From fee5a9767e762d60ce3d46443ff582b3951fd327 Mon Sep 17 00:00:00 2001 From: Friedrich Gonzalez <1517449+friedrichg@users.noreply.github.com> Date: Fri, 16 Jan 2026 11:48:25 -0800 Subject: [PATCH 01/10] Upgrade alertmanager to v0.30.1 Signed-off-by: Friedrich Gonzalez <1517449+friedrichg@users.noreply.github.com> --- go.mod | 77 +- go.sum | 158 +- pkg/alertmanager/alertmanager.go | 23 +- pkg/alertmanager/alertmanager_http_test.go | 2 + pkg/alertmanager/alertmanager_test.go | 16 +- pkg/alertmanager/multitenant.go | 2 + .../asaskevich/govalidator/.gitignore | 15 - .../asaskevich/govalidator/.travis.yml | 12 - .../asaskevich/govalidator/CODE_OF_CONDUCT.md | 43 - .../asaskevich/govalidator/CONTRIBUTING.md | 63 - .../github.com/asaskevich/govalidator/LICENSE | 21 - .../asaskevich/govalidator/README.md | 622 ------ .../asaskevich/govalidator/arrays.go | 87 - .../asaskevich/govalidator/converter.go | 81 - .../github.com/asaskevich/govalidator/doc.go | 3 - .../asaskevich/govalidator/error.go | 47 - .../asaskevich/govalidator/numerics.go | 100 - .../asaskevich/govalidator/patterns.go | 113 -- .../asaskevich/govalidator/types.go | 656 ------ .../asaskevich/govalidator/utils.go | 270 --- .../asaskevich/govalidator/validator.go | 1768 ----------------- .../asaskevich/govalidator/wercker.yml | 15 - .../aws/aws-sdk-go-v2/aws/credentials.go | 4 + .../aws-sdk-go-v2/aws/go_module_metadata.go | 2 +- .../aws/middleware/user_agent.go | 5 + .../aws/aws-sdk-go-v2/config/CHANGELOG.md | 34 + .../config/go_module_metadata.go | 2 +- .../config/resolve_credentials.go | 25 +- .../aws/aws-sdk-go-v2/config/shared_config.go | 9 + .../aws-sdk-go-v2/credentials/CHANGELOG.md | 34 + .../credentials/go_module_metadata.go | 2 +- .../credentials/logincreds/dpop.go | 150 ++ .../credentials/logincreds/file.go | 14 + .../credentials/logincreds/provider.go | 172 ++ .../credentials/logincreds/token.go | 110 + .../feature/ec2/imds/CHANGELOG.md | 9 + .../feature/ec2/imds/go_module_metadata.go | 2 +- .../internal/configsources/CHANGELOG.md | 9 + .../configsources/go_module_metadata.go | 2 +- .../internal/endpoints/v2/CHANGELOG.md | 9 + .../endpoints/v2/go_module_metadata.go | 2 +- .../internal/accept-encoding/CHANGELOG.md | 4 + .../accept-encoding/go_module_metadata.go | 2 +- .../internal/presigned-url/CHANGELOG.md | 9 + .../presigned-url/go_module_metadata.go | 2 +- .../aws-sdk-go-v2/service/signin/CHANGELOG.md | 18 + .../aws-sdk-go-v2/service/signin/LICENSE.txt} | 6 +- .../service/signin/api_client.go | 949 +++++++++ .../signin/api_op_CreateOAuth2Token.go | 209 ++ .../aws/aws-sdk-go-v2/service/signin/auth.go | 351 ++++ .../service/signin/deserializers.go | 655 ++++++ .../aws/aws-sdk-go-v2/service/signin/doc.go | 9 + .../aws-sdk-go-v2/service/signin/endpoints.go | 624 ++++++ .../service/signin/generated.json | 34 + .../service/signin/go_module_metadata.go | 6 + .../signin/internal/endpoints/endpoints.go | 333 ++++ .../aws-sdk-go-v2/service/signin/options.go | 239 +++ .../service/signin/serializers.go | 135 ++ .../service/signin/types/enums.go | 37 + .../service/signin/types/errors.go | 151 ++ .../service/signin/types/types.go | 115 ++ .../service/signin/validators.go | 72 + .../aws-sdk-go-v2/service/sns/CHANGELOG.md | 45 + .../aws-sdk-go-v2/service/sns/api_client.go | 202 +- .../service/sns/api_op_AddPermission.go | 35 +- .../api_op_CheckIfPhoneNumberIsOptedOut.go | 35 +- .../service/sns/api_op_ConfirmSubscription.go | 35 +- .../sns/api_op_CreatePlatformApplication.go | 35 +- .../sns/api_op_CreatePlatformEndpoint.go | 35 +- .../sns/api_op_CreateSMSSandboxPhoneNumber.go | 35 +- .../service/sns/api_op_CreateTopic.go | 35 +- .../service/sns/api_op_DeleteEndpoint.go | 35 +- .../sns/api_op_DeletePlatformApplication.go | 35 +- .../sns/api_op_DeleteSMSSandboxPhoneNumber.go | 35 +- .../service/sns/api_op_DeleteTopic.go | 35 +- .../sns/api_op_GetDataProtectionPolicy.go | 35 +- .../sns/api_op_GetEndpointAttributes.go | 35 +- ...api_op_GetPlatformApplicationAttributes.go | 35 +- .../service/sns/api_op_GetSMSAttributes.go | 35 +- .../sns/api_op_GetSMSSandboxAccountStatus.go | 35 +- .../sns/api_op_GetSubscriptionAttributes.go | 35 +- .../service/sns/api_op_GetTopicAttributes.go | 35 +- ...i_op_ListEndpointsByPlatformApplication.go | 35 +- .../sns/api_op_ListOriginationNumbers.go | 35 +- .../sns/api_op_ListPhoneNumbersOptedOut.go | 35 +- .../sns/api_op_ListPlatformApplications.go | 35 +- .../sns/api_op_ListSMSSandboxPhoneNumbers.go | 35 +- .../service/sns/api_op_ListSubscriptions.go | 35 +- .../sns/api_op_ListSubscriptionsByTopic.go | 35 +- .../service/sns/api_op_ListTagsForResource.go | 35 +- .../service/sns/api_op_ListTopics.go | 35 +- .../service/sns/api_op_OptInPhoneNumber.go | 35 +- .../service/sns/api_op_Publish.go | 35 +- .../service/sns/api_op_PublishBatch.go | 35 +- .../sns/api_op_PutDataProtectionPolicy.go | 35 +- .../service/sns/api_op_RemovePermission.go | 35 +- .../sns/api_op_SetEndpointAttributes.go | 35 +- ...api_op_SetPlatformApplicationAttributes.go | 35 +- .../service/sns/api_op_SetSMSAttributes.go | 35 +- .../sns/api_op_SetSubscriptionAttributes.go | 35 +- .../service/sns/api_op_SetTopicAttributes.go | 35 +- .../service/sns/api_op_Subscribe.go | 35 +- .../service/sns/api_op_TagResource.go | 35 +- .../service/sns/api_op_Unsubscribe.go | 35 +- .../service/sns/api_op_UntagResource.go | 35 +- .../sns/api_op_VerifySMSSandboxPhoneNumber.go | 35 +- .../aws/aws-sdk-go-v2/service/sns/auth.go | 16 +- .../aws-sdk-go-v2/service/sns/endpoints.go | 27 +- .../aws-sdk-go-v2/service/sns/generated.json | 2 +- .../service/sns/go_module_metadata.go | 2 +- .../sns/internal/endpoints/endpoints.go | 17 + .../aws-sdk-go-v2/service/sso/CHANGELOG.md | 23 + .../aws-sdk-go-v2/service/sso/api_client.go | 202 +- .../service/sso/api_op_GetRoleCredentials.go | 35 +- .../service/sso/api_op_ListAccountRoles.go | 35 +- .../service/sso/api_op_ListAccounts.go | 35 +- .../service/sso/api_op_Logout.go | 35 +- .../aws/aws-sdk-go-v2/service/sso/auth.go | 16 +- .../aws-sdk-go-v2/service/sso/endpoints.go | 27 +- .../service/sso/go_module_metadata.go | 2 +- .../sso/internal/endpoints/endpoints.go | 14 + .../service/ssooidc/CHANGELOG.md | 27 + .../service/ssooidc/api_client.go | 202 +- .../service/ssooidc/api_op_CreateToken.go | 35 +- .../ssooidc/api_op_CreateTokenWithIAM.go | 35 +- .../service/ssooidc/api_op_RegisterClient.go | 35 +- .../api_op_StartDeviceAuthorization.go | 35 +- .../aws/aws-sdk-go-v2/service/ssooidc/auth.go | 16 +- .../service/ssooidc/endpoints.go | 27 +- .../service/ssooidc/go_module_metadata.go | 2 +- .../ssooidc/internal/endpoints/endpoints.go | 17 + .../aws-sdk-go-v2/service/sts/CHANGELOG.md | 31 + .../aws-sdk-go-v2/service/sts/api_client.go | 202 +- .../service/sts/api_op_AssumeRole.go | 41 +- .../service/sts/api_op_AssumeRoleWithSAML.go | 38 +- .../sts/api_op_AssumeRoleWithWebIdentity.go | 39 +- .../service/sts/api_op_AssumeRoot.go | 53 +- .../sts/api_op_DecodeAuthorizationMessage.go | 35 +- .../service/sts/api_op_GetAccessKeyInfo.go | 35 +- .../service/sts/api_op_GetCallerIdentity.go | 35 +- .../sts/api_op_GetDelegatedAccessToken.go | 172 ++ .../service/sts/api_op_GetFederationToken.go | 35 +- .../service/sts/api_op_GetSessionToken.go | 35 +- .../service/sts/api_op_GetWebIdentityToken.go | 195 ++ .../aws/aws-sdk-go-v2/service/sts/auth.go | 16 +- .../service/sts/deserializers.go | 978 +++++++-- .../aws-sdk-go-v2/service/sts/endpoints.go | 27 +- .../aws-sdk-go-v2/service/sts/generated.json | 2 + .../service/sts/go_module_metadata.go | 2 +- .../sts/internal/endpoints/endpoints.go | 14 + .../aws-sdk-go-v2/service/sts/serializers.go | 193 ++ .../aws-sdk-go-v2/service/sts/types/errors.go | 117 +- .../aws-sdk-go-v2/service/sts/validators.go | 86 + vendor/github.com/aws/smithy-go/CHANGELOG.md | 9 + .../aws/smithy-go/go_module_metadata.go | 2 +- .../aws/smithy-go/middleware/step_build.go | 185 +- .../smithy-go/middleware/step_deserialize.go | 176 +- .../aws/smithy-go/middleware/step_finalize.go | 168 +- .../smithy-go/middleware/step_initialize.go | 160 +- .../smithy-go/middleware/step_serialize.go | 166 +- vendor/github.com/coder/quartz/mock.go | 64 +- vendor/github.com/coder/quartz/ticker.go | 94 +- vendor/github.com/coder/quartz/timer.go | 49 +- .../go-openapi/analysis/.golangci.yml | 2 +- .../go-openapi/analysis/analyzer.go | 68 +- .../github.com/go-openapi/analysis/debug.go | 15 +- vendor/github.com/go-openapi/analysis/doc.go | 15 +- .../github.com/go-openapi/analysis/errors.go | 3 + .../github.com/go-openapi/analysis/fixer.go | 15 +- .../github.com/go-openapi/analysis/flatten.go | 25 +- .../go-openapi/analysis/flatten_name.go | 3 + .../go-openapi/analysis/flatten_options.go | 3 + .../analysis/internal/debug/debug.go | 21 +- .../internal/flatten/normalize/normalize.go | 3 + .../internal/flatten/operations/operations.go | 3 + .../internal/flatten/replace/errors.go | 3 + .../internal/flatten/replace/replace.go | 13 +- .../flatten/schutils/flatten_schema.go | 3 + .../analysis/internal/flatten/sortref/keys.go | 5 +- .../internal/flatten/sortref/sort_ref.go | 7 +- .../github.com/go-openapi/analysis/mixin.go | 43 +- .../github.com/go-openapi/analysis/schema.go | 7 +- vendor/github.com/go-openapi/errors/README.md | 4 + vendor/github.com/go-openapi/errors/api.go | 23 +- vendor/github.com/go-openapi/errors/auth.go | 15 +- vendor/github.com/go-openapi/errors/doc.go | 15 +- .../github.com/go-openapi/errors/headers.go | 25 +- .../go-openapi/errors/middleware.go | 15 +- .../github.com/go-openapi/errors/parsing.go | 17 +- vendor/github.com/go-openapi/errors/schema.go | 51 +- .../go-openapi/jsonreference/NOTICE | 36 + .../go-openapi/jsonreference/README.md | 7 + .../jsonreference/internal/normalize_url.go | 3 + .../go-openapi/jsonreference/reference.go | 26 +- .../github.com/go-openapi/loads/.golangci.yml | 2 +- vendor/github.com/go-openapi/loads/README.md | 4 + vendor/github.com/go-openapi/loads/doc.go | 15 +- vendor/github.com/go-openapi/loads/errors.go | 3 + vendor/github.com/go-openapi/loads/loaders.go | 3 + vendor/github.com/go-openapi/loads/options.go | 3 + vendor/github.com/go-openapi/loads/spec.go | 15 +- .../go-openapi/runtime/.golangci.yml | 1 - .../github.com/go-openapi/runtime/README.md | 6 +- .../go-openapi/runtime/bytestream.go | 19 +- .../go-openapi/runtime/client/auth_info.go | 15 +- .../go-openapi/runtime/client/keepalive.go | 3 + .../runtime/client/opentelemetry.go | 7 +- .../go-openapi/runtime/client/request.go | 15 +- .../go-openapi/runtime/client/response.go | 15 +- .../go-openapi/runtime/client/runtime.go | 17 +- .../go-openapi/runtime/client_auth_info.go | 15 +- .../go-openapi/runtime/client_operation.go | 17 +- .../go-openapi/runtime/client_request.go | 25 +- .../go-openapi/runtime/client_response.go | 32 +- .../go-openapi/runtime/constants.go | 15 +- vendor/github.com/go-openapi/runtime/csv.go | 19 +- .../go-openapi/runtime/csv_options.go | 3 + .../github.com/go-openapi/runtime/discard.go | 7 +- vendor/github.com/go-openapi/runtime/file.go | 15 +- .../go-openapi/runtime/flagext/byte_size.go | 3 + .../github.com/go-openapi/runtime/go.work.sum | 5 + .../github.com/go-openapi/runtime/headers.go | 15 +- .../go-openapi/runtime/interfaces.go | 45 +- vendor/github.com/go-openapi/runtime/json.go | 19 +- .../go-openapi/runtime/logger/logger.go | 7 +- .../go-openapi/runtime/logger/standard.go | 7 +- .../go-openapi/runtime/middleware/context.go | 25 +- .../runtime/middleware/denco/router.go | 15 +- .../runtime/middleware/denco/server.go | 3 + .../runtime/middleware/denco/util.go | 3 + .../go-openapi/runtime/middleware/doc.go | 15 +- .../runtime/middleware/header/header.go | 8 +- .../runtime/middleware/negotiate.go | 3 + .../runtime/middleware/not_implemented.go | 19 +- .../runtime/middleware/operation.go | 15 +- .../runtime/middleware/parameter.go | 49 +- .../go-openapi/runtime/middleware/rapidoc.go | 3 + .../go-openapi/runtime/middleware/redoc.go | 3 + .../go-openapi/runtime/middleware/request.go | 21 +- .../go-openapi/runtime/middleware/router.go | 21 +- .../go-openapi/runtime/middleware/security.go | 15 +- .../go-openapi/runtime/middleware/spec.go | 15 +- .../runtime/middleware/swaggerui.go | 3 + .../runtime/middleware/swaggerui_oauth2.go | 3 + .../runtime/middleware/ui_options.go | 5 +- .../runtime/middleware/untyped/api.go | 15 +- .../runtime/middleware/validation.go | 15 +- .../github.com/go-openapi/runtime/request.go | 15 +- .../runtime/security/authenticator.go | 55 +- .../go-openapi/runtime/security/authorizer.go | 17 +- .../github.com/go-openapi/runtime/statuses.go | 15 +- vendor/github.com/go-openapi/runtime/text.go | 19 +- .../github.com/go-openapi/runtime/values.go | 3 + vendor/github.com/go-openapi/runtime/xml.go | 19 +- .../go-openapi/runtime/yamlpc/yaml.go | 15 +- .../go-openapi/strfmt/.golangci.yml | 2 +- vendor/github.com/go-openapi/strfmt/README.md | 13 +- vendor/github.com/go-openapi/strfmt/bson.go | 56 +- vendor/github.com/go-openapi/strfmt/date.go | 41 +- .../github.com/go-openapi/strfmt/default.go | 712 +++---- vendor/github.com/go-openapi/strfmt/doc.go | 15 +- .../github.com/go-openapi/strfmt/duration.go | 41 +- vendor/github.com/go-openapi/strfmt/errors.go | 3 + vendor/github.com/go-openapi/strfmt/format.go | 44 +- vendor/github.com/go-openapi/strfmt/ifaces.go | 32 + vendor/github.com/go-openapi/strfmt/mongo.go | 646 ++++++ vendor/github.com/go-openapi/strfmt/time.go | 85 +- vendor/github.com/go-openapi/strfmt/ulid.go | 35 +- .../github.com/go-openapi/swag/.golangci.yml | 1 + vendor/github.com/go-openapi/swag/README.md | 53 +- vendor/github.com/go-openapi/swag/SECURITY.md | 19 + vendor/github.com/go-openapi/swag/TODO.md | 1 - .../go-openapi/swag/cmdutils/cmd_utils.go | 17 +- .../go-openapi/swag/cmdutils/doc.go | 15 +- .../go-openapi/swag/cmdutils_iface.go | 15 +- .../go-openapi/swag/conv/convert.go | 15 +- .../go-openapi/swag/conv/convert_types.go | 21 +- vendor/github.com/go-openapi/swag/conv/doc.go | 15 +- .../github.com/go-openapi/swag/conv/format.go | 15 +- .../github.com/go-openapi/swag/conv/sizeof.go | 3 + .../go-openapi/swag/conv/type_constraints.go | 15 +- .../github.com/go-openapi/swag/conv_iface.go | 15 +- vendor/github.com/go-openapi/swag/doc.go | 15 +- .../go-openapi/swag/fileutils/doc.go | 15 +- .../go-openapi/swag/fileutils/file.go | 15 +- .../go-openapi/swag/fileutils/path.go | 15 +- .../go-openapi/swag/fileutils_iface.go | 15 +- vendor/github.com/go-openapi/swag/go.work.sum | 11 +- .../go-openapi/swag/jsonname/doc.go | 15 +- .../go-openapi/swag/jsonname/name_provider.go | 21 +- .../go-openapi/swag/jsonname_iface.go | 15 +- .../go-openapi/swag/jsonutils/README.md | 2 +- .../go-openapi/swag/jsonutils/adapters/doc.go | 15 +- .../swag/jsonutils/adapters/ifaces/doc.go | 3 + .../swag/jsonutils/adapters/ifaces/ifaces.go | 3 + .../adapters/ifaces/registry_iface.go | 3 + .../swag/jsonutils/adapters/registry.go | 15 +- .../jsonutils/adapters/stdlib/json/adapter.go | 15 +- .../jsonutils/adapters/stdlib/json/doc.go | 15 +- .../jsonutils/adapters/stdlib/json/lexer.go | 15 +- .../adapters/stdlib/json/ordered_map.go | 15 +- .../jsonutils/adapters/stdlib/json/pool.go | 15 +- .../adapters/stdlib/json/register.go | 15 +- .../jsonutils/adapters/stdlib/json/writer.go | 15 +- .../go-openapi/swag/jsonutils/concat.go | 17 +- .../go-openapi/swag/jsonutils/doc.go | 15 +- .../go-openapi/swag/jsonutils/json.go | 15 +- .../go-openapi/swag/jsonutils/ordered_map.go | 15 +- .../go-openapi/swag/jsonutils_iface.go | 33 +- .../github.com/go-openapi/swag/loading/doc.go | 15 +- .../go-openapi/swag/loading/errors.go | 15 +- .../go-openapi/swag/loading/json.go | 3 + .../go-openapi/swag/loading/loading.go | 15 +- .../go-openapi/swag/loading/options.go | 19 +- .../go-openapi/swag/loading/yaml.go | 17 +- .../go-openapi/swag/loading_iface.go | 17 +- .../go-openapi/swag/mangling/doc.go | 15 +- .../swag/mangling/initialism_index.go | 28 +- .../go-openapi/swag/mangling/name_lexem.go | 15 +- .../go-openapi/swag/mangling/name_mangler.go | 15 +- .../go-openapi/swag/mangling/options.go | 15 +- .../go-openapi/swag/mangling/pools.go | 15 +- .../go-openapi/swag/mangling/split.go | 223 ++- .../go-openapi/swag/mangling/string_bytes.go | 15 +- .../go-openapi/swag/mangling/util.go | 15 +- .../go-openapi/swag/mangling_iface.go | 15 +- .../go-openapi/swag/netutils/doc.go | 15 +- .../go-openapi/swag/netutils/net.go | 15 +- .../go-openapi/swag/netutils_iface.go | 15 +- .../swag/stringutils/collection_formats.go | 15 +- .../go-openapi/swag/stringutils/doc.go | 15 +- .../go-openapi/swag/stringutils/strings.go | 15 +- .../go-openapi/swag/stringutils_iface.go | 15 +- .../go-openapi/swag/typeutils/doc.go | 15 +- .../go-openapi/swag/typeutils/types.go | 15 +- .../go-openapi/swag/typeutils_iface.go | 17 +- .../go-openapi/swag/yamlutils/doc.go | 15 +- .../go-openapi/swag/yamlutils/errors.go | 15 +- .../go-openapi/swag/yamlutils/ordered_map.go | 3 + .../go-openapi/swag/yamlutils/yaml.go | 15 +- .../go-openapi/swag/yamlutils_iface.go | 19 +- .../go-openapi/validate/.golangci.yml | 2 +- .../github.com/go-openapi/validate/README.md | 4 + .../github.com/go-openapi/validate/context.go | 3 + .../github.com/go-openapi/validate/debug.go | 17 +- .../go-openapi/validate/default_validator.go | 15 +- vendor/github.com/go-openapi/validate/doc.go | 15 +- .../go-openapi/validate/example_validator.go | 15 +- .../github.com/go-openapi/validate/formats.go | 19 +- .../github.com/go-openapi/validate/helpers.go | 25 +- .../go-openapi/validate/object_validator.go | 15 +- .../github.com/go-openapi/validate/options.go | 15 +- .../github.com/go-openapi/validate/pools.go | 3 + .../go-openapi/validate/pools_debug.go | 3 + .../github.com/go-openapi/validate/result.go | 15 +- vendor/github.com/go-openapi/validate/rexp.go | 20 +- .../github.com/go-openapi/validate/schema.go | 27 +- .../go-openapi/validate/schema_messages.go | 15 +- .../go-openapi/validate/schema_option.go | 15 +- .../go-openapi/validate/schema_props.go | 35 +- .../go-openapi/validate/slice_validator.go | 23 +- vendor/github.com/go-openapi/validate/spec.go | 23 +- .../go-openapi/validate/spec_messages.go | 23 +- vendor/github.com/go-openapi/validate/type.go | 21 +- .../go-openapi/validate/validator.go | 69 +- .../github.com/go-openapi/validate/values.go | 15 +- vendor/github.com/gofrs/uuid/.gitignore | 15 - vendor/github.com/gofrs/uuid/LICENSE | 20 - vendor/github.com/gofrs/uuid/README.md | 117 -- vendor/github.com/gofrs/uuid/codec.go | 234 --- vendor/github.com/gofrs/uuid/fuzz.go | 48 - vendor/github.com/gofrs/uuid/generator.go | 456 ----- vendor/github.com/gofrs/uuid/sql.go | 116 -- vendor/github.com/gofrs/uuid/uuid.go | 285 --- .../prometheus/alertmanager/api/api.go | 47 +- .../alertmanager/api/metrics/metrics.go | 15 +- .../prometheus/alertmanager/api/v2/api.go | 96 +- .../v2/client/alert/get_alerts_parameters.go | 2 +- .../alertgroup/get_alert_groups_parameters.go | 2 +- .../client/silence/get_silences_parameters.go | 2 +- .../prometheus/alertmanager/api/v2/compat.go | 6 +- .../alertmanager/api/v2/openapi.yaml | 6 +- .../api/v2/restapi/embedded_spec.go | 12 +- .../operations/alert/get_alerts_parameters.go | 2 +- .../alertgroup/get_alert_groups_parameters.go | 2 +- .../silence/get_silences_parameters.go | 2 +- .../prometheus/alertmanager/asset/asset.go | 1 - .../alertmanager/asset/assets_vfsdata.go | 8 +- .../alertmanager/cluster/channel.go | 14 +- .../alertmanager/cluster/cluster.go | 96 +- .../alertmanager/cluster/delegate.go | 42 +- .../alertmanager/cluster/tls_transport.go | 26 +- .../prometheus/alertmanager/config/config.go | 66 +- .../alertmanager/config/coordinator.go | 9 +- .../alertmanager/config/notifiers.go | 232 ++- .../prometheus/alertmanager/config/tracing.go | 92 + .../alertmanager/dispatch/dispatch.go | 339 +++- .../featurecontrol/featurecontrol.go | 2 +- .../prometheus/alertmanager/inhibit/index.go | 64 + .../alertmanager/inhibit/inhibit.go | 226 ++- .../alertmanager/matcher/parse/token.go | 8 +- .../prometheus/alertmanager/nflog/nflog.go | 41 +- .../alertmanager/notify/discord/discord.go | 15 +- .../alertmanager/notify/email/email.go | 27 +- .../notify/incidentio/incidentio.go | 2 +- .../alertmanager/notify/jira/jira.go | 53 +- .../alertmanager/notify/jira/types.go | 21 +- .../alertmanager/notify/msteams/msteams.go | 7 +- .../notify/msteamsv2/msteamsv2.go | 7 +- .../prometheus/alertmanager/notify/notify.go | 125 +- .../alertmanager/notify/opsgenie/opsgenie.go | 14 +- .../notify/pagerduty/pagerduty.go | 89 +- .../alertmanager/notify/pushover/pushover.go | 16 +- .../notify/rocketchat/rocketchat.go | 17 +- .../alertmanager/notify/slack/slack.go | 27 +- .../prometheus/alertmanager/notify/sns/sns.go | 2 +- .../alertmanager/notify/telegram/telegram.go | 21 +- .../prometheus/alertmanager/notify/util.go | 26 +- .../notify/victorops/victorops.go | 4 +- .../alertmanager/notify/webex/webex.go | 9 +- .../alertmanager/notify/webhook/webhook.go | 9 +- .../alertmanager/notify/wechat/wechat.go | 10 +- .../alertmanager/pkg/labels/parse.go | 4 +- .../alertmanager/provider/mem/mem.go | 110 +- .../alertmanager/provider/provider.go | 31 +- .../alertmanager/silence/silence.go | 548 +++-- .../prometheus/alertmanager/store/store.go | 8 + .../alertmanager/template/default.tmpl | 11 + .../alertmanager/template/template.go | 77 + .../prometheus/alertmanager/tracing/http.go | 50 + .../alertmanager/tracing/tracing.go | 273 +++ .../prometheus/alertmanager/types/types.go | 7 +- .../prometheus/alertmanager/ui/web.go | 16 +- .../trivago/tgo/tcontainer/arrays.go | 113 -- .../trivago/tgo/tcontainer/bytepool.go | 157 -- .../trivago/tgo/tcontainer/marshalmap.go | 565 ------ .../github.com/trivago/tgo/tcontainer/trie.go | 227 --- .../github.com/trivago/tgo/treflect/clone.go | 80 - .../trivago/tgo/treflect/reflection.go | 371 ---- .../trivago/tgo/treflect/typeregistry.go | 97 - .../otlp/otlptrace/otlptracehttp/LICENSE | 231 +++ .../otlp/otlptrace/otlptracehttp/README.md | 3 + .../otlp/otlptrace/otlptracehttp/client.go | 396 ++++ .../otlp/otlptrace/otlptracehttp/doc.go | 63 + .../otlp/otlptrace/otlptracehttp/exporter.go | 20 + .../internal/envconfig/envconfig.go | 217 ++ .../otlptrace/otlptracehttp/internal/gen.go | 25 + .../internal/otlpconfig/envconfig.go | 150 ++ .../internal/otlpconfig/options.go | 360 ++++ .../internal/otlpconfig/optiontypes.go | 40 + .../otlptracehttp/internal/otlpconfig/tls.go | 26 + .../otlptracehttp/internal/partialsuccess.go | 56 + .../otlptracehttp/internal/retry/retry.go | 141 ++ .../otlp/otlptrace/otlptracehttp/options.go | 171 ++ vendor/modules.txt | 100 +- 455 files changed, 14117 insertions(+), 13503 deletions(-) delete mode 100644 vendor/github.com/asaskevich/govalidator/.gitignore delete mode 100644 vendor/github.com/asaskevich/govalidator/.travis.yml delete mode 100644 vendor/github.com/asaskevich/govalidator/CODE_OF_CONDUCT.md delete mode 100644 vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md delete mode 100644 vendor/github.com/asaskevich/govalidator/LICENSE delete mode 100644 vendor/github.com/asaskevich/govalidator/README.md delete mode 100644 vendor/github.com/asaskevich/govalidator/arrays.go delete mode 100644 vendor/github.com/asaskevich/govalidator/converter.go delete mode 100644 vendor/github.com/asaskevich/govalidator/doc.go delete mode 100644 vendor/github.com/asaskevich/govalidator/error.go delete mode 100644 vendor/github.com/asaskevich/govalidator/numerics.go delete mode 100644 vendor/github.com/asaskevich/govalidator/patterns.go delete mode 100644 vendor/github.com/asaskevich/govalidator/types.go delete mode 100644 vendor/github.com/asaskevich/govalidator/utils.go delete mode 100644 vendor/github.com/asaskevich/govalidator/validator.go delete mode 100644 vendor/github.com/asaskevich/govalidator/wercker.yml create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/credentials/logincreds/dpop.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/credentials/logincreds/file.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/credentials/logincreds/provider.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/credentials/logincreds/token.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/service/signin/CHANGELOG.md rename vendor/github.com/{trivago/tgo/LICENSE => aws/aws-sdk-go-v2/service/signin/LICENSE.txt} (99%) create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/service/signin/api_client.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/service/signin/api_op_CreateOAuth2Token.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/service/signin/auth.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/service/signin/deserializers.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/service/signin/doc.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/service/signin/endpoints.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/service/signin/generated.json create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/service/signin/go_module_metadata.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/service/signin/internal/endpoints/endpoints.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/service/signin/options.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/service/signin/serializers.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/service/signin/types/enums.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/service/signin/types/errors.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/service/signin/types/types.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/service/signin/validators.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetDelegatedAccessToken.go create mode 100644 vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetWebIdentityToken.go create mode 100644 vendor/github.com/go-openapi/jsonreference/NOTICE create mode 100644 vendor/github.com/go-openapi/strfmt/ifaces.go create mode 100644 vendor/github.com/go-openapi/strfmt/mongo.go create mode 100644 vendor/github.com/go-openapi/swag/SECURITY.md delete mode 100644 vendor/github.com/go-openapi/swag/TODO.md delete mode 100644 vendor/github.com/gofrs/uuid/.gitignore delete mode 100644 vendor/github.com/gofrs/uuid/LICENSE delete mode 100644 vendor/github.com/gofrs/uuid/README.md delete mode 100644 vendor/github.com/gofrs/uuid/codec.go delete mode 100644 vendor/github.com/gofrs/uuid/fuzz.go delete mode 100644 vendor/github.com/gofrs/uuid/generator.go delete mode 100644 vendor/github.com/gofrs/uuid/sql.go delete mode 100644 vendor/github.com/gofrs/uuid/uuid.go create mode 100644 vendor/github.com/prometheus/alertmanager/config/tracing.go create mode 100644 vendor/github.com/prometheus/alertmanager/inhibit/index.go create mode 100644 vendor/github.com/prometheus/alertmanager/tracing/http.go create mode 100644 vendor/github.com/prometheus/alertmanager/tracing/tracing.go delete mode 100644 vendor/github.com/trivago/tgo/tcontainer/arrays.go delete mode 100644 vendor/github.com/trivago/tgo/tcontainer/bytepool.go delete mode 100644 vendor/github.com/trivago/tgo/tcontainer/marshalmap.go delete mode 100644 vendor/github.com/trivago/tgo/tcontainer/trie.go delete mode 100644 vendor/github.com/trivago/tgo/treflect/clone.go delete mode 100644 vendor/github.com/trivago/tgo/treflect/reflection.go delete mode 100644 vendor/github.com/trivago/tgo/treflect/typeregistry.go create mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/LICENSE create mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/README.md create mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/client.go create mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/doc.go create mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/exporter.go create mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/envconfig/envconfig.go create mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/gen.go create mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/otlpconfig/envconfig.go create mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/otlpconfig/options.go create mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/otlpconfig/optiontypes.go create mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/otlpconfig/tls.go create mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/partialsuccess.go create mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/retry/retry.go create mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/options.go diff --git a/go.mod b/go.mod index 54e8d42b161..781104978b1 100644 --- a/go.mod +++ b/go.mod @@ -13,8 +13,8 @@ require ( github.com/facette/natsort v0.0.0-20181210072756-2cd4dd1e2dcb github.com/felixge/fgprof v0.9.5 github.com/go-kit/log v0.2.1 - github.com/go-openapi/strfmt v0.24.0 - github.com/go-openapi/swag v0.25.1 // indirect + github.com/go-openapi/strfmt v0.25.0 + github.com/go-openapi/swag v0.25.4 // indirect github.com/go-redis/redis/v8 v8.11.5 github.com/gogo/protobuf v1.3.2 github.com/gogo/status v1.1.1 @@ -39,7 +39,7 @@ require ( github.com/opentracing-contrib/go-stdlib v1.1.1 github.com/opentracing/opentracing-go v1.2.0 github.com/pkg/errors v0.9.1 - github.com/prometheus/alertmanager v0.29.0 + github.com/prometheus/alertmanager v0.30.1 github.com/prometheus/client_golang v1.23.2 github.com/prometheus/client_model v0.6.2 github.com/prometheus/common v0.67.5 @@ -75,14 +75,14 @@ require ( require ( github.com/VictoriaMetrics/fastcache v1.12.2 - github.com/aws/aws-sdk-go-v2 v1.39.6 - github.com/aws/aws-sdk-go-v2/config v1.31.17 + github.com/aws/aws-sdk-go-v2 v1.40.1 + github.com/aws/aws-sdk-go-v2/config v1.32.3 github.com/aws/aws-sdk-go-v2/service/dynamodb v1.50.1 github.com/axiomhq/hyperloglog v0.2.6 github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 github.com/cespare/xxhash/v2 v2.3.0 github.com/edsrzf/mmap-go v1.2.0 - github.com/go-openapi/swag/jsonutils v0.25.1 + github.com/go-openapi/swag/jsonutils v0.25.4 github.com/google/go-cmp v0.7.0 github.com/google/uuid v1.6.0 github.com/hashicorp/golang-lru/v2 v2.0.7 @@ -120,27 +120,27 @@ require ( github.com/alecthomas/kingpin/v2 v2.4.0 // indirect github.com/andybalholm/brotli v1.1.1 // indirect github.com/armon/go-metrics v0.4.1 // indirect - github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.18.21 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.13 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.13 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.13 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.3 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.15 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.15 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.15 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 // indirect github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.6 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.13 // indirect - github.com/aws/aws-sdk-go-v2/service/sns v1.38.5 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.30.1 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.5 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.39.1 // indirect - github.com/aws/smithy-go v1.23.2 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.15 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.0.3 // indirect + github.com/aws/aws-sdk-go-v2/service/sns v1.39.8 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.30.6 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.11 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.41.3 // indirect + github.com/aws/smithy-go v1.24.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect github.com/caio/go-tdigest v3.1.0+incompatible // indirect github.com/cenkalti/backoff/v4 v4.3.0 // indirect github.com/cenkalti/backoff/v5 v5.0.3 // indirect github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f // indirect - github.com/coder/quartz v0.2.1 // indirect + github.com/coder/quartz v0.3.0 // indirect github.com/coreos/go-semver v0.3.0 // indirect github.com/coreos/go-systemd/v22 v22.6.0 // indirect github.com/cristalhq/hedgedhttp v0.9.1 // indirect @@ -160,27 +160,26 @@ require ( github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-openapi/analysis v0.24.0 // indirect - github.com/go-openapi/errors v0.22.3 // indirect + github.com/go-openapi/analysis v0.24.1 // indirect + github.com/go-openapi/errors v0.22.4 // indirect github.com/go-openapi/jsonpointer v0.22.1 // indirect - github.com/go-openapi/jsonreference v0.21.2 // indirect - github.com/go-openapi/loads v0.23.1 // indirect - github.com/go-openapi/runtime v0.29.0 // indirect - github.com/go-openapi/spec v0.22.0 // indirect - github.com/go-openapi/swag/cmdutils v0.25.1 // indirect - github.com/go-openapi/swag/conv v0.25.1 // indirect - github.com/go-openapi/swag/fileutils v0.25.1 // indirect - github.com/go-openapi/swag/jsonname v0.25.1 // indirect - github.com/go-openapi/swag/loading v0.25.1 // indirect - github.com/go-openapi/swag/mangling v0.25.1 // indirect - github.com/go-openapi/swag/netutils v0.25.1 // indirect - github.com/go-openapi/swag/stringutils v0.25.1 // indirect - github.com/go-openapi/swag/typeutils v0.25.1 // indirect - github.com/go-openapi/swag/yamlutils v0.25.1 // indirect - github.com/go-openapi/validate v0.25.0 // indirect + github.com/go-openapi/jsonreference v0.21.3 // indirect + github.com/go-openapi/loads v0.23.2 // indirect + github.com/go-openapi/runtime v0.29.2 // indirect + github.com/go-openapi/spec v0.22.1 // indirect + github.com/go-openapi/swag/cmdutils v0.25.4 // indirect + github.com/go-openapi/swag/conv v0.25.4 // indirect + github.com/go-openapi/swag/fileutils v0.25.4 // indirect + github.com/go-openapi/swag/jsonname v0.25.4 // indirect + github.com/go-openapi/swag/loading v0.25.4 // indirect + github.com/go-openapi/swag/mangling v0.25.4 // indirect + github.com/go-openapi/swag/netutils v0.25.4 // indirect + github.com/go-openapi/swag/stringutils v0.25.4 // indirect + github.com/go-openapi/swag/typeutils v0.25.4 // indirect + github.com/go-openapi/swag/yamlutils v0.25.4 // indirect + github.com/go-openapi/validate v0.25.1 // indirect github.com/go-viper/mapstructure/v2 v2.4.0 // indirect github.com/gobwas/glob v0.2.3 // indirect - github.com/gofrs/uuid v4.4.0+incompatible // indirect github.com/gogo/googleapis v1.4.1 // indirect github.com/golang-jwt/jwt/v5 v5.3.0 // indirect github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect @@ -258,13 +257,12 @@ require ( github.com/soheilhy/cmux v0.1.5 // indirect github.com/stretchr/objx v0.5.2 // indirect github.com/tinylib/msgp v1.6.1 // indirect - github.com/trivago/tgo v1.0.7 // indirect github.com/uber/jaeger-lib v2.4.1+incompatible // indirect github.com/vimeo/galaxycache v1.3.1 // indirect github.com/weaveworks/promrus v1.2.0 // indirect github.com/xhit/go-str2duration/v2 v2.1.0 // indirect github.com/yuin/gopher-lua v1.1.1 // indirect - go.mongodb.org/mongo-driver v1.17.4 // indirect + go.mongodb.org/mongo-driver v1.17.6 // indirect go.opencensus.io v0.24.0 // indirect go.opentelemetry.io/auto/sdk v1.2.1 // indirect go.opentelemetry.io/collector/component v1.45.0 // indirect @@ -283,6 +281,7 @@ require ( go.opentelemetry.io/contrib/propagators/b3 v1.36.0 // indirect go.opentelemetry.io/contrib/propagators/jaeger v1.36.0 // indirect go.opentelemetry.io/contrib/propagators/ot v1.36.0 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 // indirect go.opentelemetry.io/otel/metric v1.38.0 // indirect go.opentelemetry.io/otel/sdk/metric v1.38.0 // indirect go.opentelemetry.io/proto/otlp v1.7.1 // indirect diff --git a/go.sum b/go.sum index 942d9f05c17..4f764d68b0d 100644 --- a/go.sum +++ b/go.sum @@ -863,20 +863,18 @@ github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJ github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3dyBCFEj5IhUbnKptjxatkF07cF2ak3yi77so= -github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= -github.com/aws/aws-sdk-go-v2 v1.39.6 h1:2JrPCVgWJm7bm83BDwY5z8ietmeJUbh3O2ACnn+Xsqk= -github.com/aws/aws-sdk-go-v2 v1.39.6/go.mod h1:c9pm7VwuW0UPxAEYGyTmyurVcNrbF6Rt/wixFqDhcjE= -github.com/aws/aws-sdk-go-v2/config v1.31.17 h1:QFl8lL6RgakNK86vusim14P2k8BFSxjvUkcWLDjgz9Y= -github.com/aws/aws-sdk-go-v2/config v1.31.17/go.mod h1:V8P7ILjp/Uef/aX8TjGk6OHZN6IKPM5YW6S78QnRD5c= -github.com/aws/aws-sdk-go-v2/credentials v1.18.21 h1:56HGpsgnmD+2/KpG0ikvvR8+3v3COCwaF4r+oWwOeNA= -github.com/aws/aws-sdk-go-v2/credentials v1.18.21/go.mod h1:3YELwedmQbw7cXNaII2Wywd+YY58AmLPwX4LzARgmmA= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.13 h1:T1brd5dR3/fzNFAQch/iBKeX07/ffu/cLu+q+RuzEWk= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.13/go.mod h1:Peg/GBAQ6JDt+RoBf4meB1wylmAipb7Kg2ZFakZTlwk= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.13 h1:a+8/MLcWlIxo1lF9xaGt3J/u3yOZx+CdSveSNwjhD40= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.13/go.mod h1:oGnKwIYZ4XttyU2JWxFrwvhF6YKiK/9/wmE3v3Iu9K8= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.13 h1:HBSI2kDkMdWz4ZM7FjwE7e/pWDEZ+nR95x8Ztet1ooY= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.13/go.mod h1:YE94ZoDArI7awZqJzBAZ3PDD2zSfuP7w6P2knOzIn8M= +github.com/aws/aws-sdk-go-v2 v1.40.1 h1:difXb4maDZkRH0x//Qkwcfpdg1XQVXEAEs2DdXldFFc= +github.com/aws/aws-sdk-go-v2 v1.40.1/go.mod h1:MayyLB8y+buD9hZqkCW3kX1AKq07Y5pXxtgB+rRFhz0= +github.com/aws/aws-sdk-go-v2/config v1.32.3 h1:cpz7H2uMNTDa0h/5CYL5dLUEzPSLo2g0NkbxTRJtSSU= +github.com/aws/aws-sdk-go-v2/config v1.32.3/go.mod h1:srtPKaJJe3McW6T/+GMBZyIPc+SeqJsNPJsd4mOYZ6s= +github.com/aws/aws-sdk-go-v2/credentials v1.19.3 h1:01Ym72hK43hjwDeJUfi1l2oYLXBAOR8gNSZNmXmvuas= +github.com/aws/aws-sdk-go-v2/credentials v1.19.3/go.mod h1:55nWF/Sr9Zvls0bGnWkRxUdhzKqj9uRNlPvgV1vgxKc= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.15 h1:utxLraaifrSBkeyII9mIbVwXXWrZdlPO7FIKmyLCEcY= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.15/go.mod h1:hW6zjYUDQwfz3icf4g2O41PHi77u10oAzJ84iSzR/lo= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.15 h1:Y5YXgygXwDI5P4RkteB5yF7v35neH7LfJKBG+hzIons= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.15/go.mod h1:K+/1EpG42dFSY7CBj+Fruzm8PsCGWTXJ3jdeJ659oGQ= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.15 h1:AvltKnW9ewxX2hFmQS0FyJH93aSvJVUEFvXfU+HWtSE= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.15/go.mod h1:3I4oCdZdmgrREhU74qS1dK9yZ62yumob+58AbFR4cQA= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 h1:WKuaxf++XKWlHWu9ECbMlha8WOEGm0OUEZqm4K/Gcfk= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4/go.mod h1:ZWy7j6v1vWGmPReu0iSGvRiise4YI5SkR3OHKTZ6Wuc= github.com/aws/aws-sdk-go-v2/service/dynamodb v1.50.1 h1:MXUnj1TKjwQvotPPHFMfynlUljcpl5UccMrkiauKdWI= @@ -885,24 +883,26 @@ github.com/aws/aws-sdk-go-v2/service/ec2 v1.262.0 h1:5qBb1XV/D18qtCHd3bmmxoVglI+ github.com/aws/aws-sdk-go-v2/service/ec2 v1.262.0/go.mod h1:NDdDLLW5PtLLXN661gKcvJvqAH5OBXsfhMlmKVu1/pY= github.com/aws/aws-sdk-go-v2/service/ecs v1.67.2 h1:oeICOX/+D0XXV1aMYJPXVe3CO37zYr7fB6HFgxchleU= github.com/aws/aws-sdk-go-v2/service/ecs v1.67.2/go.mod h1:rrhqfkXfa2DSNq0RyFhnnFEAyI+yJB4+2QlZKeJvMjs= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.3 h1:x2Ibm/Af8Fi+BH+Hsn9TXGdT+hKbDd5XOTZxTMxDk7o= -github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.3/go.mod h1:IW1jwyrQgMdhisceG8fQLmQIydcT/jWY21rFhzgaKwo= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 h1:0ryTNEdJbzUCEWkVXEXoqlXV72J5keC1GvILMOuD00E= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4/go.mod h1:HQ4qwNZh32C3CBeO6iJLQlgtMzqeG17ziAA/3KDJFow= github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.6 h1:34ojKW9OV123FZ6Q8Nua3Uwy6yVTcshZ+gLE4gpMDEs= github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.6/go.mod h1:sXXWh1G9LKKkNbuR0f0ZPd/IvDXlMGiag40opt4XEgY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.13 h1:kDqdFvMY4AtKoACfzIGD8A0+hbT41KTKF//gq7jITfM= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.13/go.mod h1:lmKuogqSU3HzQCwZ9ZtcqOc5XGMqtDK7OIc2+DxiUEg= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.15 h1:3/u/4yZOffg5jdNk1sDpOQ4Y+R6Xbh+GzpDrSZjuy3U= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.15/go.mod h1:4Zkjq0FKjE78NKjabuM4tRXKFzUJWXgP0ItEZK8l7JU= github.com/aws/aws-sdk-go-v2/service/lightsail v1.50.4 h1:/1o2AYwHJojUDeMvQNyJiKZwcWCc3e4kQuTXqRLuThc= github.com/aws/aws-sdk-go-v2/service/lightsail v1.50.4/go.mod h1:Nn2xx6HojGuNMtUFxxz/nyNLSS+tHMRsMhe3+W3wB5k= -github.com/aws/aws-sdk-go-v2/service/sns v1.38.5 h1:c0hINjMfDQvQLJJxfNNcIaLYVLC7E0W2zOQOVVKLnnU= -github.com/aws/aws-sdk-go-v2/service/sns v1.38.5/go.mod h1:E427ZzdOMWh/4KtD48AGfbWLX14iyw9URVOdIwtv80o= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.1 h1:0JPwLz1J+5lEOfy/g0SURC9cxhbQ1lIMHMa+AHZSzz0= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.1/go.mod h1:fKvyjJcz63iL/ftA6RaM8sRCtN4r4zl4tjL3qw5ec7k= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.5 h1:OWs0/j2UYR5LOGi88sD5/lhN6TDLG6SfA7CqsQO9zF0= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.5/go.mod h1:klO+ejMvYsB4QATfEOIXk8WAEwN4N0aBfJpvC+5SZBo= -github.com/aws/aws-sdk-go-v2/service/sts v1.39.1 h1:mLlUgHn02ue8whiR4BmxxGJLR2gwU6s6ZzJ5wDamBUs= -github.com/aws/aws-sdk-go-v2/service/sts v1.39.1/go.mod h1:E19xDjpzPZC7LS2knI9E6BaRFDK43Eul7vd6rSq2HWk= -github.com/aws/smithy-go v1.23.2 h1:Crv0eatJUQhaManss33hS5r40CG3ZFH+21XSkqMrIUM= -github.com/aws/smithy-go v1.23.2/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.3 h1:d/6xOGIllc/XW1lzG9a4AUBMmpLA9PXcQnVPTuHHcik= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.3/go.mod h1:fQ7E7Qj9GiW8y0ClD7cUJk3Bz5Iw8wZkWDHsTe8vDKs= +github.com/aws/aws-sdk-go-v2/service/sns v1.39.8 h1:s2QY81HBbJ+zbafTcWQmMaHj0C18VoJON/gDY1ibrEg= +github.com/aws/aws-sdk-go-v2/service/sns v1.39.8/go.mod h1:3aOzyhwa/mXPZYLwGaALfl88GFRXHQKXdyQSq2L/Y4g= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.6 h1:8sTTiw+9yuNXcfWeqKF2x01GqCF49CpP4Z9nKrrk/ts= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.6/go.mod h1:8WYg+Y40Sn3X2hioaaWAAIngndR8n1XFdRPPX+7QBaM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.11 h1:E+KqWoVsSrj1tJ6I/fjDIu5xoS2Zacuu1zT+H7KtiIk= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.11/go.mod h1:qyWHz+4lvkXcr3+PoGlGHEI+3DLLiU6/GdrFfMaAhB0= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.3 h1:tzMkjh0yTChUqJDgGkcDdxvZDSrJ/WB6R6ymI5ehqJI= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.3/go.mod h1:T270C0R5sZNLbWUe8ueiAF42XSZxxPocTaGSgs5c/60= +github.com/aws/smithy-go v1.24.0 h1:LpilSUItNPFr1eY85RYgTIg5eIEPtvFbskaFcmmIUnk= +github.com/aws/smithy-go v1.24.0/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0= github.com/axiomhq/hyperloglog v0.2.6 h1:sRhvvF3RIXWQgAXaTphLp4yJiX4S0IN3MWTaAgZoRJw= github.com/axiomhq/hyperloglog v0.2.6/go.mod h1:YjX/dQqCR/7QYX0g8mu8UZAjpIenz1FKM71UEsjFoTo= github.com/baidubce/bce-sdk-go v0.9.230 h1:HzELBKiD7QAgYqZ1qHZexoI2A3Lo/6zYGQFvcUbS5cA= @@ -962,8 +962,8 @@ github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1Ig github.com/cncf/xds/go v0.0.0-20241223141626-cff3c89139a3/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f h1:Y8xYupdHxryycyPlc9Y+bSQAYZnetRJ70VMVKm5CKI0= github.com/cncf/xds/go v0.0.0-20251022180443-0feb69152e9f/go.mod h1:HlzOvOjVBOfTGSRXRyY0OiCS/3J1akRGQQpRO/7zyF4= -github.com/coder/quartz v0.2.1 h1:QgQ2Vc1+mvzewg2uD/nj8MJ9p9gE+QhGJm+Z+NGnrSE= -github.com/coder/quartz v0.2.1/go.mod h1:vsiCc+AHViMKH2CQpGIpFgdHIEQsxwm8yCscqKmzbRA= +github.com/coder/quartz v0.3.0 h1:bUoSEJ77NBfKtUqv6CPSC0AS8dsjqAqqAv7bN02m1mg= +github.com/coder/quartz v0.3.0/go.mod h1:BgE7DOj/8NfvRgvKw0jPLDQH/2Lya2kxcTaNJ8X0rZk= github.com/containerd/errdefs v1.0.0 h1:tg5yIfIlQIrxYtu9ajqY42W3lpS19XqdxRQeEwYG8PI= github.com/containerd/errdefs v1.0.0/go.mod h1:+YBYIdtsnF4Iw6nWZhJcqGSg/dwvV7tyJ/kCkyJ2k+M= github.com/containerd/errdefs/pkg v0.3.0 h1:9IKJ06FvyNlexW690DXuQNx2KA2cUJXx151Xdx3ZPPE= @@ -1093,55 +1093,59 @@ 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-openapi/analysis v0.24.0 h1:vE/VFFkICKyYuTWYnplQ+aVr45vlG6NcZKC7BdIXhsA= -github.com/go-openapi/analysis v0.24.0/go.mod h1:GLyoJA+bvmGGaHgpfeDh8ldpGo69fAJg7eeMDMRCIrw= -github.com/go-openapi/errors v0.22.3 h1:k6Hxa5Jg1TUyZnOwV2Lh81j8ayNw5VVYLvKrp4zFKFs= -github.com/go-openapi/errors v0.22.3/go.mod h1:+WvbaBBULWCOna//9B9TbLNGSFOfF8lY9dw4hGiEiKQ= +github.com/go-openapi/analysis v0.24.1 h1:Xp+7Yn/KOnVWYG8d+hPksOYnCYImE3TieBa7rBOesYM= +github.com/go-openapi/analysis v0.24.1/go.mod h1:dU+qxX7QGU1rl7IYhBC8bIfmWQdX4Buoea4TGtxXY84= +github.com/go-openapi/errors v0.22.4 h1:oi2K9mHTOb5DPW2Zjdzs/NIvwi2N3fARKaTJLdNabaM= +github.com/go-openapi/errors v0.22.4/go.mod h1:z9S8ASTUqx7+CP1Q8dD8ewGH/1JWFFLX/2PmAYNQLgk= 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.22.1 h1:sHYI1He3b9NqJ4wXLoJDKmUmHkWy/L7rtEo92JUxBNk= github.com/go-openapi/jsonpointer v0.22.1/go.mod h1:pQT9OsLkfz1yWoMgYFy4x3U5GY5nUlsOn1qSBH5MkCM= github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= -github.com/go-openapi/jsonreference v0.21.2 h1:Wxjda4M/BBQllegefXrY/9aq1fxBA8sI5M/lFU6tSWU= -github.com/go-openapi/jsonreference v0.21.2/go.mod h1:pp3PEjIsJ9CZDGCNOyXIQxsNuroxm8FAJ/+quA0yKzQ= -github.com/go-openapi/loads v0.23.1 h1:H8A0dX2KDHxDzc797h0+uiCZ5kwE2+VojaQVaTlXvS0= -github.com/go-openapi/loads v0.23.1/go.mod h1:hZSXkyACCWzWPQqizAv/Ye0yhi2zzHwMmoXQ6YQml44= -github.com/go-openapi/runtime v0.29.0 h1:Y7iDTFarS9XaFQ+fA+lBLngMwH6nYfqig1G+pHxMRO0= -github.com/go-openapi/runtime v0.29.0/go.mod h1:52HOkEmLL/fE4Pg3Kf9nxc9fYQn0UsIWyGjGIJE9dkg= +github.com/go-openapi/jsonreference v0.21.3 h1:96Dn+MRPa0nYAR8DR1E03SblB5FJvh7W6krPI0Z7qMc= +github.com/go-openapi/jsonreference v0.21.3/go.mod h1:RqkUP0MrLf37HqxZxrIAtTWW4ZJIK1VzduhXYBEeGc4= +github.com/go-openapi/loads v0.23.2 h1:rJXAcP7g1+lWyBHC7iTY+WAF0rprtM+pm8Jxv1uQJp4= +github.com/go-openapi/loads v0.23.2/go.mod h1:IEVw1GfRt/P2Pplkelxzj9BYFajiWOtY2nHZNj4UnWY= +github.com/go-openapi/runtime v0.29.2 h1:UmwSGWNmWQqKm1c2MGgXVpC2FTGwPDQeUsBMufc5Yj0= +github.com/go-openapi/runtime v0.29.2/go.mod h1:biq5kJXRJKBJxTDJXAa00DOTa/anflQPhT0/wmjuy+0= github.com/go-openapi/spec v0.20.6 h1:ich1RQ3WDbfoeTqTAb+5EIxNmpKVJZWBNah9RAT0jIQ= github.com/go-openapi/spec v0.20.6/go.mod h1:2OpW+JddWPrpXSCIX8eOx7lZ5iyuWj3RYR6VaaBKcWA= -github.com/go-openapi/strfmt v0.24.0 h1:dDsopqbI3wrrlIzeXRbqMihRNnjzGC+ez4NQaAAJLuc= -github.com/go-openapi/strfmt v0.24.0/go.mod h1:Lnn1Bk9rZjXxU9VMADbEEOo7D7CDyKGLsSKekhFr7s4= +github.com/go-openapi/strfmt v0.25.0 h1:7R0RX7mbKLa9EYCTHRcCuIPcaqlyQiWNPTXwClK0saQ= +github.com/go-openapi/strfmt v0.25.0/go.mod h1:nNXct7OzbwrMY9+5tLX4I21pzcmE6ccMGXl3jFdPfn8= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-openapi/swag v0.19.15/go.mod h1:QYRuS/SOXUCsnplDa677K7+DxSOj6IPNl/eQntq43wQ= -github.com/go-openapi/swag v0.25.1 h1:6uwVsx+/OuvFVPqfQmOOPsqTcm5/GkBhNwLqIR916n8= -github.com/go-openapi/swag v0.25.1/go.mod h1:bzONdGlT0fkStgGPd3bhZf1MnuPkf2YAys6h+jZipOo= -github.com/go-openapi/swag/cmdutils v0.25.1 h1:nDke3nAFDArAa631aitksFGj2omusks88GF1VwdYqPY= -github.com/go-openapi/swag/cmdutils v0.25.1/go.mod h1:pdae/AFo6WxLl5L0rq87eRzVPm/XRHM3MoYgRMvG4A0= -github.com/go-openapi/swag/conv v0.25.1 h1:+9o8YUg6QuqqBM5X6rYL/p1dpWeZRhoIt9x7CCP+he0= -github.com/go-openapi/swag/conv v0.25.1/go.mod h1:Z1mFEGPfyIKPu0806khI3zF+/EUXde+fdeksUl2NiDs= -github.com/go-openapi/swag/fileutils v0.25.1 h1:rSRXapjQequt7kqalKXdcpIegIShhTPXx7yw0kek2uU= -github.com/go-openapi/swag/fileutils v0.25.1/go.mod h1:+NXtt5xNZZqmpIpjqcujqojGFek9/w55b3ecmOdtg8M= -github.com/go-openapi/swag/jsonname v0.25.1 h1:Sgx+qbwa4ej6AomWC6pEfXrA6uP2RkaNjA9BR8a1RJU= -github.com/go-openapi/swag/jsonname v0.25.1/go.mod h1:71Tekow6UOLBD3wS7XhdT98g5J5GR13NOTQ9/6Q11Zo= -github.com/go-openapi/swag/jsonutils v0.25.1 h1:AihLHaD0brrkJoMqEZOBNzTLnk81Kg9cWr+SPtxtgl8= -github.com/go-openapi/swag/jsonutils v0.25.1/go.mod h1:JpEkAjxQXpiaHmRO04N1zE4qbUEg3b7Udll7AMGTNOo= -github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.1 h1:DSQGcdB6G0N9c/KhtpYc71PzzGEIc/fZ1no35x4/XBY= -github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.1/go.mod h1:kjmweouyPwRUEYMSrbAidoLMGeJ5p6zdHi9BgZiqmsg= -github.com/go-openapi/swag/loading v0.25.1 h1:6OruqzjWoJyanZOim58iG2vj934TysYVptyaoXS24kw= -github.com/go-openapi/swag/loading v0.25.1/go.mod h1:xoIe2EG32NOYYbqxvXgPzne989bWvSNoWoyQVWEZicc= -github.com/go-openapi/swag/mangling v0.25.1 h1:XzILnLzhZPZNtmxKaz/2xIGPQsBsvmCjrJOWGNz/ync= -github.com/go-openapi/swag/mangling v0.25.1/go.mod h1:CdiMQ6pnfAgyQGSOIYnZkXvqhnnwOn997uXZMAd/7mQ= -github.com/go-openapi/swag/netutils v0.25.1 h1:2wFLYahe40tDUHfKT1GRC4rfa5T1B4GWZ+msEFA4Fl4= -github.com/go-openapi/swag/netutils v0.25.1/go.mod h1:CAkkvqnUJX8NV96tNhEQvKz8SQo2KF0f7LleiJwIeRE= -github.com/go-openapi/swag/stringutils v0.25.1 h1:Xasqgjvk30eUe8VKdmyzKtjkVjeiXx1Iz0zDfMNpPbw= -github.com/go-openapi/swag/stringutils v0.25.1/go.mod h1:JLdSAq5169HaiDUbTvArA2yQxmgn4D6h4A+4HqVvAYg= -github.com/go-openapi/swag/typeutils v0.25.1 h1:rD/9HsEQieewNt6/k+JBwkxuAHktFtH3I3ysiFZqukA= -github.com/go-openapi/swag/typeutils v0.25.1/go.mod h1:9McMC/oCdS4BKwk2shEB7x17P6HmMmA6dQRtAkSnNb8= -github.com/go-openapi/swag/yamlutils v0.25.1 h1:mry5ez8joJwzvMbaTGLhw8pXUnhDK91oSJLDPF1bmGk= -github.com/go-openapi/swag/yamlutils v0.25.1/go.mod h1:cm9ywbzncy3y6uPm/97ysW8+wZ09qsks+9RS8fLWKqg= -github.com/go-openapi/validate v0.25.0 h1:JD9eGX81hDTjoY3WOzh6WqxVBVl7xjsLnvDo1GL5WPU= -github.com/go-openapi/validate v0.25.0/go.mod h1:SUY7vKrN5FiwK6LyvSwKjDfLNirSfWwHNgxd2l29Mmw= +github.com/go-openapi/swag v0.25.4 h1:OyUPUFYDPDBMkqyxOTkqDYFnrhuhi9NR6QVUvIochMU= +github.com/go-openapi/swag v0.25.4/go.mod h1:zNfJ9WZABGHCFg2RnY0S4IOkAcVTzJ6z2Bi+Q4i6qFQ= +github.com/go-openapi/swag/cmdutils v0.25.4 h1:8rYhB5n6WawR192/BfUu2iVlxqVR9aRgGJP6WaBoW+4= +github.com/go-openapi/swag/cmdutils v0.25.4/go.mod h1:pdae/AFo6WxLl5L0rq87eRzVPm/XRHM3MoYgRMvG4A0= +github.com/go-openapi/swag/conv v0.25.4 h1:/Dd7p0LZXczgUcC/Ikm1+YqVzkEeCc9LnOWjfkpkfe4= +github.com/go-openapi/swag/conv v0.25.4/go.mod h1:3LXfie/lwoAv0NHoEuY1hjoFAYkvlqI/Bn5EQDD3PPU= +github.com/go-openapi/swag/fileutils v0.25.4 h1:2oI0XNW5y6UWZTC7vAxC8hmsK/tOkWXHJQH4lKjqw+Y= +github.com/go-openapi/swag/fileutils v0.25.4/go.mod h1:cdOT/PKbwcysVQ9Tpr0q20lQKH7MGhOEb6EwmHOirUk= +github.com/go-openapi/swag/jsonname v0.25.4 h1:bZH0+MsS03MbnwBXYhuTttMOqk+5KcQ9869Vye1bNHI= +github.com/go-openapi/swag/jsonname v0.25.4/go.mod h1:GPVEk9CWVhNvWhZgrnvRA6utbAltopbKwDu8mXNUMag= +github.com/go-openapi/swag/jsonutils v0.25.4 h1:VSchfbGhD4UTf4vCdR2F4TLBdLwHyUDTd1/q4i+jGZA= +github.com/go-openapi/swag/jsonutils v0.25.4/go.mod h1:7OYGXpvVFPn4PpaSdPHJBtF0iGnbEaTk8AvBkoWnaAY= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.4 h1:IACsSvBhiNJwlDix7wq39SS2Fh7lUOCJRmx/4SN4sVo= +github.com/go-openapi/swag/jsonutils/fixtures_test v0.25.4/go.mod h1:Mt0Ost9l3cUzVv4OEZG+WSeoHwjWLnarzMePNDAOBiM= +github.com/go-openapi/swag/loading v0.25.4 h1:jN4MvLj0X6yhCDduRsxDDw1aHe+ZWoLjW+9ZQWIKn2s= +github.com/go-openapi/swag/loading v0.25.4/go.mod h1:rpUM1ZiyEP9+mNLIQUdMiD7dCETXvkkC30z53i+ftTE= +github.com/go-openapi/swag/mangling v0.25.4 h1:2b9kBJk9JvPgxr36V23FxJLdwBrpijI26Bx5JH4Hp48= +github.com/go-openapi/swag/mangling v0.25.4/go.mod h1:6dxwu6QyORHpIIApsdZgb6wBk/DPU15MdyYj/ikn0Hg= +github.com/go-openapi/swag/netutils v0.25.4 h1:Gqe6K71bGRb3ZQLusdI8p/y1KLgV4M/k+/HzVSqT8H0= +github.com/go-openapi/swag/netutils v0.25.4/go.mod h1:m2W8dtdaoX7oj9rEttLyTeEFFEBvnAx9qHd5nJEBzYg= +github.com/go-openapi/swag/stringutils v0.25.4 h1:O6dU1Rd8bej4HPA3/CLPciNBBDwZj9HiEpdVsb8B5A8= +github.com/go-openapi/swag/stringutils v0.25.4/go.mod h1:GTsRvhJW5xM5gkgiFe0fV3PUlFm0dr8vki6/VSRaZK0= +github.com/go-openapi/swag/typeutils v0.25.4 h1:1/fbZOUN472NTc39zpa+YGHn3jzHWhv42wAJSN91wRw= +github.com/go-openapi/swag/typeutils v0.25.4/go.mod h1:Ou7g//Wx8tTLS9vG0UmzfCsjZjKhpjxayRKTHXf2pTE= +github.com/go-openapi/swag/yamlutils v0.25.4 h1:6jdaeSItEUb7ioS9lFoCZ65Cne1/RZtPBZ9A56h92Sw= +github.com/go-openapi/swag/yamlutils v0.25.4/go.mod h1:MNzq1ulQu+yd8Kl7wPOut/YHAAU/H6hL91fF+E2RFwc= +github.com/go-openapi/testify/enable/yaml/v2 v2.0.2 h1:0+Y41Pz1NkbTHz8NngxTuAXxEodtNSI1WG1c/m5Akw4= +github.com/go-openapi/testify/enable/yaml/v2 v2.0.2/go.mod h1:kme83333GCtJQHXQ8UKX3IBZu6z8T5Dvy5+CW3NLUUg= +github.com/go-openapi/testify/v2 v2.0.2 h1:X999g3jeLcoY8qctY/c/Z8iBHTbwLz7R2WXd6Ub6wls= +github.com/go-openapi/testify/v2 v2.0.2/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54= +github.com/go-openapi/validate v0.25.1 h1:sSACUI6Jcnbo5IWqbYHgjibrhhmt3vR6lCzKZnmAgBw= +github.com/go-openapi/validate v0.25.1/go.mod h1:RMVyVFYte0gbSTaZ0N4KmTn6u/kClvAFp+mAVfS/DQc= 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= @@ -1167,8 +1171,6 @@ github.com/goccy/go-yaml v1.9.5/go.mod h1:U/jl18uSupI5rdI2jmuCswEA2htH9eXfferR3K github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.12.1 h1:MTLVXXHf8ekldpJk3AKicLij9MdwOWkZ+a/jHHZby9E= github.com/gofrs/flock v0.12.1/go.mod h1:9zxTsyu5xtJ9DK+1tFZyibEV7y3uwDxPPfbxeeHCoD0= -github.com/gofrs/uuid v4.4.0+incompatible h1:3qXRTX8/NbyulANqlc0lchS1gqAVxRgsuW1YrTJupqA= -github.com/gofrs/uuid v4.4.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= github.com/gogo/googleapis v0.0.0-20180223154316-0cd9801be74a/go.mod h1:gf4bu3Q80BeJ6H1S1vYPm8/ELATdvryBaNFGgqEef3s= github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= @@ -1652,8 +1654,8 @@ github.com/prometheus-community/parquet-common v0.0.0-20251211092633-65ebeae24e9 github.com/prometheus-community/parquet-common v0.0.0-20251211092633-65ebeae24e94/go.mod h1:gewN7ZuOXJh0X2I57iGHyDLbLvL891P2Ynko2QM5axY= github.com/prometheus-community/prom-label-proxy v0.11.1 h1:jX+m+BQCNM0z3/P6V6jVxbiDKgugvk91SaICD6bVhT4= github.com/prometheus-community/prom-label-proxy v0.11.1/go.mod h1:uTeQW+wZ/VPV1LL3IPfvUE++wR2nPLex+Y4RE38Cpis= -github.com/prometheus/alertmanager v0.29.0 h1:/ET4NmAGx2Dv9kStrXIBqBgHyiSgIk4OetY+hoZRfgc= -github.com/prometheus/alertmanager v0.29.0/go.mod h1:SjI2vhrfdWg10UaRUxTz27rgdJVG3HXrhI5WFjCdBgs= +github.com/prometheus/alertmanager v0.30.1 h1:427prmCHuy1rMmV7fl/TVQFh5A/78XQ/Mp+TsswZNGM= +github.com/prometheus/alertmanager v0.30.1/go.mod h1:93PBumcTLr/gNtNtM0m7BcCffbvYP5bKuLBWiOnISaA= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= @@ -1795,8 +1797,6 @@ github.com/tinylib/msgp v1.6.1 h1:ESRv8eL3u+DNHUoSAAQRE50Hm162zqAnBoGv9PzScPY= github.com/tinylib/msgp v1.6.1/go.mod h1:RSp0LW9oSxFut3KzESt5Voq4GVWyS+PSulT77roAqEA= github.com/tjhop/slog-gokit v0.1.4 h1:uj/vbDt3HaF0Py8bHPV4ti/s0utnO0miRbO277FLBKM= github.com/tjhop/slog-gokit v0.1.4/go.mod h1:Bbu5v2748qpAWH7k6gse/kw3076IJf6owJmh7yArmJs= -github.com/trivago/tgo v1.0.7 h1:uaWH/XIy9aWYWpjm2CU3RpcqZXmX2ysQ9/Go+d9gyrM= -github.com/trivago/tgo v1.0.7/go.mod h1:w4dpD+3tzNIIiIfkWWa85w5/B77tlvdZckQ+6PkFnhc= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/uber/jaeger-client-go v2.30.0+incompatible h1:D6wyKGCecFaSRUpo8lCVbaOOb6ThwMmTEbhRwtKR97o= github.com/uber/jaeger-client-go v2.30.0+incompatible/go.mod h1:WVhlPFC8FDjOFMMWRy2pZqQJSXxYSwNYOkTr/Z6d3Kk= @@ -1835,8 +1835,8 @@ go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+ go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= go.etcd.io/etcd/client/v3 v3.5.17 h1:o48sINNeWz5+pjy/Z0+HKpj/xSnBkuVhVvXkjEXbqZY= go.etcd.io/etcd/client/v3 v3.5.17/go.mod h1:j2d4eXTHWkT2ClBgnnEPm/Wuu7jsqku41v9DZ3OtjQo= -go.mongodb.org/mongo-driver v1.17.4 h1:jUorfmVzljjr0FLzYQsGP8cgN/qzzxlY9Vh0C9KFXVw= -go.mongodb.org/mongo-driver v1.17.4/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= +go.mongodb.org/mongo-driver v1.17.6 h1:87JUG1wZfWsr6rIz3ZmpH90rL5tea7O3IHuSwHUpsss= +go.mongodb.org/mongo-driver v1.17.6/go.mod h1:Hy04i7O2kC4RS06ZrhPRqj/u4DTYkFDAAccj+rVKqgQ= 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= @@ -1912,6 +1912,8 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 h1:GqRJVj7UmLjCVyVJ3ZF go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0/go.mod h1:ri3aaHSmCTVYu2AWv44YMauwAQc0aqI9gHKIcSbI1pU= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 h1:lwI4Dc5leUqENgGuQImwLo4WnuXFPetmPpkLi2IrX54= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0/go.mod h1:Kz/oCE7z5wuyhPxsXDuaPteSWqjSBD5YaSdbxZYGbGk= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 h1:aTL7F04bJHUlztTsNGJ2l+6he8c+y/b//eR0jjjemT4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0/go.mod h1:kldtb7jDTeol0l3ewcmd8SDvx3EmIE7lyvqbasU3QC4= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0 h1:WDdP9acbMYjbKIyJUhTvtzj601sVJOqgWdUxSdR/Ysc= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0/go.mod h1:BLbf7zbNIONBLPwvFnwNHGj4zge8uTCM/UPIVW1Mq2I= go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= diff --git a/pkg/alertmanager/alertmanager.go b/pkg/alertmanager/alertmanager.go index 44be356d16c..f03b9e25fab 100644 --- a/pkg/alertmanager/alertmanager.go +++ b/pkg/alertmanager/alertmanager.go @@ -87,13 +87,14 @@ type Config struct { // Tenant-specific local directory where AM can store its state (notifications, silences, templates). When AM is stopped, entire dir is removed. TenantDataDir string - ShardingEnabled bool - ReplicationFactor int - Replicator Replicator - Store alertstore.AlertStore - PersisterConfig PersisterConfig - APIConcurrency int - GCInterval time.Duration + ShardingEnabled bool + ReplicationFactor int + Replicator Replicator + Store alertstore.AlertStore + PersisterConfig PersisterConfig + APIConcurrency int + GCInterval time.Duration + DispatchStartDelay time.Duration } // An Alertmanager manages the alerts for one user. @@ -288,8 +289,8 @@ func New(cfg *Config, reg *prometheus.Registry) (*Alertmanager, error) { Peer: &NilPeer{}, Registry: am.registry, Logger: util_log.GoKitLogToSlog(log.With(am.logger, "component", "api")), - GroupFunc: func(f1 func(*dispatch.Route) bool, f2 func(*types.Alert, time.Time) bool) (dispatch.AlertGroups, map[model.Fingerprint][]string) { - return am.dispatcher.Groups(f1, f2) + GroupFunc: func(ctx context.Context, f1 func(*dispatch.Route) bool, f2 func(*types.Alert, time.Time) bool) (dispatch.AlertGroups, map[model.Fingerprint][]string, error) { + return am.dispatcher.Groups(ctx, f1, f2) }, Concurrency: am.cfg.APIConcurrency, }) @@ -354,7 +355,7 @@ func (am *Alertmanager) ApplyConfig(userID string, conf *config.Config, rawCfg s } tmpl.ExternalURL = am.cfg.ExternalURL - am.api.Update(conf, func(_ model.LabelSet) {}) + am.api.Update(conf, func(_ context.Context, _ model.LabelSet) {}) // Ensure inhibitor is set before being called if am.inhibitor != nil { @@ -428,7 +429,7 @@ func (am *Alertmanager) ApplyConfig(userID string, conf *config.Config, rawCfg s am.dispatcherMetrics, ) - go am.dispatcher.Run() + go am.dispatcher.Run(time.Now()) go am.inhibitor.Run() am.configHashMetric.Set(md5HashAsMetricValue([]byte(rawCfg))) diff --git a/pkg/alertmanager/alertmanager_http_test.go b/pkg/alertmanager/alertmanager_http_test.go index 126de01695a..b31173dc340 100644 --- a/pkg/alertmanager/alertmanager_http_test.go +++ b/pkg/alertmanager/alertmanager_http_test.go @@ -28,11 +28,13 @@ func TestMultitenantAlertmanager_GetStatusHandler(t *testing.T) { cluster.DefaultPushPullInterval, cluster.DefaultGossipInterval, cluster.DefaultTCPTimeout, + cluster.DefaultResolvePeersTimeout, cluster.DefaultProbeTimeout, cluster.DefaultProbeInterval, nil, false, "", + "", ) } diff --git a/pkg/alertmanager/alertmanager_test.go b/pkg/alertmanager/alertmanager_test.go index 54d4cd45846..a7c144bbc19 100644 --- a/pkg/alertmanager/alertmanager_test.go +++ b/pkg/alertmanager/alertmanager_test.go @@ -1,6 +1,7 @@ package alertmanager import ( + "context" "fmt" "net/url" "strings" @@ -46,28 +47,29 @@ func TestSilencesLimits(t *testing.T) { EndsAt: time.Now().Add(time.Minute * 30), } } + ctx := context.Background() // create silences up to maxSilencesCount for range maxSilencesCount { - err := am.silences.Set(createSilences()) + err := am.silences.Set(ctx, createSilences()) require.NoError(t, err) } // exceeds limit - err = am.silences.Set(createSilences()) + err = am.silences.Set(ctx, createSilences()) require.Error(t, err) require.Equal(t, fmt.Sprintf("exceeded maximum number of silences: %d (limit: %d)", maxSilencesCount, maxSilencesCount), err.Error()) // expire whole silences - silences, _, err := am.silences.Query() + silences, _, err := am.silences.Query(ctx) require.NoError(t, err) for _, s := range silences { - err := am.silences.Expire(s.Id) + err := am.silences.Expire(ctx, s.Id) require.NoError(t, err) } // check maxSilencesCount includes expired silences - err = am.silences.Set(createSilences()) + err = am.silences.Set(ctx, createSilences()) require.Error(t, err) require.Equal(t, fmt.Sprintf("exceeded maximum number of silences: %d (limit: %d)", maxSilencesCount, maxSilencesCount), err.Error()) @@ -83,7 +85,7 @@ func TestSilencesLimits(t *testing.T) { EndsAt: time.Now().Add(time.Minute * 30), } - err = am.silences.Set(bigSilences) + err = am.silences.Set(context.Background(), bigSilences) require.Error(t, err) require.True(t, strings.Contains(err.Error(), "silence exceeded maximum size")) }) @@ -170,7 +172,7 @@ route: Timeout: false, }, } - require.NoError(t, am.alerts.Put(inputAlerts...)) + require.NoError(t, am.alerts.Put(context.Background(), inputAlerts...)) } // Give it some time, as alerts are sent to dispatcher asynchronously. diff --git a/pkg/alertmanager/multitenant.go b/pkg/alertmanager/multitenant.go index 094f05a4f90..744a25d44be 100644 --- a/pkg/alertmanager/multitenant.go +++ b/pkg/alertmanager/multitenant.go @@ -332,11 +332,13 @@ func NewMultitenantAlertmanager(cfg *MultitenantAlertmanagerConfig, store alerts cfg.Cluster.PushPullInterval, cfg.Cluster.GossipInterval, cluster.DefaultTCPTimeout, + cluster.DefaultResolvePeersTimeout, cluster.DefaultProbeTimeout, cluster.DefaultProbeInterval, nil, false, "", + "", ) if err != nil { return nil, errors.Wrap(err, "unable to initialize gossip mesh") diff --git a/vendor/github.com/asaskevich/govalidator/.gitignore b/vendor/github.com/asaskevich/govalidator/.gitignore deleted file mode 100644 index 8d69a9418aa..00000000000 --- a/vendor/github.com/asaskevich/govalidator/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -bin/ -.idea/ -# Binaries for programs and plugins -*.exe -*.exe~ -*.dll -*.so -*.dylib - -# Test binary, built with `go test -c` -*.test - -# Output of the go coverage tool, specifically when used with LiteIDE -*.out - diff --git a/vendor/github.com/asaskevich/govalidator/.travis.yml b/vendor/github.com/asaskevich/govalidator/.travis.yml deleted file mode 100644 index bb83c6670df..00000000000 --- a/vendor/github.com/asaskevich/govalidator/.travis.yml +++ /dev/null @@ -1,12 +0,0 @@ -language: go -dist: xenial -go: - - '1.10' - - '1.11' - - '1.12' - - '1.13' - - 'tip' - -script: - - go test -coverpkg=./... -coverprofile=coverage.info -timeout=5s - - bash <(curl -s https://codecov.io/bash) diff --git a/vendor/github.com/asaskevich/govalidator/CODE_OF_CONDUCT.md b/vendor/github.com/asaskevich/govalidator/CODE_OF_CONDUCT.md deleted file mode 100644 index 4b462b0d81b..00000000000 --- a/vendor/github.com/asaskevich/govalidator/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,43 +0,0 @@ -# Contributor Code of Conduct - -This project adheres to [The Code Manifesto](http://codemanifesto.com) -as its guidelines for contributor interactions. - -## The Code Manifesto - -We want to work in an ecosystem that empowers developers to reach their -potential — one that encourages growth and effective collaboration. A space -that is safe for all. - -A space such as this benefits everyone that participates in it. It encourages -new developers to enter our field. It is through discussion and collaboration -that we grow, and through growth that we improve. - -In the effort to create such a place, we hold to these values: - -1. **Discrimination limits us.** This includes discrimination on the basis of - race, gender, sexual orientation, gender identity, age, nationality, - technology and any other arbitrary exclusion of a group of people. -2. **Boundaries honor us.** Your comfort levels are not everyone’s comfort - levels. Remember that, and if brought to your attention, heed it. -3. **We are our biggest assets.** None of us were born masters of our trade. - Each of us has been helped along the way. Return that favor, when and where - you can. -4. **We are resources for the future.** As an extension of #3, share what you - know. Make yourself a resource to help those that come after you. -5. **Respect defines us.** Treat others as you wish to be treated. Make your - discussions, criticisms and debates from a position of respectfulness. Ask - yourself, is it true? Is it necessary? Is it constructive? Anything less is - unacceptable. -6. **Reactions require grace.** Angry responses are valid, but abusive language - and vindictive actions are toxic. When something happens that offends you, - handle it assertively, but be respectful. Escalate reasonably, and try to - allow the offender an opportunity to explain themselves, and possibly - correct the issue. -7. **Opinions are just that: opinions.** Each and every one of us, due to our - background and upbringing, have varying opinions. That is perfectly - acceptable. Remember this: if you respect your own opinions, you should - respect the opinions of others. -8. **To err is human.** You might not intend it, but mistakes do happen and - contribute to build experience. Tolerate honest mistakes, and don't - hesitate to apologize if you make one yourself. diff --git a/vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md b/vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md deleted file mode 100644 index 7ed268a1edd..00000000000 --- a/vendor/github.com/asaskevich/govalidator/CONTRIBUTING.md +++ /dev/null @@ -1,63 +0,0 @@ -#### Support -If you do have a contribution to the package, feel free to create a Pull Request or an Issue. - -#### What to contribute -If you don't know what to do, there are some features and functions that need to be done - -- [ ] Refactor code -- [ ] Edit docs and [README](https://github.com/asaskevich/govalidator/README.md): spellcheck, grammar and typo check -- [ ] Create actual list of contributors and projects that currently using this package -- [ ] Resolve [issues and bugs](https://github.com/asaskevich/govalidator/issues) -- [ ] Update actual [list of functions](https://github.com/asaskevich/govalidator#list-of-functions) -- [ ] Update [list of validators](https://github.com/asaskevich/govalidator#validatestruct-2) that available for `ValidateStruct` and add new -- [ ] Implement new validators: `IsFQDN`, `IsIMEI`, `IsPostalCode`, `IsISIN`, `IsISRC` etc -- [x] Implement [validation by maps](https://github.com/asaskevich/govalidator/issues/224) -- [ ] Implement fuzzing testing -- [ ] Implement some struct/map/array utilities -- [ ] Implement map/array validation -- [ ] Implement benchmarking -- [ ] Implement batch of examples -- [ ] Look at forks for new features and fixes - -#### Advice -Feel free to create what you want, but keep in mind when you implement new features: -- Code must be clear and readable, names of variables/constants clearly describes what they are doing -- Public functions must be documented and described in source file and added to README.md to the list of available functions -- There are must be unit-tests for any new functions and improvements - -## Financial contributions - -We also welcome financial contributions in full transparency on our [open collective](https://opencollective.com/govalidator). -Anyone can file an expense. If the expense makes sense for the development of the community, it will be "merged" in the ledger of our open collective by the core contributors and the person who filed the expense will be reimbursed. - - -## Credits - - -### Contributors - -Thank you to all the people who have already contributed to govalidator! - - - -### Backers - -Thank you to all our backers! [[Become a backer](https://opencollective.com/govalidator#backer)] - - - - -### Sponsors - -Thank you to all our sponsors! (please ask your company to also support this open source project by [becoming a sponsor](https://opencollective.com/govalidator#sponsor)) - - - - - - - - - - - \ No newline at end of file diff --git a/vendor/github.com/asaskevich/govalidator/LICENSE b/vendor/github.com/asaskevich/govalidator/LICENSE deleted file mode 100644 index cacba910240..00000000000 --- a/vendor/github.com/asaskevich/govalidator/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2014-2020 Alex Saskevich - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. \ No newline at end of file diff --git a/vendor/github.com/asaskevich/govalidator/README.md b/vendor/github.com/asaskevich/govalidator/README.md deleted file mode 100644 index 2c3fc35eb64..00000000000 --- a/vendor/github.com/asaskevich/govalidator/README.md +++ /dev/null @@ -1,622 +0,0 @@ -govalidator -=========== -[![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/asaskevich/govalidator?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge) [![GoDoc](https://godoc.org/github.com/asaskevich/govalidator?status.png)](https://godoc.org/github.com/asaskevich/govalidator) -[![Build Status](https://travis-ci.org/asaskevich/govalidator.svg?branch=master)](https://travis-ci.org/asaskevich/govalidator) -[![Coverage](https://codecov.io/gh/asaskevich/govalidator/branch/master/graph/badge.svg)](https://codecov.io/gh/asaskevich/govalidator) [![Go Report Card](https://goreportcard.com/badge/github.com/asaskevich/govalidator)](https://goreportcard.com/report/github.com/asaskevich/govalidator) [![GoSearch](http://go-search.org/badge?id=github.com%2Fasaskevich%2Fgovalidator)](http://go-search.org/view?id=github.com%2Fasaskevich%2Fgovalidator) [![Backers on Open Collective](https://opencollective.com/govalidator/backers/badge.svg)](#backers) [![Sponsors on Open Collective](https://opencollective.com/govalidator/sponsors/badge.svg)](#sponsors) [![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator.svg?type=shield)](https://app.fossa.io/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator?ref=badge_shield) - -A package of validators and sanitizers for strings, structs and collections. Based on [validator.js](https://github.com/chriso/validator.js). - -#### Installation -Make sure that Go is installed on your computer. -Type the following command in your terminal: - - go get github.com/asaskevich/govalidator - -or you can get specified release of the package with `gopkg.in`: - - go get gopkg.in/asaskevich/govalidator.v10 - -After it the package is ready to use. - - -#### Import package in your project -Add following line in your `*.go` file: -```go -import "github.com/asaskevich/govalidator" -``` -If you are unhappy to use long `govalidator`, you can do something like this: -```go -import ( - valid "github.com/asaskevich/govalidator" -) -``` - -#### Activate behavior to require all fields have a validation tag by default -`SetFieldsRequiredByDefault` causes validation to fail when struct fields do not include validations or are not explicitly marked as exempt (using `valid:"-"` or `valid:"email,optional"`). A good place to activate this is a package init function or the main() function. - -`SetNilPtrAllowedByRequired` causes validation to pass when struct fields marked by `required` are set to nil. This is disabled by default for consistency, but some packages that need to be able to determine between `nil` and `zero value` state can use this. If disabled, both `nil` and `zero` values cause validation errors. - -```go -import "github.com/asaskevich/govalidator" - -func init() { - govalidator.SetFieldsRequiredByDefault(true) -} -``` - -Here's some code to explain it: -```go -// this struct definition will fail govalidator.ValidateStruct() (and the field values do not matter): -type exampleStruct struct { - Name string `` - Email string `valid:"email"` -} - -// this, however, will only fail when Email is empty or an invalid email address: -type exampleStruct2 struct { - Name string `valid:"-"` - Email string `valid:"email"` -} - -// lastly, this will only fail when Email is an invalid email address but not when it's empty: -type exampleStruct2 struct { - Name string `valid:"-"` - Email string `valid:"email,optional"` -} -``` - -#### Recent breaking changes (see [#123](https://github.com/asaskevich/govalidator/pull/123)) -##### Custom validator function signature -A context was added as the second parameter, for structs this is the object being validated – this makes dependent validation possible. -```go -import "github.com/asaskevich/govalidator" - -// old signature -func(i interface{}) bool - -// new signature -func(i interface{}, o interface{}) bool -``` - -##### Adding a custom validator -This was changed to prevent data races when accessing custom validators. -```go -import "github.com/asaskevich/govalidator" - -// before -govalidator.CustomTypeTagMap["customByteArrayValidator"] = func(i interface{}, o interface{}) bool { - // ... -} - -// after -govalidator.CustomTypeTagMap.Set("customByteArrayValidator", func(i interface{}, o interface{}) bool { - // ... -}) -``` - -#### List of functions: -```go -func Abs(value float64) float64 -func BlackList(str, chars string) string -func ByteLength(str string, params ...string) bool -func CamelCaseToUnderscore(str string) string -func Contains(str, substring string) bool -func Count(array []interface{}, iterator ConditionIterator) int -func Each(array []interface{}, iterator Iterator) -func ErrorByField(e error, field string) string -func ErrorsByField(e error) map[string]string -func Filter(array []interface{}, iterator ConditionIterator) []interface{} -func Find(array []interface{}, iterator ConditionIterator) interface{} -func GetLine(s string, index int) (string, error) -func GetLines(s string) []string -func HasLowerCase(str string) bool -func HasUpperCase(str string) bool -func HasWhitespace(str string) bool -func HasWhitespaceOnly(str string) bool -func InRange(value interface{}, left interface{}, right interface{}) bool -func InRangeFloat32(value, left, right float32) bool -func InRangeFloat64(value, left, right float64) bool -func InRangeInt(value, left, right interface{}) bool -func IsASCII(str string) bool -func IsAlpha(str string) bool -func IsAlphanumeric(str string) bool -func IsBase64(str string) bool -func IsByteLength(str string, min, max int) bool -func IsCIDR(str string) bool -func IsCRC32(str string) bool -func IsCRC32b(str string) bool -func IsCreditCard(str string) bool -func IsDNSName(str string) bool -func IsDataURI(str string) bool -func IsDialString(str string) bool -func IsDivisibleBy(str, num string) bool -func IsEmail(str string) bool -func IsExistingEmail(email string) bool -func IsFilePath(str string) (bool, int) -func IsFloat(str string) bool -func IsFullWidth(str string) bool -func IsHalfWidth(str string) bool -func IsHash(str string, algorithm string) bool -func IsHexadecimal(str string) bool -func IsHexcolor(str string) bool -func IsHost(str string) bool -func IsIP(str string) bool -func IsIPv4(str string) bool -func IsIPv6(str string) bool -func IsISBN(str string, version int) bool -func IsISBN10(str string) bool -func IsISBN13(str string) bool -func IsISO3166Alpha2(str string) bool -func IsISO3166Alpha3(str string) bool -func IsISO4217(str string) bool -func IsISO693Alpha2(str string) bool -func IsISO693Alpha3b(str string) bool -func IsIn(str string, params ...string) bool -func IsInRaw(str string, params ...string) bool -func IsInt(str string) bool -func IsJSON(str string) bool -func IsLatitude(str string) bool -func IsLongitude(str string) bool -func IsLowerCase(str string) bool -func IsMAC(str string) bool -func IsMD4(str string) bool -func IsMD5(str string) bool -func IsMagnetURI(str string) bool -func IsMongoID(str string) bool -func IsMultibyte(str string) bool -func IsNatural(value float64) bool -func IsNegative(value float64) bool -func IsNonNegative(value float64) bool -func IsNonPositive(value float64) bool -func IsNotNull(str string) bool -func IsNull(str string) bool -func IsNumeric(str string) bool -func IsPort(str string) bool -func IsPositive(value float64) bool -func IsPrintableASCII(str string) bool -func IsRFC3339(str string) bool -func IsRFC3339WithoutZone(str string) bool -func IsRGBcolor(str string) bool -func IsRegex(str string) bool -func IsRequestURI(rawurl string) bool -func IsRequestURL(rawurl string) bool -func IsRipeMD128(str string) bool -func IsRipeMD160(str string) bool -func IsRsaPub(str string, params ...string) bool -func IsRsaPublicKey(str string, keylen int) bool -func IsSHA1(str string) bool -func IsSHA256(str string) bool -func IsSHA384(str string) bool -func IsSHA512(str string) bool -func IsSSN(str string) bool -func IsSemver(str string) bool -func IsTiger128(str string) bool -func IsTiger160(str string) bool -func IsTiger192(str string) bool -func IsTime(str string, format string) bool -func IsType(v interface{}, params ...string) bool -func IsURL(str string) bool -func IsUTFDigit(str string) bool -func IsUTFLetter(str string) bool -func IsUTFLetterNumeric(str string) bool -func IsUTFNumeric(str string) bool -func IsUUID(str string) bool -func IsUUIDv3(str string) bool -func IsUUIDv4(str string) bool -func IsUUIDv5(str string) bool -func IsULID(str string) bool -func IsUnixTime(str string) bool -func IsUpperCase(str string) bool -func IsVariableWidth(str string) bool -func IsWhole(value float64) bool -func LeftTrim(str, chars string) string -func Map(array []interface{}, iterator ResultIterator) []interface{} -func Matches(str, pattern string) bool -func MaxStringLength(str string, params ...string) bool -func MinStringLength(str string, params ...string) bool -func NormalizeEmail(str string) (string, error) -func PadBoth(str string, padStr string, padLen int) string -func PadLeft(str string, padStr string, padLen int) string -func PadRight(str string, padStr string, padLen int) string -func PrependPathToErrors(err error, path string) error -func Range(str string, params ...string) bool -func RemoveTags(s string) string -func ReplacePattern(str, pattern, replace string) string -func Reverse(s string) string -func RightTrim(str, chars string) string -func RuneLength(str string, params ...string) bool -func SafeFileName(str string) string -func SetFieldsRequiredByDefault(value bool) -func SetNilPtrAllowedByRequired(value bool) -func Sign(value float64) float64 -func StringLength(str string, params ...string) bool -func StringMatches(s string, params ...string) bool -func StripLow(str string, keepNewLines bool) string -func ToBoolean(str string) (bool, error) -func ToFloat(str string) (float64, error) -func ToInt(value interface{}) (res int64, err error) -func ToJSON(obj interface{}) (string, error) -func ToString(obj interface{}) string -func Trim(str, chars string) string -func Truncate(str string, length int, ending string) string -func TruncatingErrorf(str string, args ...interface{}) error -func UnderscoreToCamelCase(s string) string -func ValidateMap(inputMap map[string]interface{}, validationMap map[string]interface{}) (bool, error) -func ValidateStruct(s interface{}) (bool, error) -func WhiteList(str, chars string) string -type ConditionIterator -type CustomTypeValidator -type Error -func (e Error) Error() string -type Errors -func (es Errors) Error() string -func (es Errors) Errors() []error -type ISO3166Entry -type ISO693Entry -type InterfaceParamValidator -type Iterator -type ParamValidator -type ResultIterator -type UnsupportedTypeError -func (e *UnsupportedTypeError) Error() string -type Validator -``` - -#### Examples -###### IsURL -```go -println(govalidator.IsURL(`http://user@pass:domain.com/path/page`)) -``` -###### IsType -```go -println(govalidator.IsType("Bob", "string")) -println(govalidator.IsType(1, "int")) -i := 1 -println(govalidator.IsType(&i, "*int")) -``` - -IsType can be used through the tag `type` which is essential for map validation: -```go -type User struct { - Name string `valid:"type(string)"` - Age int `valid:"type(int)"` - Meta interface{} `valid:"type(string)"` -} -result, err := govalidator.ValidateStruct(User{"Bob", 20, "meta"}) -if err != nil { - println("error: " + err.Error()) -} -println(result) -``` -###### ToString -```go -type User struct { - FirstName string - LastName string -} - -str := govalidator.ToString(&User{"John", "Juan"}) -println(str) -``` -###### Each, Map, Filter, Count for slices -Each iterates over the slice/array and calls Iterator for every item -```go -data := []interface{}{1, 2, 3, 4, 5} -var fn govalidator.Iterator = func(value interface{}, index int) { - println(value.(int)) -} -govalidator.Each(data, fn) -``` -```go -data := []interface{}{1, 2, 3, 4, 5} -var fn govalidator.ResultIterator = func(value interface{}, index int) interface{} { - return value.(int) * 3 -} -_ = govalidator.Map(data, fn) // result = []interface{}{1, 6, 9, 12, 15} -``` -```go -data := []interface{}{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} -var fn govalidator.ConditionIterator = func(value interface{}, index int) bool { - return value.(int)%2 == 0 -} -_ = govalidator.Filter(data, fn) // result = []interface{}{2, 4, 6, 8, 10} -_ = govalidator.Count(data, fn) // result = 5 -``` -###### ValidateStruct [#2](https://github.com/asaskevich/govalidator/pull/2) -If you want to validate structs, you can use tag `valid` for any field in your structure. All validators used with this field in one tag are separated by comma. If you want to skip validation, place `-` in your tag. If you need a validator that is not on the list below, you can add it like this: -```go -govalidator.TagMap["duck"] = govalidator.Validator(func(str string) bool { - return str == "duck" -}) -``` -For completely custom validators (interface-based), see below. - -Here is a list of available validators for struct fields (validator - used function): -```go -"email": IsEmail, -"url": IsURL, -"dialstring": IsDialString, -"requrl": IsRequestURL, -"requri": IsRequestURI, -"alpha": IsAlpha, -"utfletter": IsUTFLetter, -"alphanum": IsAlphanumeric, -"utfletternum": IsUTFLetterNumeric, -"numeric": IsNumeric, -"utfnumeric": IsUTFNumeric, -"utfdigit": IsUTFDigit, -"hexadecimal": IsHexadecimal, -"hexcolor": IsHexcolor, -"rgbcolor": IsRGBcolor, -"lowercase": IsLowerCase, -"uppercase": IsUpperCase, -"int": IsInt, -"float": IsFloat, -"null": IsNull, -"uuid": IsUUID, -"uuidv3": IsUUIDv3, -"uuidv4": IsUUIDv4, -"uuidv5": IsUUIDv5, -"creditcard": IsCreditCard, -"isbn10": IsISBN10, -"isbn13": IsISBN13, -"json": IsJSON, -"multibyte": IsMultibyte, -"ascii": IsASCII, -"printableascii": IsPrintableASCII, -"fullwidth": IsFullWidth, -"halfwidth": IsHalfWidth, -"variablewidth": IsVariableWidth, -"base64": IsBase64, -"datauri": IsDataURI, -"ip": IsIP, -"port": IsPort, -"ipv4": IsIPv4, -"ipv6": IsIPv6, -"dns": IsDNSName, -"host": IsHost, -"mac": IsMAC, -"latitude": IsLatitude, -"longitude": IsLongitude, -"ssn": IsSSN, -"semver": IsSemver, -"rfc3339": IsRFC3339, -"rfc3339WithoutZone": IsRFC3339WithoutZone, -"ISO3166Alpha2": IsISO3166Alpha2, -"ISO3166Alpha3": IsISO3166Alpha3, -"ulid": IsULID, -``` -Validators with parameters - -```go -"range(min|max)": Range, -"length(min|max)": ByteLength, -"runelength(min|max)": RuneLength, -"stringlength(min|max)": StringLength, -"matches(pattern)": StringMatches, -"in(string1|string2|...|stringN)": IsIn, -"rsapub(keylength)" : IsRsaPub, -"minstringlength(int): MinStringLength, -"maxstringlength(int): MaxStringLength, -``` -Validators with parameters for any type - -```go -"type(type)": IsType, -``` - -And here is small example of usage: -```go -type Post struct { - Title string `valid:"alphanum,required"` - Message string `valid:"duck,ascii"` - Message2 string `valid:"animal(dog)"` - AuthorIP string `valid:"ipv4"` - Date string `valid:"-"` -} -post := &Post{ - Title: "My Example Post", - Message: "duck", - Message2: "dog", - AuthorIP: "123.234.54.3", -} - -// Add your own struct validation tags -govalidator.TagMap["duck"] = govalidator.Validator(func(str string) bool { - return str == "duck" -}) - -// Add your own struct validation tags with parameter -govalidator.ParamTagMap["animal"] = govalidator.ParamValidator(func(str string, params ...string) bool { - species := params[0] - return str == species -}) -govalidator.ParamTagRegexMap["animal"] = regexp.MustCompile("^animal\\((\\w+)\\)$") - -result, err := govalidator.ValidateStruct(post) -if err != nil { - println("error: " + err.Error()) -} -println(result) -``` -###### ValidateMap [#2](https://github.com/asaskevich/govalidator/pull/338) -If you want to validate maps, you can use the map to be validated and a validation map that contain the same tags used in ValidateStruct, both maps have to be in the form `map[string]interface{}` - -So here is small example of usage: -```go -var mapTemplate = map[string]interface{}{ - "name":"required,alpha", - "family":"required,alpha", - "email":"required,email", - "cell-phone":"numeric", - "address":map[string]interface{}{ - "line1":"required,alphanum", - "line2":"alphanum", - "postal-code":"numeric", - }, -} - -var inputMap = map[string]interface{}{ - "name":"Bob", - "family":"Smith", - "email":"foo@bar.baz", - "address":map[string]interface{}{ - "line1":"", - "line2":"", - "postal-code":"", - }, -} - -result, err := govalidator.ValidateMap(inputMap, mapTemplate) -if err != nil { - println("error: " + err.Error()) -} -println(result) -``` - -###### WhiteList -```go -// Remove all characters from string ignoring characters between "a" and "z" -println(govalidator.WhiteList("a3a43a5a4a3a2a23a4a5a4a3a4", "a-z") == "aaaaaaaaaaaa") -``` - -###### Custom validation functions -Custom validation using your own domain specific validators is also available - here's an example of how to use it: -```go -import "github.com/asaskevich/govalidator" - -type CustomByteArray [6]byte // custom types are supported and can be validated - -type StructWithCustomByteArray struct { - ID CustomByteArray `valid:"customByteArrayValidator,customMinLengthValidator"` // multiple custom validators are possible as well and will be evaluated in sequence - Email string `valid:"email"` - CustomMinLength int `valid:"-"` -} - -govalidator.CustomTypeTagMap.Set("customByteArrayValidator", func(i interface{}, context interface{}) bool { - switch v := context.(type) { // you can type switch on the context interface being validated - case StructWithCustomByteArray: - // you can check and validate against some other field in the context, - // return early or not validate against the context at all – your choice - case SomeOtherType: - // ... - default: - // expecting some other type? Throw/panic here or continue - } - - switch v := i.(type) { // type switch on the struct field being validated - case CustomByteArray: - for _, e := range v { // this validator checks that the byte array is not empty, i.e. not all zeroes - if e != 0 { - return true - } - } - } - return false -}) -govalidator.CustomTypeTagMap.Set("customMinLengthValidator", func(i interface{}, context interface{}) bool { - switch v := context.(type) { // this validates a field against the value in another field, i.e. dependent validation - case StructWithCustomByteArray: - return len(v.ID) >= v.CustomMinLength - } - return false -}) -``` - -###### Loop over Error() -By default .Error() returns all errors in a single String. To access each error you can do this: -```go - if err != nil { - errs := err.(govalidator.Errors).Errors() - for _, e := range errs { - fmt.Println(e.Error()) - } - } -``` - -###### Custom error messages -Custom error messages are supported via annotations by adding the `~` separator - here's an example of how to use it: -```go -type Ticket struct { - Id int64 `json:"id"` - FirstName string `json:"firstname" valid:"required~First name is blank"` -} -``` - -#### Notes -Documentation is available here: [godoc.org](https://godoc.org/github.com/asaskevich/govalidator). -Full information about code coverage is also available here: [govalidator on gocover.io](http://gocover.io/github.com/asaskevich/govalidator). - -#### Support -If you do have a contribution to the package, feel free to create a Pull Request or an Issue. - -#### What to contribute -If you don't know what to do, there are some features and functions that need to be done - -- [ ] Refactor code -- [ ] Edit docs and [README](https://github.com/asaskevich/govalidator/README.md): spellcheck, grammar and typo check -- [ ] Create actual list of contributors and projects that currently using this package -- [ ] Resolve [issues and bugs](https://github.com/asaskevich/govalidator/issues) -- [ ] Update actual [list of functions](https://github.com/asaskevich/govalidator#list-of-functions) -- [ ] Update [list of validators](https://github.com/asaskevich/govalidator#validatestruct-2) that available for `ValidateStruct` and add new -- [ ] Implement new validators: `IsFQDN`, `IsIMEI`, `IsPostalCode`, `IsISIN`, `IsISRC` etc -- [x] Implement [validation by maps](https://github.com/asaskevich/govalidator/issues/224) -- [ ] Implement fuzzing testing -- [ ] Implement some struct/map/array utilities -- [ ] Implement map/array validation -- [ ] Implement benchmarking -- [ ] Implement batch of examples -- [ ] Look at forks for new features and fixes - -#### Advice -Feel free to create what you want, but keep in mind when you implement new features: -- Code must be clear and readable, names of variables/constants clearly describes what they are doing -- Public functions must be documented and described in source file and added to README.md to the list of available functions -- There are must be unit-tests for any new functions and improvements - -## Credits -### Contributors - -This project exists thanks to all the people who contribute. [[Contribute](CONTRIBUTING.md)]. - -#### Special thanks to [contributors](https://github.com/asaskevich/govalidator/graphs/contributors) -* [Daniel Lohse](https://github.com/annismckenzie) -* [Attila Oláh](https://github.com/attilaolah) -* [Daniel Korner](https://github.com/Dadie) -* [Steven Wilkin](https://github.com/stevenwilkin) -* [Deiwin Sarjas](https://github.com/deiwin) -* [Noah Shibley](https://github.com/slugmobile) -* [Nathan Davies](https://github.com/nathj07) -* [Matt Sanford](https://github.com/mzsanford) -* [Simon ccl1115](https://github.com/ccl1115) - - - - -### Backers - -Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/govalidator#backer)] - - - - -### Sponsors - -Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/govalidator#sponsor)] - - - - - - - - - - - - - - - -## License -[![FOSSA Status](https://app.fossa.io/api/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator.svg?type=large)](https://app.fossa.io/projects/git%2Bgithub.com%2Fasaskevich%2Fgovalidator?ref=badge_large) diff --git a/vendor/github.com/asaskevich/govalidator/arrays.go b/vendor/github.com/asaskevich/govalidator/arrays.go deleted file mode 100644 index 3e1da7cb480..00000000000 --- a/vendor/github.com/asaskevich/govalidator/arrays.go +++ /dev/null @@ -1,87 +0,0 @@ -package govalidator - -// Iterator is the function that accepts element of slice/array and its index -type Iterator func(interface{}, int) - -// ResultIterator is the function that accepts element of slice/array and its index and returns any result -type ResultIterator func(interface{}, int) interface{} - -// ConditionIterator is the function that accepts element of slice/array and its index and returns boolean -type ConditionIterator func(interface{}, int) bool - -// ReduceIterator is the function that accepts two element of slice/array and returns result of merging those values -type ReduceIterator func(interface{}, interface{}) interface{} - -// Some validates that any item of array corresponds to ConditionIterator. Returns boolean. -func Some(array []interface{}, iterator ConditionIterator) bool { - res := false - for index, data := range array { - res = res || iterator(data, index) - } - return res -} - -// Every validates that every item of array corresponds to ConditionIterator. Returns boolean. -func Every(array []interface{}, iterator ConditionIterator) bool { - res := true - for index, data := range array { - res = res && iterator(data, index) - } - return res -} - -// Reduce boils down a list of values into a single value by ReduceIterator -func Reduce(array []interface{}, iterator ReduceIterator, initialValue interface{}) interface{} { - for _, data := range array { - initialValue = iterator(initialValue, data) - } - return initialValue -} - -// Each iterates over the slice and apply Iterator to every item -func Each(array []interface{}, iterator Iterator) { - for index, data := range array { - iterator(data, index) - } -} - -// Map iterates over the slice and apply ResultIterator to every item. Returns new slice as a result. -func Map(array []interface{}, iterator ResultIterator) []interface{} { - var result = make([]interface{}, len(array)) - for index, data := range array { - result[index] = iterator(data, index) - } - return result -} - -// Find iterates over the slice and apply ConditionIterator to every item. Returns first item that meet ConditionIterator or nil otherwise. -func Find(array []interface{}, iterator ConditionIterator) interface{} { - for index, data := range array { - if iterator(data, index) { - return data - } - } - return nil -} - -// Filter iterates over the slice and apply ConditionIterator to every item. Returns new slice. -func Filter(array []interface{}, iterator ConditionIterator) []interface{} { - var result = make([]interface{}, 0) - for index, data := range array { - if iterator(data, index) { - result = append(result, data) - } - } - return result -} - -// Count iterates over the slice and apply ConditionIterator to every item. Returns count of items that meets ConditionIterator. -func Count(array []interface{}, iterator ConditionIterator) int { - count := 0 - for index, data := range array { - if iterator(data, index) { - count = count + 1 - } - } - return count -} diff --git a/vendor/github.com/asaskevich/govalidator/converter.go b/vendor/github.com/asaskevich/govalidator/converter.go deleted file mode 100644 index d68e990fc25..00000000000 --- a/vendor/github.com/asaskevich/govalidator/converter.go +++ /dev/null @@ -1,81 +0,0 @@ -package govalidator - -import ( - "encoding/json" - "fmt" - "reflect" - "strconv" -) - -// ToString convert the input to a string. -func ToString(obj interface{}) string { - res := fmt.Sprintf("%v", obj) - return res -} - -// ToJSON convert the input to a valid JSON string -func ToJSON(obj interface{}) (string, error) { - res, err := json.Marshal(obj) - if err != nil { - res = []byte("") - } - return string(res), err -} - -// ToFloat convert the input string to a float, or 0.0 if the input is not a float. -func ToFloat(value interface{}) (res float64, err error) { - val := reflect.ValueOf(value) - - switch value.(type) { - case int, int8, int16, int32, int64: - res = float64(val.Int()) - case uint, uint8, uint16, uint32, uint64: - res = float64(val.Uint()) - case float32, float64: - res = val.Float() - case string: - res, err = strconv.ParseFloat(val.String(), 64) - if err != nil { - res = 0 - } - default: - err = fmt.Errorf("ToInt: unknown interface type %T", value) - res = 0 - } - - return -} - -// ToInt convert the input string or any int type to an integer type 64, or 0 if the input is not an integer. -func ToInt(value interface{}) (res int64, err error) { - val := reflect.ValueOf(value) - - switch value.(type) { - case int, int8, int16, int32, int64: - res = val.Int() - case uint, uint8, uint16, uint32, uint64: - res = int64(val.Uint()) - case float32, float64: - res = int64(val.Float()) - case string: - if IsInt(val.String()) { - res, err = strconv.ParseInt(val.String(), 0, 64) - if err != nil { - res = 0 - } - } else { - err = fmt.Errorf("ToInt: invalid numeric format %g", value) - res = 0 - } - default: - err = fmt.Errorf("ToInt: unknown interface type %T", value) - res = 0 - } - - return -} - -// ToBoolean convert the input string to a boolean. -func ToBoolean(str string) (bool, error) { - return strconv.ParseBool(str) -} diff --git a/vendor/github.com/asaskevich/govalidator/doc.go b/vendor/github.com/asaskevich/govalidator/doc.go deleted file mode 100644 index 55dce62dc8c..00000000000 --- a/vendor/github.com/asaskevich/govalidator/doc.go +++ /dev/null @@ -1,3 +0,0 @@ -package govalidator - -// A package of validators and sanitizers for strings, structures and collections. diff --git a/vendor/github.com/asaskevich/govalidator/error.go b/vendor/github.com/asaskevich/govalidator/error.go deleted file mode 100644 index 1da2336f47e..00000000000 --- a/vendor/github.com/asaskevich/govalidator/error.go +++ /dev/null @@ -1,47 +0,0 @@ -package govalidator - -import ( - "sort" - "strings" -) - -// Errors is an array of multiple errors and conforms to the error interface. -type Errors []error - -// Errors returns itself. -func (es Errors) Errors() []error { - return es -} - -func (es Errors) Error() string { - var errs []string - for _, e := range es { - errs = append(errs, e.Error()) - } - sort.Strings(errs) - return strings.Join(errs, ";") -} - -// Error encapsulates a name, an error and whether there's a custom error message or not. -type Error struct { - Name string - Err error - CustomErrorMessageExists bool - - // Validator indicates the name of the validator that failed - Validator string - Path []string -} - -func (e Error) Error() string { - if e.CustomErrorMessageExists { - return e.Err.Error() - } - - errName := e.Name - if len(e.Path) > 0 { - errName = strings.Join(append(e.Path, e.Name), ".") - } - - return errName + ": " + e.Err.Error() -} diff --git a/vendor/github.com/asaskevich/govalidator/numerics.go b/vendor/github.com/asaskevich/govalidator/numerics.go deleted file mode 100644 index 5041d9e8684..00000000000 --- a/vendor/github.com/asaskevich/govalidator/numerics.go +++ /dev/null @@ -1,100 +0,0 @@ -package govalidator - -import ( - "math" -) - -// Abs returns absolute value of number -func Abs(value float64) float64 { - return math.Abs(value) -} - -// Sign returns signum of number: 1 in case of value > 0, -1 in case of value < 0, 0 otherwise -func Sign(value float64) float64 { - if value > 0 { - return 1 - } else if value < 0 { - return -1 - } else { - return 0 - } -} - -// IsNegative returns true if value < 0 -func IsNegative(value float64) bool { - return value < 0 -} - -// IsPositive returns true if value > 0 -func IsPositive(value float64) bool { - return value > 0 -} - -// IsNonNegative returns true if value >= 0 -func IsNonNegative(value float64) bool { - return value >= 0 -} - -// IsNonPositive returns true if value <= 0 -func IsNonPositive(value float64) bool { - return value <= 0 -} - -// InRangeInt returns true if value lies between left and right border -func InRangeInt(value, left, right interface{}) bool { - value64, _ := ToInt(value) - left64, _ := ToInt(left) - right64, _ := ToInt(right) - if left64 > right64 { - left64, right64 = right64, left64 - } - return value64 >= left64 && value64 <= right64 -} - -// InRangeFloat32 returns true if value lies between left and right border -func InRangeFloat32(value, left, right float32) bool { - if left > right { - left, right = right, left - } - return value >= left && value <= right -} - -// InRangeFloat64 returns true if value lies between left and right border -func InRangeFloat64(value, left, right float64) bool { - if left > right { - left, right = right, left - } - return value >= left && value <= right -} - -// InRange returns true if value lies between left and right border, generic type to handle int, float32, float64 and string. -// All types must the same type. -// False if value doesn't lie in range or if it incompatible or not comparable -func InRange(value interface{}, left interface{}, right interface{}) bool { - switch value.(type) { - case int: - intValue, _ := ToInt(value) - intLeft, _ := ToInt(left) - intRight, _ := ToInt(right) - return InRangeInt(intValue, intLeft, intRight) - case float32, float64: - intValue, _ := ToFloat(value) - intLeft, _ := ToFloat(left) - intRight, _ := ToFloat(right) - return InRangeFloat64(intValue, intLeft, intRight) - case string: - return value.(string) >= left.(string) && value.(string) <= right.(string) - default: - return false - } -} - -// IsWhole returns true if value is whole number -func IsWhole(value float64) bool { - return math.Remainder(value, 1) == 0 -} - -// IsNatural returns true if value is natural number (positive and whole) -func IsNatural(value float64) bool { - return IsWhole(value) && IsPositive(value) -} diff --git a/vendor/github.com/asaskevich/govalidator/patterns.go b/vendor/github.com/asaskevich/govalidator/patterns.go deleted file mode 100644 index bafc3765ea1..00000000000 --- a/vendor/github.com/asaskevich/govalidator/patterns.go +++ /dev/null @@ -1,113 +0,0 @@ -package govalidator - -import "regexp" - -// Basic regular expressions for validating strings -const ( - Email string = "^(((([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+(\\.([a-zA-Z]|\\d|[!#\\$%&'\\*\\+\\-\\/=\\?\\^_`{\\|}~]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])+)*)|((\\x22)((((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(([\\x01-\\x08\\x0b\\x0c\\x0e-\\x1f\\x7f]|\\x21|[\\x23-\\x5b]|[\\x5d-\\x7e]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(\\([\\x01-\\x09\\x0b\\x0c\\x0d-\\x7f]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}]))))*(((\\x20|\\x09)*(\\x0d\\x0a))?(\\x20|\\x09)+)?(\\x22)))@((([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|\\.|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|\\d|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.)+(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])|(([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])([a-zA-Z]|\\d|-|_|~|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])*([a-zA-Z]|[\\x{00A0}-\\x{D7FF}\\x{F900}-\\x{FDCF}\\x{FDF0}-\\x{FFEF}])))\\.?$" - CreditCard string = "^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11}|6[27][0-9]{14})$" - ISBN10 string = "^(?:[0-9]{9}X|[0-9]{10})$" - ISBN13 string = "^(?:[0-9]{13})$" - UUID3 string = "^[0-9a-f]{8}-[0-9a-f]{4}-3[0-9a-f]{3}-[0-9a-f]{4}-[0-9a-f]{12}$" - UUID4 string = "^[0-9a-f]{8}-[0-9a-f]{4}-4[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" - UUID5 string = "^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$" - UUID string = "^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$" - Alpha string = "^[a-zA-Z]+$" - Alphanumeric string = "^[a-zA-Z0-9]+$" - Numeric string = "^[0-9]+$" - Int string = "^(?:[-+]?(?:0|[1-9][0-9]*))$" - Float string = "^(?:[-+]?(?:[0-9]+))?(?:\\.[0-9]*)?(?:[eE][\\+\\-]?(?:[0-9]+))?$" - Hexadecimal string = "^[0-9a-fA-F]+$" - Hexcolor string = "^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$" - RGBcolor string = "^rgb\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*\\)$" - ASCII string = "^[\x00-\x7F]+$" - Multibyte string = "[^\x00-\x7F]" - FullWidth string = "[^\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]" - HalfWidth string = "[\u0020-\u007E\uFF61-\uFF9F\uFFA0-\uFFDC\uFFE8-\uFFEE0-9a-zA-Z]" - Base64 string = "^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=|[A-Za-z0-9+\\/]{4})$" - PrintableASCII string = "^[\x20-\x7E]+$" - DataURI string = "^data:.+\\/(.+);base64$" - MagnetURI string = "^magnet:\\?xt=urn:[a-zA-Z0-9]+:[a-zA-Z0-9]{32,40}&dn=.+&tr=.+$" - Latitude string = "^[-+]?([1-8]?\\d(\\.\\d+)?|90(\\.0+)?)$" - Longitude string = "^[-+]?(180(\\.0+)?|((1[0-7]\\d)|([1-9]?\\d))(\\.\\d+)?)$" - DNSName string = `^([a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62}){1}(\.[a-zA-Z0-9_]{1}[a-zA-Z0-9_-]{0,62})*[\._]?$` - IP string = `(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))` - URLSchema string = `((ftp|tcp|udp|wss?|https?):\/\/)` - URLUsername string = `(\S+(:\S*)?@)` - URLPath string = `((\/|\?|#)[^\s]*)` - URLPort string = `(:(\d{1,5}))` - URLIP string = `([1-9]\d?|1\d\d|2[01]\d|22[0-3]|24\d|25[0-5])(\.(\d{1,2}|1\d\d|2[0-4]\d|25[0-5])){2}(?:\.([0-9]\d?|1\d\d|2[0-4]\d|25[0-5]))` - URLSubdomain string = `((www\.)|([a-zA-Z0-9]+([-_\.]?[a-zA-Z0-9])*[a-zA-Z0-9]\.[a-zA-Z0-9]+))` - URL = `^` + URLSchema + `?` + URLUsername + `?` + `((` + URLIP + `|(\[` + IP + `\])|(([a-zA-Z0-9]([a-zA-Z0-9-_]+)?[a-zA-Z0-9]([-\.][a-zA-Z0-9]+)*)|(` + URLSubdomain + `?))?(([a-zA-Z\x{00a1}-\x{ffff}0-9]+-?-?)*[a-zA-Z\x{00a1}-\x{ffff}0-9]+)(?:\.([a-zA-Z\x{00a1}-\x{ffff}]{1,}))?))\.?` + URLPort + `?` + URLPath + `?$` - SSN string = `^\d{3}[- ]?\d{2}[- ]?\d{4}$` - WinPath string = `^[a-zA-Z]:\\(?:[^\\/:*?"<>|\r\n]+\\)*[^\\/:*?"<>|\r\n]*$` - UnixPath string = `^(/[^/\x00]*)+/?$` - WinARPath string = `^(?:(?:[a-zA-Z]:|\\\\[a-z0-9_.$●-]+\\[a-z0-9_.$●-]+)\\|\\?[^\\/:*?"<>|\r\n]+\\?)(?:[^\\/:*?"<>|\r\n]+\\)*[^\\/:*?"<>|\r\n]*$` - UnixARPath string = `^((\.{0,2}/)?([^/\x00]*))+/?$` - Semver string = "^v?(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)\\.(?:0|[1-9]\\d*)(-(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*)(\\.(0|[1-9]\\d*|\\d*[a-zA-Z-][0-9a-zA-Z-]*))*)?(\\+[0-9a-zA-Z-]+(\\.[0-9a-zA-Z-]+)*)?$" - tagName string = "valid" - hasLowerCase string = ".*[[:lower:]]" - hasUpperCase string = ".*[[:upper:]]" - hasWhitespace string = ".*[[:space:]]" - hasWhitespaceOnly string = "^[[:space:]]+$" - IMEI string = "^[0-9a-f]{14}$|^\\d{15}$|^\\d{18}$" - IMSI string = "^\\d{14,15}$" - E164 string = `^\+?[1-9]\d{1,14}$` -) - -// Used by IsFilePath func -const ( - // Unknown is unresolved OS type - Unknown = iota - // Win is Windows type - Win - // Unix is *nix OS types - Unix -) - -var ( - userRegexp = regexp.MustCompile("^[a-zA-Z0-9!#$%&'*+/=?^_`{|}~.-]+$") - hostRegexp = regexp.MustCompile("^[^\\s]+\\.[^\\s]+$") - userDotRegexp = regexp.MustCompile("(^[.]{1})|([.]{1}$)|([.]{2,})") - rxEmail = regexp.MustCompile(Email) - rxCreditCard = regexp.MustCompile(CreditCard) - rxISBN10 = regexp.MustCompile(ISBN10) - rxISBN13 = regexp.MustCompile(ISBN13) - rxUUID3 = regexp.MustCompile(UUID3) - rxUUID4 = regexp.MustCompile(UUID4) - rxUUID5 = regexp.MustCompile(UUID5) - rxUUID = regexp.MustCompile(UUID) - rxAlpha = regexp.MustCompile(Alpha) - rxAlphanumeric = regexp.MustCompile(Alphanumeric) - rxNumeric = regexp.MustCompile(Numeric) - rxInt = regexp.MustCompile(Int) - rxFloat = regexp.MustCompile(Float) - rxHexadecimal = regexp.MustCompile(Hexadecimal) - rxHexcolor = regexp.MustCompile(Hexcolor) - rxRGBcolor = regexp.MustCompile(RGBcolor) - rxASCII = regexp.MustCompile(ASCII) - rxPrintableASCII = regexp.MustCompile(PrintableASCII) - rxMultibyte = regexp.MustCompile(Multibyte) - rxFullWidth = regexp.MustCompile(FullWidth) - rxHalfWidth = regexp.MustCompile(HalfWidth) - rxBase64 = regexp.MustCompile(Base64) - rxDataURI = regexp.MustCompile(DataURI) - rxMagnetURI = regexp.MustCompile(MagnetURI) - rxLatitude = regexp.MustCompile(Latitude) - rxLongitude = regexp.MustCompile(Longitude) - rxDNSName = regexp.MustCompile(DNSName) - rxURL = regexp.MustCompile(URL) - rxSSN = regexp.MustCompile(SSN) - rxWinPath = regexp.MustCompile(WinPath) - rxUnixPath = regexp.MustCompile(UnixPath) - rxARWinPath = regexp.MustCompile(WinARPath) - rxARUnixPath = regexp.MustCompile(UnixARPath) - rxSemver = regexp.MustCompile(Semver) - rxHasLowerCase = regexp.MustCompile(hasLowerCase) - rxHasUpperCase = regexp.MustCompile(hasUpperCase) - rxHasWhitespace = regexp.MustCompile(hasWhitespace) - rxHasWhitespaceOnly = regexp.MustCompile(hasWhitespaceOnly) - rxIMEI = regexp.MustCompile(IMEI) - rxIMSI = regexp.MustCompile(IMSI) - rxE164 = regexp.MustCompile(E164) -) diff --git a/vendor/github.com/asaskevich/govalidator/types.go b/vendor/github.com/asaskevich/govalidator/types.go deleted file mode 100644 index c573abb51af..00000000000 --- a/vendor/github.com/asaskevich/govalidator/types.go +++ /dev/null @@ -1,656 +0,0 @@ -package govalidator - -import ( - "reflect" - "regexp" - "sort" - "sync" -) - -// Validator is a wrapper for a validator function that returns bool and accepts string. -type Validator func(str string) bool - -// CustomTypeValidator is a wrapper for validator functions that returns bool and accepts any type. -// The second parameter should be the context (in the case of validating a struct: the whole object being validated). -type CustomTypeValidator func(i interface{}, o interface{}) bool - -// ParamValidator is a wrapper for validator functions that accept additional parameters. -type ParamValidator func(str string, params ...string) bool - -// InterfaceParamValidator is a wrapper for functions that accept variants parameters for an interface value -type InterfaceParamValidator func(in interface{}, params ...string) bool -type tagOptionsMap map[string]tagOption - -func (t tagOptionsMap) orderedKeys() []string { - var keys []string - for k := range t { - keys = append(keys, k) - } - - sort.Slice(keys, func(a, b int) bool { - return t[keys[a]].order < t[keys[b]].order - }) - - return keys -} - -type tagOption struct { - name string - customErrorMessage string - order int -} - -// UnsupportedTypeError is a wrapper for reflect.Type -type UnsupportedTypeError struct { - Type reflect.Type -} - -// stringValues is a slice of reflect.Value holding *reflect.StringValue. -// It implements the methods to sort by string. -type stringValues []reflect.Value - -// InterfaceParamTagMap is a map of functions accept variants parameters for an interface value -var InterfaceParamTagMap = map[string]InterfaceParamValidator{ - "type": IsType, -} - -// InterfaceParamTagRegexMap maps interface param tags to their respective regexes. -var InterfaceParamTagRegexMap = map[string]*regexp.Regexp{ - "type": regexp.MustCompile(`^type\((.*)\)$`), -} - -// ParamTagMap is a map of functions accept variants parameters -var ParamTagMap = map[string]ParamValidator{ - "length": ByteLength, - "range": Range, - "runelength": RuneLength, - "stringlength": StringLength, - "matches": StringMatches, - "in": IsInRaw, - "rsapub": IsRsaPub, - "minstringlength": MinStringLength, - "maxstringlength": MaxStringLength, -} - -// ParamTagRegexMap maps param tags to their respective regexes. -var ParamTagRegexMap = map[string]*regexp.Regexp{ - "range": regexp.MustCompile("^range\\((\\d+)\\|(\\d+)\\)$"), - "length": regexp.MustCompile("^length\\((\\d+)\\|(\\d+)\\)$"), - "runelength": regexp.MustCompile("^runelength\\((\\d+)\\|(\\d+)\\)$"), - "stringlength": regexp.MustCompile("^stringlength\\((\\d+)\\|(\\d+)\\)$"), - "in": regexp.MustCompile(`^in\((.*)\)`), - "matches": regexp.MustCompile(`^matches\((.+)\)$`), - "rsapub": regexp.MustCompile("^rsapub\\((\\d+)\\)$"), - "minstringlength": regexp.MustCompile("^minstringlength\\((\\d+)\\)$"), - "maxstringlength": regexp.MustCompile("^maxstringlength\\((\\d+)\\)$"), -} - -type customTypeTagMap struct { - validators map[string]CustomTypeValidator - - sync.RWMutex -} - -func (tm *customTypeTagMap) Get(name string) (CustomTypeValidator, bool) { - tm.RLock() - defer tm.RUnlock() - v, ok := tm.validators[name] - return v, ok -} - -func (tm *customTypeTagMap) Set(name string, ctv CustomTypeValidator) { - tm.Lock() - defer tm.Unlock() - tm.validators[name] = ctv -} - -// CustomTypeTagMap is a map of functions that can be used as tags for ValidateStruct function. -// Use this to validate compound or custom types that need to be handled as a whole, e.g. -// `type UUID [16]byte` (this would be handled as an array of bytes). -var CustomTypeTagMap = &customTypeTagMap{validators: make(map[string]CustomTypeValidator)} - -// TagMap is a map of functions, that can be used as tags for ValidateStruct function. -var TagMap = map[string]Validator{ - "email": IsEmail, - "url": IsURL, - "dialstring": IsDialString, - "requrl": IsRequestURL, - "requri": IsRequestURI, - "alpha": IsAlpha, - "utfletter": IsUTFLetter, - "alphanum": IsAlphanumeric, - "utfletternum": IsUTFLetterNumeric, - "numeric": IsNumeric, - "utfnumeric": IsUTFNumeric, - "utfdigit": IsUTFDigit, - "hexadecimal": IsHexadecimal, - "hexcolor": IsHexcolor, - "rgbcolor": IsRGBcolor, - "lowercase": IsLowerCase, - "uppercase": IsUpperCase, - "int": IsInt, - "float": IsFloat, - "null": IsNull, - "notnull": IsNotNull, - "uuid": IsUUID, - "uuidv3": IsUUIDv3, - "uuidv4": IsUUIDv4, - "uuidv5": IsUUIDv5, - "creditcard": IsCreditCard, - "isbn10": IsISBN10, - "isbn13": IsISBN13, - "json": IsJSON, - "multibyte": IsMultibyte, - "ascii": IsASCII, - "printableascii": IsPrintableASCII, - "fullwidth": IsFullWidth, - "halfwidth": IsHalfWidth, - "variablewidth": IsVariableWidth, - "base64": IsBase64, - "datauri": IsDataURI, - "ip": IsIP, - "port": IsPort, - "ipv4": IsIPv4, - "ipv6": IsIPv6, - "dns": IsDNSName, - "host": IsHost, - "mac": IsMAC, - "latitude": IsLatitude, - "longitude": IsLongitude, - "ssn": IsSSN, - "semver": IsSemver, - "rfc3339": IsRFC3339, - "rfc3339WithoutZone": IsRFC3339WithoutZone, - "ISO3166Alpha2": IsISO3166Alpha2, - "ISO3166Alpha3": IsISO3166Alpha3, - "ISO4217": IsISO4217, - "IMEI": IsIMEI, - "ulid": IsULID, -} - -// ISO3166Entry stores country codes -type ISO3166Entry struct { - EnglishShortName string - FrenchShortName string - Alpha2Code string - Alpha3Code string - Numeric string -} - -//ISO3166List based on https://www.iso.org/obp/ui/#search/code/ Code Type "Officially Assigned Codes" -var ISO3166List = []ISO3166Entry{ - {"Afghanistan", "Afghanistan (l')", "AF", "AFG", "004"}, - {"Albania", "Albanie (l')", "AL", "ALB", "008"}, - {"Antarctica", "Antarctique (l')", "AQ", "ATA", "010"}, - {"Algeria", "Algérie (l')", "DZ", "DZA", "012"}, - {"American Samoa", "Samoa américaines (les)", "AS", "ASM", "016"}, - {"Andorra", "Andorre (l')", "AD", "AND", "020"}, - {"Angola", "Angola (l')", "AO", "AGO", "024"}, - {"Antigua and Barbuda", "Antigua-et-Barbuda", "AG", "ATG", "028"}, - {"Azerbaijan", "Azerbaïdjan (l')", "AZ", "AZE", "031"}, - {"Argentina", "Argentine (l')", "AR", "ARG", "032"}, - {"Australia", "Australie (l')", "AU", "AUS", "036"}, - {"Austria", "Autriche (l')", "AT", "AUT", "040"}, - {"Bahamas (the)", "Bahamas (les)", "BS", "BHS", "044"}, - {"Bahrain", "Bahreïn", "BH", "BHR", "048"}, - {"Bangladesh", "Bangladesh (le)", "BD", "BGD", "050"}, - {"Armenia", "Arménie (l')", "AM", "ARM", "051"}, - {"Barbados", "Barbade (la)", "BB", "BRB", "052"}, - {"Belgium", "Belgique (la)", "BE", "BEL", "056"}, - {"Bermuda", "Bermudes (les)", "BM", "BMU", "060"}, - {"Bhutan", "Bhoutan (le)", "BT", "BTN", "064"}, - {"Bolivia (Plurinational State of)", "Bolivie (État plurinational de)", "BO", "BOL", "068"}, - {"Bosnia and Herzegovina", "Bosnie-Herzégovine (la)", "BA", "BIH", "070"}, - {"Botswana", "Botswana (le)", "BW", "BWA", "072"}, - {"Bouvet Island", "Bouvet (l'Île)", "BV", "BVT", "074"}, - {"Brazil", "Brésil (le)", "BR", "BRA", "076"}, - {"Belize", "Belize (le)", "BZ", "BLZ", "084"}, - {"British Indian Ocean Territory (the)", "Indien (le Territoire britannique de l'océan)", "IO", "IOT", "086"}, - {"Solomon Islands", "Salomon (Îles)", "SB", "SLB", "090"}, - {"Virgin Islands (British)", "Vierges britanniques (les Îles)", "VG", "VGB", "092"}, - {"Brunei Darussalam", "Brunéi Darussalam (le)", "BN", "BRN", "096"}, - {"Bulgaria", "Bulgarie (la)", "BG", "BGR", "100"}, - {"Myanmar", "Myanmar (le)", "MM", "MMR", "104"}, - {"Burundi", "Burundi (le)", "BI", "BDI", "108"}, - {"Belarus", "Bélarus (le)", "BY", "BLR", "112"}, - {"Cambodia", "Cambodge (le)", "KH", "KHM", "116"}, - {"Cameroon", "Cameroun (le)", "CM", "CMR", "120"}, - {"Canada", "Canada (le)", "CA", "CAN", "124"}, - {"Cabo Verde", "Cabo Verde", "CV", "CPV", "132"}, - {"Cayman Islands (the)", "Caïmans (les Îles)", "KY", "CYM", "136"}, - {"Central African Republic (the)", "République centrafricaine (la)", "CF", "CAF", "140"}, - {"Sri Lanka", "Sri Lanka", "LK", "LKA", "144"}, - {"Chad", "Tchad (le)", "TD", "TCD", "148"}, - {"Chile", "Chili (le)", "CL", "CHL", "152"}, - {"China", "Chine (la)", "CN", "CHN", "156"}, - {"Taiwan (Province of China)", "Taïwan (Province de Chine)", "TW", "TWN", "158"}, - {"Christmas Island", "Christmas (l'Île)", "CX", "CXR", "162"}, - {"Cocos (Keeling) Islands (the)", "Cocos (les Îles)/ Keeling (les Îles)", "CC", "CCK", "166"}, - {"Colombia", "Colombie (la)", "CO", "COL", "170"}, - {"Comoros (the)", "Comores (les)", "KM", "COM", "174"}, - {"Mayotte", "Mayotte", "YT", "MYT", "175"}, - {"Congo (the)", "Congo (le)", "CG", "COG", "178"}, - {"Congo (the Democratic Republic of the)", "Congo (la République démocratique du)", "CD", "COD", "180"}, - {"Cook Islands (the)", "Cook (les Îles)", "CK", "COK", "184"}, - {"Costa Rica", "Costa Rica (le)", "CR", "CRI", "188"}, - {"Croatia", "Croatie (la)", "HR", "HRV", "191"}, - {"Cuba", "Cuba", "CU", "CUB", "192"}, - {"Cyprus", "Chypre", "CY", "CYP", "196"}, - {"Czech Republic (the)", "tchèque (la République)", "CZ", "CZE", "203"}, - {"Benin", "Bénin (le)", "BJ", "BEN", "204"}, - {"Denmark", "Danemark (le)", "DK", "DNK", "208"}, - {"Dominica", "Dominique (la)", "DM", "DMA", "212"}, - {"Dominican Republic (the)", "dominicaine (la République)", "DO", "DOM", "214"}, - {"Ecuador", "Équateur (l')", "EC", "ECU", "218"}, - {"El Salvador", "El Salvador", "SV", "SLV", "222"}, - {"Equatorial Guinea", "Guinée équatoriale (la)", "GQ", "GNQ", "226"}, - {"Ethiopia", "Éthiopie (l')", "ET", "ETH", "231"}, - {"Eritrea", "Érythrée (l')", "ER", "ERI", "232"}, - {"Estonia", "Estonie (l')", "EE", "EST", "233"}, - {"Faroe Islands (the)", "Féroé (les Îles)", "FO", "FRO", "234"}, - {"Falkland Islands (the) [Malvinas]", "Falkland (les Îles)/Malouines (les Îles)", "FK", "FLK", "238"}, - {"South Georgia and the South Sandwich Islands", "Géorgie du Sud-et-les Îles Sandwich du Sud (la)", "GS", "SGS", "239"}, - {"Fiji", "Fidji (les)", "FJ", "FJI", "242"}, - {"Finland", "Finlande (la)", "FI", "FIN", "246"}, - {"Åland Islands", "Åland(les Îles)", "AX", "ALA", "248"}, - {"France", "France (la)", "FR", "FRA", "250"}, - {"French Guiana", "Guyane française (la )", "GF", "GUF", "254"}, - {"French Polynesia", "Polynésie française (la)", "PF", "PYF", "258"}, - {"French Southern Territories (the)", "Terres australes françaises (les)", "TF", "ATF", "260"}, - {"Djibouti", "Djibouti", "DJ", "DJI", "262"}, - {"Gabon", "Gabon (le)", "GA", "GAB", "266"}, - {"Georgia", "Géorgie (la)", "GE", "GEO", "268"}, - {"Gambia (the)", "Gambie (la)", "GM", "GMB", "270"}, - {"Palestine, State of", "Palestine, État de", "PS", "PSE", "275"}, - {"Germany", "Allemagne (l')", "DE", "DEU", "276"}, - {"Ghana", "Ghana (le)", "GH", "GHA", "288"}, - {"Gibraltar", "Gibraltar", "GI", "GIB", "292"}, - {"Kiribati", "Kiribati", "KI", "KIR", "296"}, - {"Greece", "Grèce (la)", "GR", "GRC", "300"}, - {"Greenland", "Groenland (le)", "GL", "GRL", "304"}, - {"Grenada", "Grenade (la)", "GD", "GRD", "308"}, - {"Guadeloupe", "Guadeloupe (la)", "GP", "GLP", "312"}, - {"Guam", "Guam", "GU", "GUM", "316"}, - {"Guatemala", "Guatemala (le)", "GT", "GTM", "320"}, - {"Guinea", "Guinée (la)", "GN", "GIN", "324"}, - {"Guyana", "Guyana (le)", "GY", "GUY", "328"}, - {"Haiti", "Haïti", "HT", "HTI", "332"}, - {"Heard Island and McDonald Islands", "Heard-et-Îles MacDonald (l'Île)", "HM", "HMD", "334"}, - {"Holy See (the)", "Saint-Siège (le)", "VA", "VAT", "336"}, - {"Honduras", "Honduras (le)", "HN", "HND", "340"}, - {"Hong Kong", "Hong Kong", "HK", "HKG", "344"}, - {"Hungary", "Hongrie (la)", "HU", "HUN", "348"}, - {"Iceland", "Islande (l')", "IS", "ISL", "352"}, - {"India", "Inde (l')", "IN", "IND", "356"}, - {"Indonesia", "Indonésie (l')", "ID", "IDN", "360"}, - {"Iran (Islamic Republic of)", "Iran (République Islamique d')", "IR", "IRN", "364"}, - {"Iraq", "Iraq (l')", "IQ", "IRQ", "368"}, - {"Ireland", "Irlande (l')", "IE", "IRL", "372"}, - {"Israel", "Israël", "IL", "ISR", "376"}, - {"Italy", "Italie (l')", "IT", "ITA", "380"}, - {"Côte d'Ivoire", "Côte d'Ivoire (la)", "CI", "CIV", "384"}, - {"Jamaica", "Jamaïque (la)", "JM", "JAM", "388"}, - {"Japan", "Japon (le)", "JP", "JPN", "392"}, - {"Kazakhstan", "Kazakhstan (le)", "KZ", "KAZ", "398"}, - {"Jordan", "Jordanie (la)", "JO", "JOR", "400"}, - {"Kenya", "Kenya (le)", "KE", "KEN", "404"}, - {"Korea (the Democratic People's Republic of)", "Corée (la République populaire démocratique de)", "KP", "PRK", "408"}, - {"Korea (the Republic of)", "Corée (la République de)", "KR", "KOR", "410"}, - {"Kuwait", "Koweït (le)", "KW", "KWT", "414"}, - {"Kyrgyzstan", "Kirghizistan (le)", "KG", "KGZ", "417"}, - {"Lao People's Democratic Republic (the)", "Lao, République démocratique populaire", "LA", "LAO", "418"}, - {"Lebanon", "Liban (le)", "LB", "LBN", "422"}, - {"Lesotho", "Lesotho (le)", "LS", "LSO", "426"}, - {"Latvia", "Lettonie (la)", "LV", "LVA", "428"}, - {"Liberia", "Libéria (le)", "LR", "LBR", "430"}, - {"Libya", "Libye (la)", "LY", "LBY", "434"}, - {"Liechtenstein", "Liechtenstein (le)", "LI", "LIE", "438"}, - {"Lithuania", "Lituanie (la)", "LT", "LTU", "440"}, - {"Luxembourg", "Luxembourg (le)", "LU", "LUX", "442"}, - {"Macao", "Macao", "MO", "MAC", "446"}, - {"Madagascar", "Madagascar", "MG", "MDG", "450"}, - {"Malawi", "Malawi (le)", "MW", "MWI", "454"}, - {"Malaysia", "Malaisie (la)", "MY", "MYS", "458"}, - {"Maldives", "Maldives (les)", "MV", "MDV", "462"}, - {"Mali", "Mali (le)", "ML", "MLI", "466"}, - {"Malta", "Malte", "MT", "MLT", "470"}, - {"Martinique", "Martinique (la)", "MQ", "MTQ", "474"}, - {"Mauritania", "Mauritanie (la)", "MR", "MRT", "478"}, - {"Mauritius", "Maurice", "MU", "MUS", "480"}, - {"Mexico", "Mexique (le)", "MX", "MEX", "484"}, - {"Monaco", "Monaco", "MC", "MCO", "492"}, - {"Mongolia", "Mongolie (la)", "MN", "MNG", "496"}, - {"Moldova (the Republic of)", "Moldova , République de", "MD", "MDA", "498"}, - {"Montenegro", "Monténégro (le)", "ME", "MNE", "499"}, - {"Montserrat", "Montserrat", "MS", "MSR", "500"}, - {"Morocco", "Maroc (le)", "MA", "MAR", "504"}, - {"Mozambique", "Mozambique (le)", "MZ", "MOZ", "508"}, - {"Oman", "Oman", "OM", "OMN", "512"}, - {"Namibia", "Namibie (la)", "NA", "NAM", "516"}, - {"Nauru", "Nauru", "NR", "NRU", "520"}, - {"Nepal", "Népal (le)", "NP", "NPL", "524"}, - {"Netherlands (the)", "Pays-Bas (les)", "NL", "NLD", "528"}, - {"Curaçao", "Curaçao", "CW", "CUW", "531"}, - {"Aruba", "Aruba", "AW", "ABW", "533"}, - {"Sint Maarten (Dutch part)", "Saint-Martin (partie néerlandaise)", "SX", "SXM", "534"}, - {"Bonaire, Sint Eustatius and Saba", "Bonaire, Saint-Eustache et Saba", "BQ", "BES", "535"}, - {"New Caledonia", "Nouvelle-Calédonie (la)", "NC", "NCL", "540"}, - {"Vanuatu", "Vanuatu (le)", "VU", "VUT", "548"}, - {"New Zealand", "Nouvelle-Zélande (la)", "NZ", "NZL", "554"}, - {"Nicaragua", "Nicaragua (le)", "NI", "NIC", "558"}, - {"Niger (the)", "Niger (le)", "NE", "NER", "562"}, - {"Nigeria", "Nigéria (le)", "NG", "NGA", "566"}, - {"Niue", "Niue", "NU", "NIU", "570"}, - {"Norfolk Island", "Norfolk (l'Île)", "NF", "NFK", "574"}, - {"Norway", "Norvège (la)", "NO", "NOR", "578"}, - {"Northern Mariana Islands (the)", "Mariannes du Nord (les Îles)", "MP", "MNP", "580"}, - {"United States Minor Outlying Islands (the)", "Îles mineures éloignées des États-Unis (les)", "UM", "UMI", "581"}, - {"Micronesia (Federated States of)", "Micronésie (États fédérés de)", "FM", "FSM", "583"}, - {"Marshall Islands (the)", "Marshall (Îles)", "MH", "MHL", "584"}, - {"Palau", "Palaos (les)", "PW", "PLW", "585"}, - {"Pakistan", "Pakistan (le)", "PK", "PAK", "586"}, - {"Panama", "Panama (le)", "PA", "PAN", "591"}, - {"Papua New Guinea", "Papouasie-Nouvelle-Guinée (la)", "PG", "PNG", "598"}, - {"Paraguay", "Paraguay (le)", "PY", "PRY", "600"}, - {"Peru", "Pérou (le)", "PE", "PER", "604"}, - {"Philippines (the)", "Philippines (les)", "PH", "PHL", "608"}, - {"Pitcairn", "Pitcairn", "PN", "PCN", "612"}, - {"Poland", "Pologne (la)", "PL", "POL", "616"}, - {"Portugal", "Portugal (le)", "PT", "PRT", "620"}, - {"Guinea-Bissau", "Guinée-Bissau (la)", "GW", "GNB", "624"}, - {"Timor-Leste", "Timor-Leste (le)", "TL", "TLS", "626"}, - {"Puerto Rico", "Porto Rico", "PR", "PRI", "630"}, - {"Qatar", "Qatar (le)", "QA", "QAT", "634"}, - {"Réunion", "Réunion (La)", "RE", "REU", "638"}, - {"Romania", "Roumanie (la)", "RO", "ROU", "642"}, - {"Russian Federation (the)", "Russie (la Fédération de)", "RU", "RUS", "643"}, - {"Rwanda", "Rwanda (le)", "RW", "RWA", "646"}, - {"Saint Barthélemy", "Saint-Barthélemy", "BL", "BLM", "652"}, - {"Saint Helena, Ascension and Tristan da Cunha", "Sainte-Hélène, Ascension et Tristan da Cunha", "SH", "SHN", "654"}, - {"Saint Kitts and Nevis", "Saint-Kitts-et-Nevis", "KN", "KNA", "659"}, - {"Anguilla", "Anguilla", "AI", "AIA", "660"}, - {"Saint Lucia", "Sainte-Lucie", "LC", "LCA", "662"}, - {"Saint Martin (French part)", "Saint-Martin (partie française)", "MF", "MAF", "663"}, - {"Saint Pierre and Miquelon", "Saint-Pierre-et-Miquelon", "PM", "SPM", "666"}, - {"Saint Vincent and the Grenadines", "Saint-Vincent-et-les Grenadines", "VC", "VCT", "670"}, - {"San Marino", "Saint-Marin", "SM", "SMR", "674"}, - {"Sao Tome and Principe", "Sao Tomé-et-Principe", "ST", "STP", "678"}, - {"Saudi Arabia", "Arabie saoudite (l')", "SA", "SAU", "682"}, - {"Senegal", "Sénégal (le)", "SN", "SEN", "686"}, - {"Serbia", "Serbie (la)", "RS", "SRB", "688"}, - {"Seychelles", "Seychelles (les)", "SC", "SYC", "690"}, - {"Sierra Leone", "Sierra Leone (la)", "SL", "SLE", "694"}, - {"Singapore", "Singapour", "SG", "SGP", "702"}, - {"Slovakia", "Slovaquie (la)", "SK", "SVK", "703"}, - {"Viet Nam", "Viet Nam (le)", "VN", "VNM", "704"}, - {"Slovenia", "Slovénie (la)", "SI", "SVN", "705"}, - {"Somalia", "Somalie (la)", "SO", "SOM", "706"}, - {"South Africa", "Afrique du Sud (l')", "ZA", "ZAF", "710"}, - {"Zimbabwe", "Zimbabwe (le)", "ZW", "ZWE", "716"}, - {"Spain", "Espagne (l')", "ES", "ESP", "724"}, - {"South Sudan", "Soudan du Sud (le)", "SS", "SSD", "728"}, - {"Sudan (the)", "Soudan (le)", "SD", "SDN", "729"}, - {"Western Sahara*", "Sahara occidental (le)*", "EH", "ESH", "732"}, - {"Suriname", "Suriname (le)", "SR", "SUR", "740"}, - {"Svalbard and Jan Mayen", "Svalbard et l'Île Jan Mayen (le)", "SJ", "SJM", "744"}, - {"Swaziland", "Swaziland (le)", "SZ", "SWZ", "748"}, - {"Sweden", "Suède (la)", "SE", "SWE", "752"}, - {"Switzerland", "Suisse (la)", "CH", "CHE", "756"}, - {"Syrian Arab Republic", "République arabe syrienne (la)", "SY", "SYR", "760"}, - {"Tajikistan", "Tadjikistan (le)", "TJ", "TJK", "762"}, - {"Thailand", "Thaïlande (la)", "TH", "THA", "764"}, - {"Togo", "Togo (le)", "TG", "TGO", "768"}, - {"Tokelau", "Tokelau (les)", "TK", "TKL", "772"}, - {"Tonga", "Tonga (les)", "TO", "TON", "776"}, - {"Trinidad and Tobago", "Trinité-et-Tobago (la)", "TT", "TTO", "780"}, - {"United Arab Emirates (the)", "Émirats arabes unis (les)", "AE", "ARE", "784"}, - {"Tunisia", "Tunisie (la)", "TN", "TUN", "788"}, - {"Turkey", "Turquie (la)", "TR", "TUR", "792"}, - {"Turkmenistan", "Turkménistan (le)", "TM", "TKM", "795"}, - {"Turks and Caicos Islands (the)", "Turks-et-Caïcos (les Îles)", "TC", "TCA", "796"}, - {"Tuvalu", "Tuvalu (les)", "TV", "TUV", "798"}, - {"Uganda", "Ouganda (l')", "UG", "UGA", "800"}, - {"Ukraine", "Ukraine (l')", "UA", "UKR", "804"}, - {"Macedonia (the former Yugoslav Republic of)", "Macédoine (l'ex‑République yougoslave de)", "MK", "MKD", "807"}, - {"Egypt", "Égypte (l')", "EG", "EGY", "818"}, - {"United Kingdom of Great Britain and Northern Ireland (the)", "Royaume-Uni de Grande-Bretagne et d'Irlande du Nord (le)", "GB", "GBR", "826"}, - {"Guernsey", "Guernesey", "GG", "GGY", "831"}, - {"Jersey", "Jersey", "JE", "JEY", "832"}, - {"Isle of Man", "Île de Man", "IM", "IMN", "833"}, - {"Tanzania, United Republic of", "Tanzanie, République-Unie de", "TZ", "TZA", "834"}, - {"United States of America (the)", "États-Unis d'Amérique (les)", "US", "USA", "840"}, - {"Virgin Islands (U.S.)", "Vierges des États-Unis (les Îles)", "VI", "VIR", "850"}, - {"Burkina Faso", "Burkina Faso (le)", "BF", "BFA", "854"}, - {"Uruguay", "Uruguay (l')", "UY", "URY", "858"}, - {"Uzbekistan", "Ouzbékistan (l')", "UZ", "UZB", "860"}, - {"Venezuela (Bolivarian Republic of)", "Venezuela (République bolivarienne du)", "VE", "VEN", "862"}, - {"Wallis and Futuna", "Wallis-et-Futuna", "WF", "WLF", "876"}, - {"Samoa", "Samoa (le)", "WS", "WSM", "882"}, - {"Yemen", "Yémen (le)", "YE", "YEM", "887"}, - {"Zambia", "Zambie (la)", "ZM", "ZMB", "894"}, -} - -// ISO4217List is the list of ISO currency codes -var ISO4217List = []string{ - "AED", "AFN", "ALL", "AMD", "ANG", "AOA", "ARS", "AUD", "AWG", "AZN", - "BAM", "BBD", "BDT", "BGN", "BHD", "BIF", "BMD", "BND", "BOB", "BOV", "BRL", "BSD", "BTN", "BWP", "BYN", "BZD", - "CAD", "CDF", "CHE", "CHF", "CHW", "CLF", "CLP", "CNY", "COP", "COU", "CRC", "CUC", "CUP", "CVE", "CZK", - "DJF", "DKK", "DOP", "DZD", - "EGP", "ERN", "ETB", "EUR", - "FJD", "FKP", - "GBP", "GEL", "GHS", "GIP", "GMD", "GNF", "GTQ", "GYD", - "HKD", "HNL", "HRK", "HTG", "HUF", - "IDR", "ILS", "INR", "IQD", "IRR", "ISK", - "JMD", "JOD", "JPY", - "KES", "KGS", "KHR", "KMF", "KPW", "KRW", "KWD", "KYD", "KZT", - "LAK", "LBP", "LKR", "LRD", "LSL", "LYD", - "MAD", "MDL", "MGA", "MKD", "MMK", "MNT", "MOP", "MRO", "MUR", "MVR", "MWK", "MXN", "MXV", "MYR", "MZN", - "NAD", "NGN", "NIO", "NOK", "NPR", "NZD", - "OMR", - "PAB", "PEN", "PGK", "PHP", "PKR", "PLN", "PYG", - "QAR", - "RON", "RSD", "RUB", "RWF", - "SAR", "SBD", "SCR", "SDG", "SEK", "SGD", "SHP", "SLL", "SOS", "SRD", "SSP", "STD", "STN", "SVC", "SYP", "SZL", - "THB", "TJS", "TMT", "TND", "TOP", "TRY", "TTD", "TWD", "TZS", - "UAH", "UGX", "USD", "USN", "UYI", "UYU", "UYW", "UZS", - "VEF", "VES", "VND", "VUV", - "WST", - "XAF", "XAG", "XAU", "XBA", "XBB", "XBC", "XBD", "XCD", "XDR", "XOF", "XPD", "XPF", "XPT", "XSU", "XTS", "XUA", "XXX", - "YER", - "ZAR", "ZMW", "ZWL", -} - -// ISO693Entry stores ISO language codes -type ISO693Entry struct { - Alpha3bCode string - Alpha2Code string - English string -} - -//ISO693List based on http://data.okfn.org/data/core/language-codes/r/language-codes-3b2.json -var ISO693List = []ISO693Entry{ - {Alpha3bCode: "aar", Alpha2Code: "aa", English: "Afar"}, - {Alpha3bCode: "abk", Alpha2Code: "ab", English: "Abkhazian"}, - {Alpha3bCode: "afr", Alpha2Code: "af", English: "Afrikaans"}, - {Alpha3bCode: "aka", Alpha2Code: "ak", English: "Akan"}, - {Alpha3bCode: "alb", Alpha2Code: "sq", English: "Albanian"}, - {Alpha3bCode: "amh", Alpha2Code: "am", English: "Amharic"}, - {Alpha3bCode: "ara", Alpha2Code: "ar", English: "Arabic"}, - {Alpha3bCode: "arg", Alpha2Code: "an", English: "Aragonese"}, - {Alpha3bCode: "arm", Alpha2Code: "hy", English: "Armenian"}, - {Alpha3bCode: "asm", Alpha2Code: "as", English: "Assamese"}, - {Alpha3bCode: "ava", Alpha2Code: "av", English: "Avaric"}, - {Alpha3bCode: "ave", Alpha2Code: "ae", English: "Avestan"}, - {Alpha3bCode: "aym", Alpha2Code: "ay", English: "Aymara"}, - {Alpha3bCode: "aze", Alpha2Code: "az", English: "Azerbaijani"}, - {Alpha3bCode: "bak", Alpha2Code: "ba", English: "Bashkir"}, - {Alpha3bCode: "bam", Alpha2Code: "bm", English: "Bambara"}, - {Alpha3bCode: "baq", Alpha2Code: "eu", English: "Basque"}, - {Alpha3bCode: "bel", Alpha2Code: "be", English: "Belarusian"}, - {Alpha3bCode: "ben", Alpha2Code: "bn", English: "Bengali"}, - {Alpha3bCode: "bih", Alpha2Code: "bh", English: "Bihari languages"}, - {Alpha3bCode: "bis", Alpha2Code: "bi", English: "Bislama"}, - {Alpha3bCode: "bos", Alpha2Code: "bs", English: "Bosnian"}, - {Alpha3bCode: "bre", Alpha2Code: "br", English: "Breton"}, - {Alpha3bCode: "bul", Alpha2Code: "bg", English: "Bulgarian"}, - {Alpha3bCode: "bur", Alpha2Code: "my", English: "Burmese"}, - {Alpha3bCode: "cat", Alpha2Code: "ca", English: "Catalan; Valencian"}, - {Alpha3bCode: "cha", Alpha2Code: "ch", English: "Chamorro"}, - {Alpha3bCode: "che", Alpha2Code: "ce", English: "Chechen"}, - {Alpha3bCode: "chi", Alpha2Code: "zh", English: "Chinese"}, - {Alpha3bCode: "chu", Alpha2Code: "cu", English: "Church Slavic; Old Slavonic; Church Slavonic; Old Bulgarian; Old Church Slavonic"}, - {Alpha3bCode: "chv", Alpha2Code: "cv", English: "Chuvash"}, - {Alpha3bCode: "cor", Alpha2Code: "kw", English: "Cornish"}, - {Alpha3bCode: "cos", Alpha2Code: "co", English: "Corsican"}, - {Alpha3bCode: "cre", Alpha2Code: "cr", English: "Cree"}, - {Alpha3bCode: "cze", Alpha2Code: "cs", English: "Czech"}, - {Alpha3bCode: "dan", Alpha2Code: "da", English: "Danish"}, - {Alpha3bCode: "div", Alpha2Code: "dv", English: "Divehi; Dhivehi; Maldivian"}, - {Alpha3bCode: "dut", Alpha2Code: "nl", English: "Dutch; Flemish"}, - {Alpha3bCode: "dzo", Alpha2Code: "dz", English: "Dzongkha"}, - {Alpha3bCode: "eng", Alpha2Code: "en", English: "English"}, - {Alpha3bCode: "epo", Alpha2Code: "eo", English: "Esperanto"}, - {Alpha3bCode: "est", Alpha2Code: "et", English: "Estonian"}, - {Alpha3bCode: "ewe", Alpha2Code: "ee", English: "Ewe"}, - {Alpha3bCode: "fao", Alpha2Code: "fo", English: "Faroese"}, - {Alpha3bCode: "fij", Alpha2Code: "fj", English: "Fijian"}, - {Alpha3bCode: "fin", Alpha2Code: "fi", English: "Finnish"}, - {Alpha3bCode: "fre", Alpha2Code: "fr", English: "French"}, - {Alpha3bCode: "fry", Alpha2Code: "fy", English: "Western Frisian"}, - {Alpha3bCode: "ful", Alpha2Code: "ff", English: "Fulah"}, - {Alpha3bCode: "geo", Alpha2Code: "ka", English: "Georgian"}, - {Alpha3bCode: "ger", Alpha2Code: "de", English: "German"}, - {Alpha3bCode: "gla", Alpha2Code: "gd", English: "Gaelic; Scottish Gaelic"}, - {Alpha3bCode: "gle", Alpha2Code: "ga", English: "Irish"}, - {Alpha3bCode: "glg", Alpha2Code: "gl", English: "Galician"}, - {Alpha3bCode: "glv", Alpha2Code: "gv", English: "Manx"}, - {Alpha3bCode: "gre", Alpha2Code: "el", English: "Greek, Modern (1453-)"}, - {Alpha3bCode: "grn", Alpha2Code: "gn", English: "Guarani"}, - {Alpha3bCode: "guj", Alpha2Code: "gu", English: "Gujarati"}, - {Alpha3bCode: "hat", Alpha2Code: "ht", English: "Haitian; Haitian Creole"}, - {Alpha3bCode: "hau", Alpha2Code: "ha", English: "Hausa"}, - {Alpha3bCode: "heb", Alpha2Code: "he", English: "Hebrew"}, - {Alpha3bCode: "her", Alpha2Code: "hz", English: "Herero"}, - {Alpha3bCode: "hin", Alpha2Code: "hi", English: "Hindi"}, - {Alpha3bCode: "hmo", Alpha2Code: "ho", English: "Hiri Motu"}, - {Alpha3bCode: "hrv", Alpha2Code: "hr", English: "Croatian"}, - {Alpha3bCode: "hun", Alpha2Code: "hu", English: "Hungarian"}, - {Alpha3bCode: "ibo", Alpha2Code: "ig", English: "Igbo"}, - {Alpha3bCode: "ice", Alpha2Code: "is", English: "Icelandic"}, - {Alpha3bCode: "ido", Alpha2Code: "io", English: "Ido"}, - {Alpha3bCode: "iii", Alpha2Code: "ii", English: "Sichuan Yi; Nuosu"}, - {Alpha3bCode: "iku", Alpha2Code: "iu", English: "Inuktitut"}, - {Alpha3bCode: "ile", Alpha2Code: "ie", English: "Interlingue; Occidental"}, - {Alpha3bCode: "ina", Alpha2Code: "ia", English: "Interlingua (International Auxiliary Language Association)"}, - {Alpha3bCode: "ind", Alpha2Code: "id", English: "Indonesian"}, - {Alpha3bCode: "ipk", Alpha2Code: "ik", English: "Inupiaq"}, - {Alpha3bCode: "ita", Alpha2Code: "it", English: "Italian"}, - {Alpha3bCode: "jav", Alpha2Code: "jv", English: "Javanese"}, - {Alpha3bCode: "jpn", Alpha2Code: "ja", English: "Japanese"}, - {Alpha3bCode: "kal", Alpha2Code: "kl", English: "Kalaallisut; Greenlandic"}, - {Alpha3bCode: "kan", Alpha2Code: "kn", English: "Kannada"}, - {Alpha3bCode: "kas", Alpha2Code: "ks", English: "Kashmiri"}, - {Alpha3bCode: "kau", Alpha2Code: "kr", English: "Kanuri"}, - {Alpha3bCode: "kaz", Alpha2Code: "kk", English: "Kazakh"}, - {Alpha3bCode: "khm", Alpha2Code: "km", English: "Central Khmer"}, - {Alpha3bCode: "kik", Alpha2Code: "ki", English: "Kikuyu; Gikuyu"}, - {Alpha3bCode: "kin", Alpha2Code: "rw", English: "Kinyarwanda"}, - {Alpha3bCode: "kir", Alpha2Code: "ky", English: "Kirghiz; Kyrgyz"}, - {Alpha3bCode: "kom", Alpha2Code: "kv", English: "Komi"}, - {Alpha3bCode: "kon", Alpha2Code: "kg", English: "Kongo"}, - {Alpha3bCode: "kor", Alpha2Code: "ko", English: "Korean"}, - {Alpha3bCode: "kua", Alpha2Code: "kj", English: "Kuanyama; Kwanyama"}, - {Alpha3bCode: "kur", Alpha2Code: "ku", English: "Kurdish"}, - {Alpha3bCode: "lao", Alpha2Code: "lo", English: "Lao"}, - {Alpha3bCode: "lat", Alpha2Code: "la", English: "Latin"}, - {Alpha3bCode: "lav", Alpha2Code: "lv", English: "Latvian"}, - {Alpha3bCode: "lim", Alpha2Code: "li", English: "Limburgan; Limburger; Limburgish"}, - {Alpha3bCode: "lin", Alpha2Code: "ln", English: "Lingala"}, - {Alpha3bCode: "lit", Alpha2Code: "lt", English: "Lithuanian"}, - {Alpha3bCode: "ltz", Alpha2Code: "lb", English: "Luxembourgish; Letzeburgesch"}, - {Alpha3bCode: "lub", Alpha2Code: "lu", English: "Luba-Katanga"}, - {Alpha3bCode: "lug", Alpha2Code: "lg", English: "Ganda"}, - {Alpha3bCode: "mac", Alpha2Code: "mk", English: "Macedonian"}, - {Alpha3bCode: "mah", Alpha2Code: "mh", English: "Marshallese"}, - {Alpha3bCode: "mal", Alpha2Code: "ml", English: "Malayalam"}, - {Alpha3bCode: "mao", Alpha2Code: "mi", English: "Maori"}, - {Alpha3bCode: "mar", Alpha2Code: "mr", English: "Marathi"}, - {Alpha3bCode: "may", Alpha2Code: "ms", English: "Malay"}, - {Alpha3bCode: "mlg", Alpha2Code: "mg", English: "Malagasy"}, - {Alpha3bCode: "mlt", Alpha2Code: "mt", English: "Maltese"}, - {Alpha3bCode: "mon", Alpha2Code: "mn", English: "Mongolian"}, - {Alpha3bCode: "nau", Alpha2Code: "na", English: "Nauru"}, - {Alpha3bCode: "nav", Alpha2Code: "nv", English: "Navajo; Navaho"}, - {Alpha3bCode: "nbl", Alpha2Code: "nr", English: "Ndebele, South; South Ndebele"}, - {Alpha3bCode: "nde", Alpha2Code: "nd", English: "Ndebele, North; North Ndebele"}, - {Alpha3bCode: "ndo", Alpha2Code: "ng", English: "Ndonga"}, - {Alpha3bCode: "nep", Alpha2Code: "ne", English: "Nepali"}, - {Alpha3bCode: "nno", Alpha2Code: "nn", English: "Norwegian Nynorsk; Nynorsk, Norwegian"}, - {Alpha3bCode: "nob", Alpha2Code: "nb", English: "Bokmål, Norwegian; Norwegian Bokmål"}, - {Alpha3bCode: "nor", Alpha2Code: "no", English: "Norwegian"}, - {Alpha3bCode: "nya", Alpha2Code: "ny", English: "Chichewa; Chewa; Nyanja"}, - {Alpha3bCode: "oci", Alpha2Code: "oc", English: "Occitan (post 1500); Provençal"}, - {Alpha3bCode: "oji", Alpha2Code: "oj", English: "Ojibwa"}, - {Alpha3bCode: "ori", Alpha2Code: "or", English: "Oriya"}, - {Alpha3bCode: "orm", Alpha2Code: "om", English: "Oromo"}, - {Alpha3bCode: "oss", Alpha2Code: "os", English: "Ossetian; Ossetic"}, - {Alpha3bCode: "pan", Alpha2Code: "pa", English: "Panjabi; Punjabi"}, - {Alpha3bCode: "per", Alpha2Code: "fa", English: "Persian"}, - {Alpha3bCode: "pli", Alpha2Code: "pi", English: "Pali"}, - {Alpha3bCode: "pol", Alpha2Code: "pl", English: "Polish"}, - {Alpha3bCode: "por", Alpha2Code: "pt", English: "Portuguese"}, - {Alpha3bCode: "pus", Alpha2Code: "ps", English: "Pushto; Pashto"}, - {Alpha3bCode: "que", Alpha2Code: "qu", English: "Quechua"}, - {Alpha3bCode: "roh", Alpha2Code: "rm", English: "Romansh"}, - {Alpha3bCode: "rum", Alpha2Code: "ro", English: "Romanian; Moldavian; Moldovan"}, - {Alpha3bCode: "run", Alpha2Code: "rn", English: "Rundi"}, - {Alpha3bCode: "rus", Alpha2Code: "ru", English: "Russian"}, - {Alpha3bCode: "sag", Alpha2Code: "sg", English: "Sango"}, - {Alpha3bCode: "san", Alpha2Code: "sa", English: "Sanskrit"}, - {Alpha3bCode: "sin", Alpha2Code: "si", English: "Sinhala; Sinhalese"}, - {Alpha3bCode: "slo", Alpha2Code: "sk", English: "Slovak"}, - {Alpha3bCode: "slv", Alpha2Code: "sl", English: "Slovenian"}, - {Alpha3bCode: "sme", Alpha2Code: "se", English: "Northern Sami"}, - {Alpha3bCode: "smo", Alpha2Code: "sm", English: "Samoan"}, - {Alpha3bCode: "sna", Alpha2Code: "sn", English: "Shona"}, - {Alpha3bCode: "snd", Alpha2Code: "sd", English: "Sindhi"}, - {Alpha3bCode: "som", Alpha2Code: "so", English: "Somali"}, - {Alpha3bCode: "sot", Alpha2Code: "st", English: "Sotho, Southern"}, - {Alpha3bCode: "spa", Alpha2Code: "es", English: "Spanish; Castilian"}, - {Alpha3bCode: "srd", Alpha2Code: "sc", English: "Sardinian"}, - {Alpha3bCode: "srp", Alpha2Code: "sr", English: "Serbian"}, - {Alpha3bCode: "ssw", Alpha2Code: "ss", English: "Swati"}, - {Alpha3bCode: "sun", Alpha2Code: "su", English: "Sundanese"}, - {Alpha3bCode: "swa", Alpha2Code: "sw", English: "Swahili"}, - {Alpha3bCode: "swe", Alpha2Code: "sv", English: "Swedish"}, - {Alpha3bCode: "tah", Alpha2Code: "ty", English: "Tahitian"}, - {Alpha3bCode: "tam", Alpha2Code: "ta", English: "Tamil"}, - {Alpha3bCode: "tat", Alpha2Code: "tt", English: "Tatar"}, - {Alpha3bCode: "tel", Alpha2Code: "te", English: "Telugu"}, - {Alpha3bCode: "tgk", Alpha2Code: "tg", English: "Tajik"}, - {Alpha3bCode: "tgl", Alpha2Code: "tl", English: "Tagalog"}, - {Alpha3bCode: "tha", Alpha2Code: "th", English: "Thai"}, - {Alpha3bCode: "tib", Alpha2Code: "bo", English: "Tibetan"}, - {Alpha3bCode: "tir", Alpha2Code: "ti", English: "Tigrinya"}, - {Alpha3bCode: "ton", Alpha2Code: "to", English: "Tonga (Tonga Islands)"}, - {Alpha3bCode: "tsn", Alpha2Code: "tn", English: "Tswana"}, - {Alpha3bCode: "tso", Alpha2Code: "ts", English: "Tsonga"}, - {Alpha3bCode: "tuk", Alpha2Code: "tk", English: "Turkmen"}, - {Alpha3bCode: "tur", Alpha2Code: "tr", English: "Turkish"}, - {Alpha3bCode: "twi", Alpha2Code: "tw", English: "Twi"}, - {Alpha3bCode: "uig", Alpha2Code: "ug", English: "Uighur; Uyghur"}, - {Alpha3bCode: "ukr", Alpha2Code: "uk", English: "Ukrainian"}, - {Alpha3bCode: "urd", Alpha2Code: "ur", English: "Urdu"}, - {Alpha3bCode: "uzb", Alpha2Code: "uz", English: "Uzbek"}, - {Alpha3bCode: "ven", Alpha2Code: "ve", English: "Venda"}, - {Alpha3bCode: "vie", Alpha2Code: "vi", English: "Vietnamese"}, - {Alpha3bCode: "vol", Alpha2Code: "vo", English: "Volapük"}, - {Alpha3bCode: "wel", Alpha2Code: "cy", English: "Welsh"}, - {Alpha3bCode: "wln", Alpha2Code: "wa", English: "Walloon"}, - {Alpha3bCode: "wol", Alpha2Code: "wo", English: "Wolof"}, - {Alpha3bCode: "xho", Alpha2Code: "xh", English: "Xhosa"}, - {Alpha3bCode: "yid", Alpha2Code: "yi", English: "Yiddish"}, - {Alpha3bCode: "yor", Alpha2Code: "yo", English: "Yoruba"}, - {Alpha3bCode: "zha", Alpha2Code: "za", English: "Zhuang; Chuang"}, - {Alpha3bCode: "zul", Alpha2Code: "zu", English: "Zulu"}, -} diff --git a/vendor/github.com/asaskevich/govalidator/utils.go b/vendor/github.com/asaskevich/govalidator/utils.go deleted file mode 100644 index f4c30f824a2..00000000000 --- a/vendor/github.com/asaskevich/govalidator/utils.go +++ /dev/null @@ -1,270 +0,0 @@ -package govalidator - -import ( - "errors" - "fmt" - "html" - "math" - "path" - "regexp" - "strings" - "unicode" - "unicode/utf8" -) - -// Contains checks if the string contains the substring. -func Contains(str, substring string) bool { - return strings.Contains(str, substring) -} - -// Matches checks if string matches the pattern (pattern is regular expression) -// In case of error return false -func Matches(str, pattern string) bool { - match, _ := regexp.MatchString(pattern, str) - return match -} - -// LeftTrim trims characters from the left side of the input. -// If second argument is empty, it will remove leading spaces. -func LeftTrim(str, chars string) string { - if chars == "" { - return strings.TrimLeftFunc(str, unicode.IsSpace) - } - r, _ := regexp.Compile("^[" + chars + "]+") - return r.ReplaceAllString(str, "") -} - -// RightTrim trims characters from the right side of the input. -// If second argument is empty, it will remove trailing spaces. -func RightTrim(str, chars string) string { - if chars == "" { - return strings.TrimRightFunc(str, unicode.IsSpace) - } - r, _ := regexp.Compile("[" + chars + "]+$") - return r.ReplaceAllString(str, "") -} - -// Trim trims characters from both sides of the input. -// If second argument is empty, it will remove spaces. -func Trim(str, chars string) string { - return LeftTrim(RightTrim(str, chars), chars) -} - -// WhiteList removes characters that do not appear in the whitelist. -func WhiteList(str, chars string) string { - pattern := "[^" + chars + "]+" - r, _ := regexp.Compile(pattern) - return r.ReplaceAllString(str, "") -} - -// BlackList removes characters that appear in the blacklist. -func BlackList(str, chars string) string { - pattern := "[" + chars + "]+" - r, _ := regexp.Compile(pattern) - return r.ReplaceAllString(str, "") -} - -// StripLow removes characters with a numerical value < 32 and 127, mostly control characters. -// If keep_new_lines is true, newline characters are preserved (\n and \r, hex 0xA and 0xD). -func StripLow(str string, keepNewLines bool) string { - chars := "" - if keepNewLines { - chars = "\x00-\x09\x0B\x0C\x0E-\x1F\x7F" - } else { - chars = "\x00-\x1F\x7F" - } - return BlackList(str, chars) -} - -// ReplacePattern replaces regular expression pattern in string -func ReplacePattern(str, pattern, replace string) string { - r, _ := regexp.Compile(pattern) - return r.ReplaceAllString(str, replace) -} - -// Escape replaces <, >, & and " with HTML entities. -var Escape = html.EscapeString - -func addSegment(inrune, segment []rune) []rune { - if len(segment) == 0 { - return inrune - } - if len(inrune) != 0 { - inrune = append(inrune, '_') - } - inrune = append(inrune, segment...) - return inrune -} - -// UnderscoreToCamelCase converts from underscore separated form to camel case form. -// Ex.: my_func => MyFunc -func UnderscoreToCamelCase(s string) string { - return strings.Replace(strings.Title(strings.Replace(strings.ToLower(s), "_", " ", -1)), " ", "", -1) -} - -// CamelCaseToUnderscore converts from camel case form to underscore separated form. -// Ex.: MyFunc => my_func -func CamelCaseToUnderscore(str string) string { - var output []rune - var segment []rune - for _, r := range str { - - // not treat number as separate segment - if !unicode.IsLower(r) && string(r) != "_" && !unicode.IsNumber(r) { - output = addSegment(output, segment) - segment = nil - } - segment = append(segment, unicode.ToLower(r)) - } - output = addSegment(output, segment) - return string(output) -} - -// Reverse returns reversed string -func Reverse(s string) string { - r := []rune(s) - for i, j := 0, len(r)-1; i < j; i, j = i+1, j-1 { - r[i], r[j] = r[j], r[i] - } - return string(r) -} - -// GetLines splits string by "\n" and return array of lines -func GetLines(s string) []string { - return strings.Split(s, "\n") -} - -// GetLine returns specified line of multiline string -func GetLine(s string, index int) (string, error) { - lines := GetLines(s) - if index < 0 || index >= len(lines) { - return "", errors.New("line index out of bounds") - } - return lines[index], nil -} - -// RemoveTags removes all tags from HTML string -func RemoveTags(s string) string { - return ReplacePattern(s, "<[^>]*>", "") -} - -// SafeFileName returns safe string that can be used in file names -func SafeFileName(str string) string { - name := strings.ToLower(str) - name = path.Clean(path.Base(name)) - name = strings.Trim(name, " ") - separators, err := regexp.Compile(`[ &_=+:]`) - if err == nil { - name = separators.ReplaceAllString(name, "-") - } - legal, err := regexp.Compile(`[^[:alnum:]-.]`) - if err == nil { - name = legal.ReplaceAllString(name, "") - } - for strings.Contains(name, "--") { - name = strings.Replace(name, "--", "-", -1) - } - return name -} - -// NormalizeEmail canonicalize an email address. -// The local part of the email address is lowercased for all domains; the hostname is always lowercased and -// the local part of the email address is always lowercased for hosts that are known to be case-insensitive (currently only GMail). -// Normalization follows special rules for known providers: currently, GMail addresses have dots removed in the local part and -// are stripped of tags (e.g. some.one+tag@gmail.com becomes someone@gmail.com) and all @googlemail.com addresses are -// normalized to @gmail.com. -func NormalizeEmail(str string) (string, error) { - if !IsEmail(str) { - return "", fmt.Errorf("%s is not an email", str) - } - parts := strings.Split(str, "@") - parts[0] = strings.ToLower(parts[0]) - parts[1] = strings.ToLower(parts[1]) - if parts[1] == "gmail.com" || parts[1] == "googlemail.com" { - parts[1] = "gmail.com" - parts[0] = strings.Split(ReplacePattern(parts[0], `\.`, ""), "+")[0] - } - return strings.Join(parts, "@"), nil -} - -// Truncate a string to the closest length without breaking words. -func Truncate(str string, length int, ending string) string { - var aftstr, befstr string - if len(str) > length { - words := strings.Fields(str) - before, present := 0, 0 - for i := range words { - befstr = aftstr - before = present - aftstr = aftstr + words[i] + " " - present = len(aftstr) - if present > length && i != 0 { - if (length - before) < (present - length) { - return Trim(befstr, " /\\.,\"'#!?&@+-") + ending - } - return Trim(aftstr, " /\\.,\"'#!?&@+-") + ending - } - } - } - - return str -} - -// PadLeft pads left side of a string if size of string is less then indicated pad length -func PadLeft(str string, padStr string, padLen int) string { - return buildPadStr(str, padStr, padLen, true, false) -} - -// PadRight pads right side of a string if size of string is less then indicated pad length -func PadRight(str string, padStr string, padLen int) string { - return buildPadStr(str, padStr, padLen, false, true) -} - -// PadBoth pads both sides of a string if size of string is less then indicated pad length -func PadBoth(str string, padStr string, padLen int) string { - return buildPadStr(str, padStr, padLen, true, true) -} - -// PadString either left, right or both sides. -// Note that padding string can be unicode and more then one character -func buildPadStr(str string, padStr string, padLen int, padLeft bool, padRight bool) string { - - // When padded length is less then the current string size - if padLen < utf8.RuneCountInString(str) { - return str - } - - padLen -= utf8.RuneCountInString(str) - - targetLen := padLen - - targetLenLeft := targetLen - targetLenRight := targetLen - if padLeft && padRight { - targetLenLeft = padLen / 2 - targetLenRight = padLen - targetLenLeft - } - - strToRepeatLen := utf8.RuneCountInString(padStr) - - repeatTimes := int(math.Ceil(float64(targetLen) / float64(strToRepeatLen))) - repeatedString := strings.Repeat(padStr, repeatTimes) - - leftSide := "" - if padLeft { - leftSide = repeatedString[0:targetLenLeft] - } - - rightSide := "" - if padRight { - rightSide = repeatedString[0:targetLenRight] - } - - return leftSide + str + rightSide -} - -// TruncatingErrorf removes extra args from fmt.Errorf if not formatted in the str object -func TruncatingErrorf(str string, args ...interface{}) error { - n := strings.Count(str, "%s") - return fmt.Errorf(str, args[:n]...) -} diff --git a/vendor/github.com/asaskevich/govalidator/validator.go b/vendor/github.com/asaskevich/govalidator/validator.go deleted file mode 100644 index c9c4fac0655..00000000000 --- a/vendor/github.com/asaskevich/govalidator/validator.go +++ /dev/null @@ -1,1768 +0,0 @@ -// Package govalidator is package of validators and sanitizers for strings, structs and collections. -package govalidator - -import ( - "bytes" - "crypto/rsa" - "crypto/x509" - "encoding/base64" - "encoding/json" - "encoding/pem" - "fmt" - "io/ioutil" - "net" - "net/url" - "reflect" - "regexp" - "sort" - "strconv" - "strings" - "time" - "unicode" - "unicode/utf8" -) - -var ( - fieldsRequiredByDefault bool - nilPtrAllowedByRequired = false - notNumberRegexp = regexp.MustCompile("[^0-9]+") - whiteSpacesAndMinus = regexp.MustCompile(`[\s-]+`) - paramsRegexp = regexp.MustCompile(`\(.*\)$`) -) - -const maxURLRuneCount = 2083 -const minURLRuneCount = 3 -const rfc3339WithoutZone = "2006-01-02T15:04:05" - -// SetFieldsRequiredByDefault causes validation to fail when struct fields -// do not include validations or are not explicitly marked as exempt (using `valid:"-"` or `valid:"email,optional"`). -// This struct definition will fail govalidator.ValidateStruct() (and the field values do not matter): -// type exampleStruct struct { -// Name string `` -// Email string `valid:"email"` -// This, however, will only fail when Email is empty or an invalid email address: -// type exampleStruct2 struct { -// Name string `valid:"-"` -// Email string `valid:"email"` -// Lastly, this will only fail when Email is an invalid email address but not when it's empty: -// type exampleStruct2 struct { -// Name string `valid:"-"` -// Email string `valid:"email,optional"` -func SetFieldsRequiredByDefault(value bool) { - fieldsRequiredByDefault = value -} - -// SetNilPtrAllowedByRequired causes validation to pass for nil ptrs when a field is set to required. -// The validation will still reject ptr fields in their zero value state. Example with this enabled: -// type exampleStruct struct { -// Name *string `valid:"required"` -// With `Name` set to "", this will be considered invalid input and will cause a validation error. -// With `Name` set to nil, this will be considered valid by validation. -// By default this is disabled. -func SetNilPtrAllowedByRequired(value bool) { - nilPtrAllowedByRequired = value -} - -// IsEmail checks if the string is an email. -func IsEmail(str string) bool { - // TODO uppercase letters are not supported - return rxEmail.MatchString(str) -} - -// IsExistingEmail checks if the string is an email of existing domain -func IsExistingEmail(email string) bool { - - if len(email) < 6 || len(email) > 254 { - return false - } - at := strings.LastIndex(email, "@") - if at <= 0 || at > len(email)-3 { - return false - } - user := email[:at] - host := email[at+1:] - if len(user) > 64 { - return false - } - switch host { - case "localhost", "example.com": - return true - } - if userDotRegexp.MatchString(user) || !userRegexp.MatchString(user) || !hostRegexp.MatchString(host) { - return false - } - if _, err := net.LookupMX(host); err != nil { - if _, err := net.LookupIP(host); err != nil { - return false - } - } - - return true -} - -// IsURL checks if the string is an URL. -func IsURL(str string) bool { - if str == "" || utf8.RuneCountInString(str) >= maxURLRuneCount || len(str) <= minURLRuneCount || strings.HasPrefix(str, ".") { - return false - } - strTemp := str - if strings.Contains(str, ":") && !strings.Contains(str, "://") { - // support no indicated urlscheme but with colon for port number - // http:// is appended so url.Parse will succeed, strTemp used so it does not impact rxURL.MatchString - strTemp = "http://" + str - } - u, err := url.Parse(strTemp) - if err != nil { - return false - } - if strings.HasPrefix(u.Host, ".") { - return false - } - if u.Host == "" && (u.Path != "" && !strings.Contains(u.Path, ".")) { - return false - } - return rxURL.MatchString(str) -} - -// IsRequestURL checks if the string rawurl, assuming -// it was received in an HTTP request, is a valid -// URL confirm to RFC 3986 -func IsRequestURL(rawurl string) bool { - url, err := url.ParseRequestURI(rawurl) - if err != nil { - return false //Couldn't even parse the rawurl - } - if len(url.Scheme) == 0 { - return false //No Scheme found - } - return true -} - -// IsRequestURI checks if the string rawurl, assuming -// it was received in an HTTP request, is an -// absolute URI or an absolute path. -func IsRequestURI(rawurl string) bool { - _, err := url.ParseRequestURI(rawurl) - return err == nil -} - -// IsAlpha checks if the string contains only letters (a-zA-Z). Empty string is valid. -func IsAlpha(str string) bool { - if IsNull(str) { - return true - } - return rxAlpha.MatchString(str) -} - -//IsUTFLetter checks if the string contains only unicode letter characters. -//Similar to IsAlpha but for all languages. Empty string is valid. -func IsUTFLetter(str string) bool { - if IsNull(str) { - return true - } - - for _, c := range str { - if !unicode.IsLetter(c) { - return false - } - } - return true - -} - -// IsAlphanumeric checks if the string contains only letters and numbers. Empty string is valid. -func IsAlphanumeric(str string) bool { - if IsNull(str) { - return true - } - return rxAlphanumeric.MatchString(str) -} - -// IsUTFLetterNumeric checks if the string contains only unicode letters and numbers. Empty string is valid. -func IsUTFLetterNumeric(str string) bool { - if IsNull(str) { - return true - } - for _, c := range str { - if !unicode.IsLetter(c) && !unicode.IsNumber(c) { //letters && numbers are ok - return false - } - } - return true - -} - -// IsNumeric checks if the string contains only numbers. Empty string is valid. -func IsNumeric(str string) bool { - if IsNull(str) { - return true - } - return rxNumeric.MatchString(str) -} - -// IsUTFNumeric checks if the string contains only unicode numbers of any kind. -// Numbers can be 0-9 but also Fractions ¾,Roman Ⅸ and Hangzhou 〩. Empty string is valid. -func IsUTFNumeric(str string) bool { - if IsNull(str) { - return true - } - if strings.IndexAny(str, "+-") > 0 { - return false - } - if len(str) > 1 { - str = strings.TrimPrefix(str, "-") - str = strings.TrimPrefix(str, "+") - } - for _, c := range str { - if !unicode.IsNumber(c) { //numbers && minus sign are ok - return false - } - } - return true - -} - -// IsUTFDigit checks if the string contains only unicode radix-10 decimal digits. Empty string is valid. -func IsUTFDigit(str string) bool { - if IsNull(str) { - return true - } - if strings.IndexAny(str, "+-") > 0 { - return false - } - if len(str) > 1 { - str = strings.TrimPrefix(str, "-") - str = strings.TrimPrefix(str, "+") - } - for _, c := range str { - if !unicode.IsDigit(c) { //digits && minus sign are ok - return false - } - } - return true - -} - -// IsHexadecimal checks if the string is a hexadecimal number. -func IsHexadecimal(str string) bool { - return rxHexadecimal.MatchString(str) -} - -// IsHexcolor checks if the string is a hexadecimal color. -func IsHexcolor(str string) bool { - return rxHexcolor.MatchString(str) -} - -// IsRGBcolor checks if the string is a valid RGB color in form rgb(RRR, GGG, BBB). -func IsRGBcolor(str string) bool { - return rxRGBcolor.MatchString(str) -} - -// IsLowerCase checks if the string is lowercase. Empty string is valid. -func IsLowerCase(str string) bool { - if IsNull(str) { - return true - } - return str == strings.ToLower(str) -} - -// IsUpperCase checks if the string is uppercase. Empty string is valid. -func IsUpperCase(str string) bool { - if IsNull(str) { - return true - } - return str == strings.ToUpper(str) -} - -// HasLowerCase checks if the string contains at least 1 lowercase. Empty string is valid. -func HasLowerCase(str string) bool { - if IsNull(str) { - return true - } - return rxHasLowerCase.MatchString(str) -} - -// HasUpperCase checks if the string contains as least 1 uppercase. Empty string is valid. -func HasUpperCase(str string) bool { - if IsNull(str) { - return true - } - return rxHasUpperCase.MatchString(str) -} - -// IsInt checks if the string is an integer. Empty string is valid. -func IsInt(str string) bool { - if IsNull(str) { - return true - } - return rxInt.MatchString(str) -} - -// IsFloat checks if the string is a float. -func IsFloat(str string) bool { - return str != "" && rxFloat.MatchString(str) -} - -// IsDivisibleBy checks if the string is a number that's divisible by another. -// If second argument is not valid integer or zero, it's return false. -// Otherwise, if first argument is not valid integer or zero, it's return true (Invalid string converts to zero). -func IsDivisibleBy(str, num string) bool { - f, _ := ToFloat(str) - p := int64(f) - q, _ := ToInt(num) - if q == 0 { - return false - } - return (p == 0) || (p%q == 0) -} - -// IsNull checks if the string is null. -func IsNull(str string) bool { - return len(str) == 0 -} - -// IsNotNull checks if the string is not null. -func IsNotNull(str string) bool { - return !IsNull(str) -} - -// HasWhitespaceOnly checks the string only contains whitespace -func HasWhitespaceOnly(str string) bool { - return len(str) > 0 && rxHasWhitespaceOnly.MatchString(str) -} - -// HasWhitespace checks if the string contains any whitespace -func HasWhitespace(str string) bool { - return len(str) > 0 && rxHasWhitespace.MatchString(str) -} - -// IsByteLength checks if the string's length (in bytes) falls in a range. -func IsByteLength(str string, min, max int) bool { - return len(str) >= min && len(str) <= max -} - -// IsUUIDv3 checks if the string is a UUID version 3. -func IsUUIDv3(str string) bool { - return rxUUID3.MatchString(str) -} - -// IsUUIDv4 checks if the string is a UUID version 4. -func IsUUIDv4(str string) bool { - return rxUUID4.MatchString(str) -} - -// IsUUIDv5 checks if the string is a UUID version 5. -func IsUUIDv5(str string) bool { - return rxUUID5.MatchString(str) -} - -// IsUUID checks if the string is a UUID (version 3, 4 or 5). -func IsUUID(str string) bool { - return rxUUID.MatchString(str) -} - -// Byte to index table for O(1) lookups when unmarshaling. -// We use 0xFF as sentinel value for invalid indexes. -var ulidDec = [...]byte{ - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0x01, - 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, - 0x0F, 0x10, 0x11, 0xFF, 0x12, 0x13, 0xFF, 0x14, 0x15, 0xFF, - 0x16, 0x17, 0x18, 0x19, 0x1A, 0xFF, 0x1B, 0x1C, 0x1D, 0x1E, - 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0A, 0x0B, 0x0C, - 0x0D, 0x0E, 0x0F, 0x10, 0x11, 0xFF, 0x12, 0x13, 0xFF, 0x14, - 0x15, 0xFF, 0x16, 0x17, 0x18, 0x19, 0x1A, 0xFF, 0x1B, 0x1C, - 0x1D, 0x1E, 0x1F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, - 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, -} - -// EncodedSize is the length of a text encoded ULID. -const ulidEncodedSize = 26 - -// IsULID checks if the string is a ULID. -// -// Implementation got from: -// https://github.com/oklog/ulid (Apache-2.0 License) -// -func IsULID(str string) bool { - // Check if a base32 encoded ULID is the right length. - if len(str) != ulidEncodedSize { - return false - } - - // Check if all the characters in a base32 encoded ULID are part of the - // expected base32 character set. - if ulidDec[str[0]] == 0xFF || - ulidDec[str[1]] == 0xFF || - ulidDec[str[2]] == 0xFF || - ulidDec[str[3]] == 0xFF || - ulidDec[str[4]] == 0xFF || - ulidDec[str[5]] == 0xFF || - ulidDec[str[6]] == 0xFF || - ulidDec[str[7]] == 0xFF || - ulidDec[str[8]] == 0xFF || - ulidDec[str[9]] == 0xFF || - ulidDec[str[10]] == 0xFF || - ulidDec[str[11]] == 0xFF || - ulidDec[str[12]] == 0xFF || - ulidDec[str[13]] == 0xFF || - ulidDec[str[14]] == 0xFF || - ulidDec[str[15]] == 0xFF || - ulidDec[str[16]] == 0xFF || - ulidDec[str[17]] == 0xFF || - ulidDec[str[18]] == 0xFF || - ulidDec[str[19]] == 0xFF || - ulidDec[str[20]] == 0xFF || - ulidDec[str[21]] == 0xFF || - ulidDec[str[22]] == 0xFF || - ulidDec[str[23]] == 0xFF || - ulidDec[str[24]] == 0xFF || - ulidDec[str[25]] == 0xFF { - return false - } - - // Check if the first character in a base32 encoded ULID will overflow. This - // happens because the base32 representation encodes 130 bits, while the - // ULID is only 128 bits. - // - // See https://github.com/oklog/ulid/issues/9 for details. - if str[0] > '7' { - return false - } - return true -} - -// IsCreditCard checks if the string is a credit card. -func IsCreditCard(str string) bool { - sanitized := whiteSpacesAndMinus.ReplaceAllString(str, "") - if !rxCreditCard.MatchString(sanitized) { - return false - } - - number, _ := ToInt(sanitized) - number, lastDigit := number / 10, number % 10 - - var sum int64 - for i:=0; number > 0; i++ { - digit := number % 10 - - if i % 2 == 0 { - digit *= 2 - if digit > 9 { - digit -= 9 - } - } - - sum += digit - number = number / 10 - } - - return (sum + lastDigit) % 10 == 0 -} - -// IsISBN10 checks if the string is an ISBN version 10. -func IsISBN10(str string) bool { - return IsISBN(str, 10) -} - -// IsISBN13 checks if the string is an ISBN version 13. -func IsISBN13(str string) bool { - return IsISBN(str, 13) -} - -// IsISBN checks if the string is an ISBN (version 10 or 13). -// If version value is not equal to 10 or 13, it will be checks both variants. -func IsISBN(str string, version int) bool { - sanitized := whiteSpacesAndMinus.ReplaceAllString(str, "") - var checksum int32 - var i int32 - if version == 10 { - if !rxISBN10.MatchString(sanitized) { - return false - } - for i = 0; i < 9; i++ { - checksum += (i + 1) * int32(sanitized[i]-'0') - } - if sanitized[9] == 'X' { - checksum += 10 * 10 - } else { - checksum += 10 * int32(sanitized[9]-'0') - } - if checksum%11 == 0 { - return true - } - return false - } else if version == 13 { - if !rxISBN13.MatchString(sanitized) { - return false - } - factor := []int32{1, 3} - for i = 0; i < 12; i++ { - checksum += factor[i%2] * int32(sanitized[i]-'0') - } - return (int32(sanitized[12]-'0'))-((10-(checksum%10))%10) == 0 - } - return IsISBN(str, 10) || IsISBN(str, 13) -} - -// IsJSON checks if the string is valid JSON (note: uses json.Unmarshal). -func IsJSON(str string) bool { - var js json.RawMessage - return json.Unmarshal([]byte(str), &js) == nil -} - -// IsMultibyte checks if the string contains one or more multibyte chars. Empty string is valid. -func IsMultibyte(str string) bool { - if IsNull(str) { - return true - } - return rxMultibyte.MatchString(str) -} - -// IsASCII checks if the string contains ASCII chars only. Empty string is valid. -func IsASCII(str string) bool { - if IsNull(str) { - return true - } - return rxASCII.MatchString(str) -} - -// IsPrintableASCII checks if the string contains printable ASCII chars only. Empty string is valid. -func IsPrintableASCII(str string) bool { - if IsNull(str) { - return true - } - return rxPrintableASCII.MatchString(str) -} - -// IsFullWidth checks if the string contains any full-width chars. Empty string is valid. -func IsFullWidth(str string) bool { - if IsNull(str) { - return true - } - return rxFullWidth.MatchString(str) -} - -// IsHalfWidth checks if the string contains any half-width chars. Empty string is valid. -func IsHalfWidth(str string) bool { - if IsNull(str) { - return true - } - return rxHalfWidth.MatchString(str) -} - -// IsVariableWidth checks if the string contains a mixture of full and half-width chars. Empty string is valid. -func IsVariableWidth(str string) bool { - if IsNull(str) { - return true - } - return rxHalfWidth.MatchString(str) && rxFullWidth.MatchString(str) -} - -// IsBase64 checks if a string is base64 encoded. -func IsBase64(str string) bool { - return rxBase64.MatchString(str) -} - -// IsFilePath checks is a string is Win or Unix file path and returns it's type. -func IsFilePath(str string) (bool, int) { - if rxWinPath.MatchString(str) { - //check windows path limit see: - // http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx#maxpath - if len(str[3:]) > 32767 { - return false, Win - } - return true, Win - } else if rxUnixPath.MatchString(str) { - return true, Unix - } - return false, Unknown -} - -//IsWinFilePath checks both relative & absolute paths in Windows -func IsWinFilePath(str string) bool { - if rxARWinPath.MatchString(str) { - //check windows path limit see: - // http://msdn.microsoft.com/en-us/library/aa365247(VS.85).aspx#maxpath - if len(str[3:]) > 32767 { - return false - } - return true - } - return false -} - -//IsUnixFilePath checks both relative & absolute paths in Unix -func IsUnixFilePath(str string) bool { - if rxARUnixPath.MatchString(str) { - return true - } - return false -} - -// IsDataURI checks if a string is base64 encoded data URI such as an image -func IsDataURI(str string) bool { - dataURI := strings.Split(str, ",") - if !rxDataURI.MatchString(dataURI[0]) { - return false - } - return IsBase64(dataURI[1]) -} - -// IsMagnetURI checks if a string is valid magnet URI -func IsMagnetURI(str string) bool { - return rxMagnetURI.MatchString(str) -} - -// IsISO3166Alpha2 checks if a string is valid two-letter country code -func IsISO3166Alpha2(str string) bool { - for _, entry := range ISO3166List { - if str == entry.Alpha2Code { - return true - } - } - return false -} - -// IsISO3166Alpha3 checks if a string is valid three-letter country code -func IsISO3166Alpha3(str string) bool { - for _, entry := range ISO3166List { - if str == entry.Alpha3Code { - return true - } - } - return false -} - -// IsISO693Alpha2 checks if a string is valid two-letter language code -func IsISO693Alpha2(str string) bool { - for _, entry := range ISO693List { - if str == entry.Alpha2Code { - return true - } - } - return false -} - -// IsISO693Alpha3b checks if a string is valid three-letter language code -func IsISO693Alpha3b(str string) bool { - for _, entry := range ISO693List { - if str == entry.Alpha3bCode { - return true - } - } - return false -} - -// IsDNSName will validate the given string as a DNS name -func IsDNSName(str string) bool { - if str == "" || len(strings.Replace(str, ".", "", -1)) > 255 { - // constraints already violated - return false - } - return !IsIP(str) && rxDNSName.MatchString(str) -} - -// IsHash checks if a string is a hash of type algorithm. -// Algorithm is one of ['md4', 'md5', 'sha1', 'sha256', 'sha384', 'sha512', 'ripemd128', 'ripemd160', 'tiger128', 'tiger160', 'tiger192', 'crc32', 'crc32b'] -func IsHash(str string, algorithm string) bool { - var len string - algo := strings.ToLower(algorithm) - - if algo == "crc32" || algo == "crc32b" { - len = "8" - } else if algo == "md5" || algo == "md4" || algo == "ripemd128" || algo == "tiger128" { - len = "32" - } else if algo == "sha1" || algo == "ripemd160" || algo == "tiger160" { - len = "40" - } else if algo == "tiger192" { - len = "48" - } else if algo == "sha3-224" { - len = "56" - } else if algo == "sha256" || algo == "sha3-256" { - len = "64" - } else if algo == "sha384" || algo == "sha3-384" { - len = "96" - } else if algo == "sha512" || algo == "sha3-512" { - len = "128" - } else { - return false - } - - return Matches(str, "^[a-f0-9]{"+len+"}$") -} - -// IsSHA3224 checks is a string is a SHA3-224 hash. Alias for `IsHash(str, "sha3-224")` -func IsSHA3224(str string) bool { - return IsHash(str, "sha3-224") -} - -// IsSHA3256 checks is a string is a SHA3-256 hash. Alias for `IsHash(str, "sha3-256")` -func IsSHA3256(str string) bool { - return IsHash(str, "sha3-256") -} - -// IsSHA3384 checks is a string is a SHA3-384 hash. Alias for `IsHash(str, "sha3-384")` -func IsSHA3384(str string) bool { - return IsHash(str, "sha3-384") -} - -// IsSHA3512 checks is a string is a SHA3-512 hash. Alias for `IsHash(str, "sha3-512")` -func IsSHA3512(str string) bool { - return IsHash(str, "sha3-512") -} - -// IsSHA512 checks is a string is a SHA512 hash. Alias for `IsHash(str, "sha512")` -func IsSHA512(str string) bool { - return IsHash(str, "sha512") -} - -// IsSHA384 checks is a string is a SHA384 hash. Alias for `IsHash(str, "sha384")` -func IsSHA384(str string) bool { - return IsHash(str, "sha384") -} - -// IsSHA256 checks is a string is a SHA256 hash. Alias for `IsHash(str, "sha256")` -func IsSHA256(str string) bool { - return IsHash(str, "sha256") -} - -// IsTiger192 checks is a string is a Tiger192 hash. Alias for `IsHash(str, "tiger192")` -func IsTiger192(str string) bool { - return IsHash(str, "tiger192") -} - -// IsTiger160 checks is a string is a Tiger160 hash. Alias for `IsHash(str, "tiger160")` -func IsTiger160(str string) bool { - return IsHash(str, "tiger160") -} - -// IsRipeMD160 checks is a string is a RipeMD160 hash. Alias for `IsHash(str, "ripemd160")` -func IsRipeMD160(str string) bool { - return IsHash(str, "ripemd160") -} - -// IsSHA1 checks is a string is a SHA-1 hash. Alias for `IsHash(str, "sha1")` -func IsSHA1(str string) bool { - return IsHash(str, "sha1") -} - -// IsTiger128 checks is a string is a Tiger128 hash. Alias for `IsHash(str, "tiger128")` -func IsTiger128(str string) bool { - return IsHash(str, "tiger128") -} - -// IsRipeMD128 checks is a string is a RipeMD128 hash. Alias for `IsHash(str, "ripemd128")` -func IsRipeMD128(str string) bool { - return IsHash(str, "ripemd128") -} - -// IsCRC32 checks is a string is a CRC32 hash. Alias for `IsHash(str, "crc32")` -func IsCRC32(str string) bool { - return IsHash(str, "crc32") -} - -// IsCRC32b checks is a string is a CRC32b hash. Alias for `IsHash(str, "crc32b")` -func IsCRC32b(str string) bool { - return IsHash(str, "crc32b") -} - -// IsMD5 checks is a string is a MD5 hash. Alias for `IsHash(str, "md5")` -func IsMD5(str string) bool { - return IsHash(str, "md5") -} - -// IsMD4 checks is a string is a MD4 hash. Alias for `IsHash(str, "md4")` -func IsMD4(str string) bool { - return IsHash(str, "md4") -} - -// IsDialString validates the given string for usage with the various Dial() functions -func IsDialString(str string) bool { - if h, p, err := net.SplitHostPort(str); err == nil && h != "" && p != "" && (IsDNSName(h) || IsIP(h)) && IsPort(p) { - return true - } - - return false -} - -// IsIP checks if a string is either IP version 4 or 6. Alias for `net.ParseIP` -func IsIP(str string) bool { - return net.ParseIP(str) != nil -} - -// IsPort checks if a string represents a valid port -func IsPort(str string) bool { - if i, err := strconv.Atoi(str); err == nil && i > 0 && i < 65536 { - return true - } - return false -} - -// IsIPv4 checks if the string is an IP version 4. -func IsIPv4(str string) bool { - ip := net.ParseIP(str) - return ip != nil && strings.Contains(str, ".") -} - -// IsIPv6 checks if the string is an IP version 6. -func IsIPv6(str string) bool { - ip := net.ParseIP(str) - return ip != nil && strings.Contains(str, ":") -} - -// IsCIDR checks if the string is an valid CIDR notiation (IPV4 & IPV6) -func IsCIDR(str string) bool { - _, _, err := net.ParseCIDR(str) - return err == nil -} - -// IsMAC checks if a string is valid MAC address. -// Possible MAC formats: -// 01:23:45:67:89:ab -// 01:23:45:67:89:ab:cd:ef -// 01-23-45-67-89-ab -// 01-23-45-67-89-ab-cd-ef -// 0123.4567.89ab -// 0123.4567.89ab.cdef -func IsMAC(str string) bool { - _, err := net.ParseMAC(str) - return err == nil -} - -// IsHost checks if the string is a valid IP (both v4 and v6) or a valid DNS name -func IsHost(str string) bool { - return IsIP(str) || IsDNSName(str) -} - -// IsMongoID checks if the string is a valid hex-encoded representation of a MongoDB ObjectId. -func IsMongoID(str string) bool { - return rxHexadecimal.MatchString(str) && (len(str) == 24) -} - -// IsLatitude checks if a string is valid latitude. -func IsLatitude(str string) bool { - return rxLatitude.MatchString(str) -} - -// IsLongitude checks if a string is valid longitude. -func IsLongitude(str string) bool { - return rxLongitude.MatchString(str) -} - -// IsIMEI checks if a string is valid IMEI -func IsIMEI(str string) bool { - return rxIMEI.MatchString(str) -} - -// IsIMSI checks if a string is valid IMSI -func IsIMSI(str string) bool { - if !rxIMSI.MatchString(str) { - return false - } - - mcc, err := strconv.ParseInt(str[0:3], 10, 32) - if err != nil { - return false - } - - switch mcc { - case 202, 204, 206, 208, 212, 213, 214, 216, 218, 219: - case 220, 221, 222, 226, 228, 230, 231, 232, 234, 235: - case 238, 240, 242, 244, 246, 247, 248, 250, 255, 257: - case 259, 260, 262, 266, 268, 270, 272, 274, 276, 278: - case 280, 282, 283, 284, 286, 288, 289, 290, 292, 293: - case 294, 295, 297, 302, 308, 310, 311, 312, 313, 314: - case 315, 316, 330, 332, 334, 338, 340, 342, 344, 346: - case 348, 350, 352, 354, 356, 358, 360, 362, 363, 364: - case 365, 366, 368, 370, 372, 374, 376, 400, 401, 402: - case 404, 405, 406, 410, 412, 413, 414, 415, 416, 417: - case 418, 419, 420, 421, 422, 424, 425, 426, 427, 428: - case 429, 430, 431, 432, 434, 436, 437, 438, 440, 441: - case 450, 452, 454, 455, 456, 457, 460, 461, 466, 467: - case 470, 472, 502, 505, 510, 514, 515, 520, 525, 528: - case 530, 536, 537, 539, 540, 541, 542, 543, 544, 545: - case 546, 547, 548, 549, 550, 551, 552, 553, 554, 555: - case 602, 603, 604, 605, 606, 607, 608, 609, 610, 611: - case 612, 613, 614, 615, 616, 617, 618, 619, 620, 621: - case 622, 623, 624, 625, 626, 627, 628, 629, 630, 631: - case 632, 633, 634, 635, 636, 637, 638, 639, 640, 641: - case 642, 643, 645, 646, 647, 648, 649, 650, 651, 652: - case 653, 654, 655, 657, 658, 659, 702, 704, 706, 708: - case 710, 712, 714, 716, 722, 724, 730, 732, 734, 736: - case 738, 740, 742, 744, 746, 748, 750, 995: - return true - default: - return false - } - return true -} - -// IsRsaPublicKey checks if a string is valid public key with provided length -func IsRsaPublicKey(str string, keylen int) bool { - bb := bytes.NewBufferString(str) - pemBytes, err := ioutil.ReadAll(bb) - if err != nil { - return false - } - block, _ := pem.Decode(pemBytes) - if block != nil && block.Type != "PUBLIC KEY" { - return false - } - var der []byte - - if block != nil { - der = block.Bytes - } else { - der, err = base64.StdEncoding.DecodeString(str) - if err != nil { - return false - } - } - - key, err := x509.ParsePKIXPublicKey(der) - if err != nil { - return false - } - pubkey, ok := key.(*rsa.PublicKey) - if !ok { - return false - } - bitlen := len(pubkey.N.Bytes()) * 8 - return bitlen == int(keylen) -} - -// IsRegex checks if a give string is a valid regex with RE2 syntax or not -func IsRegex(str string) bool { - if _, err := regexp.Compile(str); err == nil { - return true - } - return false -} - -func toJSONName(tag string) string { - if tag == "" { - return "" - } - - // JSON name always comes first. If there's no options then split[0] is - // JSON name, if JSON name is not set, then split[0] is an empty string. - split := strings.SplitN(tag, ",", 2) - - name := split[0] - - // However it is possible that the field is skipped when - // (de-)serializing from/to JSON, in which case assume that there is no - // tag name to use - if name == "-" { - return "" - } - return name -} - -func prependPathToErrors(err error, path string) error { - switch err2 := err.(type) { - case Error: - err2.Path = append([]string{path}, err2.Path...) - return err2 - case Errors: - errors := err2.Errors() - for i, err3 := range errors { - errors[i] = prependPathToErrors(err3, path) - } - return err2 - } - return err -} - -// ValidateArray performs validation according to condition iterator that validates every element of the array -func ValidateArray(array []interface{}, iterator ConditionIterator) bool { - return Every(array, iterator) -} - -// ValidateMap use validation map for fields. -// result will be equal to `false` if there are any errors. -// s is the map containing the data to be validated. -// m is the validation map in the form: -// map[string]interface{}{"name":"required,alpha","address":map[string]interface{}{"line1":"required,alphanum"}} -func ValidateMap(s map[string]interface{}, m map[string]interface{}) (bool, error) { - if s == nil { - return true, nil - } - result := true - var err error - var errs Errors - var index int - val := reflect.ValueOf(s) - for key, value := range s { - presentResult := true - validator, ok := m[key] - if !ok { - presentResult = false - var err error - err = fmt.Errorf("all map keys has to be present in the validation map; got %s", key) - err = prependPathToErrors(err, key) - errs = append(errs, err) - } - valueField := reflect.ValueOf(value) - mapResult := true - typeResult := true - structResult := true - resultField := true - switch subValidator := validator.(type) { - case map[string]interface{}: - var err error - if v, ok := value.(map[string]interface{}); !ok { - mapResult = false - err = fmt.Errorf("map validator has to be for the map type only; got %s", valueField.Type().String()) - err = prependPathToErrors(err, key) - errs = append(errs, err) - } else { - mapResult, err = ValidateMap(v, subValidator) - if err != nil { - mapResult = false - err = prependPathToErrors(err, key) - errs = append(errs, err) - } - } - case string: - if (valueField.Kind() == reflect.Struct || - (valueField.Kind() == reflect.Ptr && valueField.Elem().Kind() == reflect.Struct)) && - subValidator != "-" { - var err error - structResult, err = ValidateStruct(valueField.Interface()) - if err != nil { - err = prependPathToErrors(err, key) - errs = append(errs, err) - } - } - resultField, err = typeCheck(valueField, reflect.StructField{ - Name: key, - PkgPath: "", - Type: val.Type(), - Tag: reflect.StructTag(fmt.Sprintf("%s:%q", tagName, subValidator)), - Offset: 0, - Index: []int{index}, - Anonymous: false, - }, val, nil) - if err != nil { - errs = append(errs, err) - } - case nil: - // already handlerd when checked before - default: - typeResult = false - err = fmt.Errorf("map validator has to be either map[string]interface{} or string; got %s", valueField.Type().String()) - err = prependPathToErrors(err, key) - errs = append(errs, err) - } - result = result && presentResult && typeResult && resultField && structResult && mapResult - index++ - } - // checks required keys - requiredResult := true - for key, value := range m { - if schema, ok := value.(string); ok { - tags := parseTagIntoMap(schema) - if required, ok := tags["required"]; ok { - if _, ok := s[key]; !ok { - requiredResult = false - if required.customErrorMessage != "" { - err = Error{key, fmt.Errorf(required.customErrorMessage), true, "required", []string{}} - } else { - err = Error{key, fmt.Errorf("required field missing"), false, "required", []string{}} - } - errs = append(errs, err) - } - } - } - } - - if len(errs) > 0 { - err = errs - } - return result && requiredResult, err -} - -// ValidateStruct use tags for fields. -// result will be equal to `false` if there are any errors. -// todo currently there is no guarantee that errors will be returned in predictable order (tests may to fail) -func ValidateStruct(s interface{}) (bool, error) { - if s == nil { - return true, nil - } - result := true - var err error - val := reflect.ValueOf(s) - if val.Kind() == reflect.Interface || val.Kind() == reflect.Ptr { - val = val.Elem() - } - // we only accept structs - if val.Kind() != reflect.Struct { - return false, fmt.Errorf("function only accepts structs; got %s", val.Kind()) - } - var errs Errors - for i := 0; i < val.NumField(); i++ { - valueField := val.Field(i) - typeField := val.Type().Field(i) - if typeField.PkgPath != "" { - continue // Private field - } - structResult := true - if valueField.Kind() == reflect.Interface { - valueField = valueField.Elem() - } - if (valueField.Kind() == reflect.Struct || - (valueField.Kind() == reflect.Ptr && valueField.Elem().Kind() == reflect.Struct)) && - typeField.Tag.Get(tagName) != "-" { - var err error - structResult, err = ValidateStruct(valueField.Interface()) - if err != nil { - err = prependPathToErrors(err, typeField.Name) - errs = append(errs, err) - } - } - resultField, err2 := typeCheck(valueField, typeField, val, nil) - if err2 != nil { - - // Replace structure name with JSON name if there is a tag on the variable - jsonTag := toJSONName(typeField.Tag.Get("json")) - if jsonTag != "" { - switch jsonError := err2.(type) { - case Error: - jsonError.Name = jsonTag - err2 = jsonError - case Errors: - for i2, err3 := range jsonError { - switch customErr := err3.(type) { - case Error: - customErr.Name = jsonTag - jsonError[i2] = customErr - } - } - - err2 = jsonError - } - } - - errs = append(errs, err2) - } - result = result && resultField && structResult - } - if len(errs) > 0 { - err = errs - } - return result, err -} - -// ValidateStructAsync performs async validation of the struct and returns results through the channels -func ValidateStructAsync(s interface{}) (<-chan bool, <-chan error) { - res := make(chan bool) - errors := make(chan error) - - go func() { - defer close(res) - defer close(errors) - - isValid, isFailed := ValidateStruct(s) - - res <- isValid - errors <- isFailed - }() - - return res, errors -} - -// ValidateMapAsync performs async validation of the map and returns results through the channels -func ValidateMapAsync(s map[string]interface{}, m map[string]interface{}) (<-chan bool, <-chan error) { - res := make(chan bool) - errors := make(chan error) - - go func() { - defer close(res) - defer close(errors) - - isValid, isFailed := ValidateMap(s, m) - - res <- isValid - errors <- isFailed - }() - - return res, errors -} - -// parseTagIntoMap parses a struct tag `valid:required~Some error message,length(2|3)` into map[string]string{"required": "Some error message", "length(2|3)": ""} -func parseTagIntoMap(tag string) tagOptionsMap { - optionsMap := make(tagOptionsMap) - options := strings.Split(tag, ",") - - for i, option := range options { - option = strings.TrimSpace(option) - - validationOptions := strings.Split(option, "~") - if !isValidTag(validationOptions[0]) { - continue - } - if len(validationOptions) == 2 { - optionsMap[validationOptions[0]] = tagOption{validationOptions[0], validationOptions[1], i} - } else { - optionsMap[validationOptions[0]] = tagOption{validationOptions[0], "", i} - } - } - return optionsMap -} - -func isValidTag(s string) bool { - if s == "" { - return false - } - for _, c := range s { - switch { - case strings.ContainsRune("\\'\"!#$%&()*+-./:<=>?@[]^_{|}~ ", c): - // Backslash and quote chars are reserved, but - // otherwise any punctuation chars are allowed - // in a tag name. - default: - if !unicode.IsLetter(c) && !unicode.IsDigit(c) { - return false - } - } - } - return true -} - -// IsSSN will validate the given string as a U.S. Social Security Number -func IsSSN(str string) bool { - if str == "" || len(str) != 11 { - return false - } - return rxSSN.MatchString(str) -} - -// IsSemver checks if string is valid semantic version -func IsSemver(str string) bool { - return rxSemver.MatchString(str) -} - -// IsType checks if interface is of some type -func IsType(v interface{}, params ...string) bool { - if len(params) == 1 { - typ := params[0] - return strings.Replace(reflect.TypeOf(v).String(), " ", "", -1) == strings.Replace(typ, " ", "", -1) - } - return false -} - -// IsTime checks if string is valid according to given format -func IsTime(str string, format string) bool { - _, err := time.Parse(format, str) - return err == nil -} - -// IsUnixTime checks if string is valid unix timestamp value -func IsUnixTime(str string) bool { - if _, err := strconv.Atoi(str); err == nil { - return true - } - return false -} - -// IsRFC3339 checks if string is valid timestamp value according to RFC3339 -func IsRFC3339(str string) bool { - return IsTime(str, time.RFC3339) -} - -// IsRFC3339WithoutZone checks if string is valid timestamp value according to RFC3339 which excludes the timezone. -func IsRFC3339WithoutZone(str string) bool { - return IsTime(str, rfc3339WithoutZone) -} - -// IsISO4217 checks if string is valid ISO currency code -func IsISO4217(str string) bool { - for _, currency := range ISO4217List { - if str == currency { - return true - } - } - - return false -} - -// ByteLength checks string's length -func ByteLength(str string, params ...string) bool { - if len(params) == 2 { - min, _ := ToInt(params[0]) - max, _ := ToInt(params[1]) - return len(str) >= int(min) && len(str) <= int(max) - } - - return false -} - -// RuneLength checks string's length -// Alias for StringLength -func RuneLength(str string, params ...string) bool { - return StringLength(str, params...) -} - -// IsRsaPub checks whether string is valid RSA key -// Alias for IsRsaPublicKey -func IsRsaPub(str string, params ...string) bool { - if len(params) == 1 { - len, _ := ToInt(params[0]) - return IsRsaPublicKey(str, int(len)) - } - - return false -} - -// StringMatches checks if a string matches a given pattern. -func StringMatches(s string, params ...string) bool { - if len(params) == 1 { - pattern := params[0] - return Matches(s, pattern) - } - return false -} - -// StringLength checks string's length (including multi byte strings) -func StringLength(str string, params ...string) bool { - - if len(params) == 2 { - strLength := utf8.RuneCountInString(str) - min, _ := ToInt(params[0]) - max, _ := ToInt(params[1]) - return strLength >= int(min) && strLength <= int(max) - } - - return false -} - -// MinStringLength checks string's minimum length (including multi byte strings) -func MinStringLength(str string, params ...string) bool { - - if len(params) == 1 { - strLength := utf8.RuneCountInString(str) - min, _ := ToInt(params[0]) - return strLength >= int(min) - } - - return false -} - -// MaxStringLength checks string's maximum length (including multi byte strings) -func MaxStringLength(str string, params ...string) bool { - - if len(params) == 1 { - strLength := utf8.RuneCountInString(str) - max, _ := ToInt(params[0]) - return strLength <= int(max) - } - - return false -} - -// Range checks string's length -func Range(str string, params ...string) bool { - if len(params) == 2 { - value, _ := ToFloat(str) - min, _ := ToFloat(params[0]) - max, _ := ToFloat(params[1]) - return InRange(value, min, max) - } - - return false -} - -// IsInRaw checks if string is in list of allowed values -func IsInRaw(str string, params ...string) bool { - if len(params) == 1 { - rawParams := params[0] - - parsedParams := strings.Split(rawParams, "|") - - return IsIn(str, parsedParams...) - } - - return false -} - -// IsIn checks if string str is a member of the set of strings params -func IsIn(str string, params ...string) bool { - for _, param := range params { - if str == param { - return true - } - } - - return false -} - -func checkRequired(v reflect.Value, t reflect.StructField, options tagOptionsMap) (bool, error) { - if nilPtrAllowedByRequired { - k := v.Kind() - if (k == reflect.Ptr || k == reflect.Interface) && v.IsNil() { - return true, nil - } - } - - if requiredOption, isRequired := options["required"]; isRequired { - if len(requiredOption.customErrorMessage) > 0 { - return false, Error{t.Name, fmt.Errorf(requiredOption.customErrorMessage), true, "required", []string{}} - } - return false, Error{t.Name, fmt.Errorf("non zero value required"), false, "required", []string{}} - } else if _, isOptional := options["optional"]; fieldsRequiredByDefault && !isOptional { - return false, Error{t.Name, fmt.Errorf("Missing required field"), false, "required", []string{}} - } - // not required and empty is valid - return true, nil -} - -func typeCheck(v reflect.Value, t reflect.StructField, o reflect.Value, options tagOptionsMap) (isValid bool, resultErr error) { - if !v.IsValid() { - return false, nil - } - - tag := t.Tag.Get(tagName) - - // checks if the field should be ignored - switch tag { - case "": - if v.Kind() != reflect.Slice && v.Kind() != reflect.Map { - if !fieldsRequiredByDefault { - return true, nil - } - return false, Error{t.Name, fmt.Errorf("All fields are required to at least have one validation defined"), false, "required", []string{}} - } - case "-": - return true, nil - } - - isRootType := false - if options == nil { - isRootType = true - options = parseTagIntoMap(tag) - } - - if isEmptyValue(v) { - // an empty value is not validated, checks only required - isValid, resultErr = checkRequired(v, t, options) - for key := range options { - delete(options, key) - } - return isValid, resultErr - } - - var customTypeErrors Errors - optionsOrder := options.orderedKeys() - for _, validatorName := range optionsOrder { - validatorStruct := options[validatorName] - if validatefunc, ok := CustomTypeTagMap.Get(validatorName); ok { - delete(options, validatorName) - - if result := validatefunc(v.Interface(), o.Interface()); !result { - if len(validatorStruct.customErrorMessage) > 0 { - customTypeErrors = append(customTypeErrors, Error{Name: t.Name, Err: TruncatingErrorf(validatorStruct.customErrorMessage, fmt.Sprint(v), validatorName), CustomErrorMessageExists: true, Validator: stripParams(validatorName)}) - continue - } - customTypeErrors = append(customTypeErrors, Error{Name: t.Name, Err: fmt.Errorf("%s does not validate as %s", fmt.Sprint(v), validatorName), CustomErrorMessageExists: false, Validator: stripParams(validatorName)}) - } - } - } - - if len(customTypeErrors.Errors()) > 0 { - return false, customTypeErrors - } - - if isRootType { - // Ensure that we've checked the value by all specified validators before report that the value is valid - defer func() { - delete(options, "optional") - delete(options, "required") - - if isValid && resultErr == nil && len(options) != 0 { - optionsOrder := options.orderedKeys() - for _, validator := range optionsOrder { - isValid = false - resultErr = Error{t.Name, fmt.Errorf( - "The following validator is invalid or can't be applied to the field: %q", validator), false, stripParams(validator), []string{}} - return - } - } - }() - } - - for _, validatorSpec := range optionsOrder { - validatorStruct := options[validatorSpec] - var negate bool - validator := validatorSpec - customMsgExists := len(validatorStruct.customErrorMessage) > 0 - - // checks whether the tag looks like '!something' or 'something' - if validator[0] == '!' { - validator = validator[1:] - negate = true - } - - // checks for interface param validators - for key, value := range InterfaceParamTagRegexMap { - ps := value.FindStringSubmatch(validator) - if len(ps) == 0 { - continue - } - - validatefunc, ok := InterfaceParamTagMap[key] - if !ok { - continue - } - - delete(options, validatorSpec) - - field := fmt.Sprint(v) - if result := validatefunc(v.Interface(), ps[1:]...); (!result && !negate) || (result && negate) { - if customMsgExists { - return false, Error{t.Name, TruncatingErrorf(validatorStruct.customErrorMessage, field, validator), customMsgExists, stripParams(validatorSpec), []string{}} - } - if negate { - return false, Error{t.Name, fmt.Errorf("%s does validate as %s", field, validator), customMsgExists, stripParams(validatorSpec), []string{}} - } - return false, Error{t.Name, fmt.Errorf("%s does not validate as %s", field, validator), customMsgExists, stripParams(validatorSpec), []string{}} - } - } - } - - switch v.Kind() { - case reflect.Bool, - reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr, - reflect.Float32, reflect.Float64, - reflect.String: - // for each tag option checks the map of validator functions - for _, validatorSpec := range optionsOrder { - validatorStruct := options[validatorSpec] - var negate bool - validator := validatorSpec - customMsgExists := len(validatorStruct.customErrorMessage) > 0 - - // checks whether the tag looks like '!something' or 'something' - if validator[0] == '!' { - validator = validator[1:] - negate = true - } - - // checks for param validators - for key, value := range ParamTagRegexMap { - ps := value.FindStringSubmatch(validator) - if len(ps) == 0 { - continue - } - - validatefunc, ok := ParamTagMap[key] - if !ok { - continue - } - - delete(options, validatorSpec) - - switch v.Kind() { - case reflect.String, - reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, - reflect.Float32, reflect.Float64: - - field := fmt.Sprint(v) // make value into string, then validate with regex - if result := validatefunc(field, ps[1:]...); (!result && !negate) || (result && negate) { - if customMsgExists { - return false, Error{t.Name, TruncatingErrorf(validatorStruct.customErrorMessage, field, validator), customMsgExists, stripParams(validatorSpec), []string{}} - } - if negate { - return false, Error{t.Name, fmt.Errorf("%s does validate as %s", field, validator), customMsgExists, stripParams(validatorSpec), []string{}} - } - return false, Error{t.Name, fmt.Errorf("%s does not validate as %s", field, validator), customMsgExists, stripParams(validatorSpec), []string{}} - } - default: - // type not yet supported, fail - return false, Error{t.Name, fmt.Errorf("Validator %s doesn't support kind %s", validator, v.Kind()), false, stripParams(validatorSpec), []string{}} - } - } - - if validatefunc, ok := TagMap[validator]; ok { - delete(options, validatorSpec) - - switch v.Kind() { - case reflect.String, - reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64, - reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, - reflect.Float32, reflect.Float64: - field := fmt.Sprint(v) // make value into string, then validate with regex - if result := validatefunc(field); !result && !negate || result && negate { - if customMsgExists { - return false, Error{t.Name, TruncatingErrorf(validatorStruct.customErrorMessage, field, validator), customMsgExists, stripParams(validatorSpec), []string{}} - } - if negate { - return false, Error{t.Name, fmt.Errorf("%s does validate as %s", field, validator), customMsgExists, stripParams(validatorSpec), []string{}} - } - return false, Error{t.Name, fmt.Errorf("%s does not validate as %s", field, validator), customMsgExists, stripParams(validatorSpec), []string{}} - } - default: - //Not Yet Supported Types (Fail here!) - err := fmt.Errorf("Validator %s doesn't support kind %s for value %v", validator, v.Kind(), v) - return false, Error{t.Name, err, false, stripParams(validatorSpec), []string{}} - } - } - } - return true, nil - case reflect.Map: - if v.Type().Key().Kind() != reflect.String { - return false, &UnsupportedTypeError{v.Type()} - } - var sv stringValues - sv = v.MapKeys() - sort.Sort(sv) - result := true - for i, k := range sv { - var resultItem bool - var err error - if v.MapIndex(k).Kind() != reflect.Struct { - resultItem, err = typeCheck(v.MapIndex(k), t, o, options) - if err != nil { - return false, err - } - } else { - resultItem, err = ValidateStruct(v.MapIndex(k).Interface()) - if err != nil { - err = prependPathToErrors(err, t.Name+"."+sv[i].Interface().(string)) - return false, err - } - } - result = result && resultItem - } - return result, nil - case reflect.Slice, reflect.Array: - result := true - for i := 0; i < v.Len(); i++ { - var resultItem bool - var err error - if v.Index(i).Kind() != reflect.Struct { - resultItem, err = typeCheck(v.Index(i), t, o, options) - if err != nil { - return false, err - } - } else { - resultItem, err = ValidateStruct(v.Index(i).Interface()) - if err != nil { - err = prependPathToErrors(err, t.Name+"."+strconv.Itoa(i)) - return false, err - } - } - result = result && resultItem - } - return result, nil - case reflect.Interface: - // If the value is an interface then encode its element - if v.IsNil() { - return true, nil - } - return ValidateStruct(v.Interface()) - case reflect.Ptr: - // If the value is a pointer then checks its element - if v.IsNil() { - return true, nil - } - return typeCheck(v.Elem(), t, o, options) - case reflect.Struct: - return true, nil - default: - return false, &UnsupportedTypeError{v.Type()} - } -} - -func stripParams(validatorString string) string { - return paramsRegexp.ReplaceAllString(validatorString, "") -} - -// isEmptyValue checks whether value empty or not -func isEmptyValue(v reflect.Value) bool { - switch v.Kind() { - case reflect.String, reflect.Array: - return v.Len() == 0 - case reflect.Map, reflect.Slice: - return v.Len() == 0 || v.IsNil() - case reflect.Bool: - return !v.Bool() - case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: - return v.Int() == 0 - case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64, reflect.Uintptr: - return v.Uint() == 0 - case reflect.Float32, reflect.Float64: - return v.Float() == 0 - case reflect.Interface, reflect.Ptr: - return v.IsNil() - } - - return reflect.DeepEqual(v.Interface(), reflect.Zero(v.Type()).Interface()) -} - -// ErrorByField returns error for specified field of the struct -// validated by ValidateStruct or empty string if there are no errors -// or this field doesn't exists or doesn't have any errors. -func ErrorByField(e error, field string) string { - if e == nil { - return "" - } - return ErrorsByField(e)[field] -} - -// ErrorsByField returns map of errors of the struct validated -// by ValidateStruct or empty map if there are no errors. -func ErrorsByField(e error) map[string]string { - m := make(map[string]string) - if e == nil { - return m - } - // prototype for ValidateStruct - - switch e := e.(type) { - case Error: - m[e.Name] = e.Err.Error() - case Errors: - for _, item := range e.Errors() { - n := ErrorsByField(item) - for k, v := range n { - m[k] = v - } - } - } - - return m -} - -// Error returns string equivalent for reflect.Type -func (e *UnsupportedTypeError) Error() string { - return "validator: unsupported type: " + e.Type.String() -} - -func (sv stringValues) Len() int { return len(sv) } -func (sv stringValues) Swap(i, j int) { sv[i], sv[j] = sv[j], sv[i] } -func (sv stringValues) Less(i, j int) bool { return sv.get(i) < sv.get(j) } -func (sv stringValues) get(i int) string { return sv[i].String() } - -func IsE164(str string) bool { - return rxE164.MatchString(str) -} diff --git a/vendor/github.com/asaskevich/govalidator/wercker.yml b/vendor/github.com/asaskevich/govalidator/wercker.yml deleted file mode 100644 index bc5f7b0864b..00000000000 --- a/vendor/github.com/asaskevich/govalidator/wercker.yml +++ /dev/null @@ -1,15 +0,0 @@ -box: golang -build: - steps: - - setup-go-workspace - - - script: - name: go get - code: | - go version - go get -t ./... - - - script: - name: go test - code: | - go test -race -v ./... diff --git a/vendor/github.com/aws/aws-sdk-go-v2/aws/credentials.go b/vendor/github.com/aws/aws-sdk-go-v2/aws/credentials.go index 4ad2ee4405d..9f94cfe0046 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/aws/credentials.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/aws/credentials.go @@ -118,6 +118,10 @@ const ( CredentialSourceHTTP // CredentialSourceIMDS credentials resolved from the instance metadata service (IMDS) CredentialSourceIMDS + // CredentialSourceProfileLogin credentials resolved from an `aws login` session sourced from a profile + CredentialSourceProfileLogin + // CredentialSourceLogin credentials resolved from an `aws login` session + CredentialSourceLogin ) // A Credentials is the AWS credentials value for individual credential fields. diff --git a/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go index 372d0f9839a..0e2e96d5009 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go @@ -3,4 +3,4 @@ package aws // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.39.6" +const goModuleVersion = "1.40.1" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/user_agent.go b/vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/user_agent.go index 3314230fd8c..157a71505cd 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/user_agent.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/aws/middleware/user_agent.go @@ -137,6 +137,9 @@ const ( UserAgentFeatureCredentialsIMDS = "0" UserAgentFeatureBearerServiceEnvVars = "3" + + UserAgentFeatureCredentialsProfileLogin = "AC" + UserAgentFeatureCredentialsLogin = "AD" ) var credentialSourceToFeature = map[aws.CredentialSource]UserAgentFeature{ @@ -160,6 +163,8 @@ var credentialSourceToFeature = map[aws.CredentialSource]UserAgentFeature{ aws.CredentialSourceProcess: UserAgentFeatureCredentialsProcess, aws.CredentialSourceHTTP: UserAgentFeatureCredentialsHTTP, aws.CredentialSourceIMDS: UserAgentFeatureCredentialsIMDS, + aws.CredentialSourceProfileLogin: UserAgentFeatureCredentialsProfileLogin, + aws.CredentialSourceLogin: UserAgentFeatureCredentialsLogin, } // RequestUserAgent is a build middleware that set the User-Agent for the request. diff --git a/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md index b6057249bdf..96241169ab1 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md @@ -1,3 +1,37 @@ +# v1.32.3 (2025-12-02) + +* **Dependency Update**: Updated to the latest SDK module versions +* **Dependency Update**: Upgrade to smithy-go v1.24.0. Notably this version of the library reduces the allocation footprint of the middleware system. We observe a ~10% reduction in allocations per SDK call with this change. + +# v1.32.2 (2025-11-25) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.32.1 (2025-11-21) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.32.0 (2025-11-19.2) + +* **Feature**: Add support for AWS Login credentials (package credentials/logincreds) to the default credential chain. +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.31.21 (2025-11-19) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.31.20 (2025-11-12) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.31.19 (2025-11-11) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.31.18 (2025-11-10) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.31.17 (2025-11-04) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go index e27cb6f4d8f..f746b903844 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go @@ -3,4 +3,4 @@ package config // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.31.17" +const goModuleVersion = "1.32.3" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/config/resolve_credentials.go b/vendor/github.com/aws/aws-sdk-go-v2/config/resolve_credentials.go index b00259df03a..de839859991 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/config/resolve_credentials.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/config/resolve_credentials.go @@ -13,10 +13,12 @@ import ( "github.com/aws/aws-sdk-go-v2/credentials" "github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds" "github.com/aws/aws-sdk-go-v2/credentials/endpointcreds" + "github.com/aws/aws-sdk-go-v2/credentials/logincreds" "github.com/aws/aws-sdk-go-v2/credentials/processcreds" "github.com/aws/aws-sdk-go-v2/credentials/ssocreds" "github.com/aws/aws-sdk-go-v2/credentials/stscreds" "github.com/aws/aws-sdk-go-v2/feature/ec2/imds" + "github.com/aws/aws-sdk-go-v2/service/signin" "github.com/aws/aws-sdk-go-v2/service/sso" "github.com/aws/aws-sdk-go-v2/service/ssooidc" "github.com/aws/aws-sdk-go-v2/service/sts" @@ -172,7 +174,10 @@ func resolveCredsFromProfile(ctx context.Context, cfg *aws.Config, envConfig *En ctx = addCredentialSource(ctx, aws.CredentialSourceProfileSSO) } err = resolveSSOCredentials(ctx, cfg, sharedConfig, configs) - + case len(sharedConfig.LoginSession) > 0: + ctx = addCredentialSource(ctx, aws.CredentialSourceProfileLogin) + ctx = addCredentialSource(ctx, aws.CredentialSourceLogin) + err = resolveLoginCredentials(ctx, cfg, sharedConfig, configs) case len(sharedConfig.CredentialProcess) != 0: // Get credentials from CredentialProcess ctx = addCredentialSource(ctx, aws.CredentialSourceProfileProcess) @@ -625,3 +630,21 @@ func addCredentialSource(ctx context.Context, source aws.CredentialSource) conte func getCredentialSources(ctx context.Context) []aws.CredentialSource { return ctx.Value(credentialSource{}).([]aws.CredentialSource) } + +func resolveLoginCredentials(ctx context.Context, cfg *aws.Config, sharedCfg *SharedConfig, configs configs) error { + cacheDir := os.Getenv("AWS_LOGIN_CACHE_DIRECTORY") + tokenPath, err := logincreds.StandardCachedTokenFilepath(sharedCfg.LoginSession, cacheDir) + if err != nil { + return err + } + + svc := signin.NewFromConfig(*cfg) + provider := logincreds.New(svc, tokenPath, func(o *logincreds.Options) { + o.CredentialSources = getCredentialSources(ctx) + }) + cfg.Credentials, err = wrapWithCredentialsCache(ctx, configs, provider) + if err != nil { + return err + } + return nil +} diff --git a/vendor/github.com/aws/aws-sdk-go-v2/config/shared_config.go b/vendor/github.com/aws/aws-sdk-go-v2/config/shared_config.go index 97be3f75694..5a0fea22200 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/config/shared_config.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/config/shared_config.go @@ -125,6 +125,8 @@ const ( checksumWhenRequired = "when_required" authSchemePreferenceKey = "auth_scheme_preference" + + loginSessionKey = "login_session" ) // defaultSharedConfigProfile allows for swapping the default profile for testing @@ -362,6 +364,9 @@ type SharedConfig struct { // Priority list of preferred auth scheme names (e.g. sigv4a). AuthSchemePreference []string + + // Session ARN from an `aws login` session. + LoginSession string } func (c SharedConfig) getDefaultsMode(ctx context.Context) (value aws.DefaultsMode, ok bool, err error) { @@ -897,6 +902,8 @@ func mergeSections(dst *ini.Sections, src ini.Sections) error { ssoStartURLKey, authSchemePreferenceKey, + + loginSessionKey, } for i := range stringKeys { if err := mergeStringKey(&srcSection, &dstSection, sectionName, stringKeys[i]); err != nil { @@ -1175,6 +1182,8 @@ func (c *SharedConfig) setFromIniSection(profile string, section ini.Section) er c.AuthSchemePreference = toAuthSchemePreferenceList(section.String(authSchemePreferenceKey)) + updateString(&c.LoginSession, section, loginSessionKey) + return nil } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md index 463dce685cb..d9cf2f26b76 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md @@ -1,3 +1,37 @@ +# v1.19.3 (2025-12-02) + +* **Dependency Update**: Updated to the latest SDK module versions +* **Dependency Update**: Upgrade to smithy-go v1.24.0. Notably this version of the library reduces the allocation footprint of the middleware system. We observe a ~10% reduction in allocations per SDK call with this change. + +# v1.19.2 (2025-11-25) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.19.1 (2025-11-21) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.19.0 (2025-11-19.2) + +* **Feature**: Add support for AWS Login credentials (package credentials/logincreds) to the default credential chain. +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.25 (2025-11-19) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.24 (2025-11-12) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.23 (2025-11-11) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.22 (2025-11-10) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.18.21 (2025-11-04) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go index 89e632cc24b..84c1d0298ff 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go @@ -3,4 +3,4 @@ package credentials // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.18.21" +const goModuleVersion = "1.19.3" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/credentials/logincreds/dpop.go b/vendor/github.com/aws/aws-sdk-go-v2/credentials/logincreds/dpop.go new file mode 100644 index 00000000000..6dc0845fdfd --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go-v2/credentials/logincreds/dpop.go @@ -0,0 +1,150 @@ +package logincreds + +import ( + "context" + "crypto/ecdsa" + cryptorand "crypto/rand" + "crypto/sha256" + "crypto/x509" + "encoding/base64" + "encoding/json" + "encoding/pem" + "fmt" + + "github.com/aws/aws-sdk-go-v2/internal/sdk" + "github.com/aws/aws-sdk-go-v2/service/signin" + "github.com/aws/smithy-go/middleware" + smithyrand "github.com/aws/smithy-go/rand" + smithyhttp "github.com/aws/smithy-go/transport/http" +) + +// AWS signin DPOP always uses the P256 curve +const curvelen = 256 / 8 // bytes + +// https://datatracker.ietf.org/doc/html/rfc9449 +func mkdpop(token *loginToken, htu string) (string, error) { + key, err := parseKey(token.DPOPKey) + if err != nil { + return "", fmt.Errorf("parse key: %w", err) + } + + header, err := jsonb64(&dpopHeader{ + Typ: "dpop+jwt", + Alg: "ES256", + Jwk: &dpopHeaderJwk{ + Kty: "EC", + X: base64.RawURLEncoding.EncodeToString(key.X.Bytes()), + Y: base64.RawURLEncoding.EncodeToString(key.Y.Bytes()), + Crv: "P-256", + }, + }) + if err != nil { + return "", fmt.Errorf("marshal header: %w", err) + } + + uuid, err := smithyrand.NewUUID(cryptorand.Reader).GetUUID() + if err != nil { + return "", fmt.Errorf("uuid: %w", err) + } + + payload, err := jsonb64(&dpopPayload{ + Jti: uuid, + Htm: "POST", + Htu: htu, + Iat: sdk.NowTime().Unix(), + }) + if err != nil { + return "", fmt.Errorf("marshal payload: %w", err) + } + + msg := fmt.Sprintf("%s.%s", header, payload) + + h := sha256.New() + h.Write([]byte(msg)) + + r, s, err := ecdsa.Sign(cryptorand.Reader, key, h.Sum(nil)) + if err != nil { + return "", fmt.Errorf("sign: %w", err) + } + + // DPOP signatures are formatted in RAW r || s form (with each value padded + // to fit in curve size which in our case is always the 256 bits) - rather + // than encoded in something like asn.1 + sig := make([]byte, curvelen*2) + r.FillBytes(sig[0:curvelen]) + s.FillBytes(sig[curvelen:]) + + dpop := fmt.Sprintf("%s.%s", msg, base64.RawURLEncoding.EncodeToString(sig)) + return dpop, nil +} + +func parseKey(pemBlock string) (*ecdsa.PrivateKey, error) { + block, _ := pem.Decode([]byte(pemBlock)) + priv, err := x509.ParseECPrivateKey(block.Bytes) + if err != nil { + return nil, fmt.Errorf("parse ec private key: %w", err) + } + + return priv, nil +} + +func jsonb64(v any) (string, error) { + j, err := json.MarshalIndent(v, "", " ") + if err != nil { + return "", err + } + + return base64.RawURLEncoding.EncodeToString(j), nil +} + +type dpopHeader struct { + Typ string `json:"typ"` + Alg string `json:"alg"` + Jwk *dpopHeaderJwk `json:"jwk"` +} + +type dpopHeaderJwk struct { + Kty string `json:"kty"` + X string `json:"x"` + Y string `json:"y"` + Crv string `json:"crv"` +} + +type dpopPayload struct { + Jti string `json:"jti"` + Htm string `json:"htm"` + Htu string `json:"htu"` + Iat int64 `json:"iat"` +} + +type signDPOP struct { + Token *loginToken +} + +func addSignDPOP(token *loginToken) func(o *signin.Options) { + return signin.WithAPIOptions(func(stack *middleware.Stack) error { + return stack.Finalize.Add(&signDPOP{token}, middleware.After) + }) +} + +func (*signDPOP) ID() string { + return "signDPOP" +} + +func (m *signDPOP) HandleFinalize( + ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( + out middleware.FinalizeOutput, md middleware.Metadata, err error, +) { + req, ok := in.Request.(*smithyhttp.Request) + if !ok { + return out, md, fmt.Errorf("unexpected transport type %T", req) + } + + dpop, err := mkdpop(m.Token, req.URL.String()) + if err != nil { + return out, md, fmt.Errorf("sign dpop: %w", err) + } + + req.Header.Set("DPoP", dpop) + return next.HandleFinalize(ctx, in) +} diff --git a/vendor/github.com/aws/aws-sdk-go-v2/credentials/logincreds/file.go b/vendor/github.com/aws/aws-sdk-go-v2/credentials/logincreds/file.go new file mode 100644 index 00000000000..6cd5281d49f --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go-v2/credentials/logincreds/file.go @@ -0,0 +1,14 @@ +package logincreds + +import ( + "io" + "os" +) + +var openFile func(string) (io.ReadCloser, error) = func(name string) (io.ReadCloser, error) { + return os.Open(name) +} + +var createFile func(string) (io.WriteCloser, error) = func(name string) (io.WriteCloser, error) { + return os.Create(name) +} diff --git a/vendor/github.com/aws/aws-sdk-go-v2/credentials/logincreds/provider.go b/vendor/github.com/aws/aws-sdk-go-v2/credentials/logincreds/provider.go new file mode 100644 index 00000000000..3e6357b87c7 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go-v2/credentials/logincreds/provider.go @@ -0,0 +1,172 @@ +// Package logincreds implements AWS credential provision for sessions created +// via an `aws login` command. +package logincreds + +import ( + "context" + "encoding/json" + "errors" + "fmt" + "io" + "os" + + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/internal/sdk" + "github.com/aws/aws-sdk-go-v2/service/signin" + "github.com/aws/aws-sdk-go-v2/service/signin/types" +) + +// ProviderName identifies the login provider. +const ProviderName = "LoginProvider" + +// TokenAPIClient provides the interface for the login session's token +// retrieval operation. +type TokenAPIClient interface { + CreateOAuth2Token(context.Context, *signin.CreateOAuth2TokenInput, ...func(*signin.Options)) (*signin.CreateOAuth2TokenOutput, error) +} + +// Provider supplies credentials for an `aws login` session. +type Provider struct { + options Options +} + +var _ aws.CredentialsProvider = (*Provider)(nil) + +// Options configures the Provider. +type Options struct { + Client TokenAPIClient + + // APIOptions to pass to the underlying CreateOAuth2Token operation. + ClientOptions []func(*signin.Options) + + // The path to the cached login token. + CachedTokenFilepath string + + // The chain of providers that was used to create this provider. + // + // These values are for reporting purposes and are not meant to be set up + // directly. + CredentialSources []aws.CredentialSource +} + +// New returns a new login session credentials provider. +func New(client TokenAPIClient, path string, opts ...func(*Options)) *Provider { + options := Options{ + Client: client, + CachedTokenFilepath: path, + } + + for _, opt := range opts { + opt(&options) + } + + return &Provider{options} +} + +// Retrieve generates a new set of temporary credentials using an `aws login` +// session. +func (p *Provider) Retrieve(ctx context.Context) (aws.Credentials, error) { + token, err := p.loadToken() + if err != nil { + return aws.Credentials{}, fmt.Errorf("load login token: %w", err) + } + if err := token.Validate(); err != nil { + return aws.Credentials{}, fmt.Errorf("validate login token: %w", err) + } + + // the token may have been refreshed elsewhere or the login session might + // have just been created + if sdk.NowTime().Before(token.AccessToken.ExpiresAt) { + return token.Credentials(), nil + } + + opts := make([]func(*signin.Options), len(p.options.ClientOptions)+1) + opts[0] = addSignDPOP(token) + copy(opts[1:], p.options.ClientOptions) + + out, err := p.options.Client.CreateOAuth2Token(ctx, &signin.CreateOAuth2TokenInput{ + TokenInput: &types.CreateOAuth2TokenRequestBody{ + ClientId: aws.String(token.ClientID), + GrantType: aws.String("refresh_token"), + RefreshToken: aws.String(token.RefreshToken), + }, + }, opts...) + if err != nil { + var terr *types.AccessDeniedException + if errors.As(err, &terr) { + err = toAccessDeniedError(terr) + } + return aws.Credentials{}, fmt.Errorf("create oauth2 token: %w", err) + } + + token.Update(out) + if err := p.saveToken(token); err != nil { + return aws.Credentials{}, fmt.Errorf("save token: %w", err) + } + + return token.Credentials(), nil +} + +// ProviderSources returns the credential chain that was used to construct this +// provider. +func (p *Provider) ProviderSources() []aws.CredentialSource { + if p.options.CredentialSources == nil { + return []aws.CredentialSource{aws.CredentialSourceLogin} + } + return p.options.CredentialSources +} + +func (p *Provider) loadToken() (*loginToken, error) { + f, err := openFile(p.options.CachedTokenFilepath) + if err != nil && os.IsNotExist(err) { + return nil, fmt.Errorf("token file not found, please reauthenticate") + } + if err != nil { + return nil, err + } + defer f.Close() + + j, err := io.ReadAll(f) + if err != nil { + return nil, err + } + + var t *loginToken + if err := json.Unmarshal(j, &t); err != nil { + return nil, err + } + + return t, nil +} + +func (p *Provider) saveToken(token *loginToken) error { + j, err := json.Marshal(token) + if err != nil { + return err + } + + f, err := createFile(p.options.CachedTokenFilepath) + if err != nil { + return err + } + defer f.Close() + + if _, err := f.Write(j); err != nil { + return err + } + + return nil +} + +func toAccessDeniedError(err *types.AccessDeniedException) error { + switch err.Error_ { + case types.OAuth2ErrorCodeTokenExpired: + return fmt.Errorf("login session has expired, please reauthenticate") + case types.OAuth2ErrorCodeUserCredentialsChanged: + return fmt.Errorf("login session password has changed, please reauthenticate") + case types.OAuth2ErrorCodeInsufficientPermissions: + return fmt.Errorf("insufficient permissions, you may be missing permissions for the CreateOAuth2Token action") + default: + return err + } +} diff --git a/vendor/github.com/aws/aws-sdk-go-v2/credentials/logincreds/token.go b/vendor/github.com/aws/aws-sdk-go-v2/credentials/logincreds/token.go new file mode 100644 index 00000000000..1a97b98cdc2 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go-v2/credentials/logincreds/token.go @@ -0,0 +1,110 @@ +package logincreds + +import ( + "crypto/sha256" + "encoding/hex" + "errors" + "fmt" + "path/filepath" + "strings" + "time" + + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/internal/sdk" + "github.com/aws/aws-sdk-go-v2/internal/shareddefaults" + "github.com/aws/aws-sdk-go-v2/service/signin" +) + +var userHomeDir = shareddefaults.UserHomeDir + +// StandardCachedTokenFilepath returns the filepath for the cached login token +// file. Key that will be used to compute a SHA256 value that is hex encoded. +// +// An overriden root dir can be provided, if not set the path defaults to +// ~/.aws/sso/cache. +func StandardCachedTokenFilepath(session, dir string) (string, error) { + session = strings.TrimSpace(session) + + if len(dir) == 0 { + dir = userHomeDir() + if len(dir) == 0 { + return "", errors.New("user home dir is blank") + } + dir = filepath.Join(dir, ".aws", "login", "cache") + } + + h := sha256.New() + h.Write([]byte(session)) + + filename := strings.ToLower(hex.EncodeToString(h.Sum(nil))) + ".json" + return filepath.Join(dir, filename), nil +} + +// contents of the token as they appear on disk +type loginToken struct { + AccessToken *loginTokenAccessToken `json:"accessToken"` + TokenType string `json:"tokenType"` + RefreshToken string `json:"refreshToken"` + IdentityToken string `json:"identityToken"` + ClientID string `json:"clientId"` + DPOPKey string `json:"dpopKey"` +} + +type loginTokenAccessToken struct { + AccessKeyID string `json:"accessKeyId"` + SecretAccessKey string `json:"secretAccessKey"` + SessionToken string `json:"sessionToken"` + AccountID string `json:"accountId"` + ExpiresAt time.Time `json:"expiresAt"` +} + +func (t *loginToken) Validate() error { + if t.AccessToken == nil { + return fmt.Errorf("missing accessToken") + } + if t.AccessToken.AccessKeyID == "" { + return fmt.Errorf("missing accessToken.accessKeyId") + } + if t.AccessToken.SecretAccessKey == "" { + return fmt.Errorf("missing accessToken.secretAccessKey") + } + if t.AccessToken.SessionToken == "" { + return fmt.Errorf("missing accessToken.sessionToken") + } + if t.AccessToken.AccountID == "" { + return fmt.Errorf("missing accessToken.accountId") + } + if t.AccessToken.ExpiresAt.IsZero() { + return fmt.Errorf("missing accessToken.expiresAt") + } + if t.ClientID == "" { + return fmt.Errorf("missing clientId") + } + if t.RefreshToken == "" { + return fmt.Errorf("missing refreshToken") + } + if t.DPOPKey == "" { + return fmt.Errorf("missing dpopKey") + } + return nil +} + +func (t *loginToken) Credentials() aws.Credentials { + return aws.Credentials{ + AccessKeyID: t.AccessToken.AccessKeyID, + SecretAccessKey: t.AccessToken.SecretAccessKey, + SessionToken: t.AccessToken.SessionToken, + Source: ProviderName, + CanExpire: true, + Expires: t.AccessToken.ExpiresAt, + AccountID: t.AccessToken.AccountID, + } +} + +func (t *loginToken) Update(out *signin.CreateOAuth2TokenOutput) { + t.AccessToken.AccessKeyID = *out.TokenOutput.AccessToken.AccessKeyId + t.AccessToken.SecretAccessKey = *out.TokenOutput.AccessToken.SecretAccessKey + t.AccessToken.SessionToken = *out.TokenOutput.AccessToken.SessionToken + t.AccessToken.ExpiresAt = sdk.NowTime().Add(time.Duration(*out.TokenOutput.ExpiresIn) * time.Second) + t.RefreshToken = *out.TokenOutput.RefreshToken +} diff --git a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md index cfb9d77fe05..a7a537774c7 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md @@ -1,3 +1,12 @@ +# v1.18.15 (2025-12-02) + +* **Dependency Update**: Updated to the latest SDK module versions +* **Dependency Update**: Upgrade to smithy-go v1.24.0. Notably this version of the library reduces the allocation footprint of the middleware system. We observe a ~10% reduction in allocations per SDK call with this change. + +# v1.18.14 (2025-11-19.2) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.18.13 (2025-11-04) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go index 1af019aec27..8ad9afa8f84 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go @@ -3,4 +3,4 @@ package imds // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.18.13" +const goModuleVersion = "1.18.15" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md index 0981931aa78..f4a5edd69aa 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md @@ -1,3 +1,12 @@ +# v1.4.15 (2025-12-02) + +* **Dependency Update**: Updated to the latest SDK module versions +* **Dependency Update**: Upgrade to smithy-go v1.24.0. Notably this version of the library reduces the allocation footprint of the middleware system. We observe a ~10% reduction in allocations per SDK call with this change. + +# v1.4.14 (2025-11-19.2) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.4.13 (2025-11-04) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go index 970e61deed8..f9790cb5dc9 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go @@ -3,4 +3,4 @@ package configsources // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.4.13" +const goModuleVersion = "1.4.15" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md index 9c3aafe1da1..f5d88c32d01 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md @@ -1,3 +1,12 @@ +# v2.7.15 (2025-12-02) + +* **Dependency Update**: Updated to the latest SDK module versions +* **Dependency Update**: Upgrade to smithy-go v1.24.0. Notably this version of the library reduces the allocation footprint of the middleware system. We observe a ~10% reduction in allocations per SDK call with this change. + +# v2.7.14 (2025-11-19.2) + +* **Dependency Update**: Updated to the latest SDK module versions + # v2.7.13 (2025-11-04) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go index 9675feb419b..d9929521e55 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go @@ -3,4 +3,4 @@ package endpoints // goModuleVersion is the tagged release for this module -const goModuleVersion = "2.7.13" +const goModuleVersion = "2.7.15" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/CHANGELOG.md index c05f82ea411..6ffbf3fe4ac 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/CHANGELOG.md @@ -1,3 +1,7 @@ +# v1.13.4 (2025-12-02) + +* **Dependency Update**: Upgrade to smithy-go v1.24.0. Notably this version of the library reduces the allocation footprint of the middleware system. We observe a ~10% reduction in allocations per SDK call with this change. + # v1.13.3 (2025-11-04) * **Dependency Update**: Upgrade to smithy-go v1.23.2 which should convey some passive reduction of overall allocations, especially when not using the metrics system. diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/go_module_metadata.go index 6a4c336055a..970bb210ec9 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding/go_module_metadata.go @@ -3,4 +3,4 @@ package acceptencoding // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.13.3" +const goModuleVersion = "1.13.4" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md index 2021865dd0e..402a4e7d20d 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md @@ -1,3 +1,12 @@ +# v1.13.15 (2025-12-02) + +* **Dependency Update**: Updated to the latest SDK module versions +* **Dependency Update**: Upgrade to smithy-go v1.24.0. Notably this version of the library reduces the allocation footprint of the middleware system. We observe a ~10% reduction in allocations per SDK call with this change. + +# v1.13.14 (2025-11-19.2) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.13.13 (2025-11-04) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go index 9d29218c313..148feaf9591 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go @@ -3,4 +3,4 @@ package presignedurl // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.13.13" +const goModuleVersion = "1.13.15" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/CHANGELOG.md new file mode 100644 index 00000000000..39a8a2cd75e --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/CHANGELOG.md @@ -0,0 +1,18 @@ +# v1.0.3 (2025-12-02) + +* **Dependency Update**: Updated to the latest SDK module versions +* **Dependency Update**: Upgrade to smithy-go v1.24.0. Notably this version of the library reduces the allocation footprint of the middleware system. We observe a ~10% reduction in allocations per SDK call with this change. + +# v1.0.2 (2025-11-25) + +* **Bug Fix**: Add error check for endpoint param binding during auth scheme resolution to fix panic reported in #3234 + +# v1.0.1 (2025-11-19.2) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.0.0 (2025-11-19) + +* **Release**: New AWS service client module +* **Feature**: AWS Sign-In manages authentication for AWS services. This service provides secure authentication flows for accessing AWS resources from the console and developer tools. This release adds the CreateOAuth2Token API, which can be used to fetch OAuth2 access tokens and refresh tokens from Sign-In. + diff --git a/vendor/github.com/trivago/tgo/LICENSE b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/LICENSE.txt similarity index 99% rename from vendor/github.com/trivago/tgo/LICENSE rename to vendor/github.com/aws/aws-sdk-go-v2/service/signin/LICENSE.txt index 8f71f43fee3..d6456956733 100644 --- a/vendor/github.com/trivago/tgo/LICENSE +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/LICENSE.txt @@ -1,3 +1,4 @@ + Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ @@ -178,7 +179,7 @@ APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "{}" + boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a @@ -186,7 +187,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright {yyyy} {name of copyright owner} + Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. @@ -199,4 +200,3 @@ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. - diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/api_client.go b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/api_client.go new file mode 100644 index 00000000000..d2db11d2aa1 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/api_client.go @@ -0,0 +1,949 @@ +// Code generated by smithy-go-codegen DO NOT EDIT. + +package signin + +import ( + "context" + "errors" + "fmt" + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/aws/defaults" + awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" + "github.com/aws/aws-sdk-go-v2/aws/retry" + "github.com/aws/aws-sdk-go-v2/aws/signer/v4" + awshttp "github.com/aws/aws-sdk-go-v2/aws/transport/http" + internalauth "github.com/aws/aws-sdk-go-v2/internal/auth" + internalauthsmithy "github.com/aws/aws-sdk-go-v2/internal/auth/smithy" + internalConfig "github.com/aws/aws-sdk-go-v2/internal/configsources" + internalmiddleware "github.com/aws/aws-sdk-go-v2/internal/middleware" + smithy "github.com/aws/smithy-go" + smithyauth "github.com/aws/smithy-go/auth" + smithydocument "github.com/aws/smithy-go/document" + "github.com/aws/smithy-go/logging" + "github.com/aws/smithy-go/metrics" + "github.com/aws/smithy-go/middleware" + "github.com/aws/smithy-go/tracing" + smithyhttp "github.com/aws/smithy-go/transport/http" + "net" + "net/http" + "sync/atomic" + "time" +) + +const ServiceID = "Signin" +const ServiceAPIVersion = "2023-01-01" + +type operationMetrics struct { + Duration metrics.Float64Histogram + SerializeDuration metrics.Float64Histogram + ResolveIdentityDuration metrics.Float64Histogram + ResolveEndpointDuration metrics.Float64Histogram + SignRequestDuration metrics.Float64Histogram + DeserializeDuration metrics.Float64Histogram +} + +func (m *operationMetrics) histogramFor(name string) metrics.Float64Histogram { + switch name { + case "client.call.duration": + return m.Duration + case "client.call.serialization_duration": + return m.SerializeDuration + case "client.call.resolve_identity_duration": + return m.ResolveIdentityDuration + case "client.call.resolve_endpoint_duration": + return m.ResolveEndpointDuration + case "client.call.signing_duration": + return m.SignRequestDuration + case "client.call.deserialization_duration": + return m.DeserializeDuration + default: + panic("unrecognized operation metric") + } +} + +func timeOperationMetric[T any]( + ctx context.Context, metric string, fn func() (T, error), + opts ...metrics.RecordMetricOption, +) (T, error) { + mm := getOperationMetrics(ctx) + if mm == nil { // not using the metrics system + return fn() + } + + instr := mm.histogramFor(metric) + opts = append([]metrics.RecordMetricOption{withOperationMetadata(ctx)}, opts...) + + start := time.Now() + v, err := fn() + end := time.Now() + + elapsed := end.Sub(start) + instr.Record(ctx, float64(elapsed)/1e9, opts...) + return v, err +} + +func startMetricTimer(ctx context.Context, metric string, opts ...metrics.RecordMetricOption) func() { + mm := getOperationMetrics(ctx) + if mm == nil { // not using the metrics system + return func() {} + } + + instr := mm.histogramFor(metric) + opts = append([]metrics.RecordMetricOption{withOperationMetadata(ctx)}, opts...) + + var ended bool + start := time.Now() + return func() { + if ended { + return + } + ended = true + + end := time.Now() + + elapsed := end.Sub(start) + instr.Record(ctx, float64(elapsed)/1e9, opts...) + } +} + +func withOperationMetadata(ctx context.Context) metrics.RecordMetricOption { + return func(o *metrics.RecordMetricOptions) { + o.Properties.Set("rpc.service", middleware.GetServiceID(ctx)) + o.Properties.Set("rpc.method", middleware.GetOperationName(ctx)) + } +} + +type operationMetricsKey struct{} + +func withOperationMetrics(parent context.Context, mp metrics.MeterProvider) (context.Context, error) { + if _, ok := mp.(metrics.NopMeterProvider); ok { + // not using the metrics system - setting up the metrics context is a memory-intensive operation + // so we should skip it in this case + return parent, nil + } + + meter := mp.Meter("github.com/aws/aws-sdk-go-v2/service/signin") + om := &operationMetrics{} + + var err error + + om.Duration, err = operationMetricTimer(meter, "client.call.duration", + "Overall call duration (including retries and time to send or receive request and response body)") + if err != nil { + return nil, err + } + om.SerializeDuration, err = operationMetricTimer(meter, "client.call.serialization_duration", + "The time it takes to serialize a message body") + if err != nil { + return nil, err + } + om.ResolveIdentityDuration, err = operationMetricTimer(meter, "client.call.auth.resolve_identity_duration", + "The time taken to acquire an identity (AWS credentials, bearer token, etc) from an Identity Provider") + if err != nil { + return nil, err + } + om.ResolveEndpointDuration, err = operationMetricTimer(meter, "client.call.resolve_endpoint_duration", + "The time it takes to resolve an endpoint (endpoint resolver, not DNS) for the request") + if err != nil { + return nil, err + } + om.SignRequestDuration, err = operationMetricTimer(meter, "client.call.auth.signing_duration", + "The time it takes to sign a request") + if err != nil { + return nil, err + } + om.DeserializeDuration, err = operationMetricTimer(meter, "client.call.deserialization_duration", + "The time it takes to deserialize a message body") + if err != nil { + return nil, err + } + + return context.WithValue(parent, operationMetricsKey{}, om), nil +} + +func operationMetricTimer(m metrics.Meter, name, desc string) (metrics.Float64Histogram, error) { + return m.Float64Histogram(name, func(o *metrics.InstrumentOptions) { + o.UnitLabel = "s" + o.Description = desc + }) +} + +func getOperationMetrics(ctx context.Context) *operationMetrics { + if v := ctx.Value(operationMetricsKey{}); v != nil { + return v.(*operationMetrics) + } + return nil +} + +func operationTracer(p tracing.TracerProvider) tracing.Tracer { + return p.Tracer("github.com/aws/aws-sdk-go-v2/service/signin") +} + +// Client provides the API client to make operations call for AWS Sign-In Service. +type Client struct { + options Options + + // Difference between the time reported by the server and the client + timeOffset *atomic.Int64 +} + +// New returns an initialized Client based on the functional options. Provide +// additional functional options to further configure the behavior of the client, +// such as changing the client's endpoint or adding custom middleware behavior. +func New(options Options, optFns ...func(*Options)) *Client { + options = options.Copy() + + resolveDefaultLogger(&options) + + setResolvedDefaultsMode(&options) + + resolveRetryer(&options) + + resolveHTTPClient(&options) + + resolveHTTPSignerV4(&options) + + resolveEndpointResolverV2(&options) + + resolveTracerProvider(&options) + + resolveMeterProvider(&options) + + resolveAuthSchemeResolver(&options) + + for _, fn := range optFns { + fn(&options) + } + + finalizeRetryMaxAttempts(&options) + + ignoreAnonymousAuth(&options) + + wrapWithAnonymousAuth(&options) + + resolveAuthSchemes(&options) + + client := &Client{ + options: options, + } + + initializeTimeOffsetResolver(client) + + return client +} + +// Options returns a copy of the client configuration. +// +// Callers SHOULD NOT perform mutations on any inner structures within client +// config. Config overrides should instead be made on a per-operation basis through +// functional options. +func (c *Client) Options() Options { + return c.options.Copy() +} + +func (c *Client) invokeOperation( + ctx context.Context, opID string, params interface{}, optFns []func(*Options), stackFns ...func(*middleware.Stack, Options) error, +) ( + result interface{}, metadata middleware.Metadata, err error, +) { + ctx = middleware.ClearStackValues(ctx) + ctx = middleware.WithServiceID(ctx, ServiceID) + ctx = middleware.WithOperationName(ctx, opID) + + stack := middleware.NewStack(opID, smithyhttp.NewStackRequest) + options := c.options.Copy() + + for _, fn := range optFns { + fn(&options) + } + + finalizeOperationRetryMaxAttempts(&options, *c) + + finalizeClientEndpointResolverOptions(&options) + + for _, fn := range stackFns { + if err := fn(stack, options); err != nil { + return nil, metadata, err + } + } + + for _, fn := range options.APIOptions { + if err := fn(stack); err != nil { + return nil, metadata, err + } + } + + ctx, err = withOperationMetrics(ctx, options.MeterProvider) + if err != nil { + return nil, metadata, err + } + + tracer := operationTracer(options.TracerProvider) + spanName := fmt.Sprintf("%s.%s", ServiceID, opID) + + ctx = tracing.WithOperationTracer(ctx, tracer) + + ctx, span := tracer.StartSpan(ctx, spanName, func(o *tracing.SpanOptions) { + o.Kind = tracing.SpanKindClient + o.Properties.Set("rpc.system", "aws-api") + o.Properties.Set("rpc.method", opID) + o.Properties.Set("rpc.service", ServiceID) + }) + endTimer := startMetricTimer(ctx, "client.call.duration") + defer endTimer() + defer span.End() + + handler := smithyhttp.NewClientHandlerWithOptions(options.HTTPClient, func(o *smithyhttp.ClientHandler) { + o.Meter = options.MeterProvider.Meter("github.com/aws/aws-sdk-go-v2/service/signin") + }) + decorated := middleware.DecorateHandler(handler, stack) + result, metadata, err = decorated.Handle(ctx, params) + if err != nil { + span.SetProperty("exception.type", fmt.Sprintf("%T", err)) + span.SetProperty("exception.message", err.Error()) + + var aerr smithy.APIError + if errors.As(err, &aerr) { + span.SetProperty("api.error_code", aerr.ErrorCode()) + span.SetProperty("api.error_message", aerr.ErrorMessage()) + span.SetProperty("api.error_fault", aerr.ErrorFault().String()) + } + + err = &smithy.OperationError{ + ServiceID: ServiceID, + OperationName: opID, + Err: err, + } + } + + span.SetProperty("error", err != nil) + if err == nil { + span.SetStatus(tracing.SpanStatusOK) + } else { + span.SetStatus(tracing.SpanStatusError) + } + + return result, metadata, err +} + +type operationInputKey struct{} + +func setOperationInput(ctx context.Context, input interface{}) context.Context { + return middleware.WithStackValue(ctx, operationInputKey{}, input) +} + +func getOperationInput(ctx context.Context) interface{} { + return middleware.GetStackValue(ctx, operationInputKey{}) +} + +type setOperationInputMiddleware struct { +} + +func (*setOperationInputMiddleware) ID() string { + return "setOperationInput" +} + +func (m *setOperationInputMiddleware) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( + out middleware.SerializeOutput, metadata middleware.Metadata, err error, +) { + ctx = setOperationInput(ctx, in.Parameters) + return next.HandleSerialize(ctx, in) +} + +func addProtocolFinalizerMiddlewares(stack *middleware.Stack, options Options, operation string) error { + if err := stack.Finalize.Add(&resolveAuthSchemeMiddleware{operation: operation, options: options}, middleware.Before); err != nil { + return fmt.Errorf("add ResolveAuthScheme: %w", err) + } + if err := stack.Finalize.Insert(&getIdentityMiddleware{options: options}, "ResolveAuthScheme", middleware.After); err != nil { + return fmt.Errorf("add GetIdentity: %v", err) + } + if err := stack.Finalize.Insert(&resolveEndpointV2Middleware{options: options}, "GetIdentity", middleware.After); err != nil { + return fmt.Errorf("add ResolveEndpointV2: %v", err) + } + if err := stack.Finalize.Insert(&signRequestMiddleware{options: options}, "ResolveEndpointV2", middleware.After); err != nil { + return fmt.Errorf("add Signing: %w", err) + } + return nil +} +func resolveAuthSchemeResolver(options *Options) { + if options.AuthSchemeResolver == nil { + options.AuthSchemeResolver = &defaultAuthSchemeResolver{} + } +} + +func resolveAuthSchemes(options *Options) { + if options.AuthSchemes == nil { + options.AuthSchemes = []smithyhttp.AuthScheme{ + internalauth.NewHTTPAuthScheme("aws.auth#sigv4", &internalauthsmithy.V4SignerAdapter{ + Signer: options.HTTPSignerV4, + Logger: options.Logger, + LogSigning: options.ClientLogMode.IsSigning(), + }), + } + } +} + +type noSmithyDocumentSerde = smithydocument.NoSerde + +type legacyEndpointContextSetter struct { + LegacyResolver EndpointResolver +} + +func (*legacyEndpointContextSetter) ID() string { + return "legacyEndpointContextSetter" +} + +func (m *legacyEndpointContextSetter) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( + out middleware.InitializeOutput, metadata middleware.Metadata, err error, +) { + if m.LegacyResolver != nil { + ctx = awsmiddleware.SetRequiresLegacyEndpoints(ctx, true) + } + + return next.HandleInitialize(ctx, in) + +} +func addlegacyEndpointContextSetter(stack *middleware.Stack, o Options) error { + return stack.Initialize.Add(&legacyEndpointContextSetter{ + LegacyResolver: o.EndpointResolver, + }, middleware.Before) +} + +func resolveDefaultLogger(o *Options) { + if o.Logger != nil { + return + } + o.Logger = logging.Nop{} +} + +func addSetLoggerMiddleware(stack *middleware.Stack, o Options) error { + return middleware.AddSetLoggerMiddleware(stack, o.Logger) +} + +func setResolvedDefaultsMode(o *Options) { + if len(o.resolvedDefaultsMode) > 0 { + return + } + + var mode aws.DefaultsMode + mode.SetFromString(string(o.DefaultsMode)) + + if mode == aws.DefaultsModeAuto { + mode = defaults.ResolveDefaultsModeAuto(o.Region, o.RuntimeEnvironment) + } + + o.resolvedDefaultsMode = mode +} + +// NewFromConfig returns a new client from the provided config. +func NewFromConfig(cfg aws.Config, optFns ...func(*Options)) *Client { + opts := Options{ + Region: cfg.Region, + DefaultsMode: cfg.DefaultsMode, + RuntimeEnvironment: cfg.RuntimeEnvironment, + HTTPClient: cfg.HTTPClient, + Credentials: cfg.Credentials, + APIOptions: cfg.APIOptions, + Logger: cfg.Logger, + ClientLogMode: cfg.ClientLogMode, + AppID: cfg.AppID, + AuthSchemePreference: cfg.AuthSchemePreference, + } + resolveAWSRetryerProvider(cfg, &opts) + resolveAWSRetryMaxAttempts(cfg, &opts) + resolveAWSRetryMode(cfg, &opts) + resolveAWSEndpointResolver(cfg, &opts) + resolveInterceptors(cfg, &opts) + resolveUseDualStackEndpoint(cfg, &opts) + resolveUseFIPSEndpoint(cfg, &opts) + resolveBaseEndpoint(cfg, &opts) + return New(opts, func(o *Options) { + for _, opt := range cfg.ServiceOptions { + opt(ServiceID, o) + } + for _, opt := range optFns { + opt(o) + } + }) +} + +func resolveHTTPClient(o *Options) { + var buildable *awshttp.BuildableClient + + if o.HTTPClient != nil { + var ok bool + buildable, ok = o.HTTPClient.(*awshttp.BuildableClient) + if !ok { + return + } + } else { + buildable = awshttp.NewBuildableClient() + } + + modeConfig, err := defaults.GetModeConfiguration(o.resolvedDefaultsMode) + if err == nil { + buildable = buildable.WithDialerOptions(func(dialer *net.Dialer) { + if dialerTimeout, ok := modeConfig.GetConnectTimeout(); ok { + dialer.Timeout = dialerTimeout + } + }) + + buildable = buildable.WithTransportOptions(func(transport *http.Transport) { + if tlsHandshakeTimeout, ok := modeConfig.GetTLSNegotiationTimeout(); ok { + transport.TLSHandshakeTimeout = tlsHandshakeTimeout + } + }) + } + + o.HTTPClient = buildable +} + +func resolveRetryer(o *Options) { + if o.Retryer != nil { + return + } + + if len(o.RetryMode) == 0 { + modeConfig, err := defaults.GetModeConfiguration(o.resolvedDefaultsMode) + if err == nil { + o.RetryMode = modeConfig.RetryMode + } + } + if len(o.RetryMode) == 0 { + o.RetryMode = aws.RetryModeStandard + } + + var standardOptions []func(*retry.StandardOptions) + if v := o.RetryMaxAttempts; v != 0 { + standardOptions = append(standardOptions, func(so *retry.StandardOptions) { + so.MaxAttempts = v + }) + } + + switch o.RetryMode { + case aws.RetryModeAdaptive: + var adaptiveOptions []func(*retry.AdaptiveModeOptions) + if len(standardOptions) != 0 { + adaptiveOptions = append(adaptiveOptions, func(ao *retry.AdaptiveModeOptions) { + ao.StandardOptions = append(ao.StandardOptions, standardOptions...) + }) + } + o.Retryer = retry.NewAdaptiveMode(adaptiveOptions...) + + default: + o.Retryer = retry.NewStandard(standardOptions...) + } +} + +func resolveAWSRetryerProvider(cfg aws.Config, o *Options) { + if cfg.Retryer == nil { + return + } + o.Retryer = cfg.Retryer() +} + +func resolveAWSRetryMode(cfg aws.Config, o *Options) { + if len(cfg.RetryMode) == 0 { + return + } + o.RetryMode = cfg.RetryMode +} +func resolveAWSRetryMaxAttempts(cfg aws.Config, o *Options) { + if cfg.RetryMaxAttempts == 0 { + return + } + o.RetryMaxAttempts = cfg.RetryMaxAttempts +} + +func finalizeRetryMaxAttempts(o *Options) { + if o.RetryMaxAttempts == 0 { + return + } + + o.Retryer = retry.AddWithMaxAttempts(o.Retryer, o.RetryMaxAttempts) +} + +func finalizeOperationRetryMaxAttempts(o *Options, client Client) { + if v := o.RetryMaxAttempts; v == 0 || v == client.options.RetryMaxAttempts { + return + } + + o.Retryer = retry.AddWithMaxAttempts(o.Retryer, o.RetryMaxAttempts) +} + +func resolveAWSEndpointResolver(cfg aws.Config, o *Options) { + if cfg.EndpointResolver == nil && cfg.EndpointResolverWithOptions == nil { + return + } + o.EndpointResolver = withEndpointResolver(cfg.EndpointResolver, cfg.EndpointResolverWithOptions) +} + +func resolveInterceptors(cfg aws.Config, o *Options) { + o.Interceptors = cfg.Interceptors.Copy() +} + +func addClientUserAgent(stack *middleware.Stack, options Options) error { + ua, err := getOrAddRequestUserAgent(stack) + if err != nil { + return err + } + + ua.AddSDKAgentKeyValue(awsmiddleware.APIMetadata, "signin", goModuleVersion) + if len(options.AppID) > 0 { + ua.AddSDKAgentKey(awsmiddleware.ApplicationIdentifier, options.AppID) + } + + return nil +} + +func getOrAddRequestUserAgent(stack *middleware.Stack) (*awsmiddleware.RequestUserAgent, error) { + id := (*awsmiddleware.RequestUserAgent)(nil).ID() + mw, ok := stack.Build.Get(id) + if !ok { + mw = awsmiddleware.NewRequestUserAgent() + if err := stack.Build.Add(mw, middleware.After); err != nil { + return nil, err + } + } + + ua, ok := mw.(*awsmiddleware.RequestUserAgent) + if !ok { + return nil, fmt.Errorf("%T for %s middleware did not match expected type", mw, id) + } + + return ua, nil +} + +type HTTPSignerV4 interface { + SignHTTP(ctx context.Context, credentials aws.Credentials, r *http.Request, payloadHash string, service string, region string, signingTime time.Time, optFns ...func(*v4.SignerOptions)) error +} + +func resolveHTTPSignerV4(o *Options) { + if o.HTTPSignerV4 != nil { + return + } + o.HTTPSignerV4 = newDefaultV4Signer(*o) +} + +func newDefaultV4Signer(o Options) *v4.Signer { + return v4.NewSigner(func(so *v4.SignerOptions) { + so.Logger = o.Logger + so.LogSigning = o.ClientLogMode.IsSigning() + }) +} + +func addClientRequestID(stack *middleware.Stack) error { + return stack.Build.Add(&awsmiddleware.ClientRequestID{}, middleware.After) +} + +func addComputeContentLength(stack *middleware.Stack) error { + return stack.Build.Add(&smithyhttp.ComputeContentLength{}, middleware.After) +} + +func addRawResponseToMetadata(stack *middleware.Stack) error { + return stack.Deserialize.Add(&awsmiddleware.AddRawResponse{}, middleware.Before) +} + +func addRecordResponseTiming(stack *middleware.Stack) error { + return stack.Deserialize.Add(&awsmiddleware.RecordResponseTiming{}, middleware.After) +} + +func addSpanRetryLoop(stack *middleware.Stack, options Options) error { + return stack.Finalize.Insert(&spanRetryLoop{options: options}, "Retry", middleware.Before) +} + +type spanRetryLoop struct { + options Options +} + +func (*spanRetryLoop) ID() string { + return "spanRetryLoop" +} + +func (m *spanRetryLoop) HandleFinalize( + ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler, +) ( + middleware.FinalizeOutput, middleware.Metadata, error, +) { + tracer := operationTracer(m.options.TracerProvider) + ctx, span := tracer.StartSpan(ctx, "RetryLoop") + defer span.End() + + return next.HandleFinalize(ctx, in) +} +func addStreamingEventsPayload(stack *middleware.Stack) error { + return stack.Finalize.Add(&v4.StreamingEventsPayload{}, middleware.Before) +} + +func addUnsignedPayload(stack *middleware.Stack) error { + return stack.Finalize.Insert(&v4.UnsignedPayload{}, "ResolveEndpointV2", middleware.After) +} + +func addComputePayloadSHA256(stack *middleware.Stack) error { + return stack.Finalize.Insert(&v4.ComputePayloadSHA256{}, "ResolveEndpointV2", middleware.After) +} + +func addContentSHA256Header(stack *middleware.Stack) error { + return stack.Finalize.Insert(&v4.ContentSHA256Header{}, (*v4.ComputePayloadSHA256)(nil).ID(), middleware.After) +} + +func addIsWaiterUserAgent(o *Options) { + o.APIOptions = append(o.APIOptions, func(stack *middleware.Stack) error { + ua, err := getOrAddRequestUserAgent(stack) + if err != nil { + return err + } + + ua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureWaiter) + return nil + }) +} + +func addIsPaginatorUserAgent(o *Options) { + o.APIOptions = append(o.APIOptions, func(stack *middleware.Stack) error { + ua, err := getOrAddRequestUserAgent(stack) + if err != nil { + return err + } + + ua.AddUserAgentFeature(awsmiddleware.UserAgentFeaturePaginator) + return nil + }) +} + +func addRetry(stack *middleware.Stack, o Options) error { + attempt := retry.NewAttemptMiddleware(o.Retryer, smithyhttp.RequestCloner, func(m *retry.Attempt) { + m.LogAttempts = o.ClientLogMode.IsRetries() + m.OperationMeter = o.MeterProvider.Meter("github.com/aws/aws-sdk-go-v2/service/signin") + }) + if err := stack.Finalize.Insert(attempt, "ResolveAuthScheme", middleware.Before); err != nil { + return err + } + if err := stack.Finalize.Insert(&retry.MetricsHeader{}, attempt.ID(), middleware.After); err != nil { + return err + } + return nil +} + +// resolves dual-stack endpoint configuration +func resolveUseDualStackEndpoint(cfg aws.Config, o *Options) error { + if len(cfg.ConfigSources) == 0 { + return nil + } + value, found, err := internalConfig.ResolveUseDualStackEndpoint(context.Background(), cfg.ConfigSources) + if err != nil { + return err + } + if found { + o.EndpointOptions.UseDualStackEndpoint = value + } + return nil +} + +// resolves FIPS endpoint configuration +func resolveUseFIPSEndpoint(cfg aws.Config, o *Options) error { + if len(cfg.ConfigSources) == 0 { + return nil + } + value, found, err := internalConfig.ResolveUseFIPSEndpoint(context.Background(), cfg.ConfigSources) + if err != nil { + return err + } + if found { + o.EndpointOptions.UseFIPSEndpoint = value + } + return nil +} + +func resolveAccountID(identity smithyauth.Identity, mode aws.AccountIDEndpointMode) *string { + if mode == aws.AccountIDEndpointModeDisabled { + return nil + } + + if ca, ok := identity.(*internalauthsmithy.CredentialsAdapter); ok && ca.Credentials.AccountID != "" { + return aws.String(ca.Credentials.AccountID) + } + + return nil +} + +func addTimeOffsetBuild(stack *middleware.Stack, c *Client) error { + mw := internalmiddleware.AddTimeOffsetMiddleware{Offset: c.timeOffset} + if err := stack.Build.Add(&mw, middleware.After); err != nil { + return err + } + return stack.Deserialize.Insert(&mw, "RecordResponseTiming", middleware.Before) +} +func initializeTimeOffsetResolver(c *Client) { + c.timeOffset = new(atomic.Int64) +} + +func addUserAgentRetryMode(stack *middleware.Stack, options Options) error { + ua, err := getOrAddRequestUserAgent(stack) + if err != nil { + return err + } + + switch options.Retryer.(type) { + case *retry.Standard: + ua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureRetryModeStandard) + case *retry.AdaptiveMode: + ua.AddUserAgentFeature(awsmiddleware.UserAgentFeatureRetryModeAdaptive) + } + return nil +} + +type setCredentialSourceMiddleware struct { + ua *awsmiddleware.RequestUserAgent + options Options +} + +func (m setCredentialSourceMiddleware) ID() string { return "SetCredentialSourceMiddleware" } + +func (m setCredentialSourceMiddleware) HandleBuild(ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler) ( + out middleware.BuildOutput, metadata middleware.Metadata, err error, +) { + asProviderSource, ok := m.options.Credentials.(aws.CredentialProviderSource) + if !ok { + return next.HandleBuild(ctx, in) + } + providerSources := asProviderSource.ProviderSources() + for _, source := range providerSources { + m.ua.AddCredentialsSource(source) + } + return next.HandleBuild(ctx, in) +} + +func addCredentialSource(stack *middleware.Stack, options Options) error { + ua, err := getOrAddRequestUserAgent(stack) + if err != nil { + return err + } + + mw := setCredentialSourceMiddleware{ua: ua, options: options} + return stack.Build.Insert(&mw, "UserAgent", middleware.Before) +} + +func resolveTracerProvider(options *Options) { + if options.TracerProvider == nil { + options.TracerProvider = &tracing.NopTracerProvider{} + } +} + +func resolveMeterProvider(options *Options) { + if options.MeterProvider == nil { + options.MeterProvider = metrics.NopMeterProvider{} + } +} + +func addRecursionDetection(stack *middleware.Stack) error { + return stack.Build.Add(&awsmiddleware.RecursionDetection{}, middleware.After) +} + +func addRequestIDRetrieverMiddleware(stack *middleware.Stack) error { + return stack.Deserialize.Insert(&awsmiddleware.RequestIDRetriever{}, "OperationDeserializer", middleware.Before) + +} + +func addResponseErrorMiddleware(stack *middleware.Stack) error { + return stack.Deserialize.Insert(&awshttp.ResponseErrorWrapper{}, "RequestIDRetriever", middleware.Before) + +} + +func addRequestResponseLogging(stack *middleware.Stack, o Options) error { + return stack.Deserialize.Add(&smithyhttp.RequestResponseLogger{ + LogRequest: o.ClientLogMode.IsRequest(), + LogRequestWithBody: o.ClientLogMode.IsRequestWithBody(), + LogResponse: o.ClientLogMode.IsResponse(), + LogResponseWithBody: o.ClientLogMode.IsResponseWithBody(), + }, middleware.After) +} + +type disableHTTPSMiddleware struct { + DisableHTTPS bool +} + +func (*disableHTTPSMiddleware) ID() string { + return "disableHTTPS" +} + +func (m *disableHTTPSMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( + out middleware.FinalizeOutput, metadata middleware.Metadata, err error, +) { + req, ok := in.Request.(*smithyhttp.Request) + if !ok { + return out, metadata, fmt.Errorf("unknown transport type %T", in.Request) + } + + if m.DisableHTTPS && !smithyhttp.GetHostnameImmutable(ctx) { + req.URL.Scheme = "http" + } + + return next.HandleFinalize(ctx, in) +} + +func addDisableHTTPSMiddleware(stack *middleware.Stack, o Options) error { + return stack.Finalize.Insert(&disableHTTPSMiddleware{ + DisableHTTPS: o.EndpointOptions.DisableHTTPS, + }, "ResolveEndpointV2", middleware.After) +} + +func addInterceptBeforeRetryLoop(stack *middleware.Stack, opts Options) error { + return stack.Finalize.Insert(&smithyhttp.InterceptBeforeRetryLoop{ + Interceptors: opts.Interceptors.BeforeRetryLoop, + }, "Retry", middleware.Before) +} + +func addInterceptAttempt(stack *middleware.Stack, opts Options) error { + return stack.Finalize.Insert(&smithyhttp.InterceptAttempt{ + BeforeAttempt: opts.Interceptors.BeforeAttempt, + AfterAttempt: opts.Interceptors.AfterAttempt, + }, "Retry", middleware.After) +} + +func addInterceptors(stack *middleware.Stack, opts Options) error { + // middlewares are expensive, don't add all of these interceptor ones unless the caller + // actually has at least one interceptor configured + // + // at the moment it's all-or-nothing because some of the middlewares here are responsible for + // setting fields in the interceptor context for future ones + if len(opts.Interceptors.BeforeExecution) == 0 && + len(opts.Interceptors.BeforeSerialization) == 0 && len(opts.Interceptors.AfterSerialization) == 0 && + len(opts.Interceptors.BeforeRetryLoop) == 0 && + len(opts.Interceptors.BeforeAttempt) == 0 && + len(opts.Interceptors.BeforeSigning) == 0 && len(opts.Interceptors.AfterSigning) == 0 && + len(opts.Interceptors.BeforeTransmit) == 0 && len(opts.Interceptors.AfterTransmit) == 0 && + len(opts.Interceptors.BeforeDeserialization) == 0 && len(opts.Interceptors.AfterDeserialization) == 0 && + len(opts.Interceptors.AfterAttempt) == 0 && len(opts.Interceptors.AfterExecution) == 0 { + return nil + } + + return errors.Join( + stack.Initialize.Add(&smithyhttp.InterceptExecution{ + BeforeExecution: opts.Interceptors.BeforeExecution, + AfterExecution: opts.Interceptors.AfterExecution, + }, middleware.Before), + stack.Serialize.Insert(&smithyhttp.InterceptBeforeSerialization{ + Interceptors: opts.Interceptors.BeforeSerialization, + }, "OperationSerializer", middleware.Before), + stack.Serialize.Insert(&smithyhttp.InterceptAfterSerialization{ + Interceptors: opts.Interceptors.AfterSerialization, + }, "OperationSerializer", middleware.After), + stack.Finalize.Insert(&smithyhttp.InterceptBeforeSigning{ + Interceptors: opts.Interceptors.BeforeSigning, + }, "Signing", middleware.Before), + stack.Finalize.Insert(&smithyhttp.InterceptAfterSigning{ + Interceptors: opts.Interceptors.AfterSigning, + }, "Signing", middleware.After), + stack.Deserialize.Add(&smithyhttp.InterceptTransmit{ + BeforeTransmit: opts.Interceptors.BeforeTransmit, + AfterTransmit: opts.Interceptors.AfterTransmit, + }, middleware.After), + stack.Deserialize.Insert(&smithyhttp.InterceptBeforeDeserialization{ + Interceptors: opts.Interceptors.BeforeDeserialization, + }, "OperationDeserializer", middleware.After), // (deserialize stack is called in reverse) + stack.Deserialize.Insert(&smithyhttp.InterceptAfterDeserialization{ + Interceptors: opts.Interceptors.AfterDeserialization, + }, "OperationDeserializer", middleware.Before), + ) +} diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/api_op_CreateOAuth2Token.go b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/api_op_CreateOAuth2Token.go new file mode 100644 index 00000000000..54ba42422d0 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/api_op_CreateOAuth2Token.go @@ -0,0 +1,209 @@ +// Code generated by smithy-go-codegen DO NOT EDIT. + +package signin + +import ( + "context" + "fmt" + awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" + "github.com/aws/aws-sdk-go-v2/service/signin/types" + "github.com/aws/smithy-go/middleware" + smithyhttp "github.com/aws/smithy-go/transport/http" +) + +// CreateOAuth2Token API +// +// Path: /v1/token Request Method: POST Content-Type: application/json or +// application/x-www-form-urlencoded +// +// This API implements OAuth 2.0 flows for AWS Sign-In CLI clients, supporting +// both: +// +// - Authorization code redemption (grant_type=authorization_code) - NOT +// idempotent +// - Token refresh (grant_type=refresh_token) - Idempotent within token validity +// window +// +// The operation behavior is determined by the grant_type parameter in the request +// body: +// +// Authorization Code Flow (NOT Idempotent): +// +// - JSON or form-encoded body with client_id, grant_type=authorization_code, +// code, redirect_uri, code_verifier +// - Returns access_token, token_type, expires_in, refresh_token, and id_token +// - Each authorization code can only be used ONCE for security (prevents replay +// attacks) +// +// Token Refresh Flow (Idempotent): +// +// - JSON or form-encoded body with client_id, grant_type=refresh_token, +// refresh_token +// - Returns access_token, token_type, expires_in, and refresh_token (no +// id_token) +// - Multiple calls with same refresh_token return consistent results within +// validity window +// +// Authentication and authorization: +// +// - Confidential clients: sigv4 signing required with signin:ExchangeToken +// permissions +// - CLI clients (public): authn/authz skipped based on client_id & grant_type +// +// Note: This operation cannot be marked as @idempotent because it handles both +// idempotent (token refresh) and non-idempotent (auth code redemption) flows in a +// single endpoint. +func (c *Client) CreateOAuth2Token(ctx context.Context, params *CreateOAuth2TokenInput, optFns ...func(*Options)) (*CreateOAuth2TokenOutput, error) { + if params == nil { + params = &CreateOAuth2TokenInput{} + } + + result, metadata, err := c.invokeOperation(ctx, "CreateOAuth2Token", params, optFns, c.addOperationCreateOAuth2TokenMiddlewares) + if err != nil { + return nil, err + } + + out := result.(*CreateOAuth2TokenOutput) + out.ResultMetadata = metadata + return out, nil +} + +// Input structure for CreateOAuth2Token operation +// +// Contains flattened token operation inputs for both authorization code and +// refresh token flows. The operation type is determined by the grant_type +// parameter in the request body. +type CreateOAuth2TokenInput struct { + + // Flattened token operation inputs The specific operation is determined by + // grant_type in the request body + // + // This member is required. + TokenInput *types.CreateOAuth2TokenRequestBody + + noSmithyDocumentSerde +} + +// Output structure for CreateOAuth2Token operation +// +// Contains flattened token operation outputs for both authorization code and +// refresh token flows. The response content depends on the grant_type from the +// original request. +type CreateOAuth2TokenOutput struct { + + // Flattened token operation outputs The specific response fields depend on the + // grant_type used in the request + // + // This member is required. + TokenOutput *types.CreateOAuth2TokenResponseBody + + // Metadata pertaining to the operation's result. + ResultMetadata middleware.Metadata + + noSmithyDocumentSerde +} + +func (c *Client) addOperationCreateOAuth2TokenMiddlewares(stack *middleware.Stack, options Options) (err error) { + if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { + return err + } + err = stack.Serialize.Add(&awsRestjson1_serializeOpCreateOAuth2Token{}, middleware.After) + if err != nil { + return err + } + err = stack.Deserialize.Add(&awsRestjson1_deserializeOpCreateOAuth2Token{}, middleware.After) + if err != nil { + return err + } + if err := addProtocolFinalizerMiddlewares(stack, options, "CreateOAuth2Token"); err != nil { + return fmt.Errorf("add protocol finalizers: %v", err) + } + + if err = addlegacyEndpointContextSetter(stack, options); err != nil { + return err + } + if err = addSetLoggerMiddleware(stack, options); err != nil { + return err + } + if err = addClientRequestID(stack); err != nil { + return err + } + if err = addComputeContentLength(stack); err != nil { + return err + } + if err = addResolveEndpointMiddleware(stack, options); err != nil { + return err + } + if err = addRetry(stack, options); err != nil { + return err + } + if err = addRawResponseToMetadata(stack); err != nil { + return err + } + if err = addRecordResponseTiming(stack); err != nil { + return err + } + if err = addSpanRetryLoop(stack, options); err != nil { + return err + } + if err = addClientUserAgent(stack, options); err != nil { + return err + } + if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { + return err + } + if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { + return err + } + if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { + return err + } + if err = addTimeOffsetBuild(stack, c); err != nil { + return err + } + if err = addUserAgentRetryMode(stack, options); err != nil { + return err + } + if err = addCredentialSource(stack, options); err != nil { + return err + } + if err = addOpCreateOAuth2TokenValidationMiddleware(stack); err != nil { + return err + } + if err = stack.Initialize.Add(newServiceMetadataMiddleware_opCreateOAuth2Token(options.Region), middleware.Before); err != nil { + return err + } + if err = addRecursionDetection(stack); err != nil { + return err + } + if err = addRequestIDRetrieverMiddleware(stack); err != nil { + return err + } + if err = addResponseErrorMiddleware(stack); err != nil { + return err + } + if err = addRequestResponseLogging(stack, options); err != nil { + return err + } + if err = addDisableHTTPSMiddleware(stack, options); err != nil { + return err + } + if err = addInterceptBeforeRetryLoop(stack, options); err != nil { + return err + } + if err = addInterceptAttempt(stack, options); err != nil { + return err + } + if err = addInterceptors(stack, options); err != nil { + return err + } + return nil +} + +func newServiceMetadataMiddleware_opCreateOAuth2Token(region string) *awsmiddleware.RegisterServiceMetadata { + return &awsmiddleware.RegisterServiceMetadata{ + Region: region, + ServiceID: ServiceID, + OperationName: "CreateOAuth2Token", + } +} diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/auth.go b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/auth.go new file mode 100644 index 00000000000..cf6b3650410 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/auth.go @@ -0,0 +1,351 @@ +// Code generated by smithy-go-codegen DO NOT EDIT. + +package signin + +import ( + "context" + "fmt" + awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" + smithy "github.com/aws/smithy-go" + smithyauth "github.com/aws/smithy-go/auth" + "github.com/aws/smithy-go/metrics" + "github.com/aws/smithy-go/middleware" + "github.com/aws/smithy-go/tracing" + smithyhttp "github.com/aws/smithy-go/transport/http" + "slices" + "strings" +) + +func bindAuthParamsRegion(_ interface{}, params *AuthResolverParameters, _ interface{}, options Options) error { + params.Region = options.Region + return nil +} + +type setLegacyContextSigningOptionsMiddleware struct { +} + +func (*setLegacyContextSigningOptionsMiddleware) ID() string { + return "setLegacyContextSigningOptions" +} + +func (m *setLegacyContextSigningOptionsMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( + out middleware.FinalizeOutput, metadata middleware.Metadata, err error, +) { + rscheme := getResolvedAuthScheme(ctx) + schemeID := rscheme.Scheme.SchemeID() + + if sn := awsmiddleware.GetSigningName(ctx); sn != "" { + if schemeID == "aws.auth#sigv4" { + smithyhttp.SetSigV4SigningName(&rscheme.SignerProperties, sn) + } else if schemeID == "aws.auth#sigv4a" { + smithyhttp.SetSigV4ASigningName(&rscheme.SignerProperties, sn) + } + } + + if sr := awsmiddleware.GetSigningRegion(ctx); sr != "" { + if schemeID == "aws.auth#sigv4" { + smithyhttp.SetSigV4SigningRegion(&rscheme.SignerProperties, sr) + } else if schemeID == "aws.auth#sigv4a" { + smithyhttp.SetSigV4ASigningRegions(&rscheme.SignerProperties, []string{sr}) + } + } + + return next.HandleFinalize(ctx, in) +} + +func addSetLegacyContextSigningOptionsMiddleware(stack *middleware.Stack) error { + return stack.Finalize.Insert(&setLegacyContextSigningOptionsMiddleware{}, "Signing", middleware.Before) +} + +type withAnonymous struct { + resolver AuthSchemeResolver +} + +var _ AuthSchemeResolver = (*withAnonymous)(nil) + +func (v *withAnonymous) ResolveAuthSchemes(ctx context.Context, params *AuthResolverParameters) ([]*smithyauth.Option, error) { + opts, err := v.resolver.ResolveAuthSchemes(ctx, params) + if err != nil { + return nil, err + } + + opts = append(opts, &smithyauth.Option{ + SchemeID: smithyauth.SchemeIDAnonymous, + }) + return opts, nil +} + +func wrapWithAnonymousAuth(options *Options) { + if _, ok := options.AuthSchemeResolver.(*defaultAuthSchemeResolver); !ok { + return + } + + options.AuthSchemeResolver = &withAnonymous{ + resolver: options.AuthSchemeResolver, + } +} + +// AuthResolverParameters contains the set of inputs necessary for auth scheme +// resolution. +type AuthResolverParameters struct { + // The name of the operation being invoked. + Operation string + + // The region in which the operation is being invoked. + Region string +} + +func bindAuthResolverParams(ctx context.Context, operation string, input interface{}, options Options) (*AuthResolverParameters, error) { + params := &AuthResolverParameters{ + Operation: operation, + } + + if err := bindAuthParamsRegion(ctx, params, input, options); err != nil { + return nil, err + } + + return params, nil +} + +// AuthSchemeResolver returns a set of possible authentication options for an +// operation. +type AuthSchemeResolver interface { + ResolveAuthSchemes(context.Context, *AuthResolverParameters) ([]*smithyauth.Option, error) +} + +type defaultAuthSchemeResolver struct{} + +var _ AuthSchemeResolver = (*defaultAuthSchemeResolver)(nil) + +func (*defaultAuthSchemeResolver) ResolveAuthSchemes(ctx context.Context, params *AuthResolverParameters) ([]*smithyauth.Option, error) { + if overrides, ok := operationAuthOptions[params.Operation]; ok { + return overrides(params), nil + } + return serviceAuthOptions(params), nil +} + +var operationAuthOptions = map[string]func(*AuthResolverParameters) []*smithyauth.Option{ + "CreateOAuth2Token": func(params *AuthResolverParameters) []*smithyauth.Option { + return []*smithyauth.Option{ + {SchemeID: smithyauth.SchemeIDAnonymous}, + } + }, +} + +func serviceAuthOptions(params *AuthResolverParameters) []*smithyauth.Option { + return []*smithyauth.Option{ + { + SchemeID: smithyauth.SchemeIDSigV4, + SignerProperties: func() smithy.Properties { + var props smithy.Properties + smithyhttp.SetSigV4SigningName(&props, "signin") + smithyhttp.SetSigV4SigningRegion(&props, params.Region) + return props + }(), + }, + } +} + +type resolveAuthSchemeMiddleware struct { + operation string + options Options +} + +func (*resolveAuthSchemeMiddleware) ID() string { + return "ResolveAuthScheme" +} + +func (m *resolveAuthSchemeMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( + out middleware.FinalizeOutput, metadata middleware.Metadata, err error, +) { + _, span := tracing.StartSpan(ctx, "ResolveAuthScheme") + defer span.End() + + params, err := bindAuthResolverParams(ctx, m.operation, getOperationInput(ctx), m.options) + if err != nil { + return out, metadata, fmt.Errorf("bind auth scheme params: %w", err) + } + options, err := m.options.AuthSchemeResolver.ResolveAuthSchemes(ctx, params) + if err != nil { + return out, metadata, fmt.Errorf("resolve auth scheme: %w", err) + } + + scheme, ok := m.selectScheme(options) + if !ok { + return out, metadata, fmt.Errorf("could not select an auth scheme") + } + + ctx = setResolvedAuthScheme(ctx, scheme) + + span.SetProperty("auth.scheme_id", scheme.Scheme.SchemeID()) + span.End() + return next.HandleFinalize(ctx, in) +} + +func (m *resolveAuthSchemeMiddleware) selectScheme(options []*smithyauth.Option) (*resolvedAuthScheme, bool) { + sorted := sortAuthOptions(options, m.options.AuthSchemePreference) + for _, option := range sorted { + if option.SchemeID == smithyauth.SchemeIDAnonymous { + return newResolvedAuthScheme(smithyhttp.NewAnonymousScheme(), option), true + } + + for _, scheme := range m.options.AuthSchemes { + if scheme.SchemeID() != option.SchemeID { + continue + } + + if scheme.IdentityResolver(m.options) != nil { + return newResolvedAuthScheme(scheme, option), true + } + } + } + + return nil, false +} + +func sortAuthOptions(options []*smithyauth.Option, preferred []string) []*smithyauth.Option { + byPriority := make([]*smithyauth.Option, 0, len(options)) + for _, prefName := range preferred { + for _, option := range options { + optName := option.SchemeID + if parts := strings.Split(option.SchemeID, "#"); len(parts) == 2 { + optName = parts[1] + } + if prefName == optName { + byPriority = append(byPriority, option) + } + } + } + for _, option := range options { + if !slices.ContainsFunc(byPriority, func(o *smithyauth.Option) bool { + return o.SchemeID == option.SchemeID + }) { + byPriority = append(byPriority, option) + } + } + return byPriority +} + +type resolvedAuthSchemeKey struct{} + +type resolvedAuthScheme struct { + Scheme smithyhttp.AuthScheme + IdentityProperties smithy.Properties + SignerProperties smithy.Properties +} + +func newResolvedAuthScheme(scheme smithyhttp.AuthScheme, option *smithyauth.Option) *resolvedAuthScheme { + return &resolvedAuthScheme{ + Scheme: scheme, + IdentityProperties: option.IdentityProperties, + SignerProperties: option.SignerProperties, + } +} + +func setResolvedAuthScheme(ctx context.Context, scheme *resolvedAuthScheme) context.Context { + return middleware.WithStackValue(ctx, resolvedAuthSchemeKey{}, scheme) +} + +func getResolvedAuthScheme(ctx context.Context) *resolvedAuthScheme { + v, _ := middleware.GetStackValue(ctx, resolvedAuthSchemeKey{}).(*resolvedAuthScheme) + return v +} + +type getIdentityMiddleware struct { + options Options +} + +func (*getIdentityMiddleware) ID() string { + return "GetIdentity" +} + +func (m *getIdentityMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( + out middleware.FinalizeOutput, metadata middleware.Metadata, err error, +) { + innerCtx, span := tracing.StartSpan(ctx, "GetIdentity") + defer span.End() + + rscheme := getResolvedAuthScheme(innerCtx) + if rscheme == nil { + return out, metadata, fmt.Errorf("no resolved auth scheme") + } + + resolver := rscheme.Scheme.IdentityResolver(m.options) + if resolver == nil { + return out, metadata, fmt.Errorf("no identity resolver") + } + + identity, err := timeOperationMetric(ctx, "client.call.resolve_identity_duration", + func() (smithyauth.Identity, error) { + return resolver.GetIdentity(innerCtx, rscheme.IdentityProperties) + }, + func(o *metrics.RecordMetricOptions) { + o.Properties.Set("auth.scheme_id", rscheme.Scheme.SchemeID()) + }) + if err != nil { + return out, metadata, fmt.Errorf("get identity: %w", err) + } + + ctx = setIdentity(ctx, identity) + + span.End() + return next.HandleFinalize(ctx, in) +} + +type identityKey struct{} + +func setIdentity(ctx context.Context, identity smithyauth.Identity) context.Context { + return middleware.WithStackValue(ctx, identityKey{}, identity) +} + +func getIdentity(ctx context.Context) smithyauth.Identity { + v, _ := middleware.GetStackValue(ctx, identityKey{}).(smithyauth.Identity) + return v +} + +type signRequestMiddleware struct { + options Options +} + +func (*signRequestMiddleware) ID() string { + return "Signing" +} + +func (m *signRequestMiddleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( + out middleware.FinalizeOutput, metadata middleware.Metadata, err error, +) { + _, span := tracing.StartSpan(ctx, "SignRequest") + defer span.End() + + req, ok := in.Request.(*smithyhttp.Request) + if !ok { + return out, metadata, fmt.Errorf("unexpected transport type %T", in.Request) + } + + rscheme := getResolvedAuthScheme(ctx) + if rscheme == nil { + return out, metadata, fmt.Errorf("no resolved auth scheme") + } + + identity := getIdentity(ctx) + if identity == nil { + return out, metadata, fmt.Errorf("no identity") + } + + signer := rscheme.Scheme.Signer() + if signer == nil { + return out, metadata, fmt.Errorf("no signer") + } + + _, err = timeOperationMetric(ctx, "client.call.signing_duration", func() (any, error) { + return nil, signer.SignRequest(ctx, req, identity, rscheme.SignerProperties) + }, func(o *metrics.RecordMetricOptions) { + o.Properties.Set("auth.scheme_id", rscheme.Scheme.SchemeID()) + }) + if err != nil { + return out, metadata, fmt.Errorf("sign request: %w", err) + } + + span.End() + return next.HandleFinalize(ctx, in) +} diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/deserializers.go b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/deserializers.go new file mode 100644 index 00000000000..b74b612e6b0 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/deserializers.go @@ -0,0 +1,655 @@ +// Code generated by smithy-go-codegen DO NOT EDIT. + +package signin + +import ( + "bytes" + "context" + "encoding/json" + "fmt" + "github.com/aws/aws-sdk-go-v2/aws/protocol/restjson" + "github.com/aws/aws-sdk-go-v2/service/signin/types" + smithy "github.com/aws/smithy-go" + smithyio "github.com/aws/smithy-go/io" + "github.com/aws/smithy-go/middleware" + "github.com/aws/smithy-go/ptr" + "github.com/aws/smithy-go/tracing" + smithyhttp "github.com/aws/smithy-go/transport/http" + "io" + "strings" +) + +type awsRestjson1_deserializeOpCreateOAuth2Token struct { +} + +func (*awsRestjson1_deserializeOpCreateOAuth2Token) ID() string { + return "OperationDeserializer" +} + +func (m *awsRestjson1_deserializeOpCreateOAuth2Token) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( + out middleware.DeserializeOutput, metadata middleware.Metadata, err error, +) { + out, metadata, err = next.HandleDeserialize(ctx, in) + if err != nil { + return out, metadata, err + } + + _, span := tracing.StartSpan(ctx, "OperationDeserializer") + endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") + defer endTimer() + defer span.End() + response, ok := out.RawResponse.(*smithyhttp.Response) + if !ok { + return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} + } + + if response.StatusCode < 200 || response.StatusCode >= 300 { + return out, metadata, awsRestjson1_deserializeOpErrorCreateOAuth2Token(response, &metadata) + } + output := &CreateOAuth2TokenOutput{} + out.Result = output + + var buff [1024]byte + ringBuffer := smithyio.NewRingBuffer(buff[:]) + + body := io.TeeReader(response.Body, ringBuffer) + + decoder := json.NewDecoder(body) + decoder.UseNumber() + var shape interface{} + if err := decoder.Decode(&shape); err != nil && err != io.EOF { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + err = &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + return out, metadata, err + } + + err = awsRestjson1_deserializeDocumentCreateOAuth2TokenResponseBody(&output.TokenOutput, shape) + if err != nil { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + return out, metadata, &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body with invalid JSON, %w", err), + Snapshot: snapshot.Bytes(), + } + } + + span.End() + return out, metadata, err +} + +func awsRestjson1_deserializeOpErrorCreateOAuth2Token(response *smithyhttp.Response, metadata *middleware.Metadata) error { + var errorBuffer bytes.Buffer + if _, err := io.Copy(&errorBuffer, response.Body); err != nil { + return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} + } + errorBody := bytes.NewReader(errorBuffer.Bytes()) + + errorCode := "UnknownError" + errorMessage := errorCode + + headerCode := response.Header.Get("X-Amzn-ErrorType") + if len(headerCode) != 0 { + errorCode = restjson.SanitizeErrorCode(headerCode) + } + + var buff [1024]byte + ringBuffer := smithyio.NewRingBuffer(buff[:]) + + body := io.TeeReader(errorBody, ringBuffer) + decoder := json.NewDecoder(body) + decoder.UseNumber() + jsonCode, message, err := restjson.GetErrorInfo(decoder) + if err != nil { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + err = &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + return err + } + + errorBody.Seek(0, io.SeekStart) + if len(headerCode) == 0 && len(jsonCode) != 0 { + errorCode = restjson.SanitizeErrorCode(jsonCode) + } + if len(message) != 0 { + errorMessage = message + } + + switch { + case strings.EqualFold("AccessDeniedException", errorCode): + return awsRestjson1_deserializeErrorAccessDeniedException(response, errorBody) + + case strings.EqualFold("InternalServerException", errorCode): + return awsRestjson1_deserializeErrorInternalServerException(response, errorBody) + + case strings.EqualFold("TooManyRequestsError", errorCode): + return awsRestjson1_deserializeErrorTooManyRequestsError(response, errorBody) + + case strings.EqualFold("ValidationException", errorCode): + return awsRestjson1_deserializeErrorValidationException(response, errorBody) + + default: + genericError := &smithy.GenericAPIError{ + Code: errorCode, + Message: errorMessage, + } + return genericError + + } +} + +func awsRestjson1_deserializeOpDocumentCreateOAuth2TokenOutput(v **CreateOAuth2TokenOutput, value interface{}) error { + if v == nil { + return fmt.Errorf("unexpected nil of type %T", v) + } + if value == nil { + return nil + } + + shape, ok := value.(map[string]interface{}) + if !ok { + return fmt.Errorf("unexpected JSON type %v", value) + } + + var sv *CreateOAuth2TokenOutput + if *v == nil { + sv = &CreateOAuth2TokenOutput{} + } else { + sv = *v + } + + for key, value := range shape { + switch key { + case "tokenOutput": + if err := awsRestjson1_deserializeDocumentCreateOAuth2TokenResponseBody(&sv.TokenOutput, value); err != nil { + return err + } + + default: + _, _ = key, value + + } + } + *v = sv + return nil +} + +func awsRestjson1_deserializeErrorAccessDeniedException(response *smithyhttp.Response, errorBody *bytes.Reader) error { + output := &types.AccessDeniedException{} + var buff [1024]byte + ringBuffer := smithyio.NewRingBuffer(buff[:]) + + body := io.TeeReader(errorBody, ringBuffer) + decoder := json.NewDecoder(body) + decoder.UseNumber() + var shape interface{} + if err := decoder.Decode(&shape); err != nil && err != io.EOF { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + err = &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + return err + } + + err := awsRestjson1_deserializeDocumentAccessDeniedException(&output, shape) + + if err != nil { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + err = &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + return err + } + + errorBody.Seek(0, io.SeekStart) + + return output +} + +func awsRestjson1_deserializeErrorInternalServerException(response *smithyhttp.Response, errorBody *bytes.Reader) error { + output := &types.InternalServerException{} + var buff [1024]byte + ringBuffer := smithyio.NewRingBuffer(buff[:]) + + body := io.TeeReader(errorBody, ringBuffer) + decoder := json.NewDecoder(body) + decoder.UseNumber() + var shape interface{} + if err := decoder.Decode(&shape); err != nil && err != io.EOF { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + err = &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + return err + } + + err := awsRestjson1_deserializeDocumentInternalServerException(&output, shape) + + if err != nil { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + err = &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + return err + } + + errorBody.Seek(0, io.SeekStart) + + return output +} + +func awsRestjson1_deserializeErrorTooManyRequestsError(response *smithyhttp.Response, errorBody *bytes.Reader) error { + output := &types.TooManyRequestsError{} + var buff [1024]byte + ringBuffer := smithyio.NewRingBuffer(buff[:]) + + body := io.TeeReader(errorBody, ringBuffer) + decoder := json.NewDecoder(body) + decoder.UseNumber() + var shape interface{} + if err := decoder.Decode(&shape); err != nil && err != io.EOF { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + err = &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + return err + } + + err := awsRestjson1_deserializeDocumentTooManyRequestsError(&output, shape) + + if err != nil { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + err = &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + return err + } + + errorBody.Seek(0, io.SeekStart) + + return output +} + +func awsRestjson1_deserializeErrorValidationException(response *smithyhttp.Response, errorBody *bytes.Reader) error { + output := &types.ValidationException{} + var buff [1024]byte + ringBuffer := smithyio.NewRingBuffer(buff[:]) + + body := io.TeeReader(errorBody, ringBuffer) + decoder := json.NewDecoder(body) + decoder.UseNumber() + var shape interface{} + if err := decoder.Decode(&shape); err != nil && err != io.EOF { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + err = &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + return err + } + + err := awsRestjson1_deserializeDocumentValidationException(&output, shape) + + if err != nil { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + err = &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + return err + } + + errorBody.Seek(0, io.SeekStart) + + return output +} + +func awsRestjson1_deserializeDocumentAccessDeniedException(v **types.AccessDeniedException, value interface{}) error { + if v == nil { + return fmt.Errorf("unexpected nil of type %T", v) + } + if value == nil { + return nil + } + + shape, ok := value.(map[string]interface{}) + if !ok { + return fmt.Errorf("unexpected JSON type %v", value) + } + + var sv *types.AccessDeniedException + if *v == nil { + sv = &types.AccessDeniedException{} + } else { + sv = *v + } + + for key, value := range shape { + switch key { + case "error": + if value != nil { + jtv, ok := value.(string) + if !ok { + return fmt.Errorf("expected OAuth2ErrorCode to be of type string, got %T instead", value) + } + sv.Error_ = types.OAuth2ErrorCode(jtv) + } + + case "message", "Message": + if value != nil { + jtv, ok := value.(string) + if !ok { + return fmt.Errorf("expected String to be of type string, got %T instead", value) + } + sv.Message = ptr.String(jtv) + } + + default: + _, _ = key, value + + } + } + *v = sv + return nil +} + +func awsRestjson1_deserializeDocumentAccessToken(v **types.AccessToken, value interface{}) error { + if v == nil { + return fmt.Errorf("unexpected nil of type %T", v) + } + if value == nil { + return nil + } + + shape, ok := value.(map[string]interface{}) + if !ok { + return fmt.Errorf("unexpected JSON type %v", value) + } + + var sv *types.AccessToken + if *v == nil { + sv = &types.AccessToken{} + } else { + sv = *v + } + + for key, value := range shape { + switch key { + case "accessKeyId": + if value != nil { + jtv, ok := value.(string) + if !ok { + return fmt.Errorf("expected String to be of type string, got %T instead", value) + } + sv.AccessKeyId = ptr.String(jtv) + } + + case "secretAccessKey": + if value != nil { + jtv, ok := value.(string) + if !ok { + return fmt.Errorf("expected String to be of type string, got %T instead", value) + } + sv.SecretAccessKey = ptr.String(jtv) + } + + case "sessionToken": + if value != nil { + jtv, ok := value.(string) + if !ok { + return fmt.Errorf("expected String to be of type string, got %T instead", value) + } + sv.SessionToken = ptr.String(jtv) + } + + default: + _, _ = key, value + + } + } + *v = sv + return nil +} + +func awsRestjson1_deserializeDocumentCreateOAuth2TokenResponseBody(v **types.CreateOAuth2TokenResponseBody, value interface{}) error { + if v == nil { + return fmt.Errorf("unexpected nil of type %T", v) + } + if value == nil { + return nil + } + + shape, ok := value.(map[string]interface{}) + if !ok { + return fmt.Errorf("unexpected JSON type %v", value) + } + + var sv *types.CreateOAuth2TokenResponseBody + if *v == nil { + sv = &types.CreateOAuth2TokenResponseBody{} + } else { + sv = *v + } + + for key, value := range shape { + switch key { + case "accessToken": + if err := awsRestjson1_deserializeDocumentAccessToken(&sv.AccessToken, value); err != nil { + return err + } + + case "expiresIn": + if value != nil { + jtv, ok := value.(json.Number) + if !ok { + return fmt.Errorf("expected ExpiresIn to be json.Number, got %T instead", value) + } + i64, err := jtv.Int64() + if err != nil { + return err + } + sv.ExpiresIn = ptr.Int32(int32(i64)) + } + + case "idToken": + if value != nil { + jtv, ok := value.(string) + if !ok { + return fmt.Errorf("expected IdToken to be of type string, got %T instead", value) + } + sv.IdToken = ptr.String(jtv) + } + + case "refreshToken": + if value != nil { + jtv, ok := value.(string) + if !ok { + return fmt.Errorf("expected RefreshToken to be of type string, got %T instead", value) + } + sv.RefreshToken = ptr.String(jtv) + } + + case "tokenType": + if value != nil { + jtv, ok := value.(string) + if !ok { + return fmt.Errorf("expected TokenType to be of type string, got %T instead", value) + } + sv.TokenType = ptr.String(jtv) + } + + default: + _, _ = key, value + + } + } + *v = sv + return nil +} + +func awsRestjson1_deserializeDocumentInternalServerException(v **types.InternalServerException, value interface{}) error { + if v == nil { + return fmt.Errorf("unexpected nil of type %T", v) + } + if value == nil { + return nil + } + + shape, ok := value.(map[string]interface{}) + if !ok { + return fmt.Errorf("unexpected JSON type %v", value) + } + + var sv *types.InternalServerException + if *v == nil { + sv = &types.InternalServerException{} + } else { + sv = *v + } + + for key, value := range shape { + switch key { + case "error": + if value != nil { + jtv, ok := value.(string) + if !ok { + return fmt.Errorf("expected OAuth2ErrorCode to be of type string, got %T instead", value) + } + sv.Error_ = types.OAuth2ErrorCode(jtv) + } + + case "message", "Message": + if value != nil { + jtv, ok := value.(string) + if !ok { + return fmt.Errorf("expected String to be of type string, got %T instead", value) + } + sv.Message = ptr.String(jtv) + } + + default: + _, _ = key, value + + } + } + *v = sv + return nil +} + +func awsRestjson1_deserializeDocumentTooManyRequestsError(v **types.TooManyRequestsError, value interface{}) error { + if v == nil { + return fmt.Errorf("unexpected nil of type %T", v) + } + if value == nil { + return nil + } + + shape, ok := value.(map[string]interface{}) + if !ok { + return fmt.Errorf("unexpected JSON type %v", value) + } + + var sv *types.TooManyRequestsError + if *v == nil { + sv = &types.TooManyRequestsError{} + } else { + sv = *v + } + + for key, value := range shape { + switch key { + case "error": + if value != nil { + jtv, ok := value.(string) + if !ok { + return fmt.Errorf("expected OAuth2ErrorCode to be of type string, got %T instead", value) + } + sv.Error_ = types.OAuth2ErrorCode(jtv) + } + + case "message", "Message": + if value != nil { + jtv, ok := value.(string) + if !ok { + return fmt.Errorf("expected String to be of type string, got %T instead", value) + } + sv.Message = ptr.String(jtv) + } + + default: + _, _ = key, value + + } + } + *v = sv + return nil +} + +func awsRestjson1_deserializeDocumentValidationException(v **types.ValidationException, value interface{}) error { + if v == nil { + return fmt.Errorf("unexpected nil of type %T", v) + } + if value == nil { + return nil + } + + shape, ok := value.(map[string]interface{}) + if !ok { + return fmt.Errorf("unexpected JSON type %v", value) + } + + var sv *types.ValidationException + if *v == nil { + sv = &types.ValidationException{} + } else { + sv = *v + } + + for key, value := range shape { + switch key { + case "error": + if value != nil { + jtv, ok := value.(string) + if !ok { + return fmt.Errorf("expected OAuth2ErrorCode to be of type string, got %T instead", value) + } + sv.Error_ = types.OAuth2ErrorCode(jtv) + } + + case "message", "Message": + if value != nil { + jtv, ok := value.(string) + if !ok { + return fmt.Errorf("expected String to be of type string, got %T instead", value) + } + sv.Message = ptr.String(jtv) + } + + default: + _, _ = key, value + + } + } + *v = sv + return nil +} diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/doc.go b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/doc.go new file mode 100644 index 00000000000..dc1a8b62f09 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/doc.go @@ -0,0 +1,9 @@ +// Code generated by smithy-go-codegen DO NOT EDIT. + +// Package signin provides the API client, operations, and parameter types for AWS +// Sign-In Service. +// +// AWS Sign-In manages authentication for AWS services. This service provides +// secure authentication flows for accessing AWS resources from the console and +// developer tools. +package signin diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/endpoints.go b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/endpoints.go new file mode 100644 index 00000000000..db2e6a62a38 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/endpoints.go @@ -0,0 +1,624 @@ +// Code generated by smithy-go-codegen DO NOT EDIT. + +package signin + +import ( + "context" + "errors" + "fmt" + "github.com/aws/aws-sdk-go-v2/aws" + awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" + internalConfig "github.com/aws/aws-sdk-go-v2/internal/configsources" + "github.com/aws/aws-sdk-go-v2/internal/endpoints" + "github.com/aws/aws-sdk-go-v2/internal/endpoints/awsrulesfn" + internalendpoints "github.com/aws/aws-sdk-go-v2/service/signin/internal/endpoints" + smithyauth "github.com/aws/smithy-go/auth" + smithyendpoints "github.com/aws/smithy-go/endpoints" + "github.com/aws/smithy-go/endpoints/private/rulesfn" + "github.com/aws/smithy-go/middleware" + "github.com/aws/smithy-go/ptr" + "github.com/aws/smithy-go/tracing" + smithyhttp "github.com/aws/smithy-go/transport/http" + "net/http" + "net/url" + "os" + "strings" +) + +// EndpointResolverOptions is the service endpoint resolver options +type EndpointResolverOptions = internalendpoints.Options + +// EndpointResolver interface for resolving service endpoints. +type EndpointResolver interface { + ResolveEndpoint(region string, options EndpointResolverOptions) (aws.Endpoint, error) +} + +var _ EndpointResolver = &internalendpoints.Resolver{} + +// NewDefaultEndpointResolver constructs a new service endpoint resolver +func NewDefaultEndpointResolver() *internalendpoints.Resolver { + return internalendpoints.New() +} + +// EndpointResolverFunc is a helper utility that wraps a function so it satisfies +// the EndpointResolver interface. This is useful when you want to add additional +// endpoint resolving logic, or stub out specific endpoints with custom values. +type EndpointResolverFunc func(region string, options EndpointResolverOptions) (aws.Endpoint, error) + +func (fn EndpointResolverFunc) ResolveEndpoint(region string, options EndpointResolverOptions) (endpoint aws.Endpoint, err error) { + return fn(region, options) +} + +// EndpointResolverFromURL returns an EndpointResolver configured using the +// provided endpoint url. By default, the resolved endpoint resolver uses the +// client region as signing region, and the endpoint source is set to +// EndpointSourceCustom.You can provide functional options to configure endpoint +// values for the resolved endpoint. +func EndpointResolverFromURL(url string, optFns ...func(*aws.Endpoint)) EndpointResolver { + e := aws.Endpoint{URL: url, Source: aws.EndpointSourceCustom} + for _, fn := range optFns { + fn(&e) + } + + return EndpointResolverFunc( + func(region string, options EndpointResolverOptions) (aws.Endpoint, error) { + if len(e.SigningRegion) == 0 { + e.SigningRegion = region + } + return e, nil + }, + ) +} + +type ResolveEndpoint struct { + Resolver EndpointResolver + Options EndpointResolverOptions +} + +func (*ResolveEndpoint) ID() string { + return "ResolveEndpoint" +} + +func (m *ResolveEndpoint) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( + out middleware.SerializeOutput, metadata middleware.Metadata, err error, +) { + if !awsmiddleware.GetRequiresLegacyEndpoints(ctx) { + return next.HandleSerialize(ctx, in) + } + + req, ok := in.Request.(*smithyhttp.Request) + if !ok { + return out, metadata, fmt.Errorf("unknown transport type %T", in.Request) + } + + if m.Resolver == nil { + return out, metadata, fmt.Errorf("expected endpoint resolver to not be nil") + } + + eo := m.Options + eo.Logger = middleware.GetLogger(ctx) + + var endpoint aws.Endpoint + endpoint, err = m.Resolver.ResolveEndpoint(awsmiddleware.GetRegion(ctx), eo) + if err != nil { + nf := (&aws.EndpointNotFoundError{}) + if errors.As(err, &nf) { + ctx = awsmiddleware.SetRequiresLegacyEndpoints(ctx, false) + return next.HandleSerialize(ctx, in) + } + return out, metadata, fmt.Errorf("failed to resolve service endpoint, %w", err) + } + + req.URL, err = url.Parse(endpoint.URL) + if err != nil { + return out, metadata, fmt.Errorf("failed to parse endpoint URL: %w", err) + } + + if len(awsmiddleware.GetSigningName(ctx)) == 0 { + signingName := endpoint.SigningName + if len(signingName) == 0 { + signingName = "signin" + } + ctx = awsmiddleware.SetSigningName(ctx, signingName) + } + ctx = awsmiddleware.SetEndpointSource(ctx, endpoint.Source) + ctx = smithyhttp.SetHostnameImmutable(ctx, endpoint.HostnameImmutable) + ctx = awsmiddleware.SetSigningRegion(ctx, endpoint.SigningRegion) + ctx = awsmiddleware.SetPartitionID(ctx, endpoint.PartitionID) + return next.HandleSerialize(ctx, in) +} +func addResolveEndpointMiddleware(stack *middleware.Stack, o Options) error { + return stack.Serialize.Insert(&ResolveEndpoint{ + Resolver: o.EndpointResolver, + Options: o.EndpointOptions, + }, "OperationSerializer", middleware.Before) +} + +func removeResolveEndpointMiddleware(stack *middleware.Stack) error { + _, err := stack.Serialize.Remove((&ResolveEndpoint{}).ID()) + return err +} + +type wrappedEndpointResolver struct { + awsResolver aws.EndpointResolverWithOptions +} + +func (w *wrappedEndpointResolver) ResolveEndpoint(region string, options EndpointResolverOptions) (endpoint aws.Endpoint, err error) { + return w.awsResolver.ResolveEndpoint(ServiceID, region, options) +} + +type awsEndpointResolverAdaptor func(service, region string) (aws.Endpoint, error) + +func (a awsEndpointResolverAdaptor) ResolveEndpoint(service, region string, options ...interface{}) (aws.Endpoint, error) { + return a(service, region) +} + +var _ aws.EndpointResolverWithOptions = awsEndpointResolverAdaptor(nil) + +// withEndpointResolver returns an aws.EndpointResolverWithOptions that first delegates endpoint resolution to the awsResolver. +// If awsResolver returns aws.EndpointNotFoundError error, the v1 resolver middleware will swallow the error, +// and set an appropriate context flag such that fallback will occur when EndpointResolverV2 is invoked +// via its middleware. +// +// If another error (besides aws.EndpointNotFoundError) is returned, then that error will be propagated. +func withEndpointResolver(awsResolver aws.EndpointResolver, awsResolverWithOptions aws.EndpointResolverWithOptions) EndpointResolver { + var resolver aws.EndpointResolverWithOptions + + if awsResolverWithOptions != nil { + resolver = awsResolverWithOptions + } else if awsResolver != nil { + resolver = awsEndpointResolverAdaptor(awsResolver.ResolveEndpoint) + } + + return &wrappedEndpointResolver{ + awsResolver: resolver, + } +} + +func finalizeClientEndpointResolverOptions(options *Options) { + options.EndpointOptions.LogDeprecated = options.ClientLogMode.IsDeprecatedUsage() + + if len(options.EndpointOptions.ResolvedRegion) == 0 { + const fipsInfix = "-fips-" + const fipsPrefix = "fips-" + const fipsSuffix = "-fips" + + if strings.Contains(options.Region, fipsInfix) || + strings.Contains(options.Region, fipsPrefix) || + strings.Contains(options.Region, fipsSuffix) { + options.EndpointOptions.ResolvedRegion = strings.ReplaceAll(strings.ReplaceAll(strings.ReplaceAll( + options.Region, fipsInfix, "-"), fipsPrefix, ""), fipsSuffix, "") + options.EndpointOptions.UseFIPSEndpoint = aws.FIPSEndpointStateEnabled + } + } + +} + +func resolveEndpointResolverV2(options *Options) { + if options.EndpointResolverV2 == nil { + options.EndpointResolverV2 = NewDefaultEndpointResolverV2() + } +} + +func resolveBaseEndpoint(cfg aws.Config, o *Options) { + if cfg.BaseEndpoint != nil { + o.BaseEndpoint = cfg.BaseEndpoint + } + + _, g := os.LookupEnv("AWS_ENDPOINT_URL") + _, s := os.LookupEnv("AWS_ENDPOINT_URL_SIGNIN") + + if g && !s { + return + } + + value, found, err := internalConfig.ResolveServiceBaseEndpoint(context.Background(), "Signin", cfg.ConfigSources) + if found && err == nil { + o.BaseEndpoint = &value + } +} + +func bindRegion(region string) (*string, error) { + if region == "" { + return nil, nil + } + if !rulesfn.IsValidHostLabel(region, true) { + return nil, fmt.Errorf("invalid input region %s", region) + } + + return aws.String(endpoints.MapFIPSRegion(region)), nil +} + +// EndpointParameters provides the parameters that influence how endpoints are +// resolved. +type EndpointParameters struct { + // When true, use the dual-stack endpoint. If the configured endpoint does not + // support dual-stack, dispatching the request MAY return an error. + // + // Defaults to + // false if no value is provided. + // + // AWS::UseDualStack + UseDualStack *bool + + // When true, send this request to the FIPS-compliant regional endpoint. If the + // configured endpoint does not have a FIPS compliant endpoint, dispatching the + // request will return an error. + // + // Defaults to false if no value is + // provided. + // + // AWS::UseFIPS + UseFIPS *bool + + // Override the endpoint used to send this request + // + // Parameter is + // required. + // + // SDK::Endpoint + Endpoint *string + + // The AWS region used to dispatch the request. + // + // Parameter is + // required. + // + // AWS::Region + Region *string +} + +// ValidateRequired validates required parameters are set. +func (p EndpointParameters) ValidateRequired() error { + if p.UseDualStack == nil { + return fmt.Errorf("parameter UseDualStack is required") + } + + if p.UseFIPS == nil { + return fmt.Errorf("parameter UseFIPS is required") + } + + return nil +} + +// WithDefaults returns a shallow copy of EndpointParameterswith default values +// applied to members where applicable. +func (p EndpointParameters) WithDefaults() EndpointParameters { + if p.UseDualStack == nil { + p.UseDualStack = ptr.Bool(false) + } + + if p.UseFIPS == nil { + p.UseFIPS = ptr.Bool(false) + } + return p +} + +type stringSlice []string + +func (s stringSlice) Get(i int) *string { + if i < 0 || i >= len(s) { + return nil + } + + v := s[i] + return &v +} + +// EndpointResolverV2 provides the interface for resolving service endpoints. +type EndpointResolverV2 interface { + // ResolveEndpoint attempts to resolve the endpoint with the provided options, + // returning the endpoint if found. Otherwise an error is returned. + ResolveEndpoint(ctx context.Context, params EndpointParameters) ( + smithyendpoints.Endpoint, error, + ) +} + +// resolver provides the implementation for resolving endpoints. +type resolver struct{} + +func NewDefaultEndpointResolverV2() EndpointResolverV2 { + return &resolver{} +} + +// ResolveEndpoint attempts to resolve the endpoint with the provided options, +// returning the endpoint if found. Otherwise an error is returned. +func (r *resolver) ResolveEndpoint( + ctx context.Context, params EndpointParameters, +) ( + endpoint smithyendpoints.Endpoint, err error, +) { + params = params.WithDefaults() + if err = params.ValidateRequired(); err != nil { + return endpoint, fmt.Errorf("endpoint parameters are not valid, %w", err) + } + _UseDualStack := *params.UseDualStack + _ = _UseDualStack + _UseFIPS := *params.UseFIPS + _ = _UseFIPS + + if exprVal := params.Endpoint; exprVal != nil { + _Endpoint := *exprVal + _ = _Endpoint + if _UseFIPS == true { + return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid Configuration: FIPS and custom endpoint are not supported") + } + if _UseDualStack == true { + return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid Configuration: Dualstack and custom endpoint are not supported") + } + uriString := _Endpoint + + uri, err := url.Parse(uriString) + if err != nil { + return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) + } + + return smithyendpoints.Endpoint{ + URI: *uri, + Headers: http.Header{}, + }, nil + } + if exprVal := params.Region; exprVal != nil { + _Region := *exprVal + _ = _Region + if exprVal := awsrulesfn.GetPartition(_Region); exprVal != nil { + _PartitionResult := *exprVal + _ = _PartitionResult + if _PartitionResult.Name == "aws" { + if _UseFIPS == false { + if _UseDualStack == false { + uriString := func() string { + var out strings.Builder + out.WriteString("https://") + out.WriteString(_Region) + out.WriteString(".signin.aws.amazon.com") + return out.String() + }() + + uri, err := url.Parse(uriString) + if err != nil { + return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) + } + + return smithyendpoints.Endpoint{ + URI: *uri, + Headers: http.Header{}, + }, nil + } + } + } + if _PartitionResult.Name == "aws-cn" { + if _UseFIPS == false { + if _UseDualStack == false { + uriString := func() string { + var out strings.Builder + out.WriteString("https://") + out.WriteString(_Region) + out.WriteString(".signin.amazonaws.cn") + return out.String() + }() + + uri, err := url.Parse(uriString) + if err != nil { + return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) + } + + return smithyendpoints.Endpoint{ + URI: *uri, + Headers: http.Header{}, + }, nil + } + } + } + if _PartitionResult.Name == "aws-us-gov" { + if _UseFIPS == false { + if _UseDualStack == false { + uriString := func() string { + var out strings.Builder + out.WriteString("https://") + out.WriteString(_Region) + out.WriteString(".signin.amazonaws-us-gov.com") + return out.String() + }() + + uri, err := url.Parse(uriString) + if err != nil { + return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) + } + + return smithyendpoints.Endpoint{ + URI: *uri, + Headers: http.Header{}, + }, nil + } + } + } + if _UseFIPS == true { + if _UseDualStack == true { + if true == _PartitionResult.SupportsFIPS { + if true == _PartitionResult.SupportsDualStack { + uriString := func() string { + var out strings.Builder + out.WriteString("https://signin-fips.") + out.WriteString(_Region) + out.WriteString(".") + out.WriteString(_PartitionResult.DualStackDnsSuffix) + return out.String() + }() + + uri, err := url.Parse(uriString) + if err != nil { + return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) + } + + return smithyendpoints.Endpoint{ + URI: *uri, + Headers: http.Header{}, + }, nil + } + } + return endpoint, fmt.Errorf("endpoint rule error, %s", "FIPS and DualStack are enabled, but this partition does not support one or both") + } + } + if _UseFIPS == true { + if _UseDualStack == false { + if _PartitionResult.SupportsFIPS == true { + uriString := func() string { + var out strings.Builder + out.WriteString("https://signin-fips.") + out.WriteString(_Region) + out.WriteString(".") + out.WriteString(_PartitionResult.DnsSuffix) + return out.String() + }() + + uri, err := url.Parse(uriString) + if err != nil { + return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) + } + + return smithyendpoints.Endpoint{ + URI: *uri, + Headers: http.Header{}, + }, nil + } + return endpoint, fmt.Errorf("endpoint rule error, %s", "FIPS is enabled but this partition does not support FIPS") + } + } + if _UseFIPS == false { + if _UseDualStack == true { + if true == _PartitionResult.SupportsDualStack { + uriString := func() string { + var out strings.Builder + out.WriteString("https://signin.") + out.WriteString(_Region) + out.WriteString(".") + out.WriteString(_PartitionResult.DualStackDnsSuffix) + return out.String() + }() + + uri, err := url.Parse(uriString) + if err != nil { + return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) + } + + return smithyendpoints.Endpoint{ + URI: *uri, + Headers: http.Header{}, + }, nil + } + return endpoint, fmt.Errorf("endpoint rule error, %s", "DualStack is enabled but this partition does not support DualStack") + } + } + uriString := func() string { + var out strings.Builder + out.WriteString("https://signin.") + out.WriteString(_Region) + out.WriteString(".") + out.WriteString(_PartitionResult.DnsSuffix) + return out.String() + }() + + uri, err := url.Parse(uriString) + if err != nil { + return endpoint, fmt.Errorf("Failed to parse uri: %s", uriString) + } + + return smithyendpoints.Endpoint{ + URI: *uri, + Headers: http.Header{}, + }, nil + } + return endpoint, fmt.Errorf("Endpoint resolution failed. Invalid operation or environment input.") + } + return endpoint, fmt.Errorf("endpoint rule error, %s", "Invalid Configuration: Missing Region") +} + +type endpointParamsBinder interface { + bindEndpointParams(*EndpointParameters) +} + +func bindEndpointParams(ctx context.Context, input interface{}, options Options) (*EndpointParameters, error) { + params := &EndpointParameters{} + + params.UseDualStack = aws.Bool(options.EndpointOptions.UseDualStackEndpoint == aws.DualStackEndpointStateEnabled) + params.UseFIPS = aws.Bool(options.EndpointOptions.UseFIPSEndpoint == aws.FIPSEndpointStateEnabled) + params.Endpoint = options.BaseEndpoint + region, err := bindRegion(options.Region) + if err != nil { + return nil, err + } + params.Region = region + + if b, ok := input.(endpointParamsBinder); ok { + b.bindEndpointParams(params) + } + + return params, nil +} + +type resolveEndpointV2Middleware struct { + options Options +} + +func (*resolveEndpointV2Middleware) ID() string { + return "ResolveEndpointV2" +} + +func (m *resolveEndpointV2Middleware) HandleFinalize(ctx context.Context, in middleware.FinalizeInput, next middleware.FinalizeHandler) ( + out middleware.FinalizeOutput, metadata middleware.Metadata, err error, +) { + _, span := tracing.StartSpan(ctx, "ResolveEndpoint") + defer span.End() + + if awsmiddleware.GetRequiresLegacyEndpoints(ctx) { + return next.HandleFinalize(ctx, in) + } + + req, ok := in.Request.(*smithyhttp.Request) + if !ok { + return out, metadata, fmt.Errorf("unknown transport type %T", in.Request) + } + + if m.options.EndpointResolverV2 == nil { + return out, metadata, fmt.Errorf("expected endpoint resolver to not be nil") + } + + params, err := bindEndpointParams(ctx, getOperationInput(ctx), m.options) + if err != nil { + return out, metadata, fmt.Errorf("failed to bind endpoint params, %w", err) + } + endpt, err := timeOperationMetric(ctx, "client.call.resolve_endpoint_duration", + func() (smithyendpoints.Endpoint, error) { + return m.options.EndpointResolverV2.ResolveEndpoint(ctx, *params) + }) + if err != nil { + return out, metadata, fmt.Errorf("failed to resolve service endpoint, %w", err) + } + + span.SetProperty("client.call.resolved_endpoint", endpt.URI.String()) + + if endpt.URI.RawPath == "" && req.URL.RawPath != "" { + endpt.URI.RawPath = endpt.URI.Path + } + req.URL.Scheme = endpt.URI.Scheme + req.URL.Host = endpt.URI.Host + req.URL.Path = smithyhttp.JoinPath(endpt.URI.Path, req.URL.Path) + req.URL.RawPath = smithyhttp.JoinPath(endpt.URI.RawPath, req.URL.RawPath) + for k := range endpt.Headers { + req.Header.Set(k, endpt.Headers.Get(k)) + } + + rscheme := getResolvedAuthScheme(ctx) + if rscheme == nil { + return out, metadata, fmt.Errorf("no resolved auth scheme") + } + + opts, _ := smithyauth.GetAuthOptions(&endpt.Properties) + for _, o := range opts { + rscheme.SignerProperties.SetAll(&o.SignerProperties) + } + + span.End() + return next.HandleFinalize(ctx, in) +} diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/generated.json b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/generated.json new file mode 100644 index 00000000000..8014c56167c --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/generated.json @@ -0,0 +1,34 @@ +{ + "dependencies": { + "github.com/aws/aws-sdk-go-v2": "v1.4.0", + "github.com/aws/aws-sdk-go-v2/internal/configsources": "v0.0.0-00010101000000-000000000000", + "github.com/aws/aws-sdk-go-v2/internal/endpoints/v2": "v2.0.0-00010101000000-000000000000", + "github.com/aws/smithy-go": "v1.4.0" + }, + "files": [ + "api_client.go", + "api_client_test.go", + "api_op_CreateOAuth2Token.go", + "auth.go", + "deserializers.go", + "doc.go", + "endpoints.go", + "endpoints_config_test.go", + "endpoints_test.go", + "generated.json", + "internal/endpoints/endpoints.go", + "internal/endpoints/endpoints_test.go", + "options.go", + "protocol_test.go", + "serializers.go", + "snapshot_test.go", + "sra_operation_order_test.go", + "types/enums.go", + "types/errors.go", + "types/types.go", + "validators.go" + ], + "go": "1.23", + "module": "github.com/aws/aws-sdk-go-v2/service/signin", + "unstable": false +} diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/go_module_metadata.go new file mode 100644 index 00000000000..2510f960050 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/go_module_metadata.go @@ -0,0 +1,6 @@ +// Code generated by internal/repotools/cmd/updatemodulemeta DO NOT EDIT. + +package signin + +// goModuleVersion is the tagged release for this module +const goModuleVersion = "1.0.3" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/internal/endpoints/endpoints.go b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/internal/endpoints/endpoints.go new file mode 100644 index 00000000000..cfb2efea8a3 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/internal/endpoints/endpoints.go @@ -0,0 +1,333 @@ +// Code generated by smithy-go-codegen DO NOT EDIT. + +package endpoints + +import ( + "github.com/aws/aws-sdk-go-v2/aws" + endpoints "github.com/aws/aws-sdk-go-v2/internal/endpoints/v2" + "github.com/aws/smithy-go/logging" + "regexp" +) + +// Options is the endpoint resolver configuration options +type Options struct { + // Logger is a logging implementation that log events should be sent to. + Logger logging.Logger + + // LogDeprecated indicates that deprecated endpoints should be logged to the + // provided logger. + LogDeprecated bool + + // ResolvedRegion is used to override the region to be resolved, rather then the + // using the value passed to the ResolveEndpoint method. This value is used by the + // SDK to translate regions like fips-us-east-1 or us-east-1-fips to an alternative + // name. You must not set this value directly in your application. + ResolvedRegion string + + // DisableHTTPS informs the resolver to return an endpoint that does not use the + // HTTPS scheme. + DisableHTTPS bool + + // UseDualStackEndpoint specifies the resolver must resolve a dual-stack endpoint. + UseDualStackEndpoint aws.DualStackEndpointState + + // UseFIPSEndpoint specifies the resolver must resolve a FIPS endpoint. + UseFIPSEndpoint aws.FIPSEndpointState +} + +func (o Options) GetResolvedRegion() string { + return o.ResolvedRegion +} + +func (o Options) GetDisableHTTPS() bool { + return o.DisableHTTPS +} + +func (o Options) GetUseDualStackEndpoint() aws.DualStackEndpointState { + return o.UseDualStackEndpoint +} + +func (o Options) GetUseFIPSEndpoint() aws.FIPSEndpointState { + return o.UseFIPSEndpoint +} + +func transformToSharedOptions(options Options) endpoints.Options { + return endpoints.Options{ + Logger: options.Logger, + LogDeprecated: options.LogDeprecated, + ResolvedRegion: options.ResolvedRegion, + DisableHTTPS: options.DisableHTTPS, + UseDualStackEndpoint: options.UseDualStackEndpoint, + UseFIPSEndpoint: options.UseFIPSEndpoint, + } +} + +// Resolver Signin endpoint resolver +type Resolver struct { + partitions endpoints.Partitions +} + +// ResolveEndpoint resolves the service endpoint for the given region and options +func (r *Resolver) ResolveEndpoint(region string, options Options) (endpoint aws.Endpoint, err error) { + if len(region) == 0 { + return endpoint, &aws.MissingRegionError{} + } + + opt := transformToSharedOptions(options) + return r.partitions.ResolveEndpoint(region, opt) +} + +// New returns a new Resolver +func New() *Resolver { + return &Resolver{ + partitions: defaultPartitions, + } +} + +var partitionRegexp = struct { + Aws *regexp.Regexp + AwsCn *regexp.Regexp + AwsEusc *regexp.Regexp + AwsIso *regexp.Regexp + AwsIsoB *regexp.Regexp + AwsIsoE *regexp.Regexp + AwsIsoF *regexp.Regexp + AwsUsGov *regexp.Regexp +}{ + + Aws: regexp.MustCompile("^(us|eu|ap|sa|ca|me|af|il|mx)\\-\\w+\\-\\d+$"), + AwsCn: regexp.MustCompile("^cn\\-\\w+\\-\\d+$"), + AwsEusc: regexp.MustCompile("^eusc\\-(de)\\-\\w+\\-\\d+$"), + AwsIso: regexp.MustCompile("^us\\-iso\\-\\w+\\-\\d+$"), + AwsIsoB: regexp.MustCompile("^us\\-isob\\-\\w+\\-\\d+$"), + AwsIsoE: regexp.MustCompile("^eu\\-isoe\\-\\w+\\-\\d+$"), + AwsIsoF: regexp.MustCompile("^us\\-isof\\-\\w+\\-\\d+$"), + AwsUsGov: regexp.MustCompile("^us\\-gov\\-\\w+\\-\\d+$"), +} + +var defaultPartitions = endpoints.Partitions{ + { + ID: "aws", + Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ + { + Variant: endpoints.DualStackVariant, + }: { + Hostname: "signin.{region}.api.aws", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + { + Variant: endpoints.FIPSVariant, + }: { + Hostname: "signin-fips.{region}.amazonaws.com", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + { + Variant: endpoints.FIPSVariant | endpoints.DualStackVariant, + }: { + Hostname: "signin-fips.{region}.api.aws", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + { + Variant: 0, + }: { + Hostname: "signin.{region}.amazonaws.com", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + }, + RegionRegex: partitionRegexp.Aws, + IsRegionalized: true, + }, + { + ID: "aws-cn", + Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ + { + Variant: endpoints.DualStackVariant, + }: { + Hostname: "signin.{region}.api.amazonwebservices.com.cn", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + { + Variant: endpoints.FIPSVariant, + }: { + Hostname: "signin-fips.{region}.amazonaws.com.cn", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + { + Variant: endpoints.FIPSVariant | endpoints.DualStackVariant, + }: { + Hostname: "signin-fips.{region}.api.amazonwebservices.com.cn", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + { + Variant: 0, + }: { + Hostname: "signin.{region}.amazonaws.com.cn", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + }, + RegionRegex: partitionRegexp.AwsCn, + IsRegionalized: true, + }, + { + ID: "aws-eusc", + Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ + { + Variant: endpoints.DualStackVariant, + }: { + Hostname: "signin.{region}.api.amazonwebservices.eu", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + { + Variant: endpoints.FIPSVariant, + }: { + Hostname: "signin-fips.{region}.amazonaws.eu", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + { + Variant: endpoints.FIPSVariant | endpoints.DualStackVariant, + }: { + Hostname: "signin-fips.{region}.api.amazonwebservices.eu", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + { + Variant: 0, + }: { + Hostname: "signin.{region}.amazonaws.eu", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + }, + RegionRegex: partitionRegexp.AwsEusc, + IsRegionalized: true, + }, + { + ID: "aws-iso", + Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ + { + Variant: endpoints.FIPSVariant, + }: { + Hostname: "signin-fips.{region}.c2s.ic.gov", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + { + Variant: 0, + }: { + Hostname: "signin.{region}.c2s.ic.gov", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + }, + RegionRegex: partitionRegexp.AwsIso, + IsRegionalized: true, + }, + { + ID: "aws-iso-b", + Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ + { + Variant: endpoints.FIPSVariant, + }: { + Hostname: "signin-fips.{region}.sc2s.sgov.gov", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + { + Variant: 0, + }: { + Hostname: "signin.{region}.sc2s.sgov.gov", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + }, + RegionRegex: partitionRegexp.AwsIsoB, + IsRegionalized: true, + }, + { + ID: "aws-iso-e", + Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ + { + Variant: endpoints.FIPSVariant, + }: { + Hostname: "signin-fips.{region}.cloud.adc-e.uk", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + { + Variant: 0, + }: { + Hostname: "signin.{region}.cloud.adc-e.uk", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + }, + RegionRegex: partitionRegexp.AwsIsoE, + IsRegionalized: true, + }, + { + ID: "aws-iso-f", + Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ + { + Variant: endpoints.FIPSVariant, + }: { + Hostname: "signin-fips.{region}.csp.hci.ic.gov", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + { + Variant: 0, + }: { + Hostname: "signin.{region}.csp.hci.ic.gov", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + }, + RegionRegex: partitionRegexp.AwsIsoF, + IsRegionalized: true, + }, + { + ID: "aws-us-gov", + Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ + { + Variant: endpoints.DualStackVariant, + }: { + Hostname: "signin.{region}.api.aws", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + { + Variant: endpoints.FIPSVariant, + }: { + Hostname: "signin-fips.{region}.amazonaws.com", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + { + Variant: endpoints.FIPSVariant | endpoints.DualStackVariant, + }: { + Hostname: "signin-fips.{region}.api.aws", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + { + Variant: 0, + }: { + Hostname: "signin.{region}.amazonaws.com", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, + }, + RegionRegex: partitionRegexp.AwsUsGov, + IsRegionalized: true, + }, +} diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/options.go b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/options.go new file mode 100644 index 00000000000..3262aa58224 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/options.go @@ -0,0 +1,239 @@ +// Code generated by smithy-go-codegen DO NOT EDIT. + +package signin + +import ( + "context" + "github.com/aws/aws-sdk-go-v2/aws" + awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" + internalauthsmithy "github.com/aws/aws-sdk-go-v2/internal/auth/smithy" + smithyauth "github.com/aws/smithy-go/auth" + "github.com/aws/smithy-go/logging" + "github.com/aws/smithy-go/metrics" + "github.com/aws/smithy-go/middleware" + "github.com/aws/smithy-go/tracing" + smithyhttp "github.com/aws/smithy-go/transport/http" + "net/http" +) + +type HTTPClient interface { + Do(*http.Request) (*http.Response, error) +} + +type Options struct { + // Set of options to modify how an operation is invoked. These apply to all + // operations invoked for this client. Use functional options on operation call to + // modify this list for per operation behavior. + APIOptions []func(*middleware.Stack) error + + // The optional application specific identifier appended to the User-Agent header. + AppID string + + // This endpoint will be given as input to an EndpointResolverV2. It is used for + // providing a custom base endpoint that is subject to modifications by the + // processing EndpointResolverV2. + BaseEndpoint *string + + // Configures the events that will be sent to the configured logger. + ClientLogMode aws.ClientLogMode + + // The credentials object to use when signing requests. + Credentials aws.CredentialsProvider + + // The configuration DefaultsMode that the SDK should use when constructing the + // clients initial default settings. + DefaultsMode aws.DefaultsMode + + // The endpoint options to be used when attempting to resolve an endpoint. + EndpointOptions EndpointResolverOptions + + // The service endpoint resolver. + // + // Deprecated: Deprecated: EndpointResolver and WithEndpointResolver. Providing a + // value for this field will likely prevent you from using any endpoint-related + // service features released after the introduction of EndpointResolverV2 and + // BaseEndpoint. + // + // To migrate an EndpointResolver implementation that uses a custom endpoint, set + // the client option BaseEndpoint instead. + EndpointResolver EndpointResolver + + // Resolves the endpoint used for a particular service operation. This should be + // used over the deprecated EndpointResolver. + EndpointResolverV2 EndpointResolverV2 + + // Signature Version 4 (SigV4) Signer + HTTPSignerV4 HTTPSignerV4 + + // The logger writer interface to write logging messages to. + Logger logging.Logger + + // The client meter provider. + MeterProvider metrics.MeterProvider + + // The region to send requests to. (Required) + Region string + + // RetryMaxAttempts specifies the maximum number attempts an API client will call + // an operation that fails with a retryable error. A value of 0 is ignored, and + // will not be used to configure the API client created default retryer, or modify + // per operation call's retry max attempts. + // + // If specified in an operation call's functional options with a value that is + // different than the constructed client's Options, the Client's Retryer will be + // wrapped to use the operation's specific RetryMaxAttempts value. + RetryMaxAttempts int + + // RetryMode specifies the retry mode the API client will be created with, if + // Retryer option is not also specified. + // + // When creating a new API Clients this member will only be used if the Retryer + // Options member is nil. This value will be ignored if Retryer is not nil. + // + // Currently does not support per operation call overrides, may in the future. + RetryMode aws.RetryMode + + // Retryer guides how HTTP requests should be retried in case of recoverable + // failures. When nil the API client will use a default retryer. The kind of + // default retry created by the API client can be changed with the RetryMode + // option. + Retryer aws.Retryer + + // The RuntimeEnvironment configuration, only populated if the DefaultsMode is set + // to DefaultsModeAuto and is initialized using config.LoadDefaultConfig . You + // should not populate this structure programmatically, or rely on the values here + // within your applications. + RuntimeEnvironment aws.RuntimeEnvironment + + // The client tracer provider. + TracerProvider tracing.TracerProvider + + // The initial DefaultsMode used when the client options were constructed. If the + // DefaultsMode was set to aws.DefaultsModeAuto this will store what the resolved + // value was at that point in time. + // + // Currently does not support per operation call overrides, may in the future. + resolvedDefaultsMode aws.DefaultsMode + + // The HTTP client to invoke API calls with. Defaults to client's default HTTP + // implementation if nil. + HTTPClient HTTPClient + + // Client registry of operation interceptors. + Interceptors smithyhttp.InterceptorRegistry + + // The auth scheme resolver which determines how to authenticate for each + // operation. + AuthSchemeResolver AuthSchemeResolver + + // The list of auth schemes supported by the client. + AuthSchemes []smithyhttp.AuthScheme + + // Priority list of preferred auth scheme names (e.g. sigv4a). + AuthSchemePreference []string +} + +// Copy creates a clone where the APIOptions list is deep copied. +func (o Options) Copy() Options { + to := o + to.APIOptions = make([]func(*middleware.Stack) error, len(o.APIOptions)) + copy(to.APIOptions, o.APIOptions) + to.Interceptors = o.Interceptors.Copy() + + return to +} + +func (o Options) GetIdentityResolver(schemeID string) smithyauth.IdentityResolver { + if schemeID == "aws.auth#sigv4" { + return getSigV4IdentityResolver(o) + } + if schemeID == "smithy.api#noAuth" { + return &smithyauth.AnonymousIdentityResolver{} + } + return nil +} + +// WithAPIOptions returns a functional option for setting the Client's APIOptions +// option. +func WithAPIOptions(optFns ...func(*middleware.Stack) error) func(*Options) { + return func(o *Options) { + o.APIOptions = append(o.APIOptions, optFns...) + } +} + +// Deprecated: EndpointResolver and WithEndpointResolver. Providing a value for +// this field will likely prevent you from using any endpoint-related service +// features released after the introduction of EndpointResolverV2 and BaseEndpoint. +// +// To migrate an EndpointResolver implementation that uses a custom endpoint, set +// the client option BaseEndpoint instead. +func WithEndpointResolver(v EndpointResolver) func(*Options) { + return func(o *Options) { + o.EndpointResolver = v + } +} + +// WithEndpointResolverV2 returns a functional option for setting the Client's +// EndpointResolverV2 option. +func WithEndpointResolverV2(v EndpointResolverV2) func(*Options) { + return func(o *Options) { + o.EndpointResolverV2 = v + } +} + +func getSigV4IdentityResolver(o Options) smithyauth.IdentityResolver { + if o.Credentials != nil { + return &internalauthsmithy.CredentialsProviderAdapter{Provider: o.Credentials} + } + return nil +} + +// WithSigV4SigningName applies an override to the authentication workflow to +// use the given signing name for SigV4-authenticated operations. +// +// This is an advanced setting. The value here is FINAL, taking precedence over +// the resolved signing name from both auth scheme resolution and endpoint +// resolution. +func WithSigV4SigningName(name string) func(*Options) { + fn := func(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( + out middleware.InitializeOutput, metadata middleware.Metadata, err error, + ) { + return next.HandleInitialize(awsmiddleware.SetSigningName(ctx, name), in) + } + return func(o *Options) { + o.APIOptions = append(o.APIOptions, func(s *middleware.Stack) error { + return s.Initialize.Add( + middleware.InitializeMiddlewareFunc("withSigV4SigningName", fn), + middleware.Before, + ) + }) + } +} + +// WithSigV4SigningRegion applies an override to the authentication workflow to +// use the given signing region for SigV4-authenticated operations. +// +// This is an advanced setting. The value here is FINAL, taking precedence over +// the resolved signing region from both auth scheme resolution and endpoint +// resolution. +func WithSigV4SigningRegion(region string) func(*Options) { + fn := func(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( + out middleware.InitializeOutput, metadata middleware.Metadata, err error, + ) { + return next.HandleInitialize(awsmiddleware.SetSigningRegion(ctx, region), in) + } + return func(o *Options) { + o.APIOptions = append(o.APIOptions, func(s *middleware.Stack) error { + return s.Initialize.Add( + middleware.InitializeMiddlewareFunc("withSigV4SigningRegion", fn), + middleware.Before, + ) + }) + } +} + +func ignoreAnonymousAuth(options *Options) { + if aws.IsCredentialsProvider(options.Credentials, (*aws.AnonymousCredentials)(nil)) { + options.Credentials = nil + } +} diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/serializers.go b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/serializers.go new file mode 100644 index 00000000000..958240275e3 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/serializers.go @@ -0,0 +1,135 @@ +// Code generated by smithy-go-codegen DO NOT EDIT. + +package signin + +import ( + "bytes" + "context" + "fmt" + "github.com/aws/aws-sdk-go-v2/service/signin/types" + smithy "github.com/aws/smithy-go" + "github.com/aws/smithy-go/encoding/httpbinding" + smithyjson "github.com/aws/smithy-go/encoding/json" + "github.com/aws/smithy-go/middleware" + "github.com/aws/smithy-go/tracing" + smithyhttp "github.com/aws/smithy-go/transport/http" +) + +type awsRestjson1_serializeOpCreateOAuth2Token struct { +} + +func (*awsRestjson1_serializeOpCreateOAuth2Token) ID() string { + return "OperationSerializer" +} + +func (m *awsRestjson1_serializeOpCreateOAuth2Token) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( + out middleware.SerializeOutput, metadata middleware.Metadata, err error, +) { + _, span := tracing.StartSpan(ctx, "OperationSerializer") + endTimer := startMetricTimer(ctx, "client.call.serialization_duration") + defer endTimer() + defer span.End() + request, ok := in.Request.(*smithyhttp.Request) + if !ok { + return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} + } + + input, ok := in.Parameters.(*CreateOAuth2TokenInput) + _ = input + if !ok { + return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} + } + + opPath, opQuery := httpbinding.SplitURI("/v1/token") + request.URL.Path = smithyhttp.JoinPath(request.URL.Path, opPath) + request.URL.RawQuery = smithyhttp.JoinRawQuery(request.URL.RawQuery, opQuery) + request.Method = "POST" + var restEncoder *httpbinding.Encoder + if request.URL.RawPath == "" { + restEncoder, err = httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) + } else { + request.URL.RawPath = smithyhttp.JoinPath(request.URL.RawPath, opPath) + restEncoder, err = httpbinding.NewEncoderWithRawPath(request.URL.Path, request.URL.RawPath, request.URL.RawQuery, request.Header) + } + + if err != nil { + return out, metadata, &smithy.SerializationError{Err: err} + } + + if !restEncoder.HasHeader("Content-Type") { + ctx = smithyhttp.SetIsContentTypeDefaultValue(ctx, true) + restEncoder.SetHeader("Content-Type").String("application/json") + } + + if input.TokenInput != nil { + jsonEncoder := smithyjson.NewEncoder() + if err := awsRestjson1_serializeDocumentCreateOAuth2TokenRequestBody(input.TokenInput, jsonEncoder.Value); err != nil { + return out, metadata, &smithy.SerializationError{Err: err} + } + payload := bytes.NewReader(jsonEncoder.Bytes()) + if request, err = request.SetStream(payload); err != nil { + return out, metadata, &smithy.SerializationError{Err: err} + } + } else { + jsonEncoder := smithyjson.NewEncoder() + jsonEncoder.Value.Object().Close() + payload := bytes.NewReader(jsonEncoder.Bytes()) + if request, err = request.SetStream(payload); err != nil { + return out, metadata, &smithy.SerializationError{Err: err} + } + + } + + if request.Request, err = restEncoder.Encode(request.Request); err != nil { + return out, metadata, &smithy.SerializationError{Err: err} + } + in.Request = request + + endTimer() + span.End() + return next.HandleSerialize(ctx, in) +} +func awsRestjson1_serializeOpHttpBindingsCreateOAuth2TokenInput(v *CreateOAuth2TokenInput, encoder *httpbinding.Encoder) error { + if v == nil { + return fmt.Errorf("unsupported serialization of nil %T", v) + } + + return nil +} + +func awsRestjson1_serializeDocumentCreateOAuth2TokenRequestBody(v *types.CreateOAuth2TokenRequestBody, value smithyjson.Value) error { + object := value.Object() + defer object.Close() + + if v.ClientId != nil { + ok := object.Key("clientId") + ok.String(*v.ClientId) + } + + if v.Code != nil { + ok := object.Key("code") + ok.String(*v.Code) + } + + if v.CodeVerifier != nil { + ok := object.Key("codeVerifier") + ok.String(*v.CodeVerifier) + } + + if v.GrantType != nil { + ok := object.Key("grantType") + ok.String(*v.GrantType) + } + + if v.RedirectUri != nil { + ok := object.Key("redirectUri") + ok.String(*v.RedirectUri) + } + + if v.RefreshToken != nil { + ok := object.Key("refreshToken") + ok.String(*v.RefreshToken) + } + + return nil +} diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/types/enums.go b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/types/enums.go new file mode 100644 index 00000000000..ecfabb81f74 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/types/enums.go @@ -0,0 +1,37 @@ +// Code generated by smithy-go-codegen DO NOT EDIT. + +package types + +type OAuth2ErrorCode string + +// Enum values for OAuth2ErrorCode +const ( + // Token has expired and needs to be refreshed + OAuth2ErrorCodeTokenExpired OAuth2ErrorCode = "TOKEN_EXPIRED" + // User credentials have been changed + OAuth2ErrorCodeUserCredentialsChanged OAuth2ErrorCode = "USER_CREDENTIALS_CHANGED" + // Insufficient permissions to perform this operation + OAuth2ErrorCodeInsufficientPermissions OAuth2ErrorCode = "INSUFFICIENT_PERMISSIONS" + // Authorization code has expired + OAuth2ErrorCodeAuthcodeExpired OAuth2ErrorCode = "AUTHCODE_EXPIRED" + // Internal server error occurred + OAuth2ErrorCodeServerError OAuth2ErrorCode = "server_error" + // The request is missing a required parameter, includes an invalid parameter + // value, or is otherwise malformed + OAuth2ErrorCodeInvalidRequest OAuth2ErrorCode = "INVALID_REQUEST" +) + +// Values returns all known values for OAuth2ErrorCode. Note that this can be +// expanded in the future, and so it is only as up to date as the client. +// +// The ordering of this slice is not guaranteed to be stable across updates. +func (OAuth2ErrorCode) Values() []OAuth2ErrorCode { + return []OAuth2ErrorCode{ + "TOKEN_EXPIRED", + "USER_CREDENTIALS_CHANGED", + "INSUFFICIENT_PERMISSIONS", + "AUTHCODE_EXPIRED", + "server_error", + "INVALID_REQUEST", + } +} diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/types/errors.go b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/types/errors.go new file mode 100644 index 00000000000..ca4928a86c8 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/types/errors.go @@ -0,0 +1,151 @@ +// Code generated by smithy-go-codegen DO NOT EDIT. + +package types + +import ( + "fmt" + smithy "github.com/aws/smithy-go" +) + +// Error thrown for access denied scenarios with flexible HTTP status mapping +// +// Runtime HTTP Status Code Mapping: +// +// - HTTP 401 (Unauthorized): TOKEN_EXPIRED, AUTHCODE_EXPIRED +// - HTTP 403 (Forbidden): USER_CREDENTIALS_CHANGED, INSUFFICIENT_PERMISSIONS +// +// The specific HTTP status code is determined at runtime based on the error enum +// value. Consumers should use the error field to determine the specific access +// denial reason. +type AccessDeniedException struct { + Message *string + + ErrorCodeOverride *string + + Error_ OAuth2ErrorCode + + noSmithyDocumentSerde +} + +func (e *AccessDeniedException) Error() string { + return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) +} +func (e *AccessDeniedException) ErrorMessage() string { + if e.Message == nil { + return "" + } + return *e.Message +} +func (e *AccessDeniedException) ErrorCode() string { + if e == nil || e.ErrorCodeOverride == nil { + return "AccessDeniedException" + } + return *e.ErrorCodeOverride +} +func (e *AccessDeniedException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } + +// Error thrown when an internal server error occurs +// +// HTTP Status Code: 500 Internal Server Error +// +// Used for unexpected server-side errors that prevent request processing. +type InternalServerException struct { + Message *string + + ErrorCodeOverride *string + + Error_ OAuth2ErrorCode + + noSmithyDocumentSerde +} + +func (e *InternalServerException) Error() string { + return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) +} +func (e *InternalServerException) ErrorMessage() string { + if e.Message == nil { + return "" + } + return *e.Message +} +func (e *InternalServerException) ErrorCode() string { + if e == nil || e.ErrorCodeOverride == nil { + return "InternalServerException" + } + return *e.ErrorCodeOverride +} +func (e *InternalServerException) ErrorFault() smithy.ErrorFault { return smithy.FaultServer } + +// Error thrown when rate limit is exceeded +// +// HTTP Status Code: 429 Too Many Requests +// +// Possible OAuth2ErrorCode values: +// +// - INVALID_REQUEST: Rate limiting, too many requests, abuse prevention +// +// Possible causes: +// +// - Too many token requests from the same client +// - Rate limiting based on client_id or IP address +// - Abuse prevention mechanisms triggered +// - Service protection against excessive token generation +type TooManyRequestsError struct { + Message *string + + ErrorCodeOverride *string + + Error_ OAuth2ErrorCode + + noSmithyDocumentSerde +} + +func (e *TooManyRequestsError) Error() string { + return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) +} +func (e *TooManyRequestsError) ErrorMessage() string { + if e.Message == nil { + return "" + } + return *e.Message +} +func (e *TooManyRequestsError) ErrorCode() string { + if e == nil || e.ErrorCodeOverride == nil { + return "TooManyRequestsError" + } + return *e.ErrorCodeOverride +} +func (e *TooManyRequestsError) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } + +// Error thrown when request validation fails +// +// HTTP Status Code: 400 Bad Request +// +// Used for request validation errors such as malformed parameters, missing +// required fields, or invalid parameter values. +type ValidationException struct { + Message *string + + ErrorCodeOverride *string + + Error_ OAuth2ErrorCode + + noSmithyDocumentSerde +} + +func (e *ValidationException) Error() string { + return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) +} +func (e *ValidationException) ErrorMessage() string { + if e.Message == nil { + return "" + } + return *e.Message +} +func (e *ValidationException) ErrorCode() string { + if e == nil || e.ErrorCodeOverride == nil { + return "ValidationException" + } + return *e.ErrorCodeOverride +} +func (e *ValidationException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/types/types.go b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/types/types.go new file mode 100644 index 00000000000..98afa20bfcb --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/types/types.go @@ -0,0 +1,115 @@ +// Code generated by smithy-go-codegen DO NOT EDIT. + +package types + +import ( + smithydocument "github.com/aws/smithy-go/document" +) + +// AWS credentials structure containing temporary access credentials +// +// The scoped-down, 15 minute duration AWS credentials. Scoping down will be based +// on CLI policy (CLI team needs to create it). Similar to cloud shell +// implementation. +type AccessToken struct { + + // AWS access key ID for temporary credentials + // + // This member is required. + AccessKeyId *string + + // AWS secret access key for temporary credentials + // + // This member is required. + SecretAccessKey *string + + // AWS session token for temporary credentials + // + // This member is required. + SessionToken *string + + noSmithyDocumentSerde +} + +// Request body payload for CreateOAuth2Token operation +// +// The operation type is determined by the grant_type parameter: +// +// - grant_type=authorization_code: Requires code, redirect_uri, code_verifier +// - grant_type=refresh_token: Requires refresh_token +type CreateOAuth2TokenRequestBody struct { + + // The client identifier (ARN) used during Sign-In onboarding Required for both + // authorization code and refresh token flows + // + // This member is required. + ClientId *string + + // OAuth 2.0 grant type - determines which flow is used Must be + // "authorization_code" or "refresh_token" + // + // This member is required. + GrantType *string + + // The authorization code received from /v1/authorize Required only when + // grant_type=authorization_code + Code *string + + // PKCE code verifier to prove possession of the original code challenge Required + // only when grant_type=authorization_code + CodeVerifier *string + + // The redirect URI that must match the original authorization request Required + // only when grant_type=authorization_code + RedirectUri *string + + // The refresh token returned from auth_code redemption Required only when + // grant_type=refresh_token + RefreshToken *string + + noSmithyDocumentSerde +} + +// Response body payload for CreateOAuth2Token operation +// +// The response content depends on the grant_type from the request: +// +// - grant_type=authorization_code: Returns all fields including refresh_token +// and id_token +// - grant_type=refresh_token: Returns access_token, token_type, expires_in, +// refresh_token (no id_token) +type CreateOAuth2TokenResponseBody struct { + + // Scoped-down AWS credentials (15 minute duration) Present for both authorization + // code redemption and token refresh + // + // This member is required. + AccessToken *AccessToken + + // Time to expiry in seconds (maximum 900) Present for both authorization code + // redemption and token refresh + // + // This member is required. + ExpiresIn *int32 + + // Encrypted refresh token with cnf.jkt (SHA-256 thumbprint of presented jwk) + // Always present in responses (required for both flows) + // + // This member is required. + RefreshToken *string + + // Token type indicating this is AWS SigV4 credentials Value is "aws_sigv4" for + // both flows + // + // This member is required. + TokenType *string + + // ID token containing user identity information Present only in authorization + // code redemption response (grant_type=authorization_code) Not included in token + // refresh responses + IdToken *string + + noSmithyDocumentSerde +} + +type noSmithyDocumentSerde = smithydocument.NoSerde diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/validators.go b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/validators.go new file mode 100644 index 00000000000..f07252341ad --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/validators.go @@ -0,0 +1,72 @@ +// Code generated by smithy-go-codegen DO NOT EDIT. + +package signin + +import ( + "context" + "fmt" + "github.com/aws/aws-sdk-go-v2/service/signin/types" + smithy "github.com/aws/smithy-go" + "github.com/aws/smithy-go/middleware" +) + +type validateOpCreateOAuth2Token struct { +} + +func (*validateOpCreateOAuth2Token) ID() string { + return "OperationInputValidation" +} + +func (m *validateOpCreateOAuth2Token) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( + out middleware.InitializeOutput, metadata middleware.Metadata, err error, +) { + input, ok := in.Parameters.(*CreateOAuth2TokenInput) + if !ok { + return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) + } + if err := validateOpCreateOAuth2TokenInput(input); err != nil { + return out, metadata, err + } + return next.HandleInitialize(ctx, in) +} + +func addOpCreateOAuth2TokenValidationMiddleware(stack *middleware.Stack) error { + return stack.Initialize.Add(&validateOpCreateOAuth2Token{}, middleware.After) +} + +func validateCreateOAuth2TokenRequestBody(v *types.CreateOAuth2TokenRequestBody) error { + if v == nil { + return nil + } + invalidParams := smithy.InvalidParamsError{Context: "CreateOAuth2TokenRequestBody"} + if v.ClientId == nil { + invalidParams.Add(smithy.NewErrParamRequired("ClientId")) + } + if v.GrantType == nil { + invalidParams.Add(smithy.NewErrParamRequired("GrantType")) + } + if invalidParams.Len() > 0 { + return invalidParams + } else { + return nil + } +} + +func validateOpCreateOAuth2TokenInput(v *CreateOAuth2TokenInput) error { + if v == nil { + return nil + } + invalidParams := smithy.InvalidParamsError{Context: "CreateOAuth2TokenInput"} + if v.TokenInput == nil { + invalidParams.Add(smithy.NewErrParamRequired("TokenInput")) + } else if v.TokenInput != nil { + if err := validateCreateOAuth2TokenRequestBody(v.TokenInput); err != nil { + invalidParams.AddNested("TokenInput", err.(smithy.InvalidParamsError)) + } + } + if invalidParams.Len() > 0 { + return invalidParams + } else { + return nil + } +} diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/CHANGELOG.md index d440d166ad2..63691fc57ed 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/CHANGELOG.md @@ -1,3 +1,48 @@ +# v1.39.8 (2025-12-02) + +* **Dependency Update**: Updated to the latest SDK module versions +* **Dependency Update**: Upgrade to smithy-go v1.24.0. Notably this version of the library reduces the allocation footprint of the middleware system. We observe a ~10% reduction in allocations per SDK call with this change. + +# v1.39.7 (2025-11-25) + +* **Bug Fix**: Add error check for endpoint param binding during auth scheme resolution to fix panic reported in #3234 + +# v1.39.6 (2025-11-19.2) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.39.5 (2025-11-12) + +* **Bug Fix**: Further reduce allocation overhead when the metrics system isn't in-use. +* **Bug Fix**: Reduce allocation overhead when the client doesn't have any HTTP interceptors configured. +* **Bug Fix**: Remove blank trace spans towards the beginning of the request that added no additional information. This conveys a slight reduction in overall allocations. + +# v1.39.4 (2025-11-11) + +* **Bug Fix**: Return validation error if input region is not a valid host label. + +# v1.39.3 (2025-11-04) + +* **Dependency Update**: Updated to the latest SDK module versions +* **Dependency Update**: Upgrade to smithy-go v1.23.2 which should convey some passive reduction of overall allocations, especially when not using the metrics system. + +# v1.39.2 (2025-10-30) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.39.1 (2025-10-23) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.39.0 (2025-10-22) + +* **Feature**: Update endpoint ruleset parameters casing + +# v1.38.6 (2025-10-16) + +* **Dependency Update**: Bump minimum Go version to 1.23. +* **Dependency Update**: Updated to the latest SDK module versions + # v1.38.5 (2025-09-26) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_client.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_client.go index 72bc075bb73..0b94cd2be81 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_client.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_client.go @@ -65,7 +65,12 @@ func timeOperationMetric[T any]( ctx context.Context, metric string, fn func() (T, error), opts ...metrics.RecordMetricOption, ) (T, error) { - instr := getOperationMetrics(ctx).histogramFor(metric) + mm := getOperationMetrics(ctx) + if mm == nil { // not using the metrics system + return fn() + } + + instr := mm.histogramFor(metric) opts = append([]metrics.RecordMetricOption{withOperationMetadata(ctx)}, opts...) start := time.Now() @@ -78,7 +83,12 @@ func timeOperationMetric[T any]( } func startMetricTimer(ctx context.Context, metric string, opts ...metrics.RecordMetricOption) func() { - instr := getOperationMetrics(ctx).histogramFor(metric) + mm := getOperationMetrics(ctx) + if mm == nil { // not using the metrics system + return func() {} + } + + instr := mm.histogramFor(metric) opts = append([]metrics.RecordMetricOption{withOperationMetadata(ctx)}, opts...) var ended bool @@ -106,6 +116,12 @@ func withOperationMetadata(ctx context.Context) metrics.RecordMetricOption { type operationMetricsKey struct{} func withOperationMetrics(parent context.Context, mp metrics.MeterProvider) (context.Context, error) { + if _, ok := mp.(metrics.NopMeterProvider); ok { + // not using the metrics system - setting up the metrics context is a memory-intensive operation + // so we should skip it in this case + return parent, nil + } + meter := mp.Meter("github.com/aws/aws-sdk-go-v2/service/sns") om := &operationMetrics{} @@ -153,7 +169,10 @@ func operationMetricTimer(m metrics.Meter, name, desc string) (metrics.Float64Hi } func getOperationMetrics(ctx context.Context) *operationMetrics { - return ctx.Value(operationMetricsKey{}).(*operationMetrics) + if v := ctx.Value(operationMetricsKey{}); v != nil { + return v.(*operationMetrics) + } + return nil } func operationTracer(p tracing.TracerProvider) tracing.Tracer { @@ -883,138 +902,49 @@ func addInterceptAttempt(stack *middleware.Stack, opts Options) error { }, "Retry", middleware.After) } -func addInterceptExecution(stack *middleware.Stack, opts Options) error { - return stack.Initialize.Add(&smithyhttp.InterceptExecution{ - BeforeExecution: opts.Interceptors.BeforeExecution, - AfterExecution: opts.Interceptors.AfterExecution, - }, middleware.Before) -} - -func addInterceptBeforeSerialization(stack *middleware.Stack, opts Options) error { - return stack.Serialize.Insert(&smithyhttp.InterceptBeforeSerialization{ - Interceptors: opts.Interceptors.BeforeSerialization, - }, "OperationSerializer", middleware.Before) -} - -func addInterceptAfterSerialization(stack *middleware.Stack, opts Options) error { - return stack.Serialize.Insert(&smithyhttp.InterceptAfterSerialization{ - Interceptors: opts.Interceptors.AfterSerialization, - }, "OperationSerializer", middleware.After) -} - -func addInterceptBeforeSigning(stack *middleware.Stack, opts Options) error { - return stack.Finalize.Insert(&smithyhttp.InterceptBeforeSigning{ - Interceptors: opts.Interceptors.BeforeSigning, - }, "Signing", middleware.Before) -} - -func addInterceptAfterSigning(stack *middleware.Stack, opts Options) error { - return stack.Finalize.Insert(&smithyhttp.InterceptAfterSigning{ - Interceptors: opts.Interceptors.AfterSigning, - }, "Signing", middleware.After) -} - -func addInterceptTransmit(stack *middleware.Stack, opts Options) error { - return stack.Deserialize.Add(&smithyhttp.InterceptTransmit{ - BeforeTransmit: opts.Interceptors.BeforeTransmit, - AfterTransmit: opts.Interceptors.AfterTransmit, - }, middleware.After) -} - -func addInterceptBeforeDeserialization(stack *middleware.Stack, opts Options) error { - return stack.Deserialize.Insert(&smithyhttp.InterceptBeforeDeserialization{ - Interceptors: opts.Interceptors.BeforeDeserialization, - }, "OperationDeserializer", middleware.After) // (deserialize stack is called in reverse) -} - -func addInterceptAfterDeserialization(stack *middleware.Stack, opts Options) error { - return stack.Deserialize.Insert(&smithyhttp.InterceptAfterDeserialization{ - Interceptors: opts.Interceptors.AfterDeserialization, - }, "OperationDeserializer", middleware.Before) -} - -type spanInitializeStart struct { -} - -func (*spanInitializeStart) ID() string { - return "spanInitializeStart" -} - -func (m *spanInitializeStart) HandleInitialize( - ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler, -) ( - middleware.InitializeOutput, middleware.Metadata, error, -) { - ctx, _ = tracing.StartSpan(ctx, "Initialize") - - return next.HandleInitialize(ctx, in) -} - -type spanInitializeEnd struct { -} - -func (*spanInitializeEnd) ID() string { - return "spanInitializeEnd" -} - -func (m *spanInitializeEnd) HandleInitialize( - ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler, -) ( - middleware.InitializeOutput, middleware.Metadata, error, -) { - ctx, span := tracing.PopSpan(ctx) - span.End() - - return next.HandleInitialize(ctx, in) -} - -type spanBuildRequestStart struct { -} - -func (*spanBuildRequestStart) ID() string { - return "spanBuildRequestStart" -} - -func (m *spanBuildRequestStart) HandleSerialize( - ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler, -) ( - middleware.SerializeOutput, middleware.Metadata, error, -) { - ctx, _ = tracing.StartSpan(ctx, "BuildRequest") - - return next.HandleSerialize(ctx, in) -} - -type spanBuildRequestEnd struct { -} - -func (*spanBuildRequestEnd) ID() string { - return "spanBuildRequestEnd" -} - -func (m *spanBuildRequestEnd) HandleBuild( - ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler, -) ( - middleware.BuildOutput, middleware.Metadata, error, -) { - ctx, span := tracing.PopSpan(ctx) - span.End() - - return next.HandleBuild(ctx, in) -} - -func addSpanInitializeStart(stack *middleware.Stack) error { - return stack.Initialize.Add(&spanInitializeStart{}, middleware.Before) -} - -func addSpanInitializeEnd(stack *middleware.Stack) error { - return stack.Initialize.Add(&spanInitializeEnd{}, middleware.After) -} - -func addSpanBuildRequestStart(stack *middleware.Stack) error { - return stack.Serialize.Add(&spanBuildRequestStart{}, middleware.Before) -} +func addInterceptors(stack *middleware.Stack, opts Options) error { + // middlewares are expensive, don't add all of these interceptor ones unless the caller + // actually has at least one interceptor configured + // + // at the moment it's all-or-nothing because some of the middlewares here are responsible for + // setting fields in the interceptor context for future ones + if len(opts.Interceptors.BeforeExecution) == 0 && + len(opts.Interceptors.BeforeSerialization) == 0 && len(opts.Interceptors.AfterSerialization) == 0 && + len(opts.Interceptors.BeforeRetryLoop) == 0 && + len(opts.Interceptors.BeforeAttempt) == 0 && + len(opts.Interceptors.BeforeSigning) == 0 && len(opts.Interceptors.AfterSigning) == 0 && + len(opts.Interceptors.BeforeTransmit) == 0 && len(opts.Interceptors.AfterTransmit) == 0 && + len(opts.Interceptors.BeforeDeserialization) == 0 && len(opts.Interceptors.AfterDeserialization) == 0 && + len(opts.Interceptors.AfterAttempt) == 0 && len(opts.Interceptors.AfterExecution) == 0 { + return nil + } -func addSpanBuildRequestEnd(stack *middleware.Stack) error { - return stack.Build.Add(&spanBuildRequestEnd{}, middleware.After) + return errors.Join( + stack.Initialize.Add(&smithyhttp.InterceptExecution{ + BeforeExecution: opts.Interceptors.BeforeExecution, + AfterExecution: opts.Interceptors.AfterExecution, + }, middleware.Before), + stack.Serialize.Insert(&smithyhttp.InterceptBeforeSerialization{ + Interceptors: opts.Interceptors.BeforeSerialization, + }, "OperationSerializer", middleware.Before), + stack.Serialize.Insert(&smithyhttp.InterceptAfterSerialization{ + Interceptors: opts.Interceptors.AfterSerialization, + }, "OperationSerializer", middleware.After), + stack.Finalize.Insert(&smithyhttp.InterceptBeforeSigning{ + Interceptors: opts.Interceptors.BeforeSigning, + }, "Signing", middleware.Before), + stack.Finalize.Insert(&smithyhttp.InterceptAfterSigning{ + Interceptors: opts.Interceptors.AfterSigning, + }, "Signing", middleware.After), + stack.Deserialize.Add(&smithyhttp.InterceptTransmit{ + BeforeTransmit: opts.Interceptors.BeforeTransmit, + AfterTransmit: opts.Interceptors.AfterTransmit, + }, middleware.After), + stack.Deserialize.Insert(&smithyhttp.InterceptBeforeDeserialization{ + Interceptors: opts.Interceptors.BeforeDeserialization, + }, "OperationDeserializer", middleware.After), // (deserialize stack is called in reverse) + stack.Deserialize.Insert(&smithyhttp.InterceptAfterDeserialization{ + Interceptors: opts.Interceptors.AfterDeserialization, + }, "OperationDeserializer", middleware.Before), + ) } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_AddPermission.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_AddPermission.go index 8f56315e3c5..3af11a2bcf1 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_AddPermission.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_AddPermission.go @@ -161,40 +161,7 @@ func (c *Client) addOperationAddPermissionMiddlewares(stack *middleware.Stack, o if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_CheckIfPhoneNumberIsOptedOut.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_CheckIfPhoneNumberIsOptedOut.go index cb453b61ed6..0ca9af9993b 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_CheckIfPhoneNumberIsOptedOut.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_CheckIfPhoneNumberIsOptedOut.go @@ -154,40 +154,7 @@ func (c *Client) addOperationCheckIfPhoneNumberIsOptedOutMiddlewares(stack *midd if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ConfirmSubscription.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ConfirmSubscription.go index 624717fa4f6..1b5aa5270e5 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ConfirmSubscription.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ConfirmSubscription.go @@ -158,40 +158,7 @@ func (c *Client) addOperationConfirmSubscriptionMiddlewares(stack *middleware.St if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_CreatePlatformApplication.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_CreatePlatformApplication.go index bbc9d224f32..f0777b18a50 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_CreatePlatformApplication.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_CreatePlatformApplication.go @@ -196,40 +196,7 @@ func (c *Client) addOperationCreatePlatformApplicationMiddlewares(stack *middlew if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_CreatePlatformEndpoint.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_CreatePlatformEndpoint.go index c8a05096496..7b7d2556746 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_CreatePlatformEndpoint.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_CreatePlatformEndpoint.go @@ -176,40 +176,7 @@ func (c *Client) addOperationCreatePlatformEndpointMiddlewares(stack *middleware if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_CreateSMSSandboxPhoneNumber.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_CreateSMSSandboxPhoneNumber.go index 73f025405e4..fb522d15ba5 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_CreateSMSSandboxPhoneNumber.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_CreateSMSSandboxPhoneNumber.go @@ -155,40 +155,7 @@ func (c *Client) addOperationCreateSMSSandboxPhoneNumberMiddlewares(stack *middl if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_CreateTopic.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_CreateTopic.go index 8acc8f4779d..b11e9a03b93 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_CreateTopic.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_CreateTopic.go @@ -311,40 +311,7 @@ func (c *Client) addOperationCreateTopicMiddlewares(stack *middleware.Stack, opt if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_DeleteEndpoint.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_DeleteEndpoint.go index 44e233ca70b..9f3486a8384 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_DeleteEndpoint.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_DeleteEndpoint.go @@ -144,40 +144,7 @@ func (c *Client) addOperationDeleteEndpointMiddlewares(stack *middleware.Stack, if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_DeletePlatformApplication.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_DeletePlatformApplication.go index e1f674da49c..1e8981e0362 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_DeletePlatformApplication.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_DeletePlatformApplication.go @@ -142,40 +142,7 @@ func (c *Client) addOperationDeletePlatformApplicationMiddlewares(stack *middlew if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_DeleteSMSSandboxPhoneNumber.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_DeleteSMSSandboxPhoneNumber.go index b29e6831199..ee7afccdc33 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_DeleteSMSSandboxPhoneNumber.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_DeleteSMSSandboxPhoneNumber.go @@ -149,40 +149,7 @@ func (c *Client) addOperationDeleteSMSSandboxPhoneNumberMiddlewares(stack *middl if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_DeleteTopic.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_DeleteTopic.go index de35c46b971..8fcad63ce29 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_DeleteTopic.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_DeleteTopic.go @@ -140,40 +140,7 @@ func (c *Client) addOperationDeleteTopicMiddlewares(stack *middleware.Stack, opt if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetDataProtectionPolicy.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetDataProtectionPolicy.go index c9ddf07b0f1..2a583d4f415 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetDataProtectionPolicy.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetDataProtectionPolicy.go @@ -147,40 +147,7 @@ func (c *Client) addOperationGetDataProtectionPolicyMiddlewares(stack *middlewar if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetEndpointAttributes.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetEndpointAttributes.go index aa7621e3d4d..8840f4824a6 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetEndpointAttributes.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetEndpointAttributes.go @@ -161,40 +161,7 @@ func (c *Client) addOperationGetEndpointAttributesMiddlewares(stack *middleware. if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetPlatformApplicationAttributes.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetPlatformApplicationAttributes.go index ee6d8e4a53c..23f5d70b0e3 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetPlatformApplicationAttributes.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetPlatformApplicationAttributes.go @@ -176,40 +176,7 @@ func (c *Client) addOperationGetPlatformApplicationAttributesMiddlewares(stack * if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetSMSAttributes.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetSMSAttributes.go index 17614d10c88..c8eb79ff9d3 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetSMSAttributes.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetSMSAttributes.go @@ -148,40 +148,7 @@ func (c *Client) addOperationGetSMSAttributesMiddlewares(stack *middleware.Stack if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetSMSSandboxAccountStatus.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetSMSSandboxAccountStatus.go index 6ec1456f901..790f38aff4d 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetSMSSandboxAccountStatus.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetSMSSandboxAccountStatus.go @@ -146,40 +146,7 @@ func (c *Client) addOperationGetSMSSandboxAccountStatusMiddlewares(stack *middle if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetSubscriptionAttributes.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetSubscriptionAttributes.go index 5146c5e369f..25fdb83de64 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetSubscriptionAttributes.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetSubscriptionAttributes.go @@ -202,40 +202,7 @@ func (c *Client) addOperationGetSubscriptionAttributesMiddlewares(stack *middlew if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetTopicAttributes.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetTopicAttributes.go index b960f370cee..afd986294c0 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetTopicAttributes.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_GetTopicAttributes.go @@ -222,40 +222,7 @@ func (c *Client) addOperationGetTopicAttributesMiddlewares(stack *middleware.Sta if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListEndpointsByPlatformApplication.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListEndpointsByPlatformApplication.go index ac4fb3e7102..1b9465b8228 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListEndpointsByPlatformApplication.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListEndpointsByPlatformApplication.go @@ -163,40 +163,7 @@ func (c *Client) addOperationListEndpointsByPlatformApplicationMiddlewares(stack if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListOriginationNumbers.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListOriginationNumbers.go index ba342a4197f..6530993b95f 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListOriginationNumbers.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListOriginationNumbers.go @@ -148,40 +148,7 @@ func (c *Client) addOperationListOriginationNumbersMiddlewares(stack *middleware if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListPhoneNumbersOptedOut.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListPhoneNumbersOptedOut.go index 8f595a836d8..ca7cfcf3637 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListPhoneNumbersOptedOut.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListPhoneNumbersOptedOut.go @@ -152,40 +152,7 @@ func (c *Client) addOperationListPhoneNumbersOptedOutMiddlewares(stack *middlewa if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListPlatformApplications.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListPlatformApplications.go index 29ba29ab334..0c0a27d5852 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListPlatformApplications.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListPlatformApplications.go @@ -155,40 +155,7 @@ func (c *Client) addOperationListPlatformApplicationsMiddlewares(stack *middlewa if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListSMSSandboxPhoneNumbers.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListSMSSandboxPhoneNumbers.go index 85dad44fa30..55a73e1ef6e 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListSMSSandboxPhoneNumbers.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListSMSSandboxPhoneNumbers.go @@ -158,40 +158,7 @@ func (c *Client) addOperationListSMSSandboxPhoneNumbersMiddlewares(stack *middle if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListSubscriptions.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListSubscriptions.go index 510e54b1673..1c8020a3374 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListSubscriptions.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListSubscriptions.go @@ -148,40 +148,7 @@ func (c *Client) addOperationListSubscriptionsMiddlewares(stack *middleware.Stac if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListSubscriptionsByTopic.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListSubscriptionsByTopic.go index e27937e9724..dae01709965 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListSubscriptionsByTopic.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListSubscriptionsByTopic.go @@ -156,40 +156,7 @@ func (c *Client) addOperationListSubscriptionsByTopicMiddlewares(stack *middlewa if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListTagsForResource.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListTagsForResource.go index 7151d245f5b..3191b611dcd 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListTagsForResource.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListTagsForResource.go @@ -145,40 +145,7 @@ func (c *Client) addOperationListTagsForResourceMiddlewares(stack *middleware.St if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListTopics.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListTopics.go index 186766ed322..ad773d354b6 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListTopics.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_ListTopics.go @@ -146,40 +146,7 @@ func (c *Client) addOperationListTopicsMiddlewares(stack *middleware.Stack, opti if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_OptInPhoneNumber.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_OptInPhoneNumber.go index fd156ec9846..a236f412aa9 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_OptInPhoneNumber.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_OptInPhoneNumber.go @@ -142,40 +142,7 @@ func (c *Client) addOperationOptInPhoneNumberMiddlewares(stack *middleware.Stack if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_Publish.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_Publish.go index 057177ed041..8c9f05c554e 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_Publish.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_Publish.go @@ -323,40 +323,7 @@ func (c *Client) addOperationPublishMiddlewares(stack *middleware.Stack, options if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_PublishBatch.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_PublishBatch.go index a1161870e9b..5f0b52a0202 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_PublishBatch.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_PublishBatch.go @@ -185,40 +185,7 @@ func (c *Client) addOperationPublishBatchMiddlewares(stack *middleware.Stack, op if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_PutDataProtectionPolicy.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_PutDataProtectionPolicy.go index 13a220a2602..6c284f7b166 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_PutDataProtectionPolicy.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_PutDataProtectionPolicy.go @@ -152,40 +152,7 @@ func (c *Client) addOperationPutDataProtectionPolicyMiddlewares(stack *middlewar if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_RemovePermission.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_RemovePermission.go index f98c7d4ae27..60bd92f008b 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_RemovePermission.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_RemovePermission.go @@ -147,40 +147,7 @@ func (c *Client) addOperationRemovePermissionMiddlewares(stack *middleware.Stack if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_SetEndpointAttributes.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_SetEndpointAttributes.go index 12ea9702418..f958803318a 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_SetEndpointAttributes.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_SetEndpointAttributes.go @@ -159,40 +159,7 @@ func (c *Client) addOperationSetEndpointAttributesMiddlewares(stack *middleware. if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_SetPlatformApplicationAttributes.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_SetPlatformApplicationAttributes.go index 5e85c2770e0..52d7413a472 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_SetPlatformApplicationAttributes.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_SetPlatformApplicationAttributes.go @@ -212,40 +212,7 @@ func (c *Client) addOperationSetPlatformApplicationAttributesMiddlewares(stack * if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_SetSMSAttributes.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_SetSMSAttributes.go index 10d53cee9ae..f6c360c7b80 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_SetSMSAttributes.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_SetSMSAttributes.go @@ -223,40 +223,7 @@ func (c *Client) addOperationSetSMSAttributesMiddlewares(stack *middleware.Stack if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_SetSubscriptionAttributes.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_SetSubscriptionAttributes.go index f72cb8e4bd9..a47c2da9f4a 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_SetSubscriptionAttributes.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_SetSubscriptionAttributes.go @@ -191,40 +191,7 @@ func (c *Client) addOperationSetSubscriptionAttributesMiddlewares(stack *middlew if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_SetTopicAttributes.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_SetTopicAttributes.go index 093ba2ba5ba..c587b90d0ac 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_SetTopicAttributes.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_SetTopicAttributes.go @@ -292,40 +292,7 @@ func (c *Client) addOperationSetTopicAttributesMiddlewares(stack *middleware.Sta if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_Subscribe.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_Subscribe.go index 75c05fa600c..8c570404d12 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_Subscribe.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_Subscribe.go @@ -285,40 +285,7 @@ func (c *Client) addOperationSubscribeMiddlewares(stack *middleware.Stack, optio if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_TagResource.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_TagResource.go index 448babeeb59..f43c50d4f62 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_TagResource.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_TagResource.go @@ -164,40 +164,7 @@ func (c *Client) addOperationTagResourceMiddlewares(stack *middleware.Stack, opt if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_Unsubscribe.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_Unsubscribe.go index eeab207b484..70bf1b41718 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_Unsubscribe.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_Unsubscribe.go @@ -146,40 +146,7 @@ func (c *Client) addOperationUnsubscribeMiddlewares(stack *middleware.Stack, opt if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_UntagResource.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_UntagResource.go index 244a3c42c14..516e7775fdf 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_UntagResource.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_UntagResource.go @@ -145,40 +145,7 @@ func (c *Client) addOperationUntagResourceMiddlewares(stack *middleware.Stack, o if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_VerifySMSSandboxPhoneNumber.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_VerifySMSSandboxPhoneNumber.go index a3853d8865a..143aefcfa31 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_VerifySMSSandboxPhoneNumber.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/api_op_VerifySMSSandboxPhoneNumber.go @@ -156,40 +156,7 @@ func (c *Client) addOperationVerifySMSSandboxPhoneNumberMiddlewares(stack *middl if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/auth.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/auth.go index 96fb2b5d907..9f11cc500bc 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/auth.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/auth.go @@ -16,8 +16,9 @@ import ( "strings" ) -func bindAuthParamsRegion(_ interface{}, params *AuthResolverParameters, _ interface{}, options Options) { +func bindAuthParamsRegion(_ interface{}, params *AuthResolverParameters, _ interface{}, options Options) error { params.Region = options.Region + return nil } type setLegacyContextSigningOptionsMiddleware struct { @@ -94,14 +95,16 @@ type AuthResolverParameters struct { Region string } -func bindAuthResolverParams(ctx context.Context, operation string, input interface{}, options Options) *AuthResolverParameters { +func bindAuthResolverParams(ctx context.Context, operation string, input interface{}, options Options) (*AuthResolverParameters, error) { params := &AuthResolverParameters{ Operation: operation, } - bindAuthParamsRegion(ctx, params, input, options) + if err := bindAuthParamsRegion(ctx, params, input, options); err != nil { + return nil, err + } - return params + return params, nil } // AuthSchemeResolver returns a set of possible authentication options for an @@ -152,7 +155,10 @@ func (m *resolveAuthSchemeMiddleware) HandleFinalize(ctx context.Context, in mid _, span := tracing.StartSpan(ctx, "ResolveAuthScheme") defer span.End() - params := bindAuthResolverParams(ctx, m.operation, getOperationInput(ctx), m.options) + params, err := bindAuthResolverParams(ctx, m.operation, getOperationInput(ctx), m.options) + if err != nil { + return out, metadata, fmt.Errorf("bind auth scheme params: %w", err) + } options, err := m.options.AuthSchemeResolver.ResolveAuthSchemes(ctx, params) if err != nil { return out, metadata, fmt.Errorf("resolve auth scheme: %w", err) diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/endpoints.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/endpoints.go index cb77c86bb0a..c2af00fcc64 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/endpoints.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/endpoints.go @@ -14,6 +14,7 @@ import ( internalendpoints "github.com/aws/aws-sdk-go-v2/service/sns/internal/endpoints" smithyauth "github.com/aws/smithy-go/auth" smithyendpoints "github.com/aws/smithy-go/endpoints" + "github.com/aws/smithy-go/endpoints/private/rulesfn" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" "github.com/aws/smithy-go/tracing" @@ -217,11 +218,15 @@ func resolveBaseEndpoint(cfg aws.Config, o *Options) { } } -func bindRegion(region string) *string { +func bindRegion(region string) (*string, error) { if region == "" { - return nil + return nil, nil + } + if !rulesfn.IsValidHostLabel(region, true) { + return nil, fmt.Errorf("invalid input region %s", region) } - return aws.String(endpoints.MapFIPSRegion(region)) + + return aws.String(endpoints.MapFIPSRegion(region)), nil } // EndpointParameters provides the parameters that influence how endpoints are @@ -486,10 +491,15 @@ type endpointParamsBinder interface { bindEndpointParams(*EndpointParameters) } -func bindEndpointParams(ctx context.Context, input interface{}, options Options) *EndpointParameters { +func bindEndpointParams(ctx context.Context, input interface{}, options Options) (*EndpointParameters, error) { params := &EndpointParameters{} - params.Region = bindRegion(options.Region) + region, err := bindRegion(options.Region) + if err != nil { + return nil, err + } + params.Region = region + params.UseDualStack = aws.Bool(options.EndpointOptions.UseDualStackEndpoint == aws.DualStackEndpointStateEnabled) params.UseFIPS = aws.Bool(options.EndpointOptions.UseFIPSEndpoint == aws.FIPSEndpointStateEnabled) params.Endpoint = options.BaseEndpoint @@ -498,7 +508,7 @@ func bindEndpointParams(ctx context.Context, input interface{}, options Options) b.bindEndpointParams(params) } - return params + return params, nil } type resolveEndpointV2Middleware struct { @@ -528,7 +538,10 @@ func (m *resolveEndpointV2Middleware) HandleFinalize(ctx context.Context, in mid return out, metadata, fmt.Errorf("expected endpoint resolver to not be nil") } - params := bindEndpointParams(ctx, getOperationInput(ctx), m.options) + params, err := bindEndpointParams(ctx, getOperationInput(ctx), m.options) + if err != nil { + return out, metadata, fmt.Errorf("failed to bind endpoint params, %w", err) + } endpt, err := timeOperationMetric(ctx, "client.call.resolve_endpoint_duration", func() (smithyendpoints.Endpoint, error) { return m.options.EndpointResolverV2.ResolveEndpoint(ctx, *params) diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/generated.json b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/generated.json index a0241a2bdd1..67480e420ef 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/generated.json +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/generated.json @@ -69,7 +69,7 @@ "types/types.go", "validators.go" ], - "go": "1.22", + "go": "1.23", "module": "github.com/aws/aws-sdk-go-v2/service/sns", "unstable": false } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/go_module_metadata.go index b41ab418df8..5082ab4a594 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/go_module_metadata.go @@ -3,4 +3,4 @@ package sns // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.38.5" +const goModuleVersion = "1.39.8" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/internal/endpoints/endpoints.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/internal/endpoints/endpoints.go index ce64599aa68..76361706c8d 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/internal/endpoints/endpoints.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/internal/endpoints/endpoints.go @@ -570,6 +570,13 @@ var defaultPartitions = endpoints.Partitions{ { ID: "aws-eusc", Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ + { + Variant: endpoints.DualStackVariant, + }: { + Hostname: "sns.{region}.api.amazonwebservices.eu", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, { Variant: endpoints.FIPSVariant, }: { @@ -577,6 +584,13 @@ var defaultPartitions = endpoints.Partitions{ Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, + { + Variant: endpoints.FIPSVariant | endpoints.DualStackVariant, + }: { + Hostname: "sns-fips.{region}.api.amazonwebservices.eu", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, { Variant: 0, }: { @@ -643,6 +657,9 @@ var defaultPartitions = endpoints.Partitions{ endpoints.EndpointKey{ Region: "us-isob-east-1", }: endpoints.Endpoint{}, + endpoints.EndpointKey{ + Region: "us-isob-west-1", + }: endpoints.Endpoint{}, }, }, { diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md index 4cb0c9100b3..f108ccc8c42 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md @@ -1,3 +1,26 @@ +# v1.30.6 (2025-12-02) + +* **Dependency Update**: Updated to the latest SDK module versions +* **Dependency Update**: Upgrade to smithy-go v1.24.0. Notably this version of the library reduces the allocation footprint of the middleware system. We observe a ~10% reduction in allocations per SDK call with this change. + +# v1.30.5 (2025-11-25) + +* **Bug Fix**: Add error check for endpoint param binding during auth scheme resolution to fix panic reported in #3234 + +# v1.30.4 (2025-11-19.2) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.30.3 (2025-11-12) + +* **Bug Fix**: Further reduce allocation overhead when the metrics system isn't in-use. +* **Bug Fix**: Reduce allocation overhead when the client doesn't have any HTTP interceptors configured. +* **Bug Fix**: Remove blank trace spans towards the beginning of the request that added no additional information. This conveys a slight reduction in overall allocations. + +# v1.30.2 (2025-11-11) + +* **Bug Fix**: Return validation error if input region is not a valid host label. + # v1.30.1 (2025-11-04) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_client.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_client.go index 2c498e4689a..8e5a2e77f87 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_client.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_client.go @@ -65,7 +65,12 @@ func timeOperationMetric[T any]( ctx context.Context, metric string, fn func() (T, error), opts ...metrics.RecordMetricOption, ) (T, error) { - instr := getOperationMetrics(ctx).histogramFor(metric) + mm := getOperationMetrics(ctx) + if mm == nil { // not using the metrics system + return fn() + } + + instr := mm.histogramFor(metric) opts = append([]metrics.RecordMetricOption{withOperationMetadata(ctx)}, opts...) start := time.Now() @@ -78,7 +83,12 @@ func timeOperationMetric[T any]( } func startMetricTimer(ctx context.Context, metric string, opts ...metrics.RecordMetricOption) func() { - instr := getOperationMetrics(ctx).histogramFor(metric) + mm := getOperationMetrics(ctx) + if mm == nil { // not using the metrics system + return func() {} + } + + instr := mm.histogramFor(metric) opts = append([]metrics.RecordMetricOption{withOperationMetadata(ctx)}, opts...) var ended bool @@ -106,6 +116,12 @@ func withOperationMetadata(ctx context.Context) metrics.RecordMetricOption { type operationMetricsKey struct{} func withOperationMetrics(parent context.Context, mp metrics.MeterProvider) (context.Context, error) { + if _, ok := mp.(metrics.NopMeterProvider); ok { + // not using the metrics system - setting up the metrics context is a memory-intensive operation + // so we should skip it in this case + return parent, nil + } + meter := mp.Meter("github.com/aws/aws-sdk-go-v2/service/sso") om := &operationMetrics{} @@ -153,7 +169,10 @@ func operationMetricTimer(m metrics.Meter, name, desc string) (metrics.Float64Hi } func getOperationMetrics(ctx context.Context) *operationMetrics { - return ctx.Value(operationMetricsKey{}).(*operationMetrics) + if v := ctx.Value(operationMetricsKey{}); v != nil { + return v.(*operationMetrics) + } + return nil } func operationTracer(p tracing.TracerProvider) tracing.Tracer { @@ -882,138 +901,49 @@ func addInterceptAttempt(stack *middleware.Stack, opts Options) error { }, "Retry", middleware.After) } -func addInterceptExecution(stack *middleware.Stack, opts Options) error { - return stack.Initialize.Add(&smithyhttp.InterceptExecution{ - BeforeExecution: opts.Interceptors.BeforeExecution, - AfterExecution: opts.Interceptors.AfterExecution, - }, middleware.Before) -} - -func addInterceptBeforeSerialization(stack *middleware.Stack, opts Options) error { - return stack.Serialize.Insert(&smithyhttp.InterceptBeforeSerialization{ - Interceptors: opts.Interceptors.BeforeSerialization, - }, "OperationSerializer", middleware.Before) -} - -func addInterceptAfterSerialization(stack *middleware.Stack, opts Options) error { - return stack.Serialize.Insert(&smithyhttp.InterceptAfterSerialization{ - Interceptors: opts.Interceptors.AfterSerialization, - }, "OperationSerializer", middleware.After) -} - -func addInterceptBeforeSigning(stack *middleware.Stack, opts Options) error { - return stack.Finalize.Insert(&smithyhttp.InterceptBeforeSigning{ - Interceptors: opts.Interceptors.BeforeSigning, - }, "Signing", middleware.Before) -} - -func addInterceptAfterSigning(stack *middleware.Stack, opts Options) error { - return stack.Finalize.Insert(&smithyhttp.InterceptAfterSigning{ - Interceptors: opts.Interceptors.AfterSigning, - }, "Signing", middleware.After) -} - -func addInterceptTransmit(stack *middleware.Stack, opts Options) error { - return stack.Deserialize.Add(&smithyhttp.InterceptTransmit{ - BeforeTransmit: opts.Interceptors.BeforeTransmit, - AfterTransmit: opts.Interceptors.AfterTransmit, - }, middleware.After) -} - -func addInterceptBeforeDeserialization(stack *middleware.Stack, opts Options) error { - return stack.Deserialize.Insert(&smithyhttp.InterceptBeforeDeserialization{ - Interceptors: opts.Interceptors.BeforeDeserialization, - }, "OperationDeserializer", middleware.After) // (deserialize stack is called in reverse) -} - -func addInterceptAfterDeserialization(stack *middleware.Stack, opts Options) error { - return stack.Deserialize.Insert(&smithyhttp.InterceptAfterDeserialization{ - Interceptors: opts.Interceptors.AfterDeserialization, - }, "OperationDeserializer", middleware.Before) -} - -type spanInitializeStart struct { -} - -func (*spanInitializeStart) ID() string { - return "spanInitializeStart" -} - -func (m *spanInitializeStart) HandleInitialize( - ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler, -) ( - middleware.InitializeOutput, middleware.Metadata, error, -) { - ctx, _ = tracing.StartSpan(ctx, "Initialize") - - return next.HandleInitialize(ctx, in) -} - -type spanInitializeEnd struct { -} - -func (*spanInitializeEnd) ID() string { - return "spanInitializeEnd" -} - -func (m *spanInitializeEnd) HandleInitialize( - ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler, -) ( - middleware.InitializeOutput, middleware.Metadata, error, -) { - ctx, span := tracing.PopSpan(ctx) - span.End() - - return next.HandleInitialize(ctx, in) -} - -type spanBuildRequestStart struct { -} - -func (*spanBuildRequestStart) ID() string { - return "spanBuildRequestStart" -} - -func (m *spanBuildRequestStart) HandleSerialize( - ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler, -) ( - middleware.SerializeOutput, middleware.Metadata, error, -) { - ctx, _ = tracing.StartSpan(ctx, "BuildRequest") - - return next.HandleSerialize(ctx, in) -} - -type spanBuildRequestEnd struct { -} - -func (*spanBuildRequestEnd) ID() string { - return "spanBuildRequestEnd" -} - -func (m *spanBuildRequestEnd) HandleBuild( - ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler, -) ( - middleware.BuildOutput, middleware.Metadata, error, -) { - ctx, span := tracing.PopSpan(ctx) - span.End() - - return next.HandleBuild(ctx, in) -} - -func addSpanInitializeStart(stack *middleware.Stack) error { - return stack.Initialize.Add(&spanInitializeStart{}, middleware.Before) -} - -func addSpanInitializeEnd(stack *middleware.Stack) error { - return stack.Initialize.Add(&spanInitializeEnd{}, middleware.After) -} - -func addSpanBuildRequestStart(stack *middleware.Stack) error { - return stack.Serialize.Add(&spanBuildRequestStart{}, middleware.Before) -} +func addInterceptors(stack *middleware.Stack, opts Options) error { + // middlewares are expensive, don't add all of these interceptor ones unless the caller + // actually has at least one interceptor configured + // + // at the moment it's all-or-nothing because some of the middlewares here are responsible for + // setting fields in the interceptor context for future ones + if len(opts.Interceptors.BeforeExecution) == 0 && + len(opts.Interceptors.BeforeSerialization) == 0 && len(opts.Interceptors.AfterSerialization) == 0 && + len(opts.Interceptors.BeforeRetryLoop) == 0 && + len(opts.Interceptors.BeforeAttempt) == 0 && + len(opts.Interceptors.BeforeSigning) == 0 && len(opts.Interceptors.AfterSigning) == 0 && + len(opts.Interceptors.BeforeTransmit) == 0 && len(opts.Interceptors.AfterTransmit) == 0 && + len(opts.Interceptors.BeforeDeserialization) == 0 && len(opts.Interceptors.AfterDeserialization) == 0 && + len(opts.Interceptors.AfterAttempt) == 0 && len(opts.Interceptors.AfterExecution) == 0 { + return nil + } -func addSpanBuildRequestEnd(stack *middleware.Stack) error { - return stack.Build.Add(&spanBuildRequestEnd{}, middleware.After) + return errors.Join( + stack.Initialize.Add(&smithyhttp.InterceptExecution{ + BeforeExecution: opts.Interceptors.BeforeExecution, + AfterExecution: opts.Interceptors.AfterExecution, + }, middleware.Before), + stack.Serialize.Insert(&smithyhttp.InterceptBeforeSerialization{ + Interceptors: opts.Interceptors.BeforeSerialization, + }, "OperationSerializer", middleware.Before), + stack.Serialize.Insert(&smithyhttp.InterceptAfterSerialization{ + Interceptors: opts.Interceptors.AfterSerialization, + }, "OperationSerializer", middleware.After), + stack.Finalize.Insert(&smithyhttp.InterceptBeforeSigning{ + Interceptors: opts.Interceptors.BeforeSigning, + }, "Signing", middleware.Before), + stack.Finalize.Insert(&smithyhttp.InterceptAfterSigning{ + Interceptors: opts.Interceptors.AfterSigning, + }, "Signing", middleware.After), + stack.Deserialize.Add(&smithyhttp.InterceptTransmit{ + BeforeTransmit: opts.Interceptors.BeforeTransmit, + AfterTransmit: opts.Interceptors.AfterTransmit, + }, middleware.After), + stack.Deserialize.Insert(&smithyhttp.InterceptBeforeDeserialization{ + Interceptors: opts.Interceptors.BeforeDeserialization, + }, "OperationDeserializer", middleware.After), // (deserialize stack is called in reverse) + stack.Deserialize.Insert(&smithyhttp.InterceptAfterDeserialization{ + Interceptors: opts.Interceptors.AfterDeserialization, + }, "OperationDeserializer", middleware.Before), + ) } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_GetRoleCredentials.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_GetRoleCredentials.go index df5dc1674f3..c0b961fcf18 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_GetRoleCredentials.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_GetRoleCredentials.go @@ -153,40 +153,7 @@ func (c *Client) addOperationGetRoleCredentialsMiddlewares(stack *middleware.Sta if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccountRoles.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccountRoles.go index 2a3b2ad9021..f5ca09ac7d8 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccountRoles.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccountRoles.go @@ -158,40 +158,7 @@ func (c *Client) addOperationListAccountRolesMiddlewares(stack *middleware.Stack if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccounts.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccounts.go index f6114a7c105..54511d34a6e 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccounts.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_ListAccounts.go @@ -157,40 +157,7 @@ func (c *Client) addOperationListAccountsMiddlewares(stack *middleware.Stack, op if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_Logout.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_Logout.go index 2c7f181c344..a21116e96c1 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_Logout.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/api_op_Logout.go @@ -152,40 +152,7 @@ func (c *Client) addOperationLogoutMiddlewares(stack *middleware.Stack, options if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/auth.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/auth.go index 708e53c5ad5..c658615fdec 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/auth.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/auth.go @@ -16,8 +16,9 @@ import ( "strings" ) -func bindAuthParamsRegion(_ interface{}, params *AuthResolverParameters, _ interface{}, options Options) { +func bindAuthParamsRegion(_ interface{}, params *AuthResolverParameters, _ interface{}, options Options) error { params.Region = options.Region + return nil } type setLegacyContextSigningOptionsMiddleware struct { @@ -94,14 +95,16 @@ type AuthResolverParameters struct { Region string } -func bindAuthResolverParams(ctx context.Context, operation string, input interface{}, options Options) *AuthResolverParameters { +func bindAuthResolverParams(ctx context.Context, operation string, input interface{}, options Options) (*AuthResolverParameters, error) { params := &AuthResolverParameters{ Operation: operation, } - bindAuthParamsRegion(ctx, params, input, options) + if err := bindAuthParamsRegion(ctx, params, input, options); err != nil { + return nil, err + } - return params + return params, nil } // AuthSchemeResolver returns a set of possible authentication options for an @@ -176,7 +179,10 @@ func (m *resolveAuthSchemeMiddleware) HandleFinalize(ctx context.Context, in mid _, span := tracing.StartSpan(ctx, "ResolveAuthScheme") defer span.End() - params := bindAuthResolverParams(ctx, m.operation, getOperationInput(ctx), m.options) + params, err := bindAuthResolverParams(ctx, m.operation, getOperationInput(ctx), m.options) + if err != nil { + return out, metadata, fmt.Errorf("bind auth scheme params: %w", err) + } options, err := m.options.AuthSchemeResolver.ResolveAuthSchemes(ctx, params) if err != nil { return out, metadata, fmt.Errorf("resolve auth scheme: %w", err) diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/endpoints.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/endpoints.go index 2b22ab779c2..551f05974e8 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/endpoints.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/endpoints.go @@ -14,6 +14,7 @@ import ( internalendpoints "github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints" smithyauth "github.com/aws/smithy-go/auth" smithyendpoints "github.com/aws/smithy-go/endpoints" + "github.com/aws/smithy-go/endpoints/private/rulesfn" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" "github.com/aws/smithy-go/tracing" @@ -217,11 +218,15 @@ func resolveBaseEndpoint(cfg aws.Config, o *Options) { } } -func bindRegion(region string) *string { +func bindRegion(region string) (*string, error) { if region == "" { - return nil + return nil, nil + } + if !rulesfn.IsValidHostLabel(region, true) { + return nil, fmt.Errorf("invalid input region %s", region) } - return aws.String(endpoints.MapFIPSRegion(region)) + + return aws.String(endpoints.MapFIPSRegion(region)), nil } // EndpointParameters provides the parameters that influence how endpoints are @@ -479,10 +484,15 @@ type endpointParamsBinder interface { bindEndpointParams(*EndpointParameters) } -func bindEndpointParams(ctx context.Context, input interface{}, options Options) *EndpointParameters { +func bindEndpointParams(ctx context.Context, input interface{}, options Options) (*EndpointParameters, error) { params := &EndpointParameters{} - params.Region = bindRegion(options.Region) + region, err := bindRegion(options.Region) + if err != nil { + return nil, err + } + params.Region = region + params.UseDualStack = aws.Bool(options.EndpointOptions.UseDualStackEndpoint == aws.DualStackEndpointStateEnabled) params.UseFIPS = aws.Bool(options.EndpointOptions.UseFIPSEndpoint == aws.FIPSEndpointStateEnabled) params.Endpoint = options.BaseEndpoint @@ -491,7 +501,7 @@ func bindEndpointParams(ctx context.Context, input interface{}, options Options) b.bindEndpointParams(params) } - return params + return params, nil } type resolveEndpointV2Middleware struct { @@ -521,7 +531,10 @@ func (m *resolveEndpointV2Middleware) HandleFinalize(ctx context.Context, in mid return out, metadata, fmt.Errorf("expected endpoint resolver to not be nil") } - params := bindEndpointParams(ctx, getOperationInput(ctx), m.options) + params, err := bindEndpointParams(ctx, getOperationInput(ctx), m.options) + if err != nil { + return out, metadata, fmt.Errorf("failed to bind endpoint params, %w", err) + } endpt, err := timeOperationMetric(ctx, "client.call.resolve_endpoint_duration", func() (smithyendpoints.Endpoint, error) { return m.options.EndpointResolverV2.ResolveEndpoint(ctx, *params) diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go index c84f88075c5..747cb9e8221 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go @@ -3,4 +3,4 @@ package sso // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.30.1" +const goModuleVersion = "1.30.6" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go index 8bb8730be07..bbac359645d 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go @@ -445,6 +445,13 @@ var defaultPartitions = endpoints.Partitions{ { ID: "aws-eusc", Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ + { + Variant: endpoints.DualStackVariant, + }: { + Hostname: "portal.sso.{region}.api.amazonwebservices.eu", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, { Variant: endpoints.FIPSVariant, }: { @@ -452,6 +459,13 @@ var defaultPartitions = endpoints.Partitions{ Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, + { + Variant: endpoints.FIPSVariant | endpoints.DualStackVariant, + }: { + Hostname: "portal.sso-fips.{region}.api.amazonwebservices.eu", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, { Variant: 0, }: { diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md index ac8f4c476e5..e70dd5ea76a 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md @@ -1,3 +1,30 @@ +# v1.35.11 (2025-12-02) + +* **Dependency Update**: Updated to the latest SDK module versions +* **Dependency Update**: Upgrade to smithy-go v1.24.0. Notably this version of the library reduces the allocation footprint of the middleware system. We observe a ~10% reduction in allocations per SDK call with this change. + +# v1.35.10 (2025-11-25) + +* **Bug Fix**: Add error check for endpoint param binding during auth scheme resolution to fix panic reported in #3234 + +# v1.35.9 (2025-11-21) + +* No change notes available for this release. + +# v1.35.8 (2025-11-19.2) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.35.7 (2025-11-12) + +* **Bug Fix**: Further reduce allocation overhead when the metrics system isn't in-use. +* **Bug Fix**: Reduce allocation overhead when the client doesn't have any HTTP interceptors configured. +* **Bug Fix**: Remove blank trace spans towards the beginning of the request that added no additional information. This conveys a slight reduction in overall allocations. + +# v1.35.6 (2025-11-11) + +* **Bug Fix**: Return validation error if input region is not a valid host label. + # v1.35.5 (2025-11-04) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_client.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_client.go index 12ad2f5d9d5..8e8508fa349 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_client.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_client.go @@ -65,7 +65,12 @@ func timeOperationMetric[T any]( ctx context.Context, metric string, fn func() (T, error), opts ...metrics.RecordMetricOption, ) (T, error) { - instr := getOperationMetrics(ctx).histogramFor(metric) + mm := getOperationMetrics(ctx) + if mm == nil { // not using the metrics system + return fn() + } + + instr := mm.histogramFor(metric) opts = append([]metrics.RecordMetricOption{withOperationMetadata(ctx)}, opts...) start := time.Now() @@ -78,7 +83,12 @@ func timeOperationMetric[T any]( } func startMetricTimer(ctx context.Context, metric string, opts ...metrics.RecordMetricOption) func() { - instr := getOperationMetrics(ctx).histogramFor(metric) + mm := getOperationMetrics(ctx) + if mm == nil { // not using the metrics system + return func() {} + } + + instr := mm.histogramFor(metric) opts = append([]metrics.RecordMetricOption{withOperationMetadata(ctx)}, opts...) var ended bool @@ -106,6 +116,12 @@ func withOperationMetadata(ctx context.Context) metrics.RecordMetricOption { type operationMetricsKey struct{} func withOperationMetrics(parent context.Context, mp metrics.MeterProvider) (context.Context, error) { + if _, ok := mp.(metrics.NopMeterProvider); ok { + // not using the metrics system - setting up the metrics context is a memory-intensive operation + // so we should skip it in this case + return parent, nil + } + meter := mp.Meter("github.com/aws/aws-sdk-go-v2/service/ssooidc") om := &operationMetrics{} @@ -153,7 +169,10 @@ func operationMetricTimer(m metrics.Meter, name, desc string) (metrics.Float64Hi } func getOperationMetrics(ctx context.Context) *operationMetrics { - return ctx.Value(operationMetricsKey{}).(*operationMetrics) + if v := ctx.Value(operationMetricsKey{}); v != nil { + return v.(*operationMetrics) + } + return nil } func operationTracer(p tracing.TracerProvider) tracing.Tracer { @@ -882,138 +901,49 @@ func addInterceptAttempt(stack *middleware.Stack, opts Options) error { }, "Retry", middleware.After) } -func addInterceptExecution(stack *middleware.Stack, opts Options) error { - return stack.Initialize.Add(&smithyhttp.InterceptExecution{ - BeforeExecution: opts.Interceptors.BeforeExecution, - AfterExecution: opts.Interceptors.AfterExecution, - }, middleware.Before) -} - -func addInterceptBeforeSerialization(stack *middleware.Stack, opts Options) error { - return stack.Serialize.Insert(&smithyhttp.InterceptBeforeSerialization{ - Interceptors: opts.Interceptors.BeforeSerialization, - }, "OperationSerializer", middleware.Before) -} - -func addInterceptAfterSerialization(stack *middleware.Stack, opts Options) error { - return stack.Serialize.Insert(&smithyhttp.InterceptAfterSerialization{ - Interceptors: opts.Interceptors.AfterSerialization, - }, "OperationSerializer", middleware.After) -} - -func addInterceptBeforeSigning(stack *middleware.Stack, opts Options) error { - return stack.Finalize.Insert(&smithyhttp.InterceptBeforeSigning{ - Interceptors: opts.Interceptors.BeforeSigning, - }, "Signing", middleware.Before) -} - -func addInterceptAfterSigning(stack *middleware.Stack, opts Options) error { - return stack.Finalize.Insert(&smithyhttp.InterceptAfterSigning{ - Interceptors: opts.Interceptors.AfterSigning, - }, "Signing", middleware.After) -} - -func addInterceptTransmit(stack *middleware.Stack, opts Options) error { - return stack.Deserialize.Add(&smithyhttp.InterceptTransmit{ - BeforeTransmit: opts.Interceptors.BeforeTransmit, - AfterTransmit: opts.Interceptors.AfterTransmit, - }, middleware.After) -} - -func addInterceptBeforeDeserialization(stack *middleware.Stack, opts Options) error { - return stack.Deserialize.Insert(&smithyhttp.InterceptBeforeDeserialization{ - Interceptors: opts.Interceptors.BeforeDeserialization, - }, "OperationDeserializer", middleware.After) // (deserialize stack is called in reverse) -} - -func addInterceptAfterDeserialization(stack *middleware.Stack, opts Options) error { - return stack.Deserialize.Insert(&smithyhttp.InterceptAfterDeserialization{ - Interceptors: opts.Interceptors.AfterDeserialization, - }, "OperationDeserializer", middleware.Before) -} - -type spanInitializeStart struct { -} - -func (*spanInitializeStart) ID() string { - return "spanInitializeStart" -} - -func (m *spanInitializeStart) HandleInitialize( - ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler, -) ( - middleware.InitializeOutput, middleware.Metadata, error, -) { - ctx, _ = tracing.StartSpan(ctx, "Initialize") - - return next.HandleInitialize(ctx, in) -} - -type spanInitializeEnd struct { -} - -func (*spanInitializeEnd) ID() string { - return "spanInitializeEnd" -} - -func (m *spanInitializeEnd) HandleInitialize( - ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler, -) ( - middleware.InitializeOutput, middleware.Metadata, error, -) { - ctx, span := tracing.PopSpan(ctx) - span.End() - - return next.HandleInitialize(ctx, in) -} - -type spanBuildRequestStart struct { -} - -func (*spanBuildRequestStart) ID() string { - return "spanBuildRequestStart" -} - -func (m *spanBuildRequestStart) HandleSerialize( - ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler, -) ( - middleware.SerializeOutput, middleware.Metadata, error, -) { - ctx, _ = tracing.StartSpan(ctx, "BuildRequest") - - return next.HandleSerialize(ctx, in) -} - -type spanBuildRequestEnd struct { -} - -func (*spanBuildRequestEnd) ID() string { - return "spanBuildRequestEnd" -} - -func (m *spanBuildRequestEnd) HandleBuild( - ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler, -) ( - middleware.BuildOutput, middleware.Metadata, error, -) { - ctx, span := tracing.PopSpan(ctx) - span.End() - - return next.HandleBuild(ctx, in) -} - -func addSpanInitializeStart(stack *middleware.Stack) error { - return stack.Initialize.Add(&spanInitializeStart{}, middleware.Before) -} - -func addSpanInitializeEnd(stack *middleware.Stack) error { - return stack.Initialize.Add(&spanInitializeEnd{}, middleware.After) -} - -func addSpanBuildRequestStart(stack *middleware.Stack) error { - return stack.Serialize.Add(&spanBuildRequestStart{}, middleware.Before) -} +func addInterceptors(stack *middleware.Stack, opts Options) error { + // middlewares are expensive, don't add all of these interceptor ones unless the caller + // actually has at least one interceptor configured + // + // at the moment it's all-or-nothing because some of the middlewares here are responsible for + // setting fields in the interceptor context for future ones + if len(opts.Interceptors.BeforeExecution) == 0 && + len(opts.Interceptors.BeforeSerialization) == 0 && len(opts.Interceptors.AfterSerialization) == 0 && + len(opts.Interceptors.BeforeRetryLoop) == 0 && + len(opts.Interceptors.BeforeAttempt) == 0 && + len(opts.Interceptors.BeforeSigning) == 0 && len(opts.Interceptors.AfterSigning) == 0 && + len(opts.Interceptors.BeforeTransmit) == 0 && len(opts.Interceptors.AfterTransmit) == 0 && + len(opts.Interceptors.BeforeDeserialization) == 0 && len(opts.Interceptors.AfterDeserialization) == 0 && + len(opts.Interceptors.AfterAttempt) == 0 && len(opts.Interceptors.AfterExecution) == 0 { + return nil + } -func addSpanBuildRequestEnd(stack *middleware.Stack) error { - return stack.Build.Add(&spanBuildRequestEnd{}, middleware.After) + return errors.Join( + stack.Initialize.Add(&smithyhttp.InterceptExecution{ + BeforeExecution: opts.Interceptors.BeforeExecution, + AfterExecution: opts.Interceptors.AfterExecution, + }, middleware.Before), + stack.Serialize.Insert(&smithyhttp.InterceptBeforeSerialization{ + Interceptors: opts.Interceptors.BeforeSerialization, + }, "OperationSerializer", middleware.Before), + stack.Serialize.Insert(&smithyhttp.InterceptAfterSerialization{ + Interceptors: opts.Interceptors.AfterSerialization, + }, "OperationSerializer", middleware.After), + stack.Finalize.Insert(&smithyhttp.InterceptBeforeSigning{ + Interceptors: opts.Interceptors.BeforeSigning, + }, "Signing", middleware.Before), + stack.Finalize.Insert(&smithyhttp.InterceptAfterSigning{ + Interceptors: opts.Interceptors.AfterSigning, + }, "Signing", middleware.After), + stack.Deserialize.Add(&smithyhttp.InterceptTransmit{ + BeforeTransmit: opts.Interceptors.BeforeTransmit, + AfterTransmit: opts.Interceptors.AfterTransmit, + }, middleware.After), + stack.Deserialize.Insert(&smithyhttp.InterceptBeforeDeserialization{ + Interceptors: opts.Interceptors.BeforeDeserialization, + }, "OperationDeserializer", middleware.After), // (deserialize stack is called in reverse) + stack.Deserialize.Insert(&smithyhttp.InterceptAfterDeserialization{ + Interceptors: opts.Interceptors.AfterDeserialization, + }, "OperationDeserializer", middleware.Before), + ) } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_CreateToken.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_CreateToken.go index 681eb4087c5..3f622dbcb95 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_CreateToken.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_CreateToken.go @@ -223,40 +223,7 @@ func (c *Client) addOperationCreateTokenMiddlewares(stack *middleware.Stack, opt if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_CreateTokenWithIAM.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_CreateTokenWithIAM.go index d7a27da5953..24cb2fac8db 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_CreateTokenWithIAM.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_CreateTokenWithIAM.go @@ -270,40 +270,7 @@ func (c *Client) addOperationCreateTokenWithIAMMiddlewares(stack *middleware.Sta if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_RegisterClient.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_RegisterClient.go index 8d50092fb15..14472ee3be6 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_RegisterClient.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_RegisterClient.go @@ -194,40 +194,7 @@ func (c *Client) addOperationRegisterClientMiddlewares(stack *middleware.Stack, if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_StartDeviceAuthorization.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_StartDeviceAuthorization.go index 7242ac82b68..92a6854a776 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_StartDeviceAuthorization.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/api_op_StartDeviceAuthorization.go @@ -176,40 +176,7 @@ func (c *Client) addOperationStartDeviceAuthorizationMiddlewares(stack *middlewa if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/auth.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/auth.go index 89b01c629dd..5f253df305e 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/auth.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/auth.go @@ -16,8 +16,9 @@ import ( "strings" ) -func bindAuthParamsRegion(_ interface{}, params *AuthResolverParameters, _ interface{}, options Options) { +func bindAuthParamsRegion(_ interface{}, params *AuthResolverParameters, _ interface{}, options Options) error { params.Region = options.Region + return nil } type setLegacyContextSigningOptionsMiddleware struct { @@ -94,14 +95,16 @@ type AuthResolverParameters struct { Region string } -func bindAuthResolverParams(ctx context.Context, operation string, input interface{}, options Options) *AuthResolverParameters { +func bindAuthResolverParams(ctx context.Context, operation string, input interface{}, options Options) (*AuthResolverParameters, error) { params := &AuthResolverParameters{ Operation: operation, } - bindAuthParamsRegion(ctx, params, input, options) + if err := bindAuthParamsRegion(ctx, params, input, options); err != nil { + return nil, err + } - return params + return params, nil } // AuthSchemeResolver returns a set of possible authentication options for an @@ -170,7 +173,10 @@ func (m *resolveAuthSchemeMiddleware) HandleFinalize(ctx context.Context, in mid _, span := tracing.StartSpan(ctx, "ResolveAuthScheme") defer span.End() - params := bindAuthResolverParams(ctx, m.operation, getOperationInput(ctx), m.options) + params, err := bindAuthResolverParams(ctx, m.operation, getOperationInput(ctx), m.options) + if err != nil { + return out, metadata, fmt.Errorf("bind auth scheme params: %w", err) + } options, err := m.options.AuthSchemeResolver.ResolveAuthSchemes(ctx, params) if err != nil { return out, metadata, fmt.Errorf("resolve auth scheme: %w", err) diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/endpoints.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/endpoints.go index 1e001f7a9e8..884983eb4d0 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/endpoints.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/endpoints.go @@ -14,6 +14,7 @@ import ( internalendpoints "github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints" smithyauth "github.com/aws/smithy-go/auth" smithyendpoints "github.com/aws/smithy-go/endpoints" + "github.com/aws/smithy-go/endpoints/private/rulesfn" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" "github.com/aws/smithy-go/tracing" @@ -217,11 +218,15 @@ func resolveBaseEndpoint(cfg aws.Config, o *Options) { } } -func bindRegion(region string) *string { +func bindRegion(region string) (*string, error) { if region == "" { - return nil + return nil, nil + } + if !rulesfn.IsValidHostLabel(region, true) { + return nil, fmt.Errorf("invalid input region %s", region) } - return aws.String(endpoints.MapFIPSRegion(region)) + + return aws.String(endpoints.MapFIPSRegion(region)), nil } // EndpointParameters provides the parameters that influence how endpoints are @@ -479,10 +484,15 @@ type endpointParamsBinder interface { bindEndpointParams(*EndpointParameters) } -func bindEndpointParams(ctx context.Context, input interface{}, options Options) *EndpointParameters { +func bindEndpointParams(ctx context.Context, input interface{}, options Options) (*EndpointParameters, error) { params := &EndpointParameters{} - params.Region = bindRegion(options.Region) + region, err := bindRegion(options.Region) + if err != nil { + return nil, err + } + params.Region = region + params.UseDualStack = aws.Bool(options.EndpointOptions.UseDualStackEndpoint == aws.DualStackEndpointStateEnabled) params.UseFIPS = aws.Bool(options.EndpointOptions.UseFIPSEndpoint == aws.FIPSEndpointStateEnabled) params.Endpoint = options.BaseEndpoint @@ -491,7 +501,7 @@ func bindEndpointParams(ctx context.Context, input interface{}, options Options) b.bindEndpointParams(params) } - return params + return params, nil } type resolveEndpointV2Middleware struct { @@ -521,7 +531,10 @@ func (m *resolveEndpointV2Middleware) HandleFinalize(ctx context.Context, in mid return out, metadata, fmt.Errorf("expected endpoint resolver to not be nil") } - params := bindEndpointParams(ctx, getOperationInput(ctx), m.options) + params, err := bindEndpointParams(ctx, getOperationInput(ctx), m.options) + if err != nil { + return out, metadata, fmt.Errorf("failed to bind endpoint params, %w", err) + } endpt, err := timeOperationMetric(ctx, "client.call.resolve_endpoint_duration", func() (smithyendpoints.Endpoint, error) { return m.options.EndpointResolverV2.ResolveEndpoint(ctx, *params) diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go index d882f41ddcc..32d58763d43 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go @@ -3,4 +3,4 @@ package ssooidc // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.35.5" +const goModuleVersion = "1.35.11" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints/endpoints.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints/endpoints.go index f15c1a3ff52..2088fc7fb22 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints/endpoints.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints/endpoints.go @@ -157,6 +157,9 @@ var defaultPartitions = endpoints.Partitions{ Region: "ap-east-1", }, }, + endpoints.EndpointKey{ + Region: "ap-east-2", + }: endpoints.Endpoint{}, endpoints.EndpointKey{ Region: "ap-northeast-1", }: endpoints.Endpoint{ @@ -445,6 +448,13 @@ var defaultPartitions = endpoints.Partitions{ { ID: "aws-eusc", Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ + { + Variant: endpoints.DualStackVariant, + }: { + Hostname: "oidc.{region}.api.amazonwebservices.eu", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, { Variant: endpoints.FIPSVariant, }: { @@ -452,6 +462,13 @@ var defaultPartitions = endpoints.Partitions{ Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, + { + Variant: endpoints.FIPSVariant | endpoints.DualStackVariant, + }: { + Hostname: "oidc-fips.{region}.api.amazonwebservices.eu", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, { Variant: 0, }: { diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md index 9ae35f44991..9b70885cc4d 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md @@ -1,3 +1,34 @@ +# v1.41.3 (2025-12-02) + +* **Dependency Update**: Updated to the latest SDK module versions +* **Dependency Update**: Upgrade to smithy-go v1.24.0. Notably this version of the library reduces the allocation footprint of the middleware system. We observe a ~10% reduction in allocations per SDK call with this change. + +# v1.41.2 (2025-11-25) + +* **Bug Fix**: Add error check for endpoint param binding during auth scheme resolution to fix panic reported in #3234 + +# v1.41.1 (2025-11-19.2) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.41.0 (2025-11-19) + +* **Feature**: IAM now supports outbound identity federation via the STS GetWebIdentityToken API, enabling AWS workloads to securely authenticate with external services using short-lived JSON Web Tokens. + +# v1.40.2 (2025-11-12) + +* **Bug Fix**: Further reduce allocation overhead when the metrics system isn't in-use. +* **Bug Fix**: Reduce allocation overhead when the client doesn't have any HTTP interceptors configured. +* **Bug Fix**: Remove blank trace spans towards the beginning of the request that added no additional information. This conveys a slight reduction in overall allocations. + +# v1.40.1 (2025-11-11) + +* **Bug Fix**: Return validation error if input region is not a valid host label. + +# v1.40.0 (2025-11-10) + +* **Feature**: Added GetDelegatedAccessToken API, which is not available for general use at this time. + # v1.39.1 (2025-11-04) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_client.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_client.go index 6658babc95f..70228d0dfa7 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_client.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_client.go @@ -68,7 +68,12 @@ func timeOperationMetric[T any]( ctx context.Context, metric string, fn func() (T, error), opts ...metrics.RecordMetricOption, ) (T, error) { - instr := getOperationMetrics(ctx).histogramFor(metric) + mm := getOperationMetrics(ctx) + if mm == nil { // not using the metrics system + return fn() + } + + instr := mm.histogramFor(metric) opts = append([]metrics.RecordMetricOption{withOperationMetadata(ctx)}, opts...) start := time.Now() @@ -81,7 +86,12 @@ func timeOperationMetric[T any]( } func startMetricTimer(ctx context.Context, metric string, opts ...metrics.RecordMetricOption) func() { - instr := getOperationMetrics(ctx).histogramFor(metric) + mm := getOperationMetrics(ctx) + if mm == nil { // not using the metrics system + return func() {} + } + + instr := mm.histogramFor(metric) opts = append([]metrics.RecordMetricOption{withOperationMetadata(ctx)}, opts...) var ended bool @@ -109,6 +119,12 @@ func withOperationMetadata(ctx context.Context) metrics.RecordMetricOption { type operationMetricsKey struct{} func withOperationMetrics(parent context.Context, mp metrics.MeterProvider) (context.Context, error) { + if _, ok := mp.(metrics.NopMeterProvider); ok { + // not using the metrics system - setting up the metrics context is a memory-intensive operation + // so we should skip it in this case + return parent, nil + } + meter := mp.Meter("github.com/aws/aws-sdk-go-v2/service/sts") om := &operationMetrics{} @@ -156,7 +172,10 @@ func operationMetricTimer(m metrics.Meter, name, desc string) (metrics.Float64Hi } func getOperationMetrics(ctx context.Context) *operationMetrics { - return ctx.Value(operationMetricsKey{}).(*operationMetrics) + if v := ctx.Value(operationMetricsKey{}); v != nil { + return v.(*operationMetrics) + } + return nil } func operationTracer(p tracing.TracerProvider) tracing.Tracer { @@ -1034,138 +1053,49 @@ func addInterceptAttempt(stack *middleware.Stack, opts Options) error { }, "Retry", middleware.After) } -func addInterceptExecution(stack *middleware.Stack, opts Options) error { - return stack.Initialize.Add(&smithyhttp.InterceptExecution{ - BeforeExecution: opts.Interceptors.BeforeExecution, - AfterExecution: opts.Interceptors.AfterExecution, - }, middleware.Before) -} - -func addInterceptBeforeSerialization(stack *middleware.Stack, opts Options) error { - return stack.Serialize.Insert(&smithyhttp.InterceptBeforeSerialization{ - Interceptors: opts.Interceptors.BeforeSerialization, - }, "OperationSerializer", middleware.Before) -} - -func addInterceptAfterSerialization(stack *middleware.Stack, opts Options) error { - return stack.Serialize.Insert(&smithyhttp.InterceptAfterSerialization{ - Interceptors: opts.Interceptors.AfterSerialization, - }, "OperationSerializer", middleware.After) -} - -func addInterceptBeforeSigning(stack *middleware.Stack, opts Options) error { - return stack.Finalize.Insert(&smithyhttp.InterceptBeforeSigning{ - Interceptors: opts.Interceptors.BeforeSigning, - }, "Signing", middleware.Before) -} - -func addInterceptAfterSigning(stack *middleware.Stack, opts Options) error { - return stack.Finalize.Insert(&smithyhttp.InterceptAfterSigning{ - Interceptors: opts.Interceptors.AfterSigning, - }, "Signing", middleware.After) -} - -func addInterceptTransmit(stack *middleware.Stack, opts Options) error { - return stack.Deserialize.Add(&smithyhttp.InterceptTransmit{ - BeforeTransmit: opts.Interceptors.BeforeTransmit, - AfterTransmit: opts.Interceptors.AfterTransmit, - }, middleware.After) -} - -func addInterceptBeforeDeserialization(stack *middleware.Stack, opts Options) error { - return stack.Deserialize.Insert(&smithyhttp.InterceptBeforeDeserialization{ - Interceptors: opts.Interceptors.BeforeDeserialization, - }, "OperationDeserializer", middleware.After) // (deserialize stack is called in reverse) -} - -func addInterceptAfterDeserialization(stack *middleware.Stack, opts Options) error { - return stack.Deserialize.Insert(&smithyhttp.InterceptAfterDeserialization{ - Interceptors: opts.Interceptors.AfterDeserialization, - }, "OperationDeserializer", middleware.Before) -} - -type spanInitializeStart struct { -} - -func (*spanInitializeStart) ID() string { - return "spanInitializeStart" -} - -func (m *spanInitializeStart) HandleInitialize( - ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler, -) ( - middleware.InitializeOutput, middleware.Metadata, error, -) { - ctx, _ = tracing.StartSpan(ctx, "Initialize") - - return next.HandleInitialize(ctx, in) -} - -type spanInitializeEnd struct { -} - -func (*spanInitializeEnd) ID() string { - return "spanInitializeEnd" -} - -func (m *spanInitializeEnd) HandleInitialize( - ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler, -) ( - middleware.InitializeOutput, middleware.Metadata, error, -) { - ctx, span := tracing.PopSpan(ctx) - span.End() - - return next.HandleInitialize(ctx, in) -} - -type spanBuildRequestStart struct { -} - -func (*spanBuildRequestStart) ID() string { - return "spanBuildRequestStart" -} - -func (m *spanBuildRequestStart) HandleSerialize( - ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler, -) ( - middleware.SerializeOutput, middleware.Metadata, error, -) { - ctx, _ = tracing.StartSpan(ctx, "BuildRequest") - - return next.HandleSerialize(ctx, in) -} - -type spanBuildRequestEnd struct { -} - -func (*spanBuildRequestEnd) ID() string { - return "spanBuildRequestEnd" -} - -func (m *spanBuildRequestEnd) HandleBuild( - ctx context.Context, in middleware.BuildInput, next middleware.BuildHandler, -) ( - middleware.BuildOutput, middleware.Metadata, error, -) { - ctx, span := tracing.PopSpan(ctx) - span.End() - - return next.HandleBuild(ctx, in) -} - -func addSpanInitializeStart(stack *middleware.Stack) error { - return stack.Initialize.Add(&spanInitializeStart{}, middleware.Before) -} - -func addSpanInitializeEnd(stack *middleware.Stack) error { - return stack.Initialize.Add(&spanInitializeEnd{}, middleware.After) -} - -func addSpanBuildRequestStart(stack *middleware.Stack) error { - return stack.Serialize.Add(&spanBuildRequestStart{}, middleware.Before) -} +func addInterceptors(stack *middleware.Stack, opts Options) error { + // middlewares are expensive, don't add all of these interceptor ones unless the caller + // actually has at least one interceptor configured + // + // at the moment it's all-or-nothing because some of the middlewares here are responsible for + // setting fields in the interceptor context for future ones + if len(opts.Interceptors.BeforeExecution) == 0 && + len(opts.Interceptors.BeforeSerialization) == 0 && len(opts.Interceptors.AfterSerialization) == 0 && + len(opts.Interceptors.BeforeRetryLoop) == 0 && + len(opts.Interceptors.BeforeAttempt) == 0 && + len(opts.Interceptors.BeforeSigning) == 0 && len(opts.Interceptors.AfterSigning) == 0 && + len(opts.Interceptors.BeforeTransmit) == 0 && len(opts.Interceptors.AfterTransmit) == 0 && + len(opts.Interceptors.BeforeDeserialization) == 0 && len(opts.Interceptors.AfterDeserialization) == 0 && + len(opts.Interceptors.AfterAttempt) == 0 && len(opts.Interceptors.AfterExecution) == 0 { + return nil + } -func addSpanBuildRequestEnd(stack *middleware.Stack) error { - return stack.Build.Add(&spanBuildRequestEnd{}, middleware.After) + return errors.Join( + stack.Initialize.Add(&smithyhttp.InterceptExecution{ + BeforeExecution: opts.Interceptors.BeforeExecution, + AfterExecution: opts.Interceptors.AfterExecution, + }, middleware.Before), + stack.Serialize.Insert(&smithyhttp.InterceptBeforeSerialization{ + Interceptors: opts.Interceptors.BeforeSerialization, + }, "OperationSerializer", middleware.Before), + stack.Serialize.Insert(&smithyhttp.InterceptAfterSerialization{ + Interceptors: opts.Interceptors.AfterSerialization, + }, "OperationSerializer", middleware.After), + stack.Finalize.Insert(&smithyhttp.InterceptBeforeSigning{ + Interceptors: opts.Interceptors.BeforeSigning, + }, "Signing", middleware.Before), + stack.Finalize.Insert(&smithyhttp.InterceptAfterSigning{ + Interceptors: opts.Interceptors.AfterSigning, + }, "Signing", middleware.After), + stack.Deserialize.Add(&smithyhttp.InterceptTransmit{ + BeforeTransmit: opts.Interceptors.BeforeTransmit, + AfterTransmit: opts.Interceptors.AfterTransmit, + }, middleware.After), + stack.Deserialize.Insert(&smithyhttp.InterceptBeforeDeserialization{ + Interceptors: opts.Interceptors.BeforeDeserialization, + }, "OperationDeserializer", middleware.After), // (deserialize stack is called in reverse) + stack.Deserialize.Insert(&smithyhttp.InterceptAfterDeserialization{ + Interceptors: opts.Interceptors.AfterDeserialization, + }, "OperationDeserializer", middleware.Before), + ) } diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRole.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRole.go index f3a93418fa0..0ddd3623ae5 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRole.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRole.go @@ -147,7 +147,7 @@ type AssumeRoleInput struct { // // The regex used to validate this parameter is a string of characters consisting // of upper- and lower-case alphanumeric characters with no spaces. You can also - // include underscores or any of the following characters: =,.@- + // include underscores or any of the following characters: +=,.@- // // [CloudTrail logs]: https://docs.aws.amazon.com/IAM/latest/UserGuide/cloudtrail-integration.html#cloudtrail-integration_signin-tempcreds // [sts:RoleSessionName]: https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_iam-condition-keys.html#ck_rolesessionname @@ -196,7 +196,7 @@ type AssumeRoleInput struct { // // The regex used to validate this parameter is a string of characters consisting // of upper- and lower-case alphanumeric characters with no spaces. You can also - // include underscores or any of the following characters: =,.@:/- + // include underscores or any of the following characters: +=,.@:\/- // // [How to Use an External ID When Granting Access to Your Amazon Web Services Resources to a Third Party]: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user_externalid.html ExternalId *string @@ -279,7 +279,7 @@ type AssumeRoleInput struct { // // The regex used to validate this parameter is a string of characters consisting // of upper- and lower-case alphanumeric characters with no spaces. You can also - // include underscores or any of the following characters: =,.@- + // include underscores or any of the following characters: +=/:,.@- SerialNumber *string // The source identity specified by the principal that is calling the AssumeRole @@ -508,40 +508,7 @@ func (c *Client) addOperationAssumeRoleMiddlewares(stack *middleware.Stack, opti if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithSAML.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithSAML.go index 9dcceec12a2..15f1dd91d29 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithSAML.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithSAML.go @@ -23,6 +23,9 @@ import ( // these temporary security credentials to sign calls to Amazon Web Services // services. // +// AssumeRoleWithSAML will not work on IAM Identity Center managed roles. These +// roles' names start with AWSReservedSSO_ . +// // # Session Duration // // By default, the temporary security credentials created by AssumeRoleWithSAML @@ -440,40 +443,7 @@ func (c *Client) addOperationAssumeRoleWithSAMLMiddlewares(stack *middleware.Sta if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithWebIdentity.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithWebIdentity.go index 5975a0cdee8..7006eb3b7fb 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithWebIdentity.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoleWithWebIdentity.go @@ -75,7 +75,7 @@ import ( // // (Optional) You can configure your IdP to pass attributes into your web identity // token as session tags. Each session tag consists of a key name and an associated -// value. For more information about session tags, see [Passing Session Tags in STS]in the IAM User Guide. +// value. For more information about session tags, see [Passing session tags using AssumeRoleWithWebIdentity]in the IAM User Guide. // // You can pass up to 50 session tags. The plaintext session tag keys can’t exceed // 128 characters and the values can’t exceed 256 characters. For these and @@ -123,6 +123,7 @@ import ( // providers to get and use temporary security credentials. // // [Amazon Web Services SDK for iOS Developer Guide]: http://aws.amazon.com/sdkforios/ +// [Passing session tags using AssumeRoleWithWebIdentity]: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_adding-assume-role-idp // [Amazon Web Services SDK for Android Developer Guide]: http://aws.amazon.com/sdkforandroid/ // [IAM and STS Character Limits]: https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_iam-limits.html#reference_iam-limits-entity-length // [session policies]: https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session @@ -135,7 +136,6 @@ import ( // [Using IAM Roles]: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use.html // [Session Policies]: https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies.html#policies_session // [Amazon Cognito federated identities]: https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-identity.html -// [Passing Session Tags in STS]: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html // [Chaining Roles with Session Tags]: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_session-tags.html#id_session-tags_role-chaining // [Update the maximum session duration for a role]: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_update-role-settings.html#id_roles_update-session-duration // [Using Web Identity Federation API Operations for Mobile Apps]: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc_manual.html @@ -460,40 +460,7 @@ func (c *Client) addOperationAssumeRoleWithWebIdentityMiddlewares(stack *middlew if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoot.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoot.go index 571f06728a5..009c4055838 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoot.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_AssumeRoot.go @@ -12,7 +12,9 @@ import ( ) // Returns a set of short term credentials you can use to perform privileged tasks -// on a member account in your organization. +// on a member account in your organization. You must use credentials from an +// Organizations management account or a delegated administrator account for IAM to +// call AssumeRoot . You cannot use root user credentials to make this call. // // Before you can launch a privileged session, you must have centralized root // access in your organization. For steps to enable this feature, see [Centralize root access for member accounts]in the IAM @@ -24,8 +26,16 @@ import ( // You can track AssumeRoot in CloudTrail logs to determine what actions were // performed in a session. For more information, see [Track privileged tasks in CloudTrail]in the IAM User Guide. // +// When granting access to privileged tasks you should only grant the necessary +// permissions required to perform that task. For more information, see [Security best practices in IAM]. In +// addition, you can use [service control policies](SCPs) to manage and limit permissions in your +// organization. See [General examples]in the Organizations User Guide for more information on SCPs. +// // [Endpoints]: https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html#sts-endpoints +// [Security best practices in IAM]: https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html // [Track privileged tasks in CloudTrail]: https://docs.aws.amazon.com/IAM/latest/UserGuide/cloudtrail-track-privileged-tasks.html +// [General examples]: https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps_examples_general.html +// [service control policies]: https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_policies_scps.html // [Centralize root access for member accounts]: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_root-enable-root-access.html func (c *Client) AssumeRoot(ctx context.Context, params *AssumeRootInput, optFns ...func(*Options)) (*AssumeRootOutput, error) { if params == nil { @@ -50,8 +60,10 @@ type AssumeRootInput struct { TargetPrincipal *string // The identity based policy that scopes the session to the privileged tasks that - // can be performed. You can use one of following Amazon Web Services managed - // policies to scope root session actions. + // can be performed. You must + // + // use one of following Amazon Web Services managed policies to scope root session + // actions: // // [IAMAuditRootUserCredentials] // @@ -205,40 +217,7 @@ func (c *Client) addOperationAssumeRootMiddlewares(stack *middleware.Stack, opti if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_DecodeAuthorizationMessage.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_DecodeAuthorizationMessage.go index 786bac89b8a..b00b0c4096c 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_DecodeAuthorizationMessage.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_DecodeAuthorizationMessage.go @@ -177,40 +177,7 @@ func (c *Client) addOperationDecodeAuthorizationMessageMiddlewares(stack *middle if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetAccessKeyInfo.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetAccessKeyInfo.go index 6c1f878981c..887bb081f3b 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetAccessKeyInfo.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetAccessKeyInfo.go @@ -168,40 +168,7 @@ func (c *Client) addOperationGetAccessKeyInfoMiddlewares(stack *middleware.Stack if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetCallerIdentity.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetCallerIdentity.go index 7d0653398b3..2c8d8867013 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetCallerIdentity.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetCallerIdentity.go @@ -156,40 +156,7 @@ func (c *Client) addOperationGetCallerIdentityMiddlewares(stack *middleware.Stac if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetDelegatedAccessToken.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetDelegatedAccessToken.go new file mode 100644 index 00000000000..092ec13e3a3 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetDelegatedAccessToken.go @@ -0,0 +1,172 @@ +// Code generated by smithy-go-codegen DO NOT EDIT. + +package sts + +import ( + "context" + "fmt" + awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" + "github.com/aws/aws-sdk-go-v2/service/sts/types" + "github.com/aws/smithy-go/middleware" + smithyhttp "github.com/aws/smithy-go/transport/http" +) + +// Exchanges a trade-in token for temporary Amazon Web Services credentials with +// the permissions associated with the assumed principal. This operation allows you +// to obtain credentials for a specific principal based on a trade-in token, +// enabling delegation of access to Amazon Web Services resources. +func (c *Client) GetDelegatedAccessToken(ctx context.Context, params *GetDelegatedAccessTokenInput, optFns ...func(*Options)) (*GetDelegatedAccessTokenOutput, error) { + if params == nil { + params = &GetDelegatedAccessTokenInput{} + } + + result, metadata, err := c.invokeOperation(ctx, "GetDelegatedAccessToken", params, optFns, c.addOperationGetDelegatedAccessTokenMiddlewares) + if err != nil { + return nil, err + } + + out := result.(*GetDelegatedAccessTokenOutput) + out.ResultMetadata = metadata + return out, nil +} + +type GetDelegatedAccessTokenInput struct { + + // The token to exchange for temporary Amazon Web Services credentials. This token + // must be valid and unexpired at the time of the request. + // + // This member is required. + TradeInToken *string + + noSmithyDocumentSerde +} + +type GetDelegatedAccessTokenOutput struct { + + // The Amazon Resource Name (ARN) of the principal that was assumed when obtaining + // the delegated access token. This ARN identifies the IAM entity whose permissions + // are granted by the temporary credentials. + AssumedPrincipal *string + + // Amazon Web Services credentials for API authentication. + Credentials *types.Credentials + + // The percentage of the maximum policy size that is used by the session policy. + // The policy size is calculated as the sum of all the session policies and + // permission boundaries attached to the session. If the packed size exceeds 100%, + // the request fails. + PackedPolicySize *int32 + + // Metadata pertaining to the operation's result. + ResultMetadata middleware.Metadata + + noSmithyDocumentSerde +} + +func (c *Client) addOperationGetDelegatedAccessTokenMiddlewares(stack *middleware.Stack, options Options) (err error) { + if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { + return err + } + err = stack.Serialize.Add(&awsAwsquery_serializeOpGetDelegatedAccessToken{}, middleware.After) + if err != nil { + return err + } + err = stack.Deserialize.Add(&awsAwsquery_deserializeOpGetDelegatedAccessToken{}, middleware.After) + if err != nil { + return err + } + if err := addProtocolFinalizerMiddlewares(stack, options, "GetDelegatedAccessToken"); err != nil { + return fmt.Errorf("add protocol finalizers: %v", err) + } + + if err = addlegacyEndpointContextSetter(stack, options); err != nil { + return err + } + if err = addSetLoggerMiddleware(stack, options); err != nil { + return err + } + if err = addClientRequestID(stack); err != nil { + return err + } + if err = addComputeContentLength(stack); err != nil { + return err + } + if err = addResolveEndpointMiddleware(stack, options); err != nil { + return err + } + if err = addComputePayloadSHA256(stack); err != nil { + return err + } + if err = addRetry(stack, options); err != nil { + return err + } + if err = addRawResponseToMetadata(stack); err != nil { + return err + } + if err = addRecordResponseTiming(stack); err != nil { + return err + } + if err = addSpanRetryLoop(stack, options); err != nil { + return err + } + if err = addClientUserAgent(stack, options); err != nil { + return err + } + if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { + return err + } + if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { + return err + } + if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { + return err + } + if err = addTimeOffsetBuild(stack, c); err != nil { + return err + } + if err = addUserAgentRetryMode(stack, options); err != nil { + return err + } + if err = addCredentialSource(stack, options); err != nil { + return err + } + if err = addOpGetDelegatedAccessTokenValidationMiddleware(stack); err != nil { + return err + } + if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetDelegatedAccessToken(options.Region), middleware.Before); err != nil { + return err + } + if err = addRecursionDetection(stack); err != nil { + return err + } + if err = addRequestIDRetrieverMiddleware(stack); err != nil { + return err + } + if err = addResponseErrorMiddleware(stack); err != nil { + return err + } + if err = addRequestResponseLogging(stack, options); err != nil { + return err + } + if err = addDisableHTTPSMiddleware(stack, options); err != nil { + return err + } + if err = addInterceptBeforeRetryLoop(stack, options); err != nil { + return err + } + if err = addInterceptAttempt(stack, options); err != nil { + return err + } + if err = addInterceptors(stack, options); err != nil { + return err + } + return nil +} + +func newServiceMetadataMiddleware_opGetDelegatedAccessToken(region string) *awsmiddleware.RegisterServiceMetadata { + return &awsmiddleware.RegisterServiceMetadata{ + Region: region, + ServiceID: ServiceID, + OperationName: "GetDelegatedAccessToken", + } +} diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetFederationToken.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetFederationToken.go index 1c2f28e519c..e0fc9a54848 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetFederationToken.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetFederationToken.go @@ -381,40 +381,7 @@ func (c *Client) addOperationGetFederationTokenMiddlewares(stack *middleware.Sta if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetSessionToken.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetSessionToken.go index 25604699009..2f931f4446d 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetSessionToken.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetSessionToken.go @@ -227,40 +227,7 @@ func (c *Client) addOperationGetSessionTokenMiddlewares(stack *middleware.Stack, if err = addInterceptAttempt(stack, options); err != nil { return err } - if err = addInterceptExecution(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSerialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterSerialization(stack, options); err != nil { - return err - } - if err = addInterceptBeforeSigning(stack, options); err != nil { - return err - } - if err = addInterceptAfterSigning(stack, options); err != nil { - return err - } - if err = addInterceptTransmit(stack, options); err != nil { - return err - } - if err = addInterceptBeforeDeserialization(stack, options); err != nil { - return err - } - if err = addInterceptAfterDeserialization(stack, options); err != nil { - return err - } - if err = addSpanInitializeStart(stack); err != nil { - return err - } - if err = addSpanInitializeEnd(stack); err != nil { - return err - } - if err = addSpanBuildRequestStart(stack); err != nil { - return err - } - if err = addSpanBuildRequestEnd(stack); err != nil { + if err = addInterceptors(stack, options); err != nil { return err } return nil diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetWebIdentityToken.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetWebIdentityToken.go new file mode 100644 index 00000000000..306ee43b1e2 --- /dev/null +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/api_op_GetWebIdentityToken.go @@ -0,0 +1,195 @@ +// Code generated by smithy-go-codegen DO NOT EDIT. + +package sts + +import ( + "context" + "fmt" + awsmiddleware "github.com/aws/aws-sdk-go-v2/aws/middleware" + "github.com/aws/aws-sdk-go-v2/service/sts/types" + "github.com/aws/smithy-go/middleware" + smithyhttp "github.com/aws/smithy-go/transport/http" + "time" +) + +// Returns a signed JSON Web Token (JWT) that represents the calling Amazon Web +// Services identity. The returned JWT can be used to authenticate with external +// services that support OIDC discovery. The token is signed by Amazon Web Services +// STS and can be publicly verified using the verification keys published at the +// issuer's JWKS endpoint. +func (c *Client) GetWebIdentityToken(ctx context.Context, params *GetWebIdentityTokenInput, optFns ...func(*Options)) (*GetWebIdentityTokenOutput, error) { + if params == nil { + params = &GetWebIdentityTokenInput{} + } + + result, metadata, err := c.invokeOperation(ctx, "GetWebIdentityToken", params, optFns, c.addOperationGetWebIdentityTokenMiddlewares) + if err != nil { + return nil, err + } + + out := result.(*GetWebIdentityTokenOutput) + out.ResultMetadata = metadata + return out, nil +} + +type GetWebIdentityTokenInput struct { + + // The intended recipient of the web identity token. This value populates the aud + // claim in the JWT and should identify the service or application that will + // validate and use the token. The external service should verify this claim to + // ensure the token was intended for their use. + // + // This member is required. + Audience []string + + // The cryptographic algorithm to use for signing the JSON Web Token (JWT). Valid + // values are RS256 (RSA with SHA-256) and ES384 (ECDSA using P-384 curve with + // SHA-384). + // + // This member is required. + SigningAlgorithm *string + + // The duration, in seconds, for which the JSON Web Token (JWT) will remain valid. + // The value can range from 60 seconds (1 minute) to 3600 seconds (1 hour). If not + // specified, the default duration is 300 seconds (5 minutes). The token is + // designed to be short-lived and should be used for proof of identity, then + // exchanged for credentials or short-lived tokens in the external service. + DurationSeconds *int32 + + // An optional list of tags to include in the JSON Web Token (JWT). These tags are + // added as custom claims to the JWT and can be used by the downstream service for + // authorization decisions. + Tags []types.Tag + + noSmithyDocumentSerde +} + +type GetWebIdentityTokenOutput struct { + + // The date and time when the web identity token expires, in UTC. The expiration + // is determined by adding the DurationSeconds value to the time the token was + // issued. After this time, the token should no longer be considered valid. + Expiration *time.Time + + // A signed JSON Web Token (JWT) that represents the caller's Amazon Web Services + // identity. The token contains standard JWT claims such as subject, audience, + // expiration time, and additional identity attributes added by STS as custom + // claims. You can also add your own custom claims to the token by passing tags as + // request parameters to the GetWebIdentityToken API. The token is signed using + // the specified signing algorithm and can be verified using the verification keys + // available at the issuer's JWKS endpoint. + WebIdentityToken *string + + // Metadata pertaining to the operation's result. + ResultMetadata middleware.Metadata + + noSmithyDocumentSerde +} + +func (c *Client) addOperationGetWebIdentityTokenMiddlewares(stack *middleware.Stack, options Options) (err error) { + if err := stack.Serialize.Add(&setOperationInputMiddleware{}, middleware.After); err != nil { + return err + } + err = stack.Serialize.Add(&awsAwsquery_serializeOpGetWebIdentityToken{}, middleware.After) + if err != nil { + return err + } + err = stack.Deserialize.Add(&awsAwsquery_deserializeOpGetWebIdentityToken{}, middleware.After) + if err != nil { + return err + } + if err := addProtocolFinalizerMiddlewares(stack, options, "GetWebIdentityToken"); err != nil { + return fmt.Errorf("add protocol finalizers: %v", err) + } + + if err = addlegacyEndpointContextSetter(stack, options); err != nil { + return err + } + if err = addSetLoggerMiddleware(stack, options); err != nil { + return err + } + if err = addClientRequestID(stack); err != nil { + return err + } + if err = addComputeContentLength(stack); err != nil { + return err + } + if err = addResolveEndpointMiddleware(stack, options); err != nil { + return err + } + if err = addComputePayloadSHA256(stack); err != nil { + return err + } + if err = addRetry(stack, options); err != nil { + return err + } + if err = addRawResponseToMetadata(stack); err != nil { + return err + } + if err = addRecordResponseTiming(stack); err != nil { + return err + } + if err = addSpanRetryLoop(stack, options); err != nil { + return err + } + if err = addClientUserAgent(stack, options); err != nil { + return err + } + if err = smithyhttp.AddErrorCloseResponseBodyMiddleware(stack); err != nil { + return err + } + if err = smithyhttp.AddCloseResponseBodyMiddleware(stack); err != nil { + return err + } + if err = addSetLegacyContextSigningOptionsMiddleware(stack); err != nil { + return err + } + if err = addTimeOffsetBuild(stack, c); err != nil { + return err + } + if err = addUserAgentRetryMode(stack, options); err != nil { + return err + } + if err = addCredentialSource(stack, options); err != nil { + return err + } + if err = addOpGetWebIdentityTokenValidationMiddleware(stack); err != nil { + return err + } + if err = stack.Initialize.Add(newServiceMetadataMiddleware_opGetWebIdentityToken(options.Region), middleware.Before); err != nil { + return err + } + if err = addRecursionDetection(stack); err != nil { + return err + } + if err = addRequestIDRetrieverMiddleware(stack); err != nil { + return err + } + if err = addResponseErrorMiddleware(stack); err != nil { + return err + } + if err = addRequestResponseLogging(stack, options); err != nil { + return err + } + if err = addDisableHTTPSMiddleware(stack, options); err != nil { + return err + } + if err = addInterceptBeforeRetryLoop(stack, options); err != nil { + return err + } + if err = addInterceptAttempt(stack, options); err != nil { + return err + } + if err = addInterceptors(stack, options); err != nil { + return err + } + return nil +} + +func newServiceMetadataMiddleware_opGetWebIdentityToken(region string) *awsmiddleware.RegisterServiceMetadata { + return &awsmiddleware.RegisterServiceMetadata{ + Region: region, + ServiceID: ServiceID, + OperationName: "GetWebIdentityToken", + } +} diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/auth.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/auth.go index 2a81b3fb19d..4db5a51f938 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/auth.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/auth.go @@ -16,8 +16,9 @@ import ( "strings" ) -func bindAuthParamsRegion(_ interface{}, params *AuthResolverParameters, _ interface{}, options Options) { +func bindAuthParamsRegion(_ interface{}, params *AuthResolverParameters, _ interface{}, options Options) error { params.Region = options.Region + return nil } type setLegacyContextSigningOptionsMiddleware struct { @@ -94,14 +95,16 @@ type AuthResolverParameters struct { Region string } -func bindAuthResolverParams(ctx context.Context, operation string, input interface{}, options Options) *AuthResolverParameters { +func bindAuthResolverParams(ctx context.Context, operation string, input interface{}, options Options) (*AuthResolverParameters, error) { params := &AuthResolverParameters{ Operation: operation, } - bindAuthParamsRegion(ctx, params, input, options) + if err := bindAuthParamsRegion(ctx, params, input, options); err != nil { + return nil, err + } - return params + return params, nil } // AuthSchemeResolver returns a set of possible authentication options for an @@ -164,7 +167,10 @@ func (m *resolveAuthSchemeMiddleware) HandleFinalize(ctx context.Context, in mid _, span := tracing.StartSpan(ctx, "ResolveAuthScheme") defer span.End() - params := bindAuthResolverParams(ctx, m.operation, getOperationInput(ctx), m.options) + params, err := bindAuthResolverParams(ctx, m.operation, getOperationInput(ctx), m.options) + if err != nil { + return out, metadata, fmt.Errorf("bind auth scheme params: %w", err) + } options, err := m.options.AuthSchemeResolver.ResolveAuthSchemes(ctx, params) if err != nil { return out, metadata, fmt.Errorf("resolve auth scheme: %w", err) diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/deserializers.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/deserializers.go index a1ac917ec6a..8c1ce351616 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/deserializers.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/deserializers.go @@ -846,6 +846,124 @@ func awsAwsquery_deserializeOpErrorGetCallerIdentity(response *smithyhttp.Respon } } +type awsAwsquery_deserializeOpGetDelegatedAccessToken struct { +} + +func (*awsAwsquery_deserializeOpGetDelegatedAccessToken) ID() string { + return "OperationDeserializer" +} + +func (m *awsAwsquery_deserializeOpGetDelegatedAccessToken) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( + out middleware.DeserializeOutput, metadata middleware.Metadata, err error, +) { + out, metadata, err = next.HandleDeserialize(ctx, in) + if err != nil { + return out, metadata, err + } + + _, span := tracing.StartSpan(ctx, "OperationDeserializer") + endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") + defer endTimer() + defer span.End() + response, ok := out.RawResponse.(*smithyhttp.Response) + if !ok { + return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} + } + + if response.StatusCode < 200 || response.StatusCode >= 300 { + return out, metadata, awsAwsquery_deserializeOpErrorGetDelegatedAccessToken(response, &metadata) + } + output := &GetDelegatedAccessTokenOutput{} + out.Result = output + + var buff [1024]byte + ringBuffer := smithyio.NewRingBuffer(buff[:]) + body := io.TeeReader(response.Body, ringBuffer) + rootDecoder := xml.NewDecoder(body) + t, err := smithyxml.FetchRootElement(rootDecoder) + if err == io.EOF { + return out, metadata, nil + } + if err != nil { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + return out, metadata, &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + } + + decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) + t, err = decoder.GetElement("GetDelegatedAccessTokenResult") + if err != nil { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + err = &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + return out, metadata, err + } + + decoder = smithyxml.WrapNodeDecoder(decoder.Decoder, t) + err = awsAwsquery_deserializeOpDocumentGetDelegatedAccessTokenOutput(&output, decoder) + if err != nil { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + err = &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + return out, metadata, err + } + + return out, metadata, err +} + +func awsAwsquery_deserializeOpErrorGetDelegatedAccessToken(response *smithyhttp.Response, metadata *middleware.Metadata) error { + var errorBuffer bytes.Buffer + if _, err := io.Copy(&errorBuffer, response.Body); err != nil { + return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} + } + errorBody := bytes.NewReader(errorBuffer.Bytes()) + + errorCode := "UnknownError" + errorMessage := errorCode + + errorComponents, err := awsxml.GetErrorResponseComponents(errorBody, false) + if err != nil { + return err + } + if reqID := errorComponents.RequestID; len(reqID) != 0 { + awsmiddleware.SetRequestIDMetadata(metadata, reqID) + } + if len(errorComponents.Code) != 0 { + errorCode = errorComponents.Code + } + if len(errorComponents.Message) != 0 { + errorMessage = errorComponents.Message + } + errorBody.Seek(0, io.SeekStart) + switch { + case strings.EqualFold("ExpiredTradeInTokenException", errorCode): + return awsAwsquery_deserializeErrorExpiredTradeInTokenException(response, errorBody) + + case strings.EqualFold("PackedPolicyTooLarge", errorCode): + return awsAwsquery_deserializeErrorPackedPolicyTooLargeException(response, errorBody) + + case strings.EqualFold("RegionDisabledException", errorCode): + return awsAwsquery_deserializeErrorRegionDisabledException(response, errorBody) + + default: + genericError := &smithy.GenericAPIError{ + Code: errorCode, + Message: errorMessage, + } + return genericError + + } +} + type awsAwsquery_deserializeOpGetFederationToken struct { } @@ -1076,6 +1194,124 @@ func awsAwsquery_deserializeOpErrorGetSessionToken(response *smithyhttp.Response } } +type awsAwsquery_deserializeOpGetWebIdentityToken struct { +} + +func (*awsAwsquery_deserializeOpGetWebIdentityToken) ID() string { + return "OperationDeserializer" +} + +func (m *awsAwsquery_deserializeOpGetWebIdentityToken) HandleDeserialize(ctx context.Context, in middleware.DeserializeInput, next middleware.DeserializeHandler) ( + out middleware.DeserializeOutput, metadata middleware.Metadata, err error, +) { + out, metadata, err = next.HandleDeserialize(ctx, in) + if err != nil { + return out, metadata, err + } + + _, span := tracing.StartSpan(ctx, "OperationDeserializer") + endTimer := startMetricTimer(ctx, "client.call.deserialization_duration") + defer endTimer() + defer span.End() + response, ok := out.RawResponse.(*smithyhttp.Response) + if !ok { + return out, metadata, &smithy.DeserializationError{Err: fmt.Errorf("unknown transport type %T", out.RawResponse)} + } + + if response.StatusCode < 200 || response.StatusCode >= 300 { + return out, metadata, awsAwsquery_deserializeOpErrorGetWebIdentityToken(response, &metadata) + } + output := &GetWebIdentityTokenOutput{} + out.Result = output + + var buff [1024]byte + ringBuffer := smithyio.NewRingBuffer(buff[:]) + body := io.TeeReader(response.Body, ringBuffer) + rootDecoder := xml.NewDecoder(body) + t, err := smithyxml.FetchRootElement(rootDecoder) + if err == io.EOF { + return out, metadata, nil + } + if err != nil { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + return out, metadata, &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + } + + decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) + t, err = decoder.GetElement("GetWebIdentityTokenResult") + if err != nil { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + err = &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + return out, metadata, err + } + + decoder = smithyxml.WrapNodeDecoder(decoder.Decoder, t) + err = awsAwsquery_deserializeOpDocumentGetWebIdentityTokenOutput(&output, decoder) + if err != nil { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + err = &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + return out, metadata, err + } + + return out, metadata, err +} + +func awsAwsquery_deserializeOpErrorGetWebIdentityToken(response *smithyhttp.Response, metadata *middleware.Metadata) error { + var errorBuffer bytes.Buffer + if _, err := io.Copy(&errorBuffer, response.Body); err != nil { + return &smithy.DeserializationError{Err: fmt.Errorf("failed to copy error response body, %w", err)} + } + errorBody := bytes.NewReader(errorBuffer.Bytes()) + + errorCode := "UnknownError" + errorMessage := errorCode + + errorComponents, err := awsxml.GetErrorResponseComponents(errorBody, false) + if err != nil { + return err + } + if reqID := errorComponents.RequestID; len(reqID) != 0 { + awsmiddleware.SetRequestIDMetadata(metadata, reqID) + } + if len(errorComponents.Code) != 0 { + errorCode = errorComponents.Code + } + if len(errorComponents.Message) != 0 { + errorMessage = errorComponents.Message + } + errorBody.Seek(0, io.SeekStart) + switch { + case strings.EqualFold("JWTPayloadSizeExceededException", errorCode): + return awsAwsquery_deserializeErrorJWTPayloadSizeExceededException(response, errorBody) + + case strings.EqualFold("OutboundWebIdentityFederationDisabledException", errorCode): + return awsAwsquery_deserializeErrorOutboundWebIdentityFederationDisabledException(response, errorBody) + + case strings.EqualFold("SessionDurationEscalationException", errorCode): + return awsAwsquery_deserializeErrorSessionDurationEscalationException(response, errorBody) + + default: + genericError := &smithy.GenericAPIError{ + Code: errorCode, + Message: errorMessage, + } + return genericError + + } +} + func awsAwsquery_deserializeErrorExpiredTokenException(response *smithyhttp.Response, errorBody *bytes.Reader) error { output := &types.ExpiredTokenException{} var buff [1024]byte @@ -1120,8 +1356,8 @@ func awsAwsquery_deserializeErrorExpiredTokenException(response *smithyhttp.Resp return output } -func awsAwsquery_deserializeErrorIDPCommunicationErrorException(response *smithyhttp.Response, errorBody *bytes.Reader) error { - output := &types.IDPCommunicationErrorException{} +func awsAwsquery_deserializeErrorExpiredTradeInTokenException(response *smithyhttp.Response, errorBody *bytes.Reader) error { + output := &types.ExpiredTradeInTokenException{} var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) @@ -1151,7 +1387,7 @@ func awsAwsquery_deserializeErrorIDPCommunicationErrorException(response *smithy } decoder = smithyxml.WrapNodeDecoder(decoder.Decoder, t) - err = awsAwsquery_deserializeDocumentIDPCommunicationErrorException(&output, decoder) + err = awsAwsquery_deserializeDocumentExpiredTradeInTokenException(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -1164,8 +1400,8 @@ func awsAwsquery_deserializeErrorIDPCommunicationErrorException(response *smithy return output } -func awsAwsquery_deserializeErrorIDPRejectedClaimException(response *smithyhttp.Response, errorBody *bytes.Reader) error { - output := &types.IDPRejectedClaimException{} +func awsAwsquery_deserializeErrorIDPCommunicationErrorException(response *smithyhttp.Response, errorBody *bytes.Reader) error { + output := &types.IDPCommunicationErrorException{} var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) @@ -1195,7 +1431,7 @@ func awsAwsquery_deserializeErrorIDPRejectedClaimException(response *smithyhttp. } decoder = smithyxml.WrapNodeDecoder(decoder.Decoder, t) - err = awsAwsquery_deserializeDocumentIDPRejectedClaimException(&output, decoder) + err = awsAwsquery_deserializeDocumentIDPCommunicationErrorException(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -1208,8 +1444,8 @@ func awsAwsquery_deserializeErrorIDPRejectedClaimException(response *smithyhttp. return output } -func awsAwsquery_deserializeErrorInvalidAuthorizationMessageException(response *smithyhttp.Response, errorBody *bytes.Reader) error { - output := &types.InvalidAuthorizationMessageException{} +func awsAwsquery_deserializeErrorIDPRejectedClaimException(response *smithyhttp.Response, errorBody *bytes.Reader) error { + output := &types.IDPRejectedClaimException{} var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) @@ -1239,7 +1475,7 @@ func awsAwsquery_deserializeErrorInvalidAuthorizationMessageException(response * } decoder = smithyxml.WrapNodeDecoder(decoder.Decoder, t) - err = awsAwsquery_deserializeDocumentInvalidAuthorizationMessageException(&output, decoder) + err = awsAwsquery_deserializeDocumentIDPRejectedClaimException(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -1252,8 +1488,8 @@ func awsAwsquery_deserializeErrorInvalidAuthorizationMessageException(response * return output } -func awsAwsquery_deserializeErrorInvalidIdentityTokenException(response *smithyhttp.Response, errorBody *bytes.Reader) error { - output := &types.InvalidIdentityTokenException{} +func awsAwsquery_deserializeErrorInvalidAuthorizationMessageException(response *smithyhttp.Response, errorBody *bytes.Reader) error { + output := &types.InvalidAuthorizationMessageException{} var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) @@ -1283,7 +1519,7 @@ func awsAwsquery_deserializeErrorInvalidIdentityTokenException(response *smithyh } decoder = smithyxml.WrapNodeDecoder(decoder.Decoder, t) - err = awsAwsquery_deserializeDocumentInvalidIdentityTokenException(&output, decoder) + err = awsAwsquery_deserializeDocumentInvalidAuthorizationMessageException(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -1296,8 +1532,8 @@ func awsAwsquery_deserializeErrorInvalidIdentityTokenException(response *smithyh return output } -func awsAwsquery_deserializeErrorMalformedPolicyDocumentException(response *smithyhttp.Response, errorBody *bytes.Reader) error { - output := &types.MalformedPolicyDocumentException{} +func awsAwsquery_deserializeErrorInvalidIdentityTokenException(response *smithyhttp.Response, errorBody *bytes.Reader) error { + output := &types.InvalidIdentityTokenException{} var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) @@ -1327,7 +1563,7 @@ func awsAwsquery_deserializeErrorMalformedPolicyDocumentException(response *smit } decoder = smithyxml.WrapNodeDecoder(decoder.Decoder, t) - err = awsAwsquery_deserializeDocumentMalformedPolicyDocumentException(&output, decoder) + err = awsAwsquery_deserializeDocumentInvalidIdentityTokenException(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -1340,8 +1576,8 @@ func awsAwsquery_deserializeErrorMalformedPolicyDocumentException(response *smit return output } -func awsAwsquery_deserializeErrorPackedPolicyTooLargeException(response *smithyhttp.Response, errorBody *bytes.Reader) error { - output := &types.PackedPolicyTooLargeException{} +func awsAwsquery_deserializeErrorJWTPayloadSizeExceededException(response *smithyhttp.Response, errorBody *bytes.Reader) error { + output := &types.JWTPayloadSizeExceededException{} var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) @@ -1371,7 +1607,7 @@ func awsAwsquery_deserializeErrorPackedPolicyTooLargeException(response *smithyh } decoder = smithyxml.WrapNodeDecoder(decoder.Decoder, t) - err = awsAwsquery_deserializeDocumentPackedPolicyTooLargeException(&output, decoder) + err = awsAwsquery_deserializeDocumentJWTPayloadSizeExceededException(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -1384,8 +1620,8 @@ func awsAwsquery_deserializeErrorPackedPolicyTooLargeException(response *smithyh return output } -func awsAwsquery_deserializeErrorRegionDisabledException(response *smithyhttp.Response, errorBody *bytes.Reader) error { - output := &types.RegionDisabledException{} +func awsAwsquery_deserializeErrorMalformedPolicyDocumentException(response *smithyhttp.Response, errorBody *bytes.Reader) error { + output := &types.MalformedPolicyDocumentException{} var buff [1024]byte ringBuffer := smithyio.NewRingBuffer(buff[:]) body := io.TeeReader(errorBody, ringBuffer) @@ -1415,7 +1651,7 @@ func awsAwsquery_deserializeErrorRegionDisabledException(response *smithyhttp.Re } decoder = smithyxml.WrapNodeDecoder(decoder.Decoder, t) - err = awsAwsquery_deserializeDocumentRegionDisabledException(&output, decoder) + err = awsAwsquery_deserializeDocumentMalformedPolicyDocumentException(&output, decoder) if err != nil { var snapshot bytes.Buffer io.Copy(&snapshot, ringBuffer) @@ -1428,13 +1664,441 @@ func awsAwsquery_deserializeErrorRegionDisabledException(response *smithyhttp.Re return output } -func awsAwsquery_deserializeDocumentAssumedRoleUser(v **types.AssumedRoleUser, decoder smithyxml.NodeDecoder) error { +func awsAwsquery_deserializeErrorOutboundWebIdentityFederationDisabledException(response *smithyhttp.Response, errorBody *bytes.Reader) error { + output := &types.OutboundWebIdentityFederationDisabledException{} + var buff [1024]byte + ringBuffer := smithyio.NewRingBuffer(buff[:]) + body := io.TeeReader(errorBody, ringBuffer) + rootDecoder := xml.NewDecoder(body) + t, err := smithyxml.FetchRootElement(rootDecoder) + if err == io.EOF { + return output + } + if err != nil { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + return &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + } + + decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) + t, err = decoder.GetElement("Error") + if err != nil { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + return &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + } + + decoder = smithyxml.WrapNodeDecoder(decoder.Decoder, t) + err = awsAwsquery_deserializeDocumentOutboundWebIdentityFederationDisabledException(&output, decoder) + if err != nil { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + return &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + } + + return output +} + +func awsAwsquery_deserializeErrorPackedPolicyTooLargeException(response *smithyhttp.Response, errorBody *bytes.Reader) error { + output := &types.PackedPolicyTooLargeException{} + var buff [1024]byte + ringBuffer := smithyio.NewRingBuffer(buff[:]) + body := io.TeeReader(errorBody, ringBuffer) + rootDecoder := xml.NewDecoder(body) + t, err := smithyxml.FetchRootElement(rootDecoder) + if err == io.EOF { + return output + } + if err != nil { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + return &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + } + + decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) + t, err = decoder.GetElement("Error") + if err != nil { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + return &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + } + + decoder = smithyxml.WrapNodeDecoder(decoder.Decoder, t) + err = awsAwsquery_deserializeDocumentPackedPolicyTooLargeException(&output, decoder) + if err != nil { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + return &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + } + + return output +} + +func awsAwsquery_deserializeErrorRegionDisabledException(response *smithyhttp.Response, errorBody *bytes.Reader) error { + output := &types.RegionDisabledException{} + var buff [1024]byte + ringBuffer := smithyio.NewRingBuffer(buff[:]) + body := io.TeeReader(errorBody, ringBuffer) + rootDecoder := xml.NewDecoder(body) + t, err := smithyxml.FetchRootElement(rootDecoder) + if err == io.EOF { + return output + } + if err != nil { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + return &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + } + + decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) + t, err = decoder.GetElement("Error") + if err != nil { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + return &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + } + + decoder = smithyxml.WrapNodeDecoder(decoder.Decoder, t) + err = awsAwsquery_deserializeDocumentRegionDisabledException(&output, decoder) + if err != nil { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + return &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + } + + return output +} + +func awsAwsquery_deserializeErrorSessionDurationEscalationException(response *smithyhttp.Response, errorBody *bytes.Reader) error { + output := &types.SessionDurationEscalationException{} + var buff [1024]byte + ringBuffer := smithyio.NewRingBuffer(buff[:]) + body := io.TeeReader(errorBody, ringBuffer) + rootDecoder := xml.NewDecoder(body) + t, err := smithyxml.FetchRootElement(rootDecoder) + if err == io.EOF { + return output + } + if err != nil { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + return &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + } + + decoder := smithyxml.WrapNodeDecoder(rootDecoder, t) + t, err = decoder.GetElement("Error") + if err != nil { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + return &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + } + + decoder = smithyxml.WrapNodeDecoder(decoder.Decoder, t) + err = awsAwsquery_deserializeDocumentSessionDurationEscalationException(&output, decoder) + if err != nil { + var snapshot bytes.Buffer + io.Copy(&snapshot, ringBuffer) + return &smithy.DeserializationError{ + Err: fmt.Errorf("failed to decode response body, %w", err), + Snapshot: snapshot.Bytes(), + } + } + + return output +} + +func awsAwsquery_deserializeDocumentAssumedRoleUser(v **types.AssumedRoleUser, decoder smithyxml.NodeDecoder) error { + if v == nil { + return fmt.Errorf("unexpected nil of type %T", v) + } + var sv *types.AssumedRoleUser + if *v == nil { + sv = &types.AssumedRoleUser{} + } else { + sv = *v + } + + for { + t, done, err := decoder.Token() + if err != nil { + return err + } + if done { + break + } + originalDecoder := decoder + decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) + switch { + case strings.EqualFold("Arn", t.Name.Local): + val, err := decoder.Value() + if err != nil { + return err + } + if val == nil { + break + } + { + xtv := string(val) + sv.Arn = ptr.String(xtv) + } + + case strings.EqualFold("AssumedRoleId", t.Name.Local): + val, err := decoder.Value() + if err != nil { + return err + } + if val == nil { + break + } + { + xtv := string(val) + sv.AssumedRoleId = ptr.String(xtv) + } + + default: + // Do nothing and ignore the unexpected tag element + err = decoder.Decoder.Skip() + if err != nil { + return err + } + + } + decoder = originalDecoder + } + *v = sv + return nil +} + +func awsAwsquery_deserializeDocumentCredentials(v **types.Credentials, decoder smithyxml.NodeDecoder) error { + if v == nil { + return fmt.Errorf("unexpected nil of type %T", v) + } + var sv *types.Credentials + if *v == nil { + sv = &types.Credentials{} + } else { + sv = *v + } + + for { + t, done, err := decoder.Token() + if err != nil { + return err + } + if done { + break + } + originalDecoder := decoder + decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) + switch { + case strings.EqualFold("AccessKeyId", t.Name.Local): + val, err := decoder.Value() + if err != nil { + return err + } + if val == nil { + break + } + { + xtv := string(val) + sv.AccessKeyId = ptr.String(xtv) + } + + case strings.EqualFold("Expiration", t.Name.Local): + val, err := decoder.Value() + if err != nil { + return err + } + if val == nil { + break + } + { + xtv := string(val) + t, err := smithytime.ParseDateTime(xtv) + if err != nil { + return err + } + sv.Expiration = ptr.Time(t) + } + + case strings.EqualFold("SecretAccessKey", t.Name.Local): + val, err := decoder.Value() + if err != nil { + return err + } + if val == nil { + break + } + { + xtv := string(val) + sv.SecretAccessKey = ptr.String(xtv) + } + + case strings.EqualFold("SessionToken", t.Name.Local): + val, err := decoder.Value() + if err != nil { + return err + } + if val == nil { + break + } + { + xtv := string(val) + sv.SessionToken = ptr.String(xtv) + } + + default: + // Do nothing and ignore the unexpected tag element + err = decoder.Decoder.Skip() + if err != nil { + return err + } + + } + decoder = originalDecoder + } + *v = sv + return nil +} + +func awsAwsquery_deserializeDocumentExpiredTokenException(v **types.ExpiredTokenException, decoder smithyxml.NodeDecoder) error { + if v == nil { + return fmt.Errorf("unexpected nil of type %T", v) + } + var sv *types.ExpiredTokenException + if *v == nil { + sv = &types.ExpiredTokenException{} + } else { + sv = *v + } + + for { + t, done, err := decoder.Token() + if err != nil { + return err + } + if done { + break + } + originalDecoder := decoder + decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) + switch { + case strings.EqualFold("message", t.Name.Local): + val, err := decoder.Value() + if err != nil { + return err + } + if val == nil { + break + } + { + xtv := string(val) + sv.Message = ptr.String(xtv) + } + + default: + // Do nothing and ignore the unexpected tag element + err = decoder.Decoder.Skip() + if err != nil { + return err + } + + } + decoder = originalDecoder + } + *v = sv + return nil +} + +func awsAwsquery_deserializeDocumentExpiredTradeInTokenException(v **types.ExpiredTradeInTokenException, decoder smithyxml.NodeDecoder) error { + if v == nil { + return fmt.Errorf("unexpected nil of type %T", v) + } + var sv *types.ExpiredTradeInTokenException + if *v == nil { + sv = &types.ExpiredTradeInTokenException{} + } else { + sv = *v + } + + for { + t, done, err := decoder.Token() + if err != nil { + return err + } + if done { + break + } + originalDecoder := decoder + decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) + switch { + case strings.EqualFold("message", t.Name.Local): + val, err := decoder.Value() + if err != nil { + return err + } + if val == nil { + break + } + { + xtv := string(val) + sv.Message = ptr.String(xtv) + } + + default: + // Do nothing and ignore the unexpected tag element + err = decoder.Decoder.Skip() + if err != nil { + return err + } + + } + decoder = originalDecoder + } + *v = sv + return nil +} + +func awsAwsquery_deserializeDocumentFederatedUser(v **types.FederatedUser, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } - var sv *types.AssumedRoleUser + var sv *types.FederatedUser if *v == nil { - sv = &types.AssumedRoleUser{} + sv = &types.FederatedUser{} } else { sv = *v } @@ -1463,7 +2127,7 @@ func awsAwsquery_deserializeDocumentAssumedRoleUser(v **types.AssumedRoleUser, d sv.Arn = ptr.String(xtv) } - case strings.EqualFold("AssumedRoleId", t.Name.Local): + case strings.EqualFold("FederatedUserId", t.Name.Local): val, err := decoder.Value() if err != nil { return err @@ -1473,7 +2137,7 @@ func awsAwsquery_deserializeDocumentAssumedRoleUser(v **types.AssumedRoleUser, d } { xtv := string(val) - sv.AssumedRoleId = ptr.String(xtv) + sv.FederatedUserId = ptr.String(xtv) } default: @@ -1490,13 +2154,13 @@ func awsAwsquery_deserializeDocumentAssumedRoleUser(v **types.AssumedRoleUser, d return nil } -func awsAwsquery_deserializeDocumentCredentials(v **types.Credentials, decoder smithyxml.NodeDecoder) error { +func awsAwsquery_deserializeDocumentIDPCommunicationErrorException(v **types.IDPCommunicationErrorException, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } - var sv *types.Credentials + var sv *types.IDPCommunicationErrorException if *v == nil { - sv = &types.Credentials{} + sv = &types.IDPCommunicationErrorException{} } else { sv = *v } @@ -1512,50 +2176,7 @@ func awsAwsquery_deserializeDocumentCredentials(v **types.Credentials, decoder s originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { - case strings.EqualFold("AccessKeyId", t.Name.Local): - val, err := decoder.Value() - if err != nil { - return err - } - if val == nil { - break - } - { - xtv := string(val) - sv.AccessKeyId = ptr.String(xtv) - } - - case strings.EqualFold("Expiration", t.Name.Local): - val, err := decoder.Value() - if err != nil { - return err - } - if val == nil { - break - } - { - xtv := string(val) - t, err := smithytime.ParseDateTime(xtv) - if err != nil { - return err - } - sv.Expiration = ptr.Time(t) - } - - case strings.EqualFold("SecretAccessKey", t.Name.Local): - val, err := decoder.Value() - if err != nil { - return err - } - if val == nil { - break - } - { - xtv := string(val) - sv.SecretAccessKey = ptr.String(xtv) - } - - case strings.EqualFold("SessionToken", t.Name.Local): + case strings.EqualFold("message", t.Name.Local): val, err := decoder.Value() if err != nil { return err @@ -1565,7 +2186,7 @@ func awsAwsquery_deserializeDocumentCredentials(v **types.Credentials, decoder s } { xtv := string(val) - sv.SessionToken = ptr.String(xtv) + sv.Message = ptr.String(xtv) } default: @@ -1582,13 +2203,13 @@ func awsAwsquery_deserializeDocumentCredentials(v **types.Credentials, decoder s return nil } -func awsAwsquery_deserializeDocumentExpiredTokenException(v **types.ExpiredTokenException, decoder smithyxml.NodeDecoder) error { +func awsAwsquery_deserializeDocumentIDPRejectedClaimException(v **types.IDPRejectedClaimException, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } - var sv *types.ExpiredTokenException + var sv *types.IDPRejectedClaimException if *v == nil { - sv = &types.ExpiredTokenException{} + sv = &types.IDPRejectedClaimException{} } else { sv = *v } @@ -1631,13 +2252,13 @@ func awsAwsquery_deserializeDocumentExpiredTokenException(v **types.ExpiredToken return nil } -func awsAwsquery_deserializeDocumentFederatedUser(v **types.FederatedUser, decoder smithyxml.NodeDecoder) error { +func awsAwsquery_deserializeDocumentInvalidAuthorizationMessageException(v **types.InvalidAuthorizationMessageException, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } - var sv *types.FederatedUser + var sv *types.InvalidAuthorizationMessageException if *v == nil { - sv = &types.FederatedUser{} + sv = &types.InvalidAuthorizationMessageException{} } else { sv = *v } @@ -1653,20 +2274,7 @@ func awsAwsquery_deserializeDocumentFederatedUser(v **types.FederatedUser, decod originalDecoder := decoder decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) switch { - case strings.EqualFold("Arn", t.Name.Local): - val, err := decoder.Value() - if err != nil { - return err - } - if val == nil { - break - } - { - xtv := string(val) - sv.Arn = ptr.String(xtv) - } - - case strings.EqualFold("FederatedUserId", t.Name.Local): + case strings.EqualFold("message", t.Name.Local): val, err := decoder.Value() if err != nil { return err @@ -1676,7 +2284,7 @@ func awsAwsquery_deserializeDocumentFederatedUser(v **types.FederatedUser, decod } { xtv := string(val) - sv.FederatedUserId = ptr.String(xtv) + sv.Message = ptr.String(xtv) } default: @@ -1693,13 +2301,13 @@ func awsAwsquery_deserializeDocumentFederatedUser(v **types.FederatedUser, decod return nil } -func awsAwsquery_deserializeDocumentIDPCommunicationErrorException(v **types.IDPCommunicationErrorException, decoder smithyxml.NodeDecoder) error { +func awsAwsquery_deserializeDocumentInvalidIdentityTokenException(v **types.InvalidIdentityTokenException, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } - var sv *types.IDPCommunicationErrorException + var sv *types.InvalidIdentityTokenException if *v == nil { - sv = &types.IDPCommunicationErrorException{} + sv = &types.InvalidIdentityTokenException{} } else { sv = *v } @@ -1742,13 +2350,13 @@ func awsAwsquery_deserializeDocumentIDPCommunicationErrorException(v **types.IDP return nil } -func awsAwsquery_deserializeDocumentIDPRejectedClaimException(v **types.IDPRejectedClaimException, decoder smithyxml.NodeDecoder) error { +func awsAwsquery_deserializeDocumentJWTPayloadSizeExceededException(v **types.JWTPayloadSizeExceededException, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } - var sv *types.IDPRejectedClaimException + var sv *types.JWTPayloadSizeExceededException if *v == nil { - sv = &types.IDPRejectedClaimException{} + sv = &types.JWTPayloadSizeExceededException{} } else { sv = *v } @@ -1791,13 +2399,13 @@ func awsAwsquery_deserializeDocumentIDPRejectedClaimException(v **types.IDPRejec return nil } -func awsAwsquery_deserializeDocumentInvalidAuthorizationMessageException(v **types.InvalidAuthorizationMessageException, decoder smithyxml.NodeDecoder) error { +func awsAwsquery_deserializeDocumentMalformedPolicyDocumentException(v **types.MalformedPolicyDocumentException, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } - var sv *types.InvalidAuthorizationMessageException + var sv *types.MalformedPolicyDocumentException if *v == nil { - sv = &types.InvalidAuthorizationMessageException{} + sv = &types.MalformedPolicyDocumentException{} } else { sv = *v } @@ -1840,13 +2448,13 @@ func awsAwsquery_deserializeDocumentInvalidAuthorizationMessageException(v **typ return nil } -func awsAwsquery_deserializeDocumentInvalidIdentityTokenException(v **types.InvalidIdentityTokenException, decoder smithyxml.NodeDecoder) error { +func awsAwsquery_deserializeDocumentOutboundWebIdentityFederationDisabledException(v **types.OutboundWebIdentityFederationDisabledException, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } - var sv *types.InvalidIdentityTokenException + var sv *types.OutboundWebIdentityFederationDisabledException if *v == nil { - sv = &types.InvalidIdentityTokenException{} + sv = &types.OutboundWebIdentityFederationDisabledException{} } else { sv = *v } @@ -1889,13 +2497,13 @@ func awsAwsquery_deserializeDocumentInvalidIdentityTokenException(v **types.Inva return nil } -func awsAwsquery_deserializeDocumentMalformedPolicyDocumentException(v **types.MalformedPolicyDocumentException, decoder smithyxml.NodeDecoder) error { +func awsAwsquery_deserializeDocumentPackedPolicyTooLargeException(v **types.PackedPolicyTooLargeException, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } - var sv *types.MalformedPolicyDocumentException + var sv *types.PackedPolicyTooLargeException if *v == nil { - sv = &types.MalformedPolicyDocumentException{} + sv = &types.PackedPolicyTooLargeException{} } else { sv = *v } @@ -1938,13 +2546,13 @@ func awsAwsquery_deserializeDocumentMalformedPolicyDocumentException(v **types.M return nil } -func awsAwsquery_deserializeDocumentPackedPolicyTooLargeException(v **types.PackedPolicyTooLargeException, decoder smithyxml.NodeDecoder) error { +func awsAwsquery_deserializeDocumentRegionDisabledException(v **types.RegionDisabledException, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } - var sv *types.PackedPolicyTooLargeException + var sv *types.RegionDisabledException if *v == nil { - sv = &types.PackedPolicyTooLargeException{} + sv = &types.RegionDisabledException{} } else { sv = *v } @@ -1987,13 +2595,13 @@ func awsAwsquery_deserializeDocumentPackedPolicyTooLargeException(v **types.Pack return nil } -func awsAwsquery_deserializeDocumentRegionDisabledException(v **types.RegionDisabledException, decoder smithyxml.NodeDecoder) error { +func awsAwsquery_deserializeDocumentSessionDurationEscalationException(v **types.SessionDurationEscalationException, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) } - var sv *types.RegionDisabledException + var sv *types.SessionDurationEscalationException if *v == nil { - sv = &types.RegionDisabledException{} + sv = &types.SessionDurationEscalationException{} } else { sv = *v } @@ -2602,6 +3210,78 @@ func awsAwsquery_deserializeOpDocumentGetCallerIdentityOutput(v **GetCallerIdent return nil } +func awsAwsquery_deserializeOpDocumentGetDelegatedAccessTokenOutput(v **GetDelegatedAccessTokenOutput, decoder smithyxml.NodeDecoder) error { + if v == nil { + return fmt.Errorf("unexpected nil of type %T", v) + } + var sv *GetDelegatedAccessTokenOutput + if *v == nil { + sv = &GetDelegatedAccessTokenOutput{} + } else { + sv = *v + } + + for { + t, done, err := decoder.Token() + if err != nil { + return err + } + if done { + break + } + originalDecoder := decoder + decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) + switch { + case strings.EqualFold("AssumedPrincipal", t.Name.Local): + val, err := decoder.Value() + if err != nil { + return err + } + if val == nil { + break + } + { + xtv := string(val) + sv.AssumedPrincipal = ptr.String(xtv) + } + + case strings.EqualFold("Credentials", t.Name.Local): + nodeDecoder := smithyxml.WrapNodeDecoder(decoder.Decoder, t) + if err := awsAwsquery_deserializeDocumentCredentials(&sv.Credentials, nodeDecoder); err != nil { + return err + } + + case strings.EqualFold("PackedPolicySize", t.Name.Local): + val, err := decoder.Value() + if err != nil { + return err + } + if val == nil { + break + } + { + xtv := string(val) + i64, err := strconv.ParseInt(xtv, 10, 64) + if err != nil { + return err + } + sv.PackedPolicySize = ptr.Int32(int32(i64)) + } + + default: + // Do nothing and ignore the unexpected tag element + err = decoder.Decoder.Skip() + if err != nil { + return err + } + + } + decoder = originalDecoder + } + *v = sv + return nil +} + func awsAwsquery_deserializeOpDocumentGetFederationTokenOutput(v **GetFederationTokenOutput, decoder smithyxml.NodeDecoder) error { if v == nil { return fmt.Errorf("unexpected nil of type %T", v) @@ -2708,3 +3388,69 @@ func awsAwsquery_deserializeOpDocumentGetSessionTokenOutput(v **GetSessionTokenO *v = sv return nil } + +func awsAwsquery_deserializeOpDocumentGetWebIdentityTokenOutput(v **GetWebIdentityTokenOutput, decoder smithyxml.NodeDecoder) error { + if v == nil { + return fmt.Errorf("unexpected nil of type %T", v) + } + var sv *GetWebIdentityTokenOutput + if *v == nil { + sv = &GetWebIdentityTokenOutput{} + } else { + sv = *v + } + + for { + t, done, err := decoder.Token() + if err != nil { + return err + } + if done { + break + } + originalDecoder := decoder + decoder = smithyxml.WrapNodeDecoder(originalDecoder.Decoder, t) + switch { + case strings.EqualFold("Expiration", t.Name.Local): + val, err := decoder.Value() + if err != nil { + return err + } + if val == nil { + break + } + { + xtv := string(val) + t, err := smithytime.ParseDateTime(xtv) + if err != nil { + return err + } + sv.Expiration = ptr.Time(t) + } + + case strings.EqualFold("WebIdentityToken", t.Name.Local): + val, err := decoder.Value() + if err != nil { + return err + } + if val == nil { + break + } + { + xtv := string(val) + sv.WebIdentityToken = ptr.String(xtv) + } + + default: + // Do nothing and ignore the unexpected tag element + err = decoder.Decoder.Skip() + if err != nil { + return err + } + + } + decoder = originalDecoder + } + *v = sv + return nil +} diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/endpoints.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/endpoints.go index 945682e1a50..c8f9526c78a 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/endpoints.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/endpoints.go @@ -15,6 +15,7 @@ import ( smithy "github.com/aws/smithy-go" smithyauth "github.com/aws/smithy-go/auth" smithyendpoints "github.com/aws/smithy-go/endpoints" + "github.com/aws/smithy-go/endpoints/private/rulesfn" "github.com/aws/smithy-go/middleware" "github.com/aws/smithy-go/ptr" "github.com/aws/smithy-go/tracing" @@ -218,11 +219,15 @@ func resolveBaseEndpoint(cfg aws.Config, o *Options) { } } -func bindRegion(region string) *string { +func bindRegion(region string) (*string, error) { if region == "" { - return nil + return nil, nil + } + if !rulesfn.IsValidHostLabel(region, true) { + return nil, fmt.Errorf("invalid input region %s", region) } - return aws.String(endpoints.MapFIPSRegion(region)) + + return aws.String(endpoints.MapFIPSRegion(region)), nil } // EndpointParameters provides the parameters that influence how endpoints are @@ -1060,10 +1065,15 @@ type endpointParamsBinder interface { bindEndpointParams(*EndpointParameters) } -func bindEndpointParams(ctx context.Context, input interface{}, options Options) *EndpointParameters { +func bindEndpointParams(ctx context.Context, input interface{}, options Options) (*EndpointParameters, error) { params := &EndpointParameters{} - params.Region = bindRegion(options.Region) + region, err := bindRegion(options.Region) + if err != nil { + return nil, err + } + params.Region = region + params.UseDualStack = aws.Bool(options.EndpointOptions.UseDualStackEndpoint == aws.DualStackEndpointStateEnabled) params.UseFIPS = aws.Bool(options.EndpointOptions.UseFIPSEndpoint == aws.FIPSEndpointStateEnabled) params.Endpoint = options.BaseEndpoint @@ -1072,7 +1082,7 @@ func bindEndpointParams(ctx context.Context, input interface{}, options Options) b.bindEndpointParams(params) } - return params + return params, nil } type resolveEndpointV2Middleware struct { @@ -1102,7 +1112,10 @@ func (m *resolveEndpointV2Middleware) HandleFinalize(ctx context.Context, in mid return out, metadata, fmt.Errorf("expected endpoint resolver to not be nil") } - params := bindEndpointParams(ctx, getOperationInput(ctx), m.options) + params, err := bindEndpointParams(ctx, getOperationInput(ctx), m.options) + if err != nil { + return out, metadata, fmt.Errorf("failed to bind endpoint params, %w", err) + } endpt, err := timeOperationMetric(ctx, "client.call.resolve_endpoint_duration", func() (smithyendpoints.Endpoint, error) { return m.options.EndpointResolverV2.ResolveEndpoint(ctx, *params) diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/generated.json b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/generated.json index 935307771e2..e61823ea016 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/generated.json +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/generated.json @@ -17,8 +17,10 @@ "api_op_DecodeAuthorizationMessage.go", "api_op_GetAccessKeyInfo.go", "api_op_GetCallerIdentity.go", + "api_op_GetDelegatedAccessToken.go", "api_op_GetFederationToken.go", "api_op_GetSessionToken.go", + "api_op_GetWebIdentityToken.go", "auth.go", "deserializers.go", "doc.go", diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go index a4dbe82e4e2..22d9a94a02c 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go @@ -3,4 +3,4 @@ package sts // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.39.1" +const goModuleVersion = "1.41.3" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints/endpoints.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints/endpoints.go index 1ec1ecf6525..b2b933c566a 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints/endpoints.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints/endpoints.go @@ -359,6 +359,13 @@ var defaultPartitions = endpoints.Partitions{ { ID: "aws-eusc", Defaults: map[endpoints.DefaultKey]endpoints.Endpoint{ + { + Variant: endpoints.DualStackVariant, + }: { + Hostname: "sts.{region}.api.amazonwebservices.eu", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, { Variant: endpoints.FIPSVariant, }: { @@ -366,6 +373,13 @@ var defaultPartitions = endpoints.Partitions{ Protocols: []string{"https"}, SignatureVersions: []string{"v4"}, }, + { + Variant: endpoints.FIPSVariant | endpoints.DualStackVariant, + }: { + Hostname: "sts-fips.{region}.api.amazonwebservices.eu", + Protocols: []string{"https"}, + SignatureVersions: []string{"v4"}, + }, { Variant: 0, }: { diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/serializers.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/serializers.go index 96b222136bf..5e227387827 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/serializers.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/serializers.go @@ -502,6 +502,76 @@ func (m *awsAwsquery_serializeOpGetCallerIdentity) HandleSerialize(ctx context.C return next.HandleSerialize(ctx, in) } +type awsAwsquery_serializeOpGetDelegatedAccessToken struct { +} + +func (*awsAwsquery_serializeOpGetDelegatedAccessToken) ID() string { + return "OperationSerializer" +} + +func (m *awsAwsquery_serializeOpGetDelegatedAccessToken) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( + out middleware.SerializeOutput, metadata middleware.Metadata, err error, +) { + _, span := tracing.StartSpan(ctx, "OperationSerializer") + endTimer := startMetricTimer(ctx, "client.call.serialization_duration") + defer endTimer() + defer span.End() + request, ok := in.Request.(*smithyhttp.Request) + if !ok { + return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} + } + + input, ok := in.Parameters.(*GetDelegatedAccessTokenInput) + _ = input + if !ok { + return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} + } + + operationPath := "/" + if len(request.Request.URL.Path) == 0 { + request.Request.URL.Path = operationPath + } else { + request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) + if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { + request.Request.URL.Path += "/" + } + } + request.Request.Method = "POST" + httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) + if err != nil { + return out, metadata, &smithy.SerializationError{Err: err} + } + httpBindingEncoder.SetHeader("Content-Type").String("application/x-www-form-urlencoded") + + bodyWriter := bytes.NewBuffer(nil) + bodyEncoder := query.NewEncoder(bodyWriter) + body := bodyEncoder.Object() + body.Key("Action").String("GetDelegatedAccessToken") + body.Key("Version").String("2011-06-15") + + if err := awsAwsquery_serializeOpDocumentGetDelegatedAccessTokenInput(input, bodyEncoder.Value); err != nil { + return out, metadata, &smithy.SerializationError{Err: err} + } + + err = bodyEncoder.Encode() + if err != nil { + return out, metadata, &smithy.SerializationError{Err: err} + } + + if request, err = request.SetStream(bytes.NewReader(bodyWriter.Bytes())); err != nil { + return out, metadata, &smithy.SerializationError{Err: err} + } + + if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { + return out, metadata, &smithy.SerializationError{Err: err} + } + in.Request = request + + endTimer() + span.End() + return next.HandleSerialize(ctx, in) +} + type awsAwsquery_serializeOpGetFederationToken struct { } @@ -641,6 +711,76 @@ func (m *awsAwsquery_serializeOpGetSessionToken) HandleSerialize(ctx context.Con span.End() return next.HandleSerialize(ctx, in) } + +type awsAwsquery_serializeOpGetWebIdentityToken struct { +} + +func (*awsAwsquery_serializeOpGetWebIdentityToken) ID() string { + return "OperationSerializer" +} + +func (m *awsAwsquery_serializeOpGetWebIdentityToken) HandleSerialize(ctx context.Context, in middleware.SerializeInput, next middleware.SerializeHandler) ( + out middleware.SerializeOutput, metadata middleware.Metadata, err error, +) { + _, span := tracing.StartSpan(ctx, "OperationSerializer") + endTimer := startMetricTimer(ctx, "client.call.serialization_duration") + defer endTimer() + defer span.End() + request, ok := in.Request.(*smithyhttp.Request) + if !ok { + return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown transport type %T", in.Request)} + } + + input, ok := in.Parameters.(*GetWebIdentityTokenInput) + _ = input + if !ok { + return out, metadata, &smithy.SerializationError{Err: fmt.Errorf("unknown input parameters type %T", in.Parameters)} + } + + operationPath := "/" + if len(request.Request.URL.Path) == 0 { + request.Request.URL.Path = operationPath + } else { + request.Request.URL.Path = path.Join(request.Request.URL.Path, operationPath) + if request.Request.URL.Path != "/" && operationPath[len(operationPath)-1] == '/' { + request.Request.URL.Path += "/" + } + } + request.Request.Method = "POST" + httpBindingEncoder, err := httpbinding.NewEncoder(request.URL.Path, request.URL.RawQuery, request.Header) + if err != nil { + return out, metadata, &smithy.SerializationError{Err: err} + } + httpBindingEncoder.SetHeader("Content-Type").String("application/x-www-form-urlencoded") + + bodyWriter := bytes.NewBuffer(nil) + bodyEncoder := query.NewEncoder(bodyWriter) + body := bodyEncoder.Object() + body.Key("Action").String("GetWebIdentityToken") + body.Key("Version").String("2011-06-15") + + if err := awsAwsquery_serializeOpDocumentGetWebIdentityTokenInput(input, bodyEncoder.Value); err != nil { + return out, metadata, &smithy.SerializationError{Err: err} + } + + err = bodyEncoder.Encode() + if err != nil { + return out, metadata, &smithy.SerializationError{Err: err} + } + + if request, err = request.SetStream(bytes.NewReader(bodyWriter.Bytes())); err != nil { + return out, metadata, &smithy.SerializationError{Err: err} + } + + if request.Request, err = httpBindingEncoder.Encode(request.Request); err != nil { + return out, metadata, &smithy.SerializationError{Err: err} + } + in.Request = request + + endTimer() + span.End() + return next.HandleSerialize(ctx, in) +} func awsAwsquery_serializeDocumentPolicyDescriptorListType(v []types.PolicyDescriptorType, value query.Value) error { array := value.Array("member") @@ -733,6 +873,16 @@ func awsAwsquery_serializeDocumentTagListType(v []types.Tag, value query.Value) return nil } +func awsAwsquery_serializeDocumentWebIdentityTokenAudienceListType(v []string, value query.Value) error { + array := value.Array("member") + + for i := range v { + av := array.Value() + av.String(v[i]) + } + return nil +} + func awsAwsquery_serializeOpDocumentAssumeRoleInput(v *AssumeRoleInput, value query.Value) error { object := value.Object() _ = object @@ -946,6 +1096,18 @@ func awsAwsquery_serializeOpDocumentGetCallerIdentityInput(v *GetCallerIdentityI return nil } +func awsAwsquery_serializeOpDocumentGetDelegatedAccessTokenInput(v *GetDelegatedAccessTokenInput, value query.Value) error { + object := value.Object() + _ = object + + if v.TradeInToken != nil { + objectKey := object.Key("TradeInToken") + objectKey.String(*v.TradeInToken) + } + + return nil +} + func awsAwsquery_serializeOpDocumentGetFederationTokenInput(v *GetFederationTokenInput, value query.Value) error { object := value.Object() _ = object @@ -1003,3 +1165,34 @@ func awsAwsquery_serializeOpDocumentGetSessionTokenInput(v *GetSessionTokenInput return nil } + +func awsAwsquery_serializeOpDocumentGetWebIdentityTokenInput(v *GetWebIdentityTokenInput, value query.Value) error { + object := value.Object() + _ = object + + if v.Audience != nil { + objectKey := object.Key("Audience") + if err := awsAwsquery_serializeDocumentWebIdentityTokenAudienceListType(v.Audience, objectKey); err != nil { + return err + } + } + + if v.DurationSeconds != nil { + objectKey := object.Key("DurationSeconds") + objectKey.Integer(*v.DurationSeconds) + } + + if v.SigningAlgorithm != nil { + objectKey := object.Key("SigningAlgorithm") + objectKey.String(*v.SigningAlgorithm) + } + + if v.Tags != nil { + objectKey := object.Key("Tags") + if err := awsAwsquery_serializeDocumentTagListType(v.Tags, objectKey); err != nil { + return err + } + } + + return nil +} diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/types/errors.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/types/errors.go index 041629bba2c..70d99a220b8 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/types/errors.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/types/errors.go @@ -34,6 +34,33 @@ func (e *ExpiredTokenException) ErrorCode() string { } func (e *ExpiredTokenException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } +// The trade-in token provided in the request has expired and can no longer be +// exchanged for credentials. Request a new token and retry the operation. +type ExpiredTradeInTokenException struct { + Message *string + + ErrorCodeOverride *string + + noSmithyDocumentSerde +} + +func (e *ExpiredTradeInTokenException) Error() string { + return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) +} +func (e *ExpiredTradeInTokenException) ErrorMessage() string { + if e.Message == nil { + return "" + } + return *e.Message +} +func (e *ExpiredTradeInTokenException) ErrorCode() string { + if e == nil || e.ErrorCodeOverride == nil { + return "ExpiredTradeInTokenException" + } + return *e.ErrorCodeOverride +} +func (e *ExpiredTradeInTokenException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } + // The request could not be fulfilled because the identity provider (IDP) that was // asked to verify the incoming identity token could not be reached. This is often // a transient error caused by network conditions. Retry the request a limited @@ -152,6 +179,34 @@ func (e *InvalidIdentityTokenException) ErrorCode() string { } func (e *InvalidIdentityTokenException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } +// The requested token payload size exceeds the maximum allowed size. Reduce the +// number of request tags included in the GetWebIdentityToken API call to reduce +// the token payload size. +type JWTPayloadSizeExceededException struct { + Message *string + + ErrorCodeOverride *string + + noSmithyDocumentSerde +} + +func (e *JWTPayloadSizeExceededException) Error() string { + return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) +} +func (e *JWTPayloadSizeExceededException) ErrorMessage() string { + if e.Message == nil { + return "" + } + return *e.Message +} +func (e *JWTPayloadSizeExceededException) ErrorCode() string { + if e == nil || e.ErrorCodeOverride == nil { + return "JWTPayloadSizeExceededException" + } + return *e.ErrorCodeOverride +} +func (e *JWTPayloadSizeExceededException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } + // The request was rejected because the policy document was malformed. The error // message describes the specific error. type MalformedPolicyDocumentException struct { @@ -179,6 +234,36 @@ func (e *MalformedPolicyDocumentException) ErrorCode() string { } func (e *MalformedPolicyDocumentException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } +// The outbound web identity federation feature is not enabled for this account. +// To use this feature, you must first enable it through the Amazon Web Services +// Management Console or API. +type OutboundWebIdentityFederationDisabledException struct { + Message *string + + ErrorCodeOverride *string + + noSmithyDocumentSerde +} + +func (e *OutboundWebIdentityFederationDisabledException) Error() string { + return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) +} +func (e *OutboundWebIdentityFederationDisabledException) ErrorMessage() string { + if e.Message == nil { + return "" + } + return *e.Message +} +func (e *OutboundWebIdentityFederationDisabledException) ErrorCode() string { + if e == nil || e.ErrorCodeOverride == nil { + return "OutboundWebIdentityFederationDisabledException" + } + return *e.ErrorCodeOverride +} +func (e *OutboundWebIdentityFederationDisabledException) ErrorFault() smithy.ErrorFault { + return smithy.FaultClient +} + // The request was rejected because the total packed size of the session policies // and session tags combined was too large. An Amazon Web Services conversion // compresses the session policy document, session policy ARNs, and session tags @@ -221,7 +306,7 @@ func (e *PackedPolicyTooLargeException) ErrorFault() smithy.ErrorFault { return // console to activate STS in that region. For more information, see [Activating and Deactivating STS in an Amazon Web Services Region]in the IAM // User Guide. // -// [Activating and Deactivating STS in an Amazon Web Services Region]: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html +// [Activating and Deactivating STS in an Amazon Web Services Region]: https://docs.aws.amazon.com/IAM/latest/UserGuide/id_credentials_temp_enable-regions.html#sts-regions-activate-deactivate type RegionDisabledException struct { Message *string @@ -246,3 +331,33 @@ func (e *RegionDisabledException) ErrorCode() string { return *e.ErrorCodeOverride } func (e *RegionDisabledException) ErrorFault() smithy.ErrorFault { return smithy.FaultClient } + +// The requested token duration would extend the session beyond its original +// expiration time. You cannot use this operation to extend the lifetime of a +// session beyond what was granted when the session was originally created. +type SessionDurationEscalationException struct { + Message *string + + ErrorCodeOverride *string + + noSmithyDocumentSerde +} + +func (e *SessionDurationEscalationException) Error() string { + return fmt.Sprintf("%s: %s", e.ErrorCode(), e.ErrorMessage()) +} +func (e *SessionDurationEscalationException) ErrorMessage() string { + if e.Message == nil { + return "" + } + return *e.Message +} +func (e *SessionDurationEscalationException) ErrorCode() string { + if e == nil || e.ErrorCodeOverride == nil { + return "SessionDurationEscalationException" + } + return *e.ErrorCodeOverride +} +func (e *SessionDurationEscalationException) ErrorFault() smithy.ErrorFault { + return smithy.FaultClient +} diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/validators.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/validators.go index 1026e22118d..4d37dd22a1d 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/validators.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/validators.go @@ -130,6 +130,26 @@ func (m *validateOpGetAccessKeyInfo) HandleInitialize(ctx context.Context, in mi return next.HandleInitialize(ctx, in) } +type validateOpGetDelegatedAccessToken struct { +} + +func (*validateOpGetDelegatedAccessToken) ID() string { + return "OperationInputValidation" +} + +func (m *validateOpGetDelegatedAccessToken) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( + out middleware.InitializeOutput, metadata middleware.Metadata, err error, +) { + input, ok := in.Parameters.(*GetDelegatedAccessTokenInput) + if !ok { + return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) + } + if err := validateOpGetDelegatedAccessTokenInput(input); err != nil { + return out, metadata, err + } + return next.HandleInitialize(ctx, in) +} + type validateOpGetFederationToken struct { } @@ -150,6 +170,26 @@ func (m *validateOpGetFederationToken) HandleInitialize(ctx context.Context, in return next.HandleInitialize(ctx, in) } +type validateOpGetWebIdentityToken struct { +} + +func (*validateOpGetWebIdentityToken) ID() string { + return "OperationInputValidation" +} + +func (m *validateOpGetWebIdentityToken) HandleInitialize(ctx context.Context, in middleware.InitializeInput, next middleware.InitializeHandler) ( + out middleware.InitializeOutput, metadata middleware.Metadata, err error, +) { + input, ok := in.Parameters.(*GetWebIdentityTokenInput) + if !ok { + return out, metadata, fmt.Errorf("unknown input parameters type %T", in.Parameters) + } + if err := validateOpGetWebIdentityTokenInput(input); err != nil { + return out, metadata, err + } + return next.HandleInitialize(ctx, in) +} + func addOpAssumeRoleValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpAssumeRole{}, middleware.After) } @@ -174,10 +214,18 @@ func addOpGetAccessKeyInfoValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpGetAccessKeyInfo{}, middleware.After) } +func addOpGetDelegatedAccessTokenValidationMiddleware(stack *middleware.Stack) error { + return stack.Initialize.Add(&validateOpGetDelegatedAccessToken{}, middleware.After) +} + func addOpGetFederationTokenValidationMiddleware(stack *middleware.Stack) error { return stack.Initialize.Add(&validateOpGetFederationToken{}, middleware.After) } +func addOpGetWebIdentityTokenValidationMiddleware(stack *middleware.Stack) error { + return stack.Initialize.Add(&validateOpGetWebIdentityToken{}, middleware.After) +} + func validateTag(v *types.Tag) error { if v == nil { return nil @@ -326,6 +374,21 @@ func validateOpGetAccessKeyInfoInput(v *GetAccessKeyInfoInput) error { } } +func validateOpGetDelegatedAccessTokenInput(v *GetDelegatedAccessTokenInput) error { + if v == nil { + return nil + } + invalidParams := smithy.InvalidParamsError{Context: "GetDelegatedAccessTokenInput"} + if v.TradeInToken == nil { + invalidParams.Add(smithy.NewErrParamRequired("TradeInToken")) + } + if invalidParams.Len() > 0 { + return invalidParams + } else { + return nil + } +} + func validateOpGetFederationTokenInput(v *GetFederationTokenInput) error { if v == nil { return nil @@ -345,3 +408,26 @@ func validateOpGetFederationTokenInput(v *GetFederationTokenInput) error { return nil } } + +func validateOpGetWebIdentityTokenInput(v *GetWebIdentityTokenInput) error { + if v == nil { + return nil + } + invalidParams := smithy.InvalidParamsError{Context: "GetWebIdentityTokenInput"} + if v.Audience == nil { + invalidParams.Add(smithy.NewErrParamRequired("Audience")) + } + if v.SigningAlgorithm == nil { + invalidParams.Add(smithy.NewErrParamRequired("SigningAlgorithm")) + } + if v.Tags != nil { + if err := validateTagListType(v.Tags); err != nil { + invalidParams.AddNested("Tags", err.(smithy.InvalidParamsError)) + } + } + if invalidParams.Len() > 0 { + return invalidParams + } else { + return nil + } +} diff --git a/vendor/github.com/aws/smithy-go/CHANGELOG.md b/vendor/github.com/aws/smithy-go/CHANGELOG.md index 8193f4b3964..80af245f087 100644 --- a/vendor/github.com/aws/smithy-go/CHANGELOG.md +++ b/vendor/github.com/aws/smithy-go/CHANGELOG.md @@ -1,3 +1,12 @@ +# Release (2025-12-01) + +## General Highlights +* **Dependency Update**: Updated to the latest SDK module versions + +## Module Highlights +* `github.com/aws/smithy-go`: v1.24.0 + * **Feature**: Improve allocation footprint of the middleware stack. This should convey a ~10% reduction in allocations per SDK request. + # Release (2025-11-03) ## General Highlights diff --git a/vendor/github.com/aws/smithy-go/go_module_metadata.go b/vendor/github.com/aws/smithy-go/go_module_metadata.go index 263059014b8..b6c4c2f51cf 100644 --- a/vendor/github.com/aws/smithy-go/go_module_metadata.go +++ b/vendor/github.com/aws/smithy-go/go_module_metadata.go @@ -3,4 +3,4 @@ package smithy // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.23.2" +const goModuleVersion = "1.24.0" diff --git a/vendor/github.com/aws/smithy-go/middleware/step_build.go b/vendor/github.com/aws/smithy-go/middleware/step_build.go index cc7fe89c94a..db8c26715cb 100644 --- a/vendor/github.com/aws/smithy-go/middleware/step_build.go +++ b/vendor/github.com/aws/smithy-go/middleware/step_build.go @@ -1,7 +1,9 @@ +// Code generated by smithy-go/middleware/generate.go DO NOT EDIT. package middleware import ( "context" + "fmt" ) // BuildInput provides the input parameters for the BuildMiddleware to consume. @@ -25,14 +27,14 @@ type BuildHandler interface { } // BuildMiddleware provides the interface for middleware specific to the -// serialize step. Delegates to the next BuildHandler for further +// build step. Delegates to the next BuildHandler for further // processing. type BuildMiddleware interface { - // Unique ID for the middleware in theBuildStep. The step does not allow - // duplicate IDs. + // ID returns a unique ID for the middleware in the BuildStep. The step does not + // allow duplicate IDs. ID() string - // Invokes the middleware behavior which must delegate to the next handler + // HandleBuild invokes the middleware behavior which must delegate to the next handler // for the middleware chain to continue. The method must return a result or // error to its caller. HandleBuild(ctx context.Context, in BuildInput, next BuildHandler) ( @@ -54,7 +56,9 @@ type buildMiddlewareFunc struct { id string // Middleware function to be called. - fn func(context.Context, BuildInput, BuildHandler) (BuildOutput, Metadata, error) + fn func(context.Context, BuildInput, BuildHandler) ( + BuildOutput, Metadata, error, + ) } // ID returns the unique ID for the middleware. @@ -69,23 +73,22 @@ func (s buildMiddlewareFunc) HandleBuild(ctx context.Context, in BuildInput, nex var _ BuildMiddleware = (buildMiddlewareFunc{}) -// BuildStep provides the ordered grouping of BuildMiddleware to be invoked on -// a handler. +// BuildStep provides the ordered grouping of BuildMiddleware to be +// invoked on a handler. type BuildStep struct { - ids *orderedIDs + head *decoratedBuildHandler + tail *decoratedBuildHandler } -// NewBuildStep returns a BuildStep ready to have middleware for -// initialization added to it. +// NewBuildStep returns an BuildStep ready to have middleware for +// build added to it. func NewBuildStep() *BuildStep { - return &BuildStep{ - ids: newOrderedIDs(baseOrderedItems), - } + return &BuildStep{} } var _ Middleware = (*BuildStep)(nil) -// ID returns the unique name of the step as a middleware. +// ID returns the unique ID of the step as a middleware. func (s *BuildStep) ID() string { return "Build stack step" } @@ -97,77 +100,161 @@ func (s *BuildStep) ID() string { func (s *BuildStep) HandleMiddleware(ctx context.Context, in interface{}, next Handler) ( out interface{}, metadata Metadata, err error, ) { - order := s.ids.GetOrder() - - var h BuildHandler = buildWrapHandler{Next: next} - for i := len(order) - 1; i >= 0; i-- { - h = decoratedBuildHandler{ - Next: h, - With: order[i].(BuildMiddleware), - } - } - sIn := BuildInput{ Request: in, } - res, metadata, err := h.HandleBuild(ctx, sIn) + wh := &buildWrapHandler{next} + if s.head == nil { + res, metadata, err := wh.HandleBuild(ctx, sIn) + return res.Result, metadata, err + } + + s.tail.Next = wh + res, metadata, err := s.head.HandleBuild(ctx, sIn) return res.Result, metadata, err } // Get retrieves the middleware identified by id. If the middleware is not present, returns false. func (s *BuildStep) Get(id string) (BuildMiddleware, bool) { - get, ok := s.ids.Get(id) - if !ok { + found, _ := s.get(id) + if found == nil { return nil, false } - return get.(BuildMiddleware), ok + + return found.With, true } // Add injects the middleware to the relative position of the middleware group. -// Returns an error if the middleware already exists. +// +// Add never returns an error. It used to for duplicate phases but this +// behavior has since been removed as part of a performance optimization. The +// return value from Add can be ignored. func (s *BuildStep) Add(m BuildMiddleware, pos RelativePosition) error { - return s.ids.Add(m, pos) + if s.head == nil { + s.head = &decoratedBuildHandler{nil, m} + s.tail = s.head + return nil + } + + if pos == Before { + s.head = &decoratedBuildHandler{s.head, m} + } else { + tail := &decoratedBuildHandler{nil, m} + s.tail.Next = tail + s.tail = tail + } + + return nil } -// Insert injects the middleware relative to an existing middleware id. -// Returns an error if the original middleware does not exist, or the middleware +// Insert injects the middleware relative to an existing middleware ID. +// Returns error if the original middleware does not exist, or the middleware // being added already exists. func (s *BuildStep) Insert(m BuildMiddleware, relativeTo string, pos RelativePosition) error { - return s.ids.Insert(m, relativeTo, pos) + found, prev := s.get(relativeTo) + if found == nil { + return fmt.Errorf("not found: %s", m.ID()) + } + + if pos == Before { + if prev == nil { // at the front + s.head = &decoratedBuildHandler{s.head, m} + } else { // somewhere in the middle + prev.Next = &decoratedBuildHandler{found, m} + } + } else { + if found.Next == nil { // at the end + tail := &decoratedBuildHandler{nil, m} + s.tail.Next = tail + s.tail = tail + } else { // somewhere in the middle + found.Next = &decoratedBuildHandler{found.Next, m} + } + } + + return nil } // Swap removes the middleware by id, replacing it with the new middleware. -// Returns the middleware removed, or an error if the middleware to be removed +// Returns the middleware removed, or error if the middleware to be removed // doesn't exist. func (s *BuildStep) Swap(id string, m BuildMiddleware) (BuildMiddleware, error) { - removed, err := s.ids.Swap(id, m) - if err != nil { - return nil, err + found, _ := s.get(id) + if found == nil { + return nil, fmt.Errorf("not found: %s", m.ID()) } - return removed.(BuildMiddleware), nil + swapped := found.With + found.With = m + return swapped, nil } // Remove removes the middleware by id. Returns error if the middleware // doesn't exist. func (s *BuildStep) Remove(id string) (BuildMiddleware, error) { - removed, err := s.ids.Remove(id) - if err != nil { - return nil, err + found, prev := s.get(id) + if found == nil { + return nil, fmt.Errorf("not found: %s", id) } - return removed.(BuildMiddleware), nil + if s.head == s.tail { // it's the only one + s.head = nil + s.tail = nil + } else if found == s.head { // at the front + s.head = s.head.Next.(*decoratedBuildHandler) + } else if found == s.tail { // at the end + prev.Next = nil + s.tail = prev + } else { + prev.Next = found.Next // somewhere in the middle + } + + return found.With, nil } // List returns a list of the middleware in the step. func (s *BuildStep) List() []string { - return s.ids.List() + var ids []string + for h := s.head; h != nil; { + ids = append(ids, h.With.ID()) + if h.Next == nil { + break + } + + // once executed, tail.Next of the list will be set to an + // *buildWrapHandler, make sure to check for that + if hnext, ok := h.Next.(*decoratedBuildHandler); ok { + h = hnext + } else { + break + } + } + return ids } // Clear removes all middleware in the step. func (s *BuildStep) Clear() { - s.ids.Clear() + s.head = nil + s.tail = nil +} + +func (s *BuildStep) get(id string) (found, prev *decoratedBuildHandler) { + for h := s.head; h != nil; { + if h.With.ID() == id { + found = h + return + } + prev = h + if h.Next == nil { + return + } + + // once executed, tail.Next of the list will be set to an + // *buildWrapHandler + h, _ = h.Next.(*decoratedBuildHandler) + } + return } type buildWrapHandler struct { @@ -176,7 +263,7 @@ type buildWrapHandler struct { var _ BuildHandler = (*buildWrapHandler)(nil) -// Implements BuildHandler, converts types and delegates to underlying +// HandleBuild implements BuildHandler, converts types and delegates to underlying // generic handler. func (w buildWrapHandler) HandleBuild(ctx context.Context, in BuildInput) ( out BuildOutput, metadata Metadata, err error, @@ -200,12 +287,12 @@ func (h decoratedBuildHandler) HandleBuild(ctx context.Context, in BuildInput) ( return h.With.HandleBuild(ctx, in, h.Next) } -// BuildHandlerFunc provides a wrapper around a function to be used as a build middleware handler. +// BuildHandlerFunc provides a wrapper around a function to be used as buildMiddleware. type BuildHandlerFunc func(context.Context, BuildInput) (BuildOutput, Metadata, error) -// HandleBuild invokes the wrapped function with the provided arguments. -func (b BuildHandlerFunc) HandleBuild(ctx context.Context, in BuildInput) (BuildOutput, Metadata, error) { - return b(ctx, in) +// HandleBuild calls the wrapped function with the provided arguments. +func (f BuildHandlerFunc) HandleBuild(ctx context.Context, in BuildInput) (BuildOutput, Metadata, error) { + return f(ctx, in) } var _ BuildHandler = BuildHandlerFunc(nil) diff --git a/vendor/github.com/aws/smithy-go/middleware/step_deserialize.go b/vendor/github.com/aws/smithy-go/middleware/step_deserialize.go index 9a6679a59b3..1f337f2dbc9 100644 --- a/vendor/github.com/aws/smithy-go/middleware/step_deserialize.go +++ b/vendor/github.com/aws/smithy-go/middleware/step_deserialize.go @@ -1,7 +1,9 @@ +// Code generated by smithy-go/middleware/generate.go DO NOT EDIT. package middleware import ( "context" + "fmt" ) // DeserializeInput provides the input parameters for the DeserializeInput to @@ -11,10 +13,7 @@ type DeserializeInput struct { Request interface{} } -// DeserializeOutput provides the result returned by the next -// DeserializeHandler. The DeserializeMiddleware should deserialize the -// RawResponse into a Result that can be consumed by middleware higher up in -// the stack. +// DeserializeOutput provides the result returned by the next DeserializeHandler. type DeserializeOutput struct { RawResponse interface{} Result interface{} @@ -29,7 +28,7 @@ type DeserializeHandler interface { } // DeserializeMiddleware provides the interface for middleware specific to the -// serialize step. Delegates to the next DeserializeHandler for further +// deserialize step. Delegates to the next DeserializeHandler for further // processing. type DeserializeMiddleware interface { // ID returns a unique ID for the middleware in the DeserializeStep. The step does not @@ -44,8 +43,8 @@ type DeserializeMiddleware interface { ) } -// DeserializeMiddlewareFunc returns a DeserializeMiddleware with the unique ID -// provided, and the func to be invoked. +// DeserializeMiddlewareFunc returns a DeserializeMiddleware with the unique ID provided, +// and the func to be invoked. func DeserializeMiddlewareFunc(id string, fn func(context.Context, DeserializeInput, DeserializeHandler) (DeserializeOutput, Metadata, error)) DeserializeMiddleware { return deserializeMiddlewareFunc{ id: id, @@ -78,16 +77,14 @@ var _ DeserializeMiddleware = (deserializeMiddlewareFunc{}) // DeserializeStep provides the ordered grouping of DeserializeMiddleware to be // invoked on a handler. type DeserializeStep struct { - ids *orderedIDs + head *decoratedDeserializeHandler + tail *decoratedDeserializeHandler } -// NewDeserializeStep returns a DeserializeStep ready to have middleware for -// initialization added to it. +// NewDeserializeStep returns an DeserializeStep ready to have middleware for +// deserialize added to it. func NewDeserializeStep() *DeserializeStep { - return &DeserializeStep{ - // downstream SDK typically has larger Deserialize step - ids: newOrderedIDs(baseOrderedItems * 2), - } + return &DeserializeStep{} } var _ Middleware = (*DeserializeStep)(nil) @@ -104,77 +101,161 @@ func (s *DeserializeStep) ID() string { func (s *DeserializeStep) HandleMiddleware(ctx context.Context, in interface{}, next Handler) ( out interface{}, metadata Metadata, err error, ) { - order := s.ids.GetOrder() - - var h DeserializeHandler = deserializeWrapHandler{Next: next} - for i := len(order) - 1; i >= 0; i-- { - h = decoratedDeserializeHandler{ - Next: h, - With: order[i].(DeserializeMiddleware), - } - } - sIn := DeserializeInput{ Request: in, } - res, metadata, err := h.HandleDeserialize(ctx, sIn) + wh := &deserializeWrapHandler{next} + if s.head == nil { + res, metadata, err := wh.HandleDeserialize(ctx, sIn) + return res.Result, metadata, err + } + + s.tail.Next = wh + res, metadata, err := s.head.HandleDeserialize(ctx, sIn) return res.Result, metadata, err } // Get retrieves the middleware identified by id. If the middleware is not present, returns false. func (s *DeserializeStep) Get(id string) (DeserializeMiddleware, bool) { - get, ok := s.ids.Get(id) - if !ok { + found, _ := s.get(id) + if found == nil { return nil, false } - return get.(DeserializeMiddleware), ok + + return found.With, true } // Add injects the middleware to the relative position of the middleware group. -// Returns an error if the middleware already exists. +// +// Add never returns an error. It used to for duplicate phases but this +// behavior has since been removed as part of a performance optimization. The +// return value from Add can be ignored. func (s *DeserializeStep) Add(m DeserializeMiddleware, pos RelativePosition) error { - return s.ids.Add(m, pos) + if s.head == nil { + s.head = &decoratedDeserializeHandler{nil, m} + s.tail = s.head + return nil + } + + if pos == Before { + s.head = &decoratedDeserializeHandler{s.head, m} + } else { + tail := &decoratedDeserializeHandler{nil, m} + s.tail.Next = tail + s.tail = tail + } + + return nil } // Insert injects the middleware relative to an existing middleware ID. // Returns error if the original middleware does not exist, or the middleware // being added already exists. func (s *DeserializeStep) Insert(m DeserializeMiddleware, relativeTo string, pos RelativePosition) error { - return s.ids.Insert(m, relativeTo, pos) + found, prev := s.get(relativeTo) + if found == nil { + return fmt.Errorf("not found: %s", m.ID()) + } + + if pos == Before { + if prev == nil { // at the front + s.head = &decoratedDeserializeHandler{s.head, m} + } else { // somewhere in the middle + prev.Next = &decoratedDeserializeHandler{found, m} + } + } else { + if found.Next == nil { // at the end + tail := &decoratedDeserializeHandler{nil, m} + s.tail.Next = tail + s.tail = tail + } else { // somewhere in the middle + found.Next = &decoratedDeserializeHandler{found.Next, m} + } + } + + return nil } // Swap removes the middleware by id, replacing it with the new middleware. // Returns the middleware removed, or error if the middleware to be removed // doesn't exist. func (s *DeserializeStep) Swap(id string, m DeserializeMiddleware) (DeserializeMiddleware, error) { - removed, err := s.ids.Swap(id, m) - if err != nil { - return nil, err + found, _ := s.get(id) + if found == nil { + return nil, fmt.Errorf("not found: %s", m.ID()) } - return removed.(DeserializeMiddleware), nil + swapped := found.With + found.With = m + return swapped, nil } // Remove removes the middleware by id. Returns error if the middleware // doesn't exist. func (s *DeserializeStep) Remove(id string) (DeserializeMiddleware, error) { - removed, err := s.ids.Remove(id) - if err != nil { - return nil, err + found, prev := s.get(id) + if found == nil { + return nil, fmt.Errorf("not found: %s", id) + } + + if s.head == s.tail { // it's the only one + s.head = nil + s.tail = nil + } else if found == s.head { // at the front + s.head = s.head.Next.(*decoratedDeserializeHandler) + } else if found == s.tail { // at the end + prev.Next = nil + s.tail = prev + } else { + prev.Next = found.Next // somewhere in the middle } - return removed.(DeserializeMiddleware), nil + return found.With, nil } // List returns a list of the middleware in the step. func (s *DeserializeStep) List() []string { - return s.ids.List() + var ids []string + for h := s.head; h != nil; { + ids = append(ids, h.With.ID()) + if h.Next == nil { + break + } + + // once executed, tail.Next of the list will be set to an + // *deserializeWrapHandler, make sure to check for that + if hnext, ok := h.Next.(*decoratedDeserializeHandler); ok { + h = hnext + } else { + break + } + } + return ids } // Clear removes all middleware in the step. func (s *DeserializeStep) Clear() { - s.ids.Clear() + s.head = nil + s.tail = nil +} + +func (s *DeserializeStep) get(id string) (found, prev *decoratedDeserializeHandler) { + for h := s.head; h != nil; { + if h.With.ID() == id { + found = h + return + } + prev = h + if h.Next == nil { + return + } + + // once executed, tail.Next of the list will be set to an + // *deserializeWrapHandler + h, _ = h.Next.(*decoratedDeserializeHandler) + } + return } type deserializeWrapHandler struct { @@ -188,9 +269,10 @@ var _ DeserializeHandler = (*deserializeWrapHandler)(nil) func (w deserializeWrapHandler) HandleDeserialize(ctx context.Context, in DeserializeInput) ( out DeserializeOutput, metadata Metadata, err error, ) { - resp, metadata, err := w.Next.Handle(ctx, in.Request) + res, metadata, err := w.Next.Handle(ctx, in.Request) return DeserializeOutput{ - RawResponse: resp, + RawResponse: res, + Result: nil, }, metadata, err } @@ -207,12 +289,12 @@ func (h decoratedDeserializeHandler) HandleDeserialize(ctx context.Context, in D return h.With.HandleDeserialize(ctx, in, h.Next) } -// DeserializeHandlerFunc provides a wrapper around a function to be used as a deserialize middleware handler. +// DeserializeHandlerFunc provides a wrapper around a function to be used as deserializeMiddleware. type DeserializeHandlerFunc func(context.Context, DeserializeInput) (DeserializeOutput, Metadata, error) -// HandleDeserialize invokes the wrapped function with the given arguments. -func (d DeserializeHandlerFunc) HandleDeserialize(ctx context.Context, in DeserializeInput) (DeserializeOutput, Metadata, error) { - return d(ctx, in) +// HandleDeserialize calls the wrapped function with the provided arguments. +func (f DeserializeHandlerFunc) HandleDeserialize(ctx context.Context, in DeserializeInput) (DeserializeOutput, Metadata, error) { + return f(ctx, in) } var _ DeserializeHandler = DeserializeHandlerFunc(nil) diff --git a/vendor/github.com/aws/smithy-go/middleware/step_finalize.go b/vendor/github.com/aws/smithy-go/middleware/step_finalize.go index 76eab249093..1a0ad9fb88b 100644 --- a/vendor/github.com/aws/smithy-go/middleware/step_finalize.go +++ b/vendor/github.com/aws/smithy-go/middleware/step_finalize.go @@ -1,6 +1,10 @@ +// Code generated by smithy-go/middleware/generate.go DO NOT EDIT. package middleware -import "context" +import ( + "context" + "fmt" +) // FinalizeInput provides the input parameters for the FinalizeMiddleware to // consume. FinalizeMiddleware may modify the Request value before forwarding @@ -23,7 +27,7 @@ type FinalizeHandler interface { } // FinalizeMiddleware provides the interface for middleware specific to the -// serialize step. Delegates to the next FinalizeHandler for further +// finalize step. Delegates to the next FinalizeHandler for further // processing. type FinalizeMiddleware interface { // ID returns a unique ID for the middleware in the FinalizeStep. The step does not @@ -38,8 +42,8 @@ type FinalizeMiddleware interface { ) } -// FinalizeMiddlewareFunc returns a FinalizeMiddleware with the unique ID -// provided, and the func to be invoked. +// FinalizeMiddlewareFunc returns a FinalizeMiddleware with the unique ID provided, +// and the func to be invoked. func FinalizeMiddlewareFunc(id string, fn func(context.Context, FinalizeInput, FinalizeHandler) (FinalizeOutput, Metadata, error)) FinalizeMiddleware { return finalizeMiddlewareFunc{ id: id, @@ -72,21 +76,19 @@ var _ FinalizeMiddleware = (finalizeMiddlewareFunc{}) // FinalizeStep provides the ordered grouping of FinalizeMiddleware to be // invoked on a handler. type FinalizeStep struct { - ids *orderedIDs + head *decoratedFinalizeHandler + tail *decoratedFinalizeHandler } -// NewFinalizeStep returns a FinalizeStep ready to have middleware for -// initialization added to it. +// NewFinalizeStep returns an FinalizeStep ready to have middleware for +// finalize added to it. func NewFinalizeStep() *FinalizeStep { - return &FinalizeStep{ - // downstream SDK typically has larger Finalize step - ids: newOrderedIDs(baseOrderedItems * 2), - } + return &FinalizeStep{} } var _ Middleware = (*FinalizeStep)(nil) -// ID returns the unique id of the step as a middleware. +// ID returns the unique ID of the step as a middleware. func (s *FinalizeStep) ID() string { return "Finalize stack step" } @@ -98,77 +100,161 @@ func (s *FinalizeStep) ID() string { func (s *FinalizeStep) HandleMiddleware(ctx context.Context, in interface{}, next Handler) ( out interface{}, metadata Metadata, err error, ) { - order := s.ids.GetOrder() - - var h FinalizeHandler = finalizeWrapHandler{Next: next} - for i := len(order) - 1; i >= 0; i-- { - h = decoratedFinalizeHandler{ - Next: h, - With: order[i].(FinalizeMiddleware), - } - } - sIn := FinalizeInput{ Request: in, } - res, metadata, err := h.HandleFinalize(ctx, sIn) + wh := &finalizeWrapHandler{next} + if s.head == nil { + res, metadata, err := wh.HandleFinalize(ctx, sIn) + return res.Result, metadata, err + } + + s.tail.Next = wh + res, metadata, err := s.head.HandleFinalize(ctx, sIn) return res.Result, metadata, err } // Get retrieves the middleware identified by id. If the middleware is not present, returns false. func (s *FinalizeStep) Get(id string) (FinalizeMiddleware, bool) { - get, ok := s.ids.Get(id) - if !ok { + found, _ := s.get(id) + if found == nil { return nil, false } - return get.(FinalizeMiddleware), ok + + return found.With, true } // Add injects the middleware to the relative position of the middleware group. -// Returns an error if the middleware already exists. +// +// Add never returns an error. It used to for duplicate phases but this +// behavior has since been removed as part of a performance optimization. The +// return value from Add can be ignored. func (s *FinalizeStep) Add(m FinalizeMiddleware, pos RelativePosition) error { - return s.ids.Add(m, pos) + if s.head == nil { + s.head = &decoratedFinalizeHandler{nil, m} + s.tail = s.head + return nil + } + + if pos == Before { + s.head = &decoratedFinalizeHandler{s.head, m} + } else { + tail := &decoratedFinalizeHandler{nil, m} + s.tail.Next = tail + s.tail = tail + } + + return nil } // Insert injects the middleware relative to an existing middleware ID. // Returns error if the original middleware does not exist, or the middleware // being added already exists. func (s *FinalizeStep) Insert(m FinalizeMiddleware, relativeTo string, pos RelativePosition) error { - return s.ids.Insert(m, relativeTo, pos) + found, prev := s.get(relativeTo) + if found == nil { + return fmt.Errorf("not found: %s", m.ID()) + } + + if pos == Before { + if prev == nil { // at the front + s.head = &decoratedFinalizeHandler{s.head, m} + } else { // somewhere in the middle + prev.Next = &decoratedFinalizeHandler{found, m} + } + } else { + if found.Next == nil { // at the end + tail := &decoratedFinalizeHandler{nil, m} + s.tail.Next = tail + s.tail = tail + } else { // somewhere in the middle + found.Next = &decoratedFinalizeHandler{found.Next, m} + } + } + + return nil } // Swap removes the middleware by id, replacing it with the new middleware. // Returns the middleware removed, or error if the middleware to be removed // doesn't exist. func (s *FinalizeStep) Swap(id string, m FinalizeMiddleware) (FinalizeMiddleware, error) { - removed, err := s.ids.Swap(id, m) - if err != nil { - return nil, err + found, _ := s.get(id) + if found == nil { + return nil, fmt.Errorf("not found: %s", m.ID()) } - return removed.(FinalizeMiddleware), nil + swapped := found.With + found.With = m + return swapped, nil } // Remove removes the middleware by id. Returns error if the middleware // doesn't exist. func (s *FinalizeStep) Remove(id string) (FinalizeMiddleware, error) { - removed, err := s.ids.Remove(id) - if err != nil { - return nil, err + found, prev := s.get(id) + if found == nil { + return nil, fmt.Errorf("not found: %s", id) + } + + if s.head == s.tail { // it's the only one + s.head = nil + s.tail = nil + } else if found == s.head { // at the front + s.head = s.head.Next.(*decoratedFinalizeHandler) + } else if found == s.tail { // at the end + prev.Next = nil + s.tail = prev + } else { + prev.Next = found.Next // somewhere in the middle } - return removed.(FinalizeMiddleware), nil + return found.With, nil } // List returns a list of the middleware in the step. func (s *FinalizeStep) List() []string { - return s.ids.List() + var ids []string + for h := s.head; h != nil; { + ids = append(ids, h.With.ID()) + if h.Next == nil { + break + } + + // once executed, tail.Next of the list will be set to an + // *finalizeWrapHandler, make sure to check for that + if hnext, ok := h.Next.(*decoratedFinalizeHandler); ok { + h = hnext + } else { + break + } + } + return ids } // Clear removes all middleware in the step. func (s *FinalizeStep) Clear() { - s.ids.Clear() + s.head = nil + s.tail = nil +} + +func (s *FinalizeStep) get(id string) (found, prev *decoratedFinalizeHandler) { + for h := s.head; h != nil; { + if h.With.ID() == id { + found = h + return + } + prev = h + if h.Next == nil { + return + } + + // once executed, tail.Next of the list will be set to an + // *finalizeWrapHandler + h, _ = h.Next.(*decoratedFinalizeHandler) + } + return } type finalizeWrapHandler struct { @@ -201,10 +287,10 @@ func (h decoratedFinalizeHandler) HandleFinalize(ctx context.Context, in Finaliz return h.With.HandleFinalize(ctx, in, h.Next) } -// FinalizeHandlerFunc provides a wrapper around a function to be used as a finalize middleware handler. +// FinalizeHandlerFunc provides a wrapper around a function to be used as finalizeMiddleware. type FinalizeHandlerFunc func(context.Context, FinalizeInput) (FinalizeOutput, Metadata, error) -// HandleFinalize invokes the wrapped function with the given arguments. +// HandleFinalize calls the wrapped function with the provided arguments. func (f FinalizeHandlerFunc) HandleFinalize(ctx context.Context, in FinalizeInput) (FinalizeOutput, Metadata, error) { return f(ctx, in) } diff --git a/vendor/github.com/aws/smithy-go/middleware/step_initialize.go b/vendor/github.com/aws/smithy-go/middleware/step_initialize.go index 312be3a331e..446f3b7bb9c 100644 --- a/vendor/github.com/aws/smithy-go/middleware/step_initialize.go +++ b/vendor/github.com/aws/smithy-go/middleware/step_initialize.go @@ -1,10 +1,15 @@ +// Code generated by smithy-go/middleware/generate.go DO NOT EDIT. package middleware -import "context" +import ( + "context" + "fmt" +) // InitializeInput wraps the input parameters for the InitializeMiddlewares to // consume. InitializeMiddleware may modify the parameter value before // forwarding it along to the next InitializeHandler. + type InitializeInput struct { Parameters interface{} } @@ -72,15 +77,14 @@ var _ InitializeMiddleware = (initializeMiddlewareFunc{}) // InitializeStep provides the ordered grouping of InitializeMiddleware to be // invoked on a handler. type InitializeStep struct { - ids *orderedIDs + head *decoratedInitializeHandler + tail *decoratedInitializeHandler } // NewInitializeStep returns an InitializeStep ready to have middleware for -// initialization added to it. +// initialize added to it. func NewInitializeStep() *InitializeStep { - return &InitializeStep{ - ids: newOrderedIDs(baseOrderedItems), - } + return &InitializeStep{} } var _ Middleware = (*InitializeStep)(nil) @@ -97,77 +101,161 @@ func (s *InitializeStep) ID() string { func (s *InitializeStep) HandleMiddleware(ctx context.Context, in interface{}, next Handler) ( out interface{}, metadata Metadata, err error, ) { - order := s.ids.GetOrder() - - var h InitializeHandler = initializeWrapHandler{Next: next} - for i := len(order) - 1; i >= 0; i-- { - h = decoratedInitializeHandler{ - Next: h, - With: order[i].(InitializeMiddleware), - } - } - sIn := InitializeInput{ Parameters: in, } - res, metadata, err := h.HandleInitialize(ctx, sIn) + wh := &initializeWrapHandler{next} + if s.head == nil { + res, metadata, err := wh.HandleInitialize(ctx, sIn) + return res.Result, metadata, err + } + + s.tail.Next = wh + res, metadata, err := s.head.HandleInitialize(ctx, sIn) return res.Result, metadata, err } // Get retrieves the middleware identified by id. If the middleware is not present, returns false. func (s *InitializeStep) Get(id string) (InitializeMiddleware, bool) { - get, ok := s.ids.Get(id) - if !ok { + found, _ := s.get(id) + if found == nil { return nil, false } - return get.(InitializeMiddleware), ok + + return found.With, true } // Add injects the middleware to the relative position of the middleware group. -// Returns an error if the middleware already exists. +// +// Add never returns an error. It used to for duplicate phases but this +// behavior has since been removed as part of a performance optimization. The +// return value from Add can be ignored. func (s *InitializeStep) Add(m InitializeMiddleware, pos RelativePosition) error { - return s.ids.Add(m, pos) + if s.head == nil { + s.head = &decoratedInitializeHandler{nil, m} + s.tail = s.head + return nil + } + + if pos == Before { + s.head = &decoratedInitializeHandler{s.head, m} + } else { + tail := &decoratedInitializeHandler{nil, m} + s.tail.Next = tail + s.tail = tail + } + + return nil } // Insert injects the middleware relative to an existing middleware ID. // Returns error if the original middleware does not exist, or the middleware // being added already exists. func (s *InitializeStep) Insert(m InitializeMiddleware, relativeTo string, pos RelativePosition) error { - return s.ids.Insert(m, relativeTo, pos) + found, prev := s.get(relativeTo) + if found == nil { + return fmt.Errorf("not found: %s", m.ID()) + } + + if pos == Before { + if prev == nil { // at the front + s.head = &decoratedInitializeHandler{s.head, m} + } else { // somewhere in the middle + prev.Next = &decoratedInitializeHandler{found, m} + } + } else { + if found.Next == nil { // at the end + tail := &decoratedInitializeHandler{nil, m} + s.tail.Next = tail + s.tail = tail + } else { // somewhere in the middle + found.Next = &decoratedInitializeHandler{found.Next, m} + } + } + + return nil } // Swap removes the middleware by id, replacing it with the new middleware. // Returns the middleware removed, or error if the middleware to be removed // doesn't exist. func (s *InitializeStep) Swap(id string, m InitializeMiddleware) (InitializeMiddleware, error) { - removed, err := s.ids.Swap(id, m) - if err != nil { - return nil, err + found, _ := s.get(id) + if found == nil { + return nil, fmt.Errorf("not found: %s", m.ID()) } - return removed.(InitializeMiddleware), nil + swapped := found.With + found.With = m + return swapped, nil } // Remove removes the middleware by id. Returns error if the middleware // doesn't exist. func (s *InitializeStep) Remove(id string) (InitializeMiddleware, error) { - removed, err := s.ids.Remove(id) - if err != nil { - return nil, err + found, prev := s.get(id) + if found == nil { + return nil, fmt.Errorf("not found: %s", id) } - return removed.(InitializeMiddleware), nil + if s.head == s.tail { // it's the only one + s.head = nil + s.tail = nil + } else if found == s.head { // at the front + s.head = s.head.Next.(*decoratedInitializeHandler) + } else if found == s.tail { // at the end + prev.Next = nil + s.tail = prev + } else { + prev.Next = found.Next // somewhere in the middle + } + + return found.With, nil } // List returns a list of the middleware in the step. func (s *InitializeStep) List() []string { - return s.ids.List() + var ids []string + for h := s.head; h != nil; { + ids = append(ids, h.With.ID()) + if h.Next == nil { + break + } + + // once executed, tail.Next of the list will be set to an + // *initializeWrapHandler, make sure to check for that + if hnext, ok := h.Next.(*decoratedInitializeHandler); ok { + h = hnext + } else { + break + } + } + return ids } // Clear removes all middleware in the step. func (s *InitializeStep) Clear() { - s.ids.Clear() + s.head = nil + s.tail = nil +} + +func (s *InitializeStep) get(id string) (found, prev *decoratedInitializeHandler) { + for h := s.head; h != nil; { + if h.With.ID() == id { + found = h + return + } + prev = h + if h.Next == nil { + return + } + + // once executed, tail.Next of the list will be set to an + // *initializeWrapHandler + h, _ = h.Next.(*decoratedInitializeHandler) + } + return } type initializeWrapHandler struct { @@ -200,12 +288,12 @@ func (h decoratedInitializeHandler) HandleInitialize(ctx context.Context, in Ini return h.With.HandleInitialize(ctx, in, h.Next) } -// InitializeHandlerFunc provides a wrapper around a function to be used as an initialize middleware handler. +// InitializeHandlerFunc provides a wrapper around a function to be used as initializeMiddleware. type InitializeHandlerFunc func(context.Context, InitializeInput) (InitializeOutput, Metadata, error) // HandleInitialize calls the wrapped function with the provided arguments. -func (i InitializeHandlerFunc) HandleInitialize(ctx context.Context, in InitializeInput) (InitializeOutput, Metadata, error) { - return i(ctx, in) +func (f InitializeHandlerFunc) HandleInitialize(ctx context.Context, in InitializeInput) (InitializeOutput, Metadata, error) { + return f(ctx, in) } var _ InitializeHandler = InitializeHandlerFunc(nil) diff --git a/vendor/github.com/aws/smithy-go/middleware/step_serialize.go b/vendor/github.com/aws/smithy-go/middleware/step_serialize.go index a4ce4bee3b7..942ebb4f3e7 100644 --- a/vendor/github.com/aws/smithy-go/middleware/step_serialize.go +++ b/vendor/github.com/aws/smithy-go/middleware/step_serialize.go @@ -1,6 +1,10 @@ +// Code generated by smithy-go/middleware/generate.go DO NOT EDIT. package middleware -import "context" +import ( + "context" + "fmt" +) // SerializeInput provides the input parameters for the SerializeMiddleware to // consume. SerializeMiddleware may modify the Request value before forwarding @@ -41,8 +45,8 @@ type SerializeMiddleware interface { ) } -// SerializeMiddlewareFunc returns a SerializeMiddleware with the unique ID -// provided, and the func to be invoked. +// SerializeMiddlewareFunc returns a SerializeMiddleware with the unique ID provided, +// and the func to be invoked. func SerializeMiddlewareFunc(id string, fn func(context.Context, SerializeInput, SerializeHandler) (SerializeOutput, Metadata, error)) SerializeMiddleware { return serializeMiddlewareFunc{ id: id, @@ -75,17 +79,15 @@ var _ SerializeMiddleware = (serializeMiddlewareFunc{}) // SerializeStep provides the ordered grouping of SerializeMiddleware to be // invoked on a handler. type SerializeStep struct { + head *decoratedSerializeHandler + tail *decoratedSerializeHandler newRequest func() interface{} - ids *orderedIDs } -// NewSerializeStep returns a SerializeStep ready to have middleware for -// initialization added to it. The newRequest func parameter is used to -// initialize the transport specific request for the stack SerializeStep to -// serialize the input parameters into. +// NewSerializeStep returns an SerializeStep ready to have middleware for +// serialize added to it. func NewSerializeStep(newRequest func() interface{}) *SerializeStep { return &SerializeStep{ - ids: newOrderedIDs(baseOrderedItems), newRequest: newRequest, } } @@ -104,78 +106,162 @@ func (s *SerializeStep) ID() string { func (s *SerializeStep) HandleMiddleware(ctx context.Context, in interface{}, next Handler) ( out interface{}, metadata Metadata, err error, ) { - order := s.ids.GetOrder() - - var h SerializeHandler = serializeWrapHandler{Next: next} - for i := len(order) - 1; i >= 0; i-- { - h = decoratedSerializeHandler{ - Next: h, - With: order[i].(SerializeMiddleware), - } - } - sIn := SerializeInput{ Parameters: in, Request: s.newRequest(), } - res, metadata, err := h.HandleSerialize(ctx, sIn) + wh := &serializeWrapHandler{next} + if s.head == nil { + res, metadata, err := wh.HandleSerialize(ctx, sIn) + return res.Result, metadata, err + } + + s.tail.Next = wh + res, metadata, err := s.head.HandleSerialize(ctx, sIn) return res.Result, metadata, err } // Get retrieves the middleware identified by id. If the middleware is not present, returns false. func (s *SerializeStep) Get(id string) (SerializeMiddleware, bool) { - get, ok := s.ids.Get(id) - if !ok { + found, _ := s.get(id) + if found == nil { return nil, false } - return get.(SerializeMiddleware), ok + + return found.With, true } // Add injects the middleware to the relative position of the middleware group. -// Returns an error if the middleware already exists. +// +// Add never returns an error. It used to for duplicate phases but this +// behavior has since been removed as part of a performance optimization. The +// return value from Add can be ignored. func (s *SerializeStep) Add(m SerializeMiddleware, pos RelativePosition) error { - return s.ids.Add(m, pos) + if s.head == nil { + s.head = &decoratedSerializeHandler{nil, m} + s.tail = s.head + return nil + } + + if pos == Before { + s.head = &decoratedSerializeHandler{s.head, m} + } else { + tail := &decoratedSerializeHandler{nil, m} + s.tail.Next = tail + s.tail = tail + } + + return nil } // Insert injects the middleware relative to an existing middleware ID. // Returns error if the original middleware does not exist, or the middleware // being added already exists. func (s *SerializeStep) Insert(m SerializeMiddleware, relativeTo string, pos RelativePosition) error { - return s.ids.Insert(m, relativeTo, pos) + found, prev := s.get(relativeTo) + if found == nil { + return fmt.Errorf("not found: %s", m.ID()) + } + + if pos == Before { + if prev == nil { // at the front + s.head = &decoratedSerializeHandler{s.head, m} + } else { // somewhere in the middle + prev.Next = &decoratedSerializeHandler{found, m} + } + } else { + if found.Next == nil { // at the end + tail := &decoratedSerializeHandler{nil, m} + s.tail.Next = tail + s.tail = tail + } else { // somewhere in the middle + found.Next = &decoratedSerializeHandler{found.Next, m} + } + } + + return nil } // Swap removes the middleware by id, replacing it with the new middleware. // Returns the middleware removed, or error if the middleware to be removed // doesn't exist. func (s *SerializeStep) Swap(id string, m SerializeMiddleware) (SerializeMiddleware, error) { - removed, err := s.ids.Swap(id, m) - if err != nil { - return nil, err + found, _ := s.get(id) + if found == nil { + return nil, fmt.Errorf("not found: %s", m.ID()) } - return removed.(SerializeMiddleware), nil + swapped := found.With + found.With = m + return swapped, nil } // Remove removes the middleware by id. Returns error if the middleware // doesn't exist. func (s *SerializeStep) Remove(id string) (SerializeMiddleware, error) { - removed, err := s.ids.Remove(id) - if err != nil { - return nil, err + found, prev := s.get(id) + if found == nil { + return nil, fmt.Errorf("not found: %s", id) + } + + if s.head == s.tail { // it's the only one + s.head = nil + s.tail = nil + } else if found == s.head { // at the front + s.head = s.head.Next.(*decoratedSerializeHandler) + } else if found == s.tail { // at the end + prev.Next = nil + s.tail = prev + } else { + prev.Next = found.Next // somewhere in the middle } - return removed.(SerializeMiddleware), nil + return found.With, nil } // List returns a list of the middleware in the step. func (s *SerializeStep) List() []string { - return s.ids.List() + var ids []string + for h := s.head; h != nil; { + ids = append(ids, h.With.ID()) + if h.Next == nil { + break + } + + // once executed, tail.Next of the list will be set to an + // *serializeWrapHandler, make sure to check for that + if hnext, ok := h.Next.(*decoratedSerializeHandler); ok { + h = hnext + } else { + break + } + } + return ids } // Clear removes all middleware in the step. func (s *SerializeStep) Clear() { - s.ids.Clear() + s.head = nil + s.tail = nil +} + +func (s *SerializeStep) get(id string) (found, prev *decoratedSerializeHandler) { + for h := s.head; h != nil; { + if h.With.ID() == id { + found = h + return + } + prev = h + if h.Next == nil { + return + } + + // once executed, tail.Next of the list will be set to an + // *serializeWrapHandler + h, _ = h.Next.(*decoratedSerializeHandler) + } + return } type serializeWrapHandler struct { @@ -184,7 +270,7 @@ type serializeWrapHandler struct { var _ SerializeHandler = (*serializeWrapHandler)(nil) -// Implements SerializeHandler, converts types and delegates to underlying +// HandleSerialize implements SerializeHandler, converts types and delegates to underlying // generic handler. func (w serializeWrapHandler) HandleSerialize(ctx context.Context, in SerializeInput) ( out SerializeOutput, metadata Metadata, err error, @@ -208,12 +294,12 @@ func (h decoratedSerializeHandler) HandleSerialize(ctx context.Context, in Seria return h.With.HandleSerialize(ctx, in, h.Next) } -// SerializeHandlerFunc provides a wrapper around a function to be used as a serialize middleware handler. +// SerializeHandlerFunc provides a wrapper around a function to be used as serializeMiddleware. type SerializeHandlerFunc func(context.Context, SerializeInput) (SerializeOutput, Metadata, error) // HandleSerialize calls the wrapped function with the provided arguments. -func (s SerializeHandlerFunc) HandleSerialize(ctx context.Context, in SerializeInput) (SerializeOutput, Metadata, error) { - return s(ctx, in) +func (f SerializeHandlerFunc) HandleSerialize(ctx context.Context, in SerializeInput) (SerializeOutput, Metadata, error) { + return f(ctx, in) } var _ SerializeHandler = SerializeHandlerFunc(nil) diff --git a/vendor/github.com/coder/quartz/mock.go b/vendor/github.com/coder/quartz/mock.go index 1b0c48c6c12..d168849d602 100644 --- a/vendor/github.com/coder/quartz/mock.go +++ b/vendor/github.com/coder/quartz/mock.go @@ -14,6 +14,7 @@ import ( // during a test, triggering any timers or tickers automatically. type Mock struct { tb testing.TB + logger Logger mu sync.Mutex testOver bool @@ -54,6 +55,9 @@ func (m *Mock) TickerFunc(ctx context.Context, d time.Duration, f func() error, return t } +// NewTicker creates a mocked ticker attached to this Mock. Note that it will cease sending ticks on its channel at the +// end of the test, to avoid leaking any goroutines. Ticks are suppressed even if the mock clock is advanced after the +// test completes. Best practice is to only manipulate the mock time in the main goroutine of the test. func (m *Mock) NewTicker(d time.Duration, tags ...string) *Ticker { if d <= 0 { panic("NewTicker called with negative or zero duration") @@ -63,17 +67,7 @@ func (m *Mock) NewTicker(d time.Duration, tags ...string) *Ticker { c := newCall(clockFunctionNewTicker, tags, withDuration(d)) m.matchCallLocked(c) defer close(c.complete) - // 1 element buffer follows standard library implementation - ticks := make(chan time.Time, 1) - t := &Ticker{ - C: ticks, - c: ticks, - d: d, - nxt: m.cur.Add(d), - mock: m, - } - m.addEventLocked(t) - return t + return newMockTickerLocked(m, d) } func (m *Mock) NewTimer(d time.Duration, tags ...string) *Timer { @@ -82,7 +76,7 @@ func (m *Mock) NewTimer(d time.Duration, tags ...string) *Timer { c := newCall(clockFunctionNewTimer, tags, withDuration(d)) defer close(c.complete) m.matchCallLocked(c) - ch := make(chan time.Time, 1) + ch := make(chan time.Time) t := &Timer{ C: ch, c: ch, @@ -199,7 +193,7 @@ func (m *Mock) matchCallLocked(c *apiCall) { } } if !m.testOver { - m.tb.Logf("Mock Clock - %s call, matched %d traps", c, len(traps)) + m.logger.Logf("Mock Clock - %s call, matched %d traps", c, len(traps)) } if len(traps) == 0 { return @@ -265,7 +259,7 @@ func (m *Mock) Advance(d time.Duration) AdvanceWaiter { w := AdvanceWaiter{tb: m.tb, ch: make(chan struct{})} m.mu.Lock() if !m.testOver { - m.tb.Logf("Mock Clock - Advance(%s)", d) + m.logger.Logf("Mock Clock - Advance(%s)", d) } fin := m.cur.Add(d) // nextTime.IsZero implies no events scheduled. @@ -276,8 +270,8 @@ func (m *Mock) Advance(d time.Duration) AdvanceWaiter { return w } if fin.After(m.nextTime) { - m.tb.Errorf(fmt.Sprintf("cannot advance %s which is beyond next timer/ticker event in %s", - d.String(), m.nextTime.Sub(m.cur))) + m.tb.Errorf("cannot advance %s which is beyond next timer/ticker event in %s", + d.String(), m.nextTime.Sub(m.cur)) m.mu.Unlock() close(w.ch) return w @@ -315,7 +309,7 @@ func (m *Mock) Set(t time.Time) AdvanceWaiter { w := AdvanceWaiter{tb: m.tb, ch: make(chan struct{})} m.mu.Lock() if !m.testOver { - m.tb.Logf("Mock Clock - Set(%s)", t) + m.logger.Logf("Mock Clock - Set(%s)", t) } if t.Before(m.cur) { defer close(w.ch) @@ -354,7 +348,7 @@ func (m *Mock) Set(t time.Time) AdvanceWaiter { func (m *Mock) AdvanceNext() (time.Duration, AdvanceWaiter) { m.mu.Lock() if !m.testOver { - m.tb.Logf("Mock Clock - AdvanceNext()") + m.logger.Logf("Mock Clock - AdvanceNext()") } m.tb.Helper() w := AdvanceWaiter{tb: m.tb, ch: make(chan struct{})} @@ -445,7 +439,7 @@ func (m *Mock) newTrap(fn clockFunction, tags []string) *Trap { m.mu.Lock() defer m.mu.Unlock() if !m.testOver { - m.tb.Logf("Mock Clock - Trap %s(..., %v)", fn, tags) + m.logger.Logf("Mock Clock - Trap %s(..., %v)", fn, tags) } tr := &Trap{ fn: fn, @@ -458,6 +452,18 @@ func (m *Mock) newTrap(fn clockFunction, tags []string) *Trap { return tr } +// WithLogger replaces the default testing logger with a custom one. +// +// This can be used to discard log messages with: +// +// quartz.NewMock(t).WithLogger(quartz.NoOpLogger) +func (m *Mock) WithLogger(l Logger) *Mock { + m.mu.Lock() + defer m.mu.Unlock() + m.logger = l + return m +} + // NewMock creates a new Mock with the time set to midnight UTC on Jan 1, 2024. // You may re-set the time earlier than this, but only before timers or tickers // are created. @@ -467,14 +473,15 @@ func NewMock(tb testing.TB) *Mock { panic(err) } m := &Mock{ - tb: tb, - cur: cur, + tb: tb, + logger: tb, + cur: cur, } tb.Cleanup(func() { m.mu.Lock() defer m.mu.Unlock() m.testOver = true - tb.Logf("Mock Clock - test cleanup; will no longer log clock events") + m.logger.Logf("Mock Clock - test cleanup; will no longer log clock events") }) return m } @@ -806,3 +813,16 @@ func (t *Trap) MustWait(ctx context.Context) *Call { } return c } + +type Logger interface { + Log(args ...any) + Logf(format string, args ...any) +} + +// NoOpLogger is a Logger that discards all log messages. +var NoOpLogger Logger = noOpLogger{} + +type noOpLogger struct{} + +func (noOpLogger) Log(args ...any) {} +func (noOpLogger) Logf(format string, args ...any) {} diff --git a/vendor/github.com/coder/quartz/ticker.go b/vendor/github.com/coder/quartz/ticker.go index 5506750d5d1..f4a4b066502 100644 --- a/vendor/github.com/coder/quartz/ticker.go +++ b/vendor/github.com/coder/quartz/ticker.go @@ -6,12 +6,25 @@ import "time" type Ticker struct { C <-chan time.Time //nolint: revive - c chan time.Time - ticker *time.Ticker // realtime impl, if set - d time.Duration // period, if set - nxt time.Time // next tick time - mock *Mock // mock clock, if set - stopped bool // true if the ticker is not running + c chan time.Time + ticker *time.Ticker // realtime impl, if set + d time.Duration // period, if set + nxt time.Time // next tick time + mock *Mock // mock clock, if set + stopped bool // true if the ticker is not running + internalTicks chan time.Time // used to deliver ticks to the runLoop goroutine + + // As of Go 1.23, ticker channels are unbuffered and guaranteed to block forever after a call to stop. + // + // When a mocked ticker fires, we don't want to block on a channel write, because it's fine for the code under test + // not to be reading. That means we need to start a new goroutine to do the channel write (runLoop) if we are a + // channel-based ticker. + // + // They also are not supposed to leak even if they are never read or stopped (Go runtime can garbage collect them). + // We can't garbage-collect because we can't check if any other code besides the mock references, but we can ensure + // that we don't leak goroutines so that the garbage collector can do its job when the mock is no longer + // referenced. The channels below allow us to interrupt the runLoop goroutine. + interrupt chan struct{} } func (t *Ticker) fire(tt time.Time) { @@ -24,9 +37,8 @@ func (t *Ticker) fire(tt time.Time) { t.nxt = t.nxt.Add(t.d) } t.mock.recomputeNextLocked() - select { - case t.c <- tt: - default: + if t.interrupt != nil { // implies runLoop is still going. + t.internalTicks <- tt } } @@ -49,6 +61,11 @@ func (t *Ticker) Stop(tags ...string) { defer close(c.complete) t.mock.removeEventLocked(t) t.stopped = true + // check if we've already fired, and if so, interrupt it. + if t.interrupt != nil { + <-t.interrupt + t.interrupt = nil + } } // Reset stops a ticker and resets its period to the specified duration. The @@ -72,4 +89,63 @@ func (t *Ticker) Reset(d time.Duration, tags ...string) { } else { t.mock.recomputeNextLocked() } + if t.interrupt == nil { + t.startRunLoopLocked() + } +} + +func (t *Ticker) runLoop(interrupt chan struct{}) { + defer close(interrupt) +outer: + for { + select { + case tt := <-t.internalTicks: + for { + select { + case t.c <- tt: + continue outer + case <-t.internalTicks: + // Discard future ticks until we can send this one. + case interrupt <- struct{}{}: + return + } + } + case interrupt <- struct{}{}: + return + } + } +} + +func (t *Ticker) startRunLoopLocked() { + // assert some assumptions. If these fire, it is a bug in Quartz itself. + if t.interrupt != nil { + t.mock.tb.Error("called startRunLoopLocked when interrupt suggests we are already running") + } + interrupt := make(chan struct{}) + t.interrupt = interrupt + go t.runLoop(interrupt) +} + +func newMockTickerLocked(m *Mock, d time.Duration) *Ticker { + // no buffer follows Go 1.23+ behavior + ticks := make(chan time.Time) + t := &Ticker{ + C: ticks, + c: ticks, + d: d, + nxt: m.cur.Add(d), + mock: m, + internalTicks: make(chan time.Time), + } + m.addEventLocked(t) + m.tb.Cleanup(func() { + m.mu.Lock() + defer m.mu.Unlock() + if t.interrupt != nil { + <-t.interrupt + t.interrupt = nil + } + }) + t.startRunLoopLocked() + return t } diff --git a/vendor/github.com/coder/quartz/timer.go b/vendor/github.com/coder/quartz/timer.go index 8d928ac6f60..8f571eb0dc6 100644 --- a/vendor/github.com/coder/quartz/timer.go +++ b/vendor/github.com/coder/quartz/timer.go @@ -1,6 +1,8 @@ package quartz -import "time" +import ( + "time" +) // The Timer type represents a single event. When the Timer expires, the current time will be sent // on C, unless the Timer was created by AfterFunc. A Timer must be created with NewTimer or @@ -14,14 +16,43 @@ type Timer struct { mock *Mock // mock clock, if set fn func() // AfterFunc function, if set stopped bool // True if stopped, false if running + + // As of Go 1.23, timer channels are unbuffered and guaranteed to block forever after a call to stop. + // + // When a mocked timer fires, we don't want to block on a channel write, because it's fine for the code under test + // not to be reading. That means we need to start a new goroutine to do the channel write if we are a channel-based + // timer. + // + // They also are not supposed to leak even if they are never read or stopped (Go runtime can garbage collect them). + // We can't garbage-collect because we can't check if any other code besides the mock references, but we can ensure + // that we don't leak goroutines so that the garbage collector can do its job when the mock is no longer + // referenced. The channels below allow us to interrupt the channel write goroutine. + interrupt chan struct{} } func (t *Timer) fire(tt time.Time) { - t.mock.removeTimer(t) + t.mock.mu.Lock() + t.mock.removeTimerLocked(t) if t.fn != nil { + t.mock.mu.Unlock() t.fn() + return } else { - t.c <- tt + interrupt := make(chan struct{}) + // Prevents the goroutine from leaking beyond the test. Side effect is that timer channels cannot be read + // after the test exits. + t.mock.tb.Cleanup(func() { + <-interrupt + }) + t.interrupt = interrupt + t.mock.mu.Unlock() + go func() { + defer close(interrupt) + select { + case t.c <- tt: + case interrupt <- struct{}{}: + } + }() } } @@ -45,6 +76,11 @@ func (t *Timer) Stop(tags ...string) bool { defer close(c.complete) result := !t.stopped t.mock.removeTimerLocked(t) + // check if we've already fired, and if so, interrupt it. + if t.interrupt != nil { + <-t.interrupt + t.interrupt = nil + } return result } @@ -62,9 +98,10 @@ func (t *Timer) Reset(d time.Duration, tags ...string) bool { t.mock.matchCallLocked(c) defer close(c.complete) result := !t.stopped - select { - case <-t.c: - default: + // check if we've already fired, and if so, interrupt it. + if t.interrupt != nil { + <-t.interrupt + t.interrupt = nil } if d <= 0 { // zero or negative duration timer means we should immediately re-fire diff --git a/vendor/github.com/go-openapi/analysis/.golangci.yml b/vendor/github.com/go-openapi/analysis/.golangci.yml index 5609b4fea9c..06190ac055f 100644 --- a/vendor/github.com/go-openapi/analysis/.golangci.yml +++ b/vendor/github.com/go-openapi/analysis/.golangci.yml @@ -16,7 +16,7 @@ linters: - godox - gosmopolitan - inamedparam - #- intrange # disabled while < go1.22 + - intrange - ireturn - lll - musttag diff --git a/vendor/github.com/go-openapi/analysis/analyzer.go b/vendor/github.com/go-openapi/analysis/analyzer.go index 3e57de88701..4870ad07beb 100644 --- a/vendor/github.com/go-openapi/analysis/analyzer.go +++ b/vendor/github.com/go-openapi/analysis/analyzer.go @@ -1,21 +1,11 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package analysis import ( "fmt" + "maps" slashpath "path" "strconv" "strings" @@ -111,33 +101,33 @@ func (p *patternAnalysis) addSchemaPattern(key, pattern string) { } type enumAnalysis struct { - parameters map[string][]interface{} - headers map[string][]interface{} - items map[string][]interface{} - schemas map[string][]interface{} - allEnums map[string][]interface{} + parameters map[string][]any + headers map[string][]any + items map[string][]any + schemas map[string][]any + allEnums map[string][]any } -func (p *enumAnalysis) addEnum(key string, enum []interface{}) { +func (p *enumAnalysis) addEnum(key string, enum []any) { p.allEnums["#"+key] = enum } -func (p *enumAnalysis) addParameterEnum(key string, enum []interface{}) { +func (p *enumAnalysis) addParameterEnum(key string, enum []any) { p.parameters["#"+key] = enum p.addEnum(key, enum) } -func (p *enumAnalysis) addHeaderEnum(key string, enum []interface{}) { +func (p *enumAnalysis) addHeaderEnum(key string, enum []any) { p.headers["#"+key] = enum p.addEnum(key, enum) } -func (p *enumAnalysis) addItemsEnum(key string, enum []interface{}) { +func (p *enumAnalysis) addItemsEnum(key string, enum []any) { p.items["#"+key] = enum p.addEnum(key, enum) } -func (p *enumAnalysis) addSchemaEnum(key string, enum []interface{}) { +func (p *enumAnalysis) addSchemaEnum(key string, enum []any) { p.schemas["#"+key] = enum p.addEnum(key, enum) } @@ -633,31 +623,31 @@ func (s *Spec) AllPatterns() map[string]string { // ParameterEnums returns all the enums found in parameters // the map is cloned to avoid accidental changes -func (s *Spec) ParameterEnums() map[string][]interface{} { +func (s *Spec) ParameterEnums() map[string][]any { return cloneEnumMap(s.enums.parameters) } // HeaderEnums returns all the enums found in response headers // the map is cloned to avoid accidental changes -func (s *Spec) HeaderEnums() map[string][]interface{} { +func (s *Spec) HeaderEnums() map[string][]any { return cloneEnumMap(s.enums.headers) } // ItemsEnums returns all the enums found in simple array items // the map is cloned to avoid accidental changes -func (s *Spec) ItemsEnums() map[string][]interface{} { +func (s *Spec) ItemsEnums() map[string][]any { return cloneEnumMap(s.enums.items) } // SchemaEnums returns all the enums found in schemas // the map is cloned to avoid accidental changes -func (s *Spec) SchemaEnums() map[string][]interface{} { +func (s *Spec) SchemaEnums() map[string][]any { return cloneEnumMap(s.enums.schemas) } // AllEnums returns all the enums found in the spec // the map is cloned to avoid accidental changes -func (s *Spec) AllEnums() map[string][]interface{} { +func (s *Spec) AllEnums() map[string][]any { return cloneEnumMap(s.enums.allEnums) } @@ -733,11 +723,11 @@ func (s *Spec) reset() { s.patterns.items = make(map[string]string, allocLargeMap) s.patterns.schemas = make(map[string]string, allocLargeMap) s.patterns.allPatterns = make(map[string]string, allocLargeMap) - s.enums.parameters = make(map[string][]interface{}, allocLargeMap) - s.enums.headers = make(map[string][]interface{}, allocLargeMap) - s.enums.items = make(map[string][]interface{}, allocLargeMap) - s.enums.schemas = make(map[string][]interface{}, allocLargeMap) - s.enums.allEnums = make(map[string][]interface{}, allocLargeMap) + s.enums.parameters = make(map[string][]any, allocLargeMap) + s.enums.headers = make(map[string][]any, allocLargeMap) + s.enums.items = make(map[string][]any, allocLargeMap) + s.enums.schemas = make(map[string][]any, allocLargeMap) + s.enums.allEnums = make(map[string][]any, allocLargeMap) } func (s *Spec) reload() { @@ -1051,18 +1041,14 @@ func (s *Spec) analyzeSchema(name string, schema *spec.Schema, prefix string) { func cloneStringMap(source map[string]string) map[string]string { res := make(map[string]string, len(source)) - for k, v := range source { - res[k] = v - } + maps.Copy(res, source) return res } -func cloneEnumMap(source map[string][]interface{}) map[string][]interface{} { - res := make(map[string][]interface{}, len(source)) - for k, v := range source { - res[k] = v - } +func cloneEnumMap(source map[string][]any) map[string][]any { + res := make(map[string][]any, len(source)) + maps.Copy(res, source) return res } diff --git a/vendor/github.com/go-openapi/analysis/debug.go b/vendor/github.com/go-openapi/analysis/debug.go index 33c15704ecb..d490eab6063 100644 --- a/vendor/github.com/go-openapi/analysis/debug.go +++ b/vendor/github.com/go-openapi/analysis/debug.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package analysis diff --git a/vendor/github.com/go-openapi/analysis/doc.go b/vendor/github.com/go-openapi/analysis/doc.go index e8d9f9b1312..9d41371a9f0 100644 --- a/vendor/github.com/go-openapi/analysis/doc.go +++ b/vendor/github.com/go-openapi/analysis/doc.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 /* Package analysis provides methods to work with a Swagger specification document from diff --git a/vendor/github.com/go-openapi/analysis/errors.go b/vendor/github.com/go-openapi/analysis/errors.go index 98133e7af06..540e159a23c 100644 --- a/vendor/github.com/go-openapi/analysis/errors.go +++ b/vendor/github.com/go-openapi/analysis/errors.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package analysis import ( diff --git a/vendor/github.com/go-openapi/analysis/fixer.go b/vendor/github.com/go-openapi/analysis/fixer.go index 8bac3a4d19b..74becbbe496 100644 --- a/vendor/github.com/go-openapi/analysis/fixer.go +++ b/vendor/github.com/go-openapi/analysis/fixer.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package analysis diff --git a/vendor/github.com/go-openapi/analysis/flatten.go b/vendor/github.com/go-openapi/analysis/flatten.go index 7042bb5adaf..1c7a49c034f 100644 --- a/vendor/github.com/go-openapi/analysis/flatten.go +++ b/vendor/github.com/go-openapi/analysis/flatten.go @@ -1,22 +1,12 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package analysis import ( "log" "path" + "slices" "sort" "strings" @@ -541,14 +531,7 @@ func updateRefParents(allRefs map[string]spec.Ref, r *newRef) { continue } - found := false - for _, p := range r.parents { - if p == k { - found = true - - break - } - } + found := slices.Contains(r.parents, k) if !found { r.parents = append(r.parents, k) } diff --git a/vendor/github.com/go-openapi/analysis/flatten_name.go b/vendor/github.com/go-openapi/analysis/flatten_name.go index 44ffe4226f2..475b33c4136 100644 --- a/vendor/github.com/go-openapi/analysis/flatten_name.go +++ b/vendor/github.com/go-openapi/analysis/flatten_name.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package analysis import ( diff --git a/vendor/github.com/go-openapi/analysis/flatten_options.go b/vendor/github.com/go-openapi/analysis/flatten_options.go index c943fe1e84a..d8fc25cf586 100644 --- a/vendor/github.com/go-openapi/analysis/flatten_options.go +++ b/vendor/github.com/go-openapi/analysis/flatten_options.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package analysis import ( diff --git a/vendor/github.com/go-openapi/analysis/internal/debug/debug.go b/vendor/github.com/go-openapi/analysis/internal/debug/debug.go index 39f55a97bfd..03e0d32e9ea 100644 --- a/vendor/github.com/go-openapi/analysis/internal/debug/debug.go +++ b/vendor/github.com/go-openapi/analysis/internal/debug/debug.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package debug @@ -27,15 +16,15 @@ var ( ) // GetLogger provides a prefix debug logger -func GetLogger(prefix string, debug bool) func(string, ...interface{}) { +func GetLogger(prefix string, debug bool) func(string, ...any) { if debug { logger := log.New(output, prefix+":", log.LstdFlags) - return func(msg string, args ...interface{}) { + return func(msg string, args ...any) { _, file1, pos1, _ := runtime.Caller(1) logger.Printf("%s:%d: %s", filepath.Base(file1), pos1, fmt.Sprintf(msg, args...)) } } - return func(_ string, _ ...interface{}) {} + return func(_ string, _ ...any) {} } diff --git a/vendor/github.com/go-openapi/analysis/internal/flatten/normalize/normalize.go b/vendor/github.com/go-openapi/analysis/internal/flatten/normalize/normalize.go index 8c9df0580da..320a50bff85 100644 --- a/vendor/github.com/go-openapi/analysis/internal/flatten/normalize/normalize.go +++ b/vendor/github.com/go-openapi/analysis/internal/flatten/normalize/normalize.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package normalize import ( diff --git a/vendor/github.com/go-openapi/analysis/internal/flatten/operations/operations.go b/vendor/github.com/go-openapi/analysis/internal/flatten/operations/operations.go index a1911b07674..940c46a9256 100644 --- a/vendor/github.com/go-openapi/analysis/internal/flatten/operations/operations.go +++ b/vendor/github.com/go-openapi/analysis/internal/flatten/operations/operations.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package operations import ( diff --git a/vendor/github.com/go-openapi/analysis/internal/flatten/replace/errors.go b/vendor/github.com/go-openapi/analysis/internal/flatten/replace/errors.go index 60c3aa044af..d7c28b88571 100644 --- a/vendor/github.com/go-openapi/analysis/internal/flatten/replace/errors.go +++ b/vendor/github.com/go-openapi/analysis/internal/flatten/replace/errors.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package replace import ( diff --git a/vendor/github.com/go-openapi/analysis/internal/flatten/replace/replace.go b/vendor/github.com/go-openapi/analysis/internal/flatten/replace/replace.go index f30a22ae2f2..61c13f7ebaa 100644 --- a/vendor/github.com/go-openapi/analysis/internal/flatten/replace/replace.go +++ b/vendor/github.com/go-openapi/analysis/internal/flatten/replace/replace.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package replace import ( @@ -45,7 +48,7 @@ func RewriteSchemaToRef(sp *spec.Swagger, key string, ref spec.Ref) error { if refable.Schema != nil { refable.Schema = &spec.Schema{SchemaProps: spec.SchemaProps{Ref: ref}} } - case map[string]interface{}: // this happens e.g. if a schema points to an extension unmarshaled as map[string]interface{} + case map[string]any: // this happens e.g. if a schema points to an extension unmarshaled as map[string]interface{} return rewriteParentRef(sp, key, ref) default: return ErrNoSchemaWithRef(key, value) @@ -127,7 +130,7 @@ func rewriteParentRef(sp *spec.Swagger, key string, ref spec.Ref) error { case spec.SchemaProperties: container[entry] = spec.Schema{SchemaProps: spec.SchemaProps{Ref: ref}} - case *interface{}: + case *any: *container = spec.Schema{SchemaProps: spec.SchemaProps{Ref: ref}} // NOTE: can't have case *spec.SchemaOrBool = parent in this case is *Schema @@ -140,7 +143,7 @@ func rewriteParentRef(sp *spec.Swagger, key string, ref spec.Ref) error { } // getPointerFromKey retrieves the content of the JSON pointer "key" -func getPointerFromKey(sp interface{}, key string) (string, interface{}, error) { +func getPointerFromKey(sp any, key string) (string, any, error) { switch sp.(type) { case *spec.Schema: case *spec.Swagger: @@ -168,7 +171,7 @@ func getPointerFromKey(sp interface{}, key string) (string, interface{}, error) } // getParentFromKey retrieves the container of the JSON pointer "key" -func getParentFromKey(sp interface{}, key string) (string, string, interface{}, error) { +func getParentFromKey(sp any, key string) (string, string, any, error) { switch sp.(type) { case *spec.Schema: case *spec.Swagger: @@ -194,7 +197,7 @@ func getParentFromKey(sp interface{}, key string) (string, string, interface{}, } // UpdateRef replaces a ref by another one -func UpdateRef(sp interface{}, key string, ref spec.Ref) error { +func UpdateRef(sp any, key string, ref spec.Ref) error { switch sp.(type) { case *spec.Schema: case *spec.Swagger: diff --git a/vendor/github.com/go-openapi/analysis/internal/flatten/schutils/flatten_schema.go b/vendor/github.com/go-openapi/analysis/internal/flatten/schutils/flatten_schema.go index fa7f6bf34e3..7e9fb9f0a5f 100644 --- a/vendor/github.com/go-openapi/analysis/internal/flatten/schutils/flatten_schema.go +++ b/vendor/github.com/go-openapi/analysis/internal/flatten/schutils/flatten_schema.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + // Package schutils provides tools to save or clone a schema // when flattening a spec. package schutils diff --git a/vendor/github.com/go-openapi/analysis/internal/flatten/sortref/keys.go b/vendor/github.com/go-openapi/analysis/internal/flatten/sortref/keys.go index cbe16f65247..a5db0249ecc 100644 --- a/vendor/github.com/go-openapi/analysis/internal/flatten/sortref/keys.go +++ b/vendor/github.com/go-openapi/analysis/internal/flatten/sortref/keys.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package sortref import ( @@ -60,7 +63,7 @@ func (k Keys) Less(i, j int) bool { // KeyParts construct a SplitKey with all its /-separated segments decomposed. It is sortable. func KeyParts(key string) SplitKey { var res []string - for _, part := range strings.Split(key[1:], "/") { + for part := range strings.SplitSeq(key[1:], "/") { if part != "" { res = append(res, jsonpointer.Unescape(part)) } diff --git a/vendor/github.com/go-openapi/analysis/internal/flatten/sortref/sort_ref.go b/vendor/github.com/go-openapi/analysis/internal/flatten/sortref/sort_ref.go index 73243df87f0..ceac7137728 100644 --- a/vendor/github.com/go-openapi/analysis/internal/flatten/sortref/sort_ref.go +++ b/vendor/github.com/go-openapi/analysis/internal/flatten/sortref/sort_ref.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package sortref import ( @@ -30,7 +33,7 @@ func (i *mapIterator) Key() string { return i.mapIter.Key().String() } -func mustMapIterator(anyMap interface{}) *mapIterator { +func mustMapIterator(anyMap any) *mapIterator { val := reflect.ValueOf(anyMap) return &mapIterator{mapIter: val.MapRange(), len: val.Len()} @@ -40,7 +43,7 @@ func mustMapIterator(anyMap interface{}) *mapIterator { // (shared params, op param, statuscode response, default response, definitions) // sort groups internally by number of parts in the key and lexical names // flatten groups into a single list of keys -func DepthFirst(in interface{}) []string { +func DepthFirst(in any) []string { iterator := mustMapIterator(in) sorted := make([]string, 0, iterator.Len()) grouped := make(map[string]Keys, iterator.Len()) diff --git a/vendor/github.com/go-openapi/analysis/mixin.go b/vendor/github.com/go-openapi/analysis/mixin.go index b0b41dba644..cc5c392334b 100644 --- a/vendor/github.com/go-openapi/analysis/mixin.go +++ b/vendor/github.com/go-openapi/analysis/mixin.go @@ -1,22 +1,12 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package analysis import ( "fmt" "reflect" + "slices" "github.com/go-openapi/spec" ) @@ -248,14 +238,7 @@ func mergeResponses(primary *spec.Swagger, m *spec.Swagger) (skipped []string) { func mergeConsumes(primary *spec.Swagger, m *spec.Swagger) []string { for _, v := range m.Consumes { - found := false - for _, vv := range primary.Consumes { - if v == vv { - found = true - - break - } - } + found := slices.Contains(primary.Consumes, v) if found { // no warning here: we just skip it @@ -269,14 +252,7 @@ func mergeConsumes(primary *spec.Swagger, m *spec.Swagger) []string { func mergeProduces(primary *spec.Swagger, m *spec.Swagger) []string { for _, v := range m.Produces { - found := false - for _, vv := range primary.Produces { - if v == vv { - found = true - - break - } - } + found := slices.Contains(primary.Produces, v) if found { // no warning here: we just skip it @@ -317,14 +293,7 @@ func mergeTags(primary *spec.Swagger, m *spec.Swagger) (skipped []string) { func mergeSchemes(primary *spec.Swagger, m *spec.Swagger) []string { for _, v := range m.Schemes { - found := false - for _, vv := range primary.Schemes { - if v == vv { - found = true - - break - } - } + found := slices.Contains(primary.Schemes, v) if found { // no warning here: we just skip it diff --git a/vendor/github.com/go-openapi/analysis/schema.go b/vendor/github.com/go-openapi/analysis/schema.go index baeb784e730..039dac15661 100644 --- a/vendor/github.com/go-openapi/analysis/schema.go +++ b/vendor/github.com/go-openapi/analysis/schema.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package analysis import ( @@ -8,7 +11,7 @@ import ( // SchemaOpts configures the schema analyzer type SchemaOpts struct { Schema *spec.Schema - Root interface{} + Root any BasePath string _ struct{} } @@ -52,7 +55,7 @@ func Schema(opts SchemaOpts) (*AnalyzedSchema, error) { // AnalyzedSchema indicates what the schema represents type AnalyzedSchema struct { schema *spec.Schema - root interface{} + root any basePath string hasProps bool diff --git a/vendor/github.com/go-openapi/errors/README.md b/vendor/github.com/go-openapi/errors/README.md index 6d57ea55c7c..d7e3a18bcf5 100644 --- a/vendor/github.com/go-openapi/errors/README.md +++ b/vendor/github.com/go-openapi/errors/README.md @@ -6,3 +6,7 @@ [![Go Report Card](https://goreportcard.com/badge/github.com/go-openapi/errors)](https://goreportcard.com/report/github.com/go-openapi/errors) Shared errors and error interface used throughout the various libraries found in the go-openapi toolkit. + +## Licensing + +This library ships under the [SPDX-License-Identifier: Apache-2.0](./LICENSE). diff --git a/vendor/github.com/go-openapi/errors/api.go b/vendor/github.com/go-openapi/errors/api.go index 52d45777280..d39233bafe4 100644 --- a/vendor/github.com/go-openapi/errors/api.go +++ b/vendor/github.com/go-openapi/errors/api.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package errors @@ -46,14 +35,14 @@ func (a *apiError) Code() int32 { // MarshalJSON implements the JSON encoding interface func (a apiError) MarshalJSON() ([]byte, error) { - return json.Marshal(map[string]interface{}{ + return json.Marshal(map[string]any{ "code": a.code, "message": a.message, }) } // New creates a new API error with a code and a message -func New(code int32, message string, args ...interface{}) Error { +func New(code int32, message string, args ...any) Error { if len(args) > 0 { return &apiError{ code: code, @@ -67,7 +56,7 @@ func New(code int32, message string, args ...interface{}) Error { } // NotFound creates a new not found error -func NotFound(message string, args ...interface{}) Error { +func NotFound(message string, args ...any) Error { if message == "" { message = "Not found" } @@ -97,7 +86,7 @@ func (m *MethodNotAllowedError) Code() int32 { // MarshalJSON implements the JSON encoding interface func (m MethodNotAllowedError) MarshalJSON() ([]byte, error) { - return json.Marshal(map[string]interface{}{ + return json.Marshal(map[string]any{ "code": m.code, "message": m.message, "allowed": m.Allowed, diff --git a/vendor/github.com/go-openapi/errors/auth.go b/vendor/github.com/go-openapi/errors/auth.go index 0545b501bd7..08de582e5db 100644 --- a/vendor/github.com/go-openapi/errors/auth.go +++ b/vendor/github.com/go-openapi/errors/auth.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package errors diff --git a/vendor/github.com/go-openapi/errors/doc.go b/vendor/github.com/go-openapi/errors/doc.go index af01190ce61..b4627f30f4c 100644 --- a/vendor/github.com/go-openapi/errors/doc.go +++ b/vendor/github.com/go-openapi/errors/doc.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 /* Package errors provides an Error interface and several concrete types diff --git a/vendor/github.com/go-openapi/errors/headers.go b/vendor/github.com/go-openapi/errors/headers.go index 6ea1151f415..2d837c34ac4 100644 --- a/vendor/github.com/go-openapi/errors/headers.go +++ b/vendor/github.com/go-openapi/errors/headers.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package errors @@ -25,9 +14,9 @@ type Validation struct { //nolint: errname code int32 Name string In string - Value interface{} + Value any message string - Values []interface{} + Values []any } func (e *Validation) Error() string { @@ -41,7 +30,7 @@ func (e *Validation) Code() int32 { // MarshalJSON implements the JSON encoding interface func (e Validation) MarshalJSON() ([]byte, error) { - return json.Marshal(map[string]interface{}{ + return json.Marshal(map[string]any{ "code": e.code, "message": e.message, "in": e.In, @@ -72,7 +61,7 @@ const ( // InvalidContentType error for an invalid content type func InvalidContentType(value string, allowed []string) *Validation { - values := make([]interface{}, 0, len(allowed)) + values := make([]any, 0, len(allowed)) for _, v := range allowed { values = append(values, v) } @@ -88,7 +77,7 @@ func InvalidContentType(value string, allowed []string) *Validation { // InvalidResponseFormat error for an unacceptable response format request func InvalidResponseFormat(value string, allowed []string) *Validation { - values := make([]interface{}, 0, len(allowed)) + values := make([]any, 0, len(allowed)) for _, v := range allowed { values = append(values, v) } diff --git a/vendor/github.com/go-openapi/errors/middleware.go b/vendor/github.com/go-openapi/errors/middleware.go index 1b9f3a93016..c434e59a6fa 100644 --- a/vendor/github.com/go-openapi/errors/middleware.go +++ b/vendor/github.com/go-openapi/errors/middleware.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package errors diff --git a/vendor/github.com/go-openapi/errors/parsing.go b/vendor/github.com/go-openapi/errors/parsing.go index 34930c087a7..ea2a7c60377 100644 --- a/vendor/github.com/go-openapi/errors/parsing.go +++ b/vendor/github.com/go-openapi/errors/parsing.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package errors @@ -63,7 +52,7 @@ func (e ParseError) MarshalJSON() ([]byte, error) { if e.Reason != nil { reason = e.Reason.Error() } - return json.Marshal(map[string]interface{}{ + return json.Marshal(map[string]any{ "code": e.code, "message": e.message, "in": e.In, diff --git a/vendor/github.com/go-openapi/errors/schema.go b/vendor/github.com/go-openapi/errors/schema.go index 8f3239dfd9b..e59ca4f863f 100644 --- a/vendor/github.com/go-openapi/errors/schema.go +++ b/vendor/github.com/go-openapi/errors/schema.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package errors @@ -130,7 +119,7 @@ func (c *CompositeError) Unwrap() []error { // MarshalJSON implements the JSON encoding interface func (c CompositeError) MarshalJSON() ([]byte, error) { - return json.Marshal(map[string]interface{}{ + return json.Marshal(map[string]any{ "code": c.code, "message": c.message, "errors": c.Errors, @@ -254,7 +243,7 @@ func InvalidTypeName(typeName string) *Validation { } // InvalidType creates an error for when the type is invalid -func InvalidType(name, in, typeName string, value interface{}) *Validation { +func InvalidType(name, in, typeName string, value any) *Validation { var message string if in != "" { @@ -302,7 +291,7 @@ func DuplicateItems(name, in string) *Validation { } // TooManyItems error for when an array contains too many items -func TooManyItems(name, in string, maximum int64, value interface{}) *Validation { +func TooManyItems(name, in string, maximum int64, value any) *Validation { msg := fmt.Sprintf(maximumItemsFail, name, in, maximum) if in == "" { msg = fmt.Sprintf(maximumItemsFailNoIn, name, maximum) @@ -318,7 +307,7 @@ func TooManyItems(name, in string, maximum int64, value interface{}) *Validation } // TooFewItems error for when an array contains too few items -func TooFewItems(name, in string, minimum int64, value interface{}) *Validation { +func TooFewItems(name, in string, minimum int64, value any) *Validation { msg := fmt.Sprintf(minItemsFail, name, in, minimum) if in == "" { msg = fmt.Sprintf(minItemsFailNoIn, name, minimum) @@ -333,7 +322,7 @@ func TooFewItems(name, in string, minimum int64, value interface{}) *Validation } // ExceedsMaximumInt error for when maximumimum validation fails -func ExceedsMaximumInt(name, in string, maximum int64, exclusive bool, value interface{}) *Validation { +func ExceedsMaximumInt(name, in string, maximum int64, exclusive bool, value any) *Validation { var message string if in == "" { m := maximumIncFailNoIn @@ -358,7 +347,7 @@ func ExceedsMaximumInt(name, in string, maximum int64, exclusive bool, value int } // ExceedsMaximumUint error for when maximumimum validation fails -func ExceedsMaximumUint(name, in string, maximum uint64, exclusive bool, value interface{}) *Validation { +func ExceedsMaximumUint(name, in string, maximum uint64, exclusive bool, value any) *Validation { var message string if in == "" { m := maximumIncFailNoIn @@ -383,7 +372,7 @@ func ExceedsMaximumUint(name, in string, maximum uint64, exclusive bool, value i } // ExceedsMaximum error for when maximumimum validation fails -func ExceedsMaximum(name, in string, maximum float64, exclusive bool, value interface{}) *Validation { +func ExceedsMaximum(name, in string, maximum float64, exclusive bool, value any) *Validation { var message string if in == "" { m := maximumIncFailNoIn @@ -408,7 +397,7 @@ func ExceedsMaximum(name, in string, maximum float64, exclusive bool, value inte } // ExceedsMinimumInt error for when minimum validation fails -func ExceedsMinimumInt(name, in string, minimum int64, exclusive bool, value interface{}) *Validation { +func ExceedsMinimumInt(name, in string, minimum int64, exclusive bool, value any) *Validation { var message string if in == "" { m := minIncFailNoIn @@ -433,7 +422,7 @@ func ExceedsMinimumInt(name, in string, minimum int64, exclusive bool, value int } // ExceedsMinimumUint error for when minimum validation fails -func ExceedsMinimumUint(name, in string, minimum uint64, exclusive bool, value interface{}) *Validation { +func ExceedsMinimumUint(name, in string, minimum uint64, exclusive bool, value any) *Validation { var message string if in == "" { m := minIncFailNoIn @@ -458,7 +447,7 @@ func ExceedsMinimumUint(name, in string, minimum uint64, exclusive bool, value i } // ExceedsMinimum error for when minimum validation fails -func ExceedsMinimum(name, in string, minimum float64, exclusive bool, value interface{}) *Validation { +func ExceedsMinimum(name, in string, minimum float64, exclusive bool, value any) *Validation { var message string if in == "" { m := minIncFailNoIn @@ -483,7 +472,7 @@ func ExceedsMinimum(name, in string, minimum float64, exclusive bool, value inte } // NotMultipleOf error for when multiple of validation fails -func NotMultipleOf(name, in string, multiple, value interface{}) *Validation { +func NotMultipleOf(name, in string, multiple, value any) *Validation { var msg string if in == "" { msg = fmt.Sprintf(multipleOfFailNoIn, name, multiple) @@ -500,7 +489,7 @@ func NotMultipleOf(name, in string, multiple, value interface{}) *Validation { } // EnumFail error for when an enum validation fails -func EnumFail(name, in string, value interface{}, values []interface{}) *Validation { +func EnumFail(name, in string, value any, values []any) *Validation { var msg string if in == "" { msg = fmt.Sprintf(enumFailNoIn, name, values) @@ -519,7 +508,7 @@ func EnumFail(name, in string, value interface{}, values []interface{}) *Validat } // Required error for when a value is missing -func Required(name, in string, value interface{}) *Validation { +func Required(name, in string, value any) *Validation { var msg string if in == "" { msg = fmt.Sprintf(requiredFailNoIn, name) @@ -536,7 +525,7 @@ func Required(name, in string, value interface{}) *Validation { } // ReadOnly error for when a value is present in request -func ReadOnly(name, in string, value interface{}) *Validation { +func ReadOnly(name, in string, value any) *Validation { var msg string if in == "" { msg = fmt.Sprintf(readOnlyFailNoIn, name) @@ -553,7 +542,7 @@ func ReadOnly(name, in string, value interface{}) *Validation { } // TooLong error for when a string is too long -func TooLong(name, in string, maximum int64, value interface{}) *Validation { +func TooLong(name, in string, maximum int64, value any) *Validation { var msg string if in == "" { msg = fmt.Sprintf(tooLongMessageNoIn, name, maximum) @@ -570,7 +559,7 @@ func TooLong(name, in string, maximum int64, value interface{}) *Validation { } // TooShort error for when a string is too short -func TooShort(name, in string, minimum int64, value interface{}) *Validation { +func TooShort(name, in string, minimum int64, value any) *Validation { var msg string if in == "" { msg = fmt.Sprintf(tooShortMessageNoIn, name, minimum) @@ -589,7 +578,7 @@ func TooShort(name, in string, minimum int64, value interface{}) *Validation { // FailedPattern error for when a string fails a regex pattern match // the pattern that is returned is the ECMA syntax version of the pattern not the golang version. -func FailedPattern(name, in, pattern string, value interface{}) *Validation { +func FailedPattern(name, in, pattern string, value any) *Validation { var msg string if in == "" { msg = fmt.Sprintf(patternFailNoIn, name, pattern) @@ -608,7 +597,7 @@ func FailedPattern(name, in, pattern string, value interface{}) *Validation { // MultipleOfMustBePositive error for when a // multipleOf factor is negative -func MultipleOfMustBePositive(name, in string, factor interface{}) *Validation { +func MultipleOfMustBePositive(name, in string, factor any) *Validation { return &Validation{ code: MultipleOfMustBePositiveCode, Name: name, diff --git a/vendor/github.com/go-openapi/jsonreference/NOTICE b/vendor/github.com/go-openapi/jsonreference/NOTICE new file mode 100644 index 00000000000..f9ad7e0f7a0 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonreference/NOTICE @@ -0,0 +1,36 @@ +Copyright 2015-2025 go-swagger maintainers + +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + +This software library, github.com/go-openapi/jsonpointer, includes software developed +by the go-swagger and go-openapi maintainers ("go-swagger maintainers"). + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this software except in compliance with the License. +You may obtain a copy of the License at + +This software is copied from, derived from, and inspired by other original software products. +It ships with copies of other software which license terms are recalled below. + +The original sofware was authored on 25-02-2013 by sigu-399 (https://github.com/sigu-399, sigu.399@gmail.com). + +github.com/sigh-399/jsonpointer +=========================== + +// SPDX-FileCopyrightText: Copyright 2013 sigu-399 ( https://github.com/sigu-399 ) +// SPDX-License-Identifier: Apache-2.0 + +Copyright 2013 sigu-399 ( https://github.com/sigu-399 ) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/vendor/github.com/go-openapi/jsonreference/README.md b/vendor/github.com/go-openapi/jsonreference/README.md index c7fc2049c1d..2274a4b78fc 100644 --- a/vendor/github.com/go-openapi/jsonreference/README.md +++ b/vendor/github.com/go-openapi/jsonreference/README.md @@ -17,3 +17,10 @@ Feature complete. Stable API * http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-07 * http://tools.ietf.org/html/draft-pbryan-zyp-json-ref-03 + +## Licensing + +This library ships under the [SPDX-License-Identifier: Apache-2.0](./LICENSE). + +See the license [NOTICE](./NOTICE), which recalls the licensing terms of all the pieces of software +on top of which it has been built. diff --git a/vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go b/vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go index f0610cf1e57..ca79391dcf3 100644 --- a/vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go +++ b/vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright (c) 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package internal import ( diff --git a/vendor/github.com/go-openapi/jsonreference/reference.go b/vendor/github.com/go-openapi/jsonreference/reference.go index 6a1fed5dfe7..33d4798cad3 100644 --- a/vendor/github.com/go-openapi/jsonreference/reference.go +++ b/vendor/github.com/go-openapi/jsonreference/reference.go @@ -1,27 +1,5 @@ -// Copyright 2013 sigu-399 ( https://github.com/sigu-399 ) -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// author sigu-399 -// author-github https://github.com/sigu-399 -// author-mail sigu.399@gmail.com -// -// repository-name jsonreference -// repository-desc An implementation of JSON Reference - Go language -// -// description Main and unique file. -// -// created 26-02-2013 +// SPDX-FileCopyrightText: Copyright (c) 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package jsonreference diff --git a/vendor/github.com/go-openapi/loads/.golangci.yml b/vendor/github.com/go-openapi/loads/.golangci.yml index 7cea1af8b52..1ad5adf47e6 100644 --- a/vendor/github.com/go-openapi/loads/.golangci.yml +++ b/vendor/github.com/go-openapi/loads/.golangci.yml @@ -16,7 +16,7 @@ linters: - godox - gosmopolitan - inamedparam - #- intrange # disabled while < go1.22 + - intrange - ireturn - lll - musttag diff --git a/vendor/github.com/go-openapi/loads/README.md b/vendor/github.com/go-openapi/loads/README.md index 6164ebe40a3..1f0174f2d91 100644 --- a/vendor/github.com/go-openapi/loads/README.md +++ b/vendor/github.com/go-openapi/loads/README.md @@ -26,3 +26,7 @@ Primary usage: ``` See also the provided [examples](https://pkg.go.dev/github.com/go-openapi/loads#pkg-examples). + +## Licensing + +This library ships under the [SPDX-License-Identifier: Apache-2.0](./LICENSE). diff --git a/vendor/github.com/go-openapi/loads/doc.go b/vendor/github.com/go-openapi/loads/doc.go index 1ca47bcfb0d..7981e70e9f1 100644 --- a/vendor/github.com/go-openapi/loads/doc.go +++ b/vendor/github.com/go-openapi/loads/doc.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 // Package loads provides document loading methods for swagger (OAI v2) API specifications. // diff --git a/vendor/github.com/go-openapi/loads/errors.go b/vendor/github.com/go-openapi/loads/errors.go index 132a702e938..8f2d602f5cc 100644 --- a/vendor/github.com/go-openapi/loads/errors.go +++ b/vendor/github.com/go-openapi/loads/errors.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package loads type loaderError string diff --git a/vendor/github.com/go-openapi/loads/loaders.go b/vendor/github.com/go-openapi/loads/loaders.go index 646d35af393..25b157302e4 100644 --- a/vendor/github.com/go-openapi/loads/loaders.go +++ b/vendor/github.com/go-openapi/loads/loaders.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package loads import ( diff --git a/vendor/github.com/go-openapi/loads/options.go b/vendor/github.com/go-openapi/loads/options.go index 3b055319b3d..adb5e6d15b0 100644 --- a/vendor/github.com/go-openapi/loads/options.go +++ b/vendor/github.com/go-openapi/loads/options.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package loads import "github.com/go-openapi/swag/loading" diff --git a/vendor/github.com/go-openapi/loads/spec.go b/vendor/github.com/go-openapi/loads/spec.go index 838231a580e..213c40c657a 100644 --- a/vendor/github.com/go-openapi/loads/spec.go +++ b/vendor/github.com/go-openapi/loads/spec.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package loads diff --git a/vendor/github.com/go-openapi/runtime/.golangci.yml b/vendor/github.com/go-openapi/runtime/.golangci.yml index 5a0faa2e5f6..0087ed31130 100644 --- a/vendor/github.com/go-openapi/runtime/.golangci.yml +++ b/vendor/github.com/go-openapi/runtime/.golangci.yml @@ -18,7 +18,6 @@ linters: - gomoddirectives # moved to mono-repo, multi-modules, so replace directives are needed - gosmopolitan - inamedparam - #- intrange # disabled while < go1.22 - ireturn - lll - musttag diff --git a/vendor/github.com/go-openapi/runtime/README.md b/vendor/github.com/go-openapi/runtime/README.md index 16a151234f4..9e15b1adb5b 100644 --- a/vendor/github.com/go-openapi/runtime/README.md +++ b/vendor/github.com/go-openapi/runtime/README.md @@ -11,7 +11,7 @@ The runtime component for use in code generation or as untyped usage. ## Release notes -### v0.29.0 [draft, unpublished] +### v0.29.0 **New with this release**: @@ -37,3 +37,7 @@ Moving forward, we want to : independently from the main package (to avoid breaking changes, the existing API will remain maintained, but evolve at a slower pace than opentelemetry). * [ ] fix a few known issues with some file upload requests (e.g. #286) + +## Licensing + +This library ships under the [SPDX-License-Identifier: Apache-2.0](./LICENSE). diff --git a/vendor/github.com/go-openapi/runtime/bytestream.go b/vendor/github.com/go-openapi/runtime/bytestream.go index 98e961878d9..eb649742e8e 100644 --- a/vendor/github.com/go-openapi/runtime/bytestream.go +++ b/vendor/github.com/go-openapi/runtime/bytestream.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime @@ -54,7 +43,7 @@ func ByteStreamConsumer(opts ...byteStreamOpt) Consumer { opt(&vals) } - return ConsumerFunc(func(reader io.Reader, data interface{}) error { + return ConsumerFunc(func(reader io.Reader, data any) error { if reader == nil { return errors.New("ByteStreamConsumer requires a reader") // early exit } @@ -148,7 +137,7 @@ func ByteStreamProducer(opts ...byteStreamOpt) Producer { opt(&vals) } - return ProducerFunc(func(writer io.Writer, data interface{}) error { + return ProducerFunc(func(writer io.Writer, data any) error { if writer == nil { return errors.New("ByteStreamProducer requires a writer") // early exit } diff --git a/vendor/github.com/go-openapi/runtime/client/auth_info.go b/vendor/github.com/go-openapi/runtime/client/auth_info.go index 4f26e92347a..a98690c4d60 100644 --- a/vendor/github.com/go-openapi/runtime/client/auth_info.go +++ b/vendor/github.com/go-openapi/runtime/client/auth_info.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package client diff --git a/vendor/github.com/go-openapi/runtime/client/keepalive.go b/vendor/github.com/go-openapi/runtime/client/keepalive.go index 7dd6b51c4df..831d23b511d 100644 --- a/vendor/github.com/go-openapi/runtime/client/keepalive.go +++ b/vendor/github.com/go-openapi/runtime/client/keepalive.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package client import ( diff --git a/vendor/github.com/go-openapi/runtime/client/opentelemetry.go b/vendor/github.com/go-openapi/runtime/client/opentelemetry.go index db246fc686e..e77941293f9 100644 --- a/vendor/github.com/go-openapi/runtime/client/opentelemetry.go +++ b/vendor/github.com/go-openapi/runtime/client/opentelemetry.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package client import ( @@ -108,7 +111,7 @@ func newOpenTelemetryTransport(transport runtime.ClientTransport, host string, o return tr } -func (t *openTelemetryTransport) Submit(op *runtime.ClientOperation) (interface{}, error) { +func (t *openTelemetryTransport) Submit(op *runtime.ClientOperation) (any, error) { if op.Context == nil { return t.transport.Submit(op) } @@ -128,7 +131,7 @@ func (t *openTelemetryTransport) Submit(op *runtime.ClientOperation) (interface{ return params.WriteToRequest(req, reg) }) - op.Reader = runtime.ClientResponseReaderFunc(func(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) { + op.Reader = runtime.ClientResponseReaderFunc(func(response runtime.ClientResponse, consumer runtime.Consumer) (any, error) { if span != nil { statusCode := response.Code() // NOTE: this is replaced by semconv.HTTPResponseStatusCode in semconv v1.21 diff --git a/vendor/github.com/go-openapi/runtime/client/request.go b/vendor/github.com/go-openapi/runtime/client/request.go index 8f8bab03439..6d9b25912ec 100644 --- a/vendor/github.com/go-openapi/runtime/client/request.go +++ b/vendor/github.com/go-openapi/runtime/client/request.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package client diff --git a/vendor/github.com/go-openapi/runtime/client/response.go b/vendor/github.com/go-openapi/runtime/client/response.go index 0bbd388bc8b..59abc3b549a 100644 --- a/vendor/github.com/go-openapi/runtime/client/response.go +++ b/vendor/github.com/go-openapi/runtime/client/response.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package client diff --git a/vendor/github.com/go-openapi/runtime/client/runtime.go b/vendor/github.com/go-openapi/runtime/client/runtime.go index 8dc50c15e36..203c74e49db 100644 --- a/vendor/github.com/go-openapi/runtime/client/runtime.go +++ b/vendor/github.com/go-openapi/runtime/client/runtime.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package client @@ -363,7 +352,7 @@ func (r *Runtime) CreateHttpRequest(operation *runtime.ClientOperation) (req *ht // Submit a request and when there is a body on success it will turn that into the result // all other things are turned into an api error for swagger which retains the status code -func (r *Runtime) Submit(operation *runtime.ClientOperation) (interface{}, error) { +func (r *Runtime) Submit(operation *runtime.ClientOperation) (any, error) { _, readResponse, _ := operation.Params, operation.Reader, operation.AuthInfo request, req, err := r.createHttpRequest(operation) diff --git a/vendor/github.com/go-openapi/runtime/client_auth_info.go b/vendor/github.com/go-openapi/runtime/client_auth_info.go index c6c97d9a7c3..581e64451a2 100644 --- a/vendor/github.com/go-openapi/runtime/client_auth_info.go +++ b/vendor/github.com/go-openapi/runtime/client_auth_info.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime diff --git a/vendor/github.com/go-openapi/runtime/client_operation.go b/vendor/github.com/go-openapi/runtime/client_operation.go index 5a5d63563ad..b0bb0977db5 100644 --- a/vendor/github.com/go-openapi/runtime/client_operation.go +++ b/vendor/github.com/go-openapi/runtime/client_operation.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime @@ -37,5 +26,5 @@ type ClientOperation struct { // A ClientTransport implementor knows how to submit Request objects to some destination type ClientTransport interface { // Submit(string, RequestWriter, ResponseReader, AuthInfoWriter) (interface{}, error) - Submit(*ClientOperation) (interface{}, error) + Submit(*ClientOperation) (any, error) } diff --git a/vendor/github.com/go-openapi/runtime/client_request.go b/vendor/github.com/go-openapi/runtime/client_request.go index 4ebb2deabe9..6e335b36f32 100644 --- a/vendor/github.com/go-openapi/runtime/client_request.go +++ b/vendor/github.com/go-openapi/runtime/client_request.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime @@ -53,7 +42,7 @@ type ClientRequest interface { //nolint:interfacebloat // a swagger-capable requ SetFileParam(string, ...NamedReadCloser) error - SetBodyParam(interface{}) error + SetBodyParam(any) error SetTimeout(time.Duration) error @@ -63,7 +52,7 @@ type ClientRequest interface { //nolint:interfacebloat // a swagger-capable requ GetBody() []byte - GetBodyParam() interface{} + GetBodyParam() any GetFileParam() map[string][]NamedReadCloser } @@ -103,7 +92,7 @@ func (n *namedReadCloser) Name() string { type TestClientRequest struct { Headers http.Header - Body interface{} + Body any } func (t *TestClientRequest) SetHeaderParam(name string, values ...string) error { @@ -122,7 +111,7 @@ func (t *TestClientRequest) SetPathParam(_ string, _ string) error { return nil func (t *TestClientRequest) SetFileParam(_ string, _ ...NamedReadCloser) error { return nil } -func (t *TestClientRequest) SetBodyParam(body interface{}) error { +func (t *TestClientRequest) SetBodyParam(body any) error { t.Body = body return nil } @@ -139,7 +128,7 @@ func (t *TestClientRequest) GetPath() string { return "" } func (t *TestClientRequest) GetBody() []byte { return nil } -func (t *TestClientRequest) GetBodyParam() interface{} { +func (t *TestClientRequest) GetBodyParam() any { return t.Body } diff --git a/vendor/github.com/go-openapi/runtime/client_response.go b/vendor/github.com/go-openapi/runtime/client_response.go index b9929946d80..f2cf942ab36 100644 --- a/vendor/github.com/go-openapi/runtime/client_response.go +++ b/vendor/github.com/go-openapi/runtime/client_response.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime @@ -18,6 +7,7 @@ import ( "encoding/json" "fmt" "io" + "strings" ) // A ClientResponse represents a client response. @@ -32,28 +22,28 @@ type ClientResponse interface { } // A ClientResponseReaderFunc turns a function into a ClientResponseReader interface implementation -type ClientResponseReaderFunc func(ClientResponse, Consumer) (interface{}, error) +type ClientResponseReaderFunc func(ClientResponse, Consumer) (any, error) // ReadResponse reads the response -func (read ClientResponseReaderFunc) ReadResponse(resp ClientResponse, consumer Consumer) (interface{}, error) { +func (read ClientResponseReaderFunc) ReadResponse(resp ClientResponse, consumer Consumer) (any, error) { return read(resp, consumer) } // A ClientResponseReader is an interface for things want to read a response. // An application of this is to create structs from response values type ClientResponseReader interface { - ReadResponse(ClientResponse, Consumer) (interface{}, error) + ReadResponse(ClientResponse, Consumer) (any, error) } // APIError wraps an error model and captures the status code type APIError struct { OperationName string - Response interface{} + Response any Code int } // NewAPIError creates a new API error -func NewAPIError(opName string, payload interface{}, code int) *APIError { +func NewAPIError(opName string, payload any, code int) *APIError { return &APIError{ OperationName: opName, Response: payload, @@ -61,13 +51,17 @@ func NewAPIError(opName string, payload interface{}, code int) *APIError { } } +// sanitizer ensures that single quotes are escaped +var sanitizer = strings.NewReplacer(`\`, `\\`, `'`, `\'`) + func (o *APIError) Error() string { var resp []byte if err, ok := o.Response.(error); ok { - resp = []byte("'" + err.Error() + "'") + resp = []byte("'" + sanitizer.Replace(err.Error()) + "'") } else { resp, _ = json.Marshal(o.Response) } + return fmt.Sprintf("%s (status %d): %s", o.OperationName, o.Code, resp) } diff --git a/vendor/github.com/go-openapi/runtime/constants.go b/vendor/github.com/go-openapi/runtime/constants.go index 515969242ca..62ae9eec0cf 100644 --- a/vendor/github.com/go-openapi/runtime/constants.go +++ b/vendor/github.com/go-openapi/runtime/constants.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime diff --git a/vendor/github.com/go-openapi/runtime/csv.go b/vendor/github.com/go-openapi/runtime/csv.go index c9597bcd6e0..567e3d9db24 100644 --- a/vendor/github.com/go-openapi/runtime/csv.go +++ b/vendor/github.com/go-openapi/runtime/csv.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime @@ -48,7 +37,7 @@ import ( func CSVConsumer(opts ...CSVOpt) Consumer { o := csvOptsWithDefaults(opts) - return ConsumerFunc(func(reader io.Reader, data interface{}) error { + return ConsumerFunc(func(reader io.Reader, data any) error { if reader == nil { return errors.New("CSVConsumer requires a reader") } @@ -181,7 +170,7 @@ func CSVConsumer(opts ...CSVOpt) Consumer { func CSVProducer(opts ...CSVOpt) Producer { o := csvOptsWithDefaults(opts) - return ProducerFunc(func(writer io.Writer, data interface{}) error { + return ProducerFunc(func(writer io.Writer, data any) error { if writer == nil { return errors.New("CSVProducer requires a writer") } diff --git a/vendor/github.com/go-openapi/runtime/csv_options.go b/vendor/github.com/go-openapi/runtime/csv_options.go index 89665788242..4cc04390010 100644 --- a/vendor/github.com/go-openapi/runtime/csv_options.go +++ b/vendor/github.com/go-openapi/runtime/csv_options.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package runtime import ( diff --git a/vendor/github.com/go-openapi/runtime/discard.go b/vendor/github.com/go-openapi/runtime/discard.go index 0d390cfd64c..b05678becd9 100644 --- a/vendor/github.com/go-openapi/runtime/discard.go +++ b/vendor/github.com/go-openapi/runtime/discard.go @@ -1,9 +1,12 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package runtime import "io" // DiscardConsumer does absolutely nothing, it's a black hole. -var DiscardConsumer = ConsumerFunc(func(_ io.Reader, _ interface{}) error { return nil }) +var DiscardConsumer = ConsumerFunc(func(_ io.Reader, _ any) error { return nil }) // DiscardProducer does absolutely nothing, it's a black hole. -var DiscardProducer = ProducerFunc(func(_ io.Writer, _ interface{}) error { return nil }) +var DiscardProducer = ProducerFunc(func(_ io.Writer, _ any) error { return nil }) diff --git a/vendor/github.com/go-openapi/runtime/file.go b/vendor/github.com/go-openapi/runtime/file.go index 1bc6aabf705..2a85379a748 100644 --- a/vendor/github.com/go-openapi/runtime/file.go +++ b/vendor/github.com/go-openapi/runtime/file.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime diff --git a/vendor/github.com/go-openapi/runtime/flagext/byte_size.go b/vendor/github.com/go-openapi/runtime/flagext/byte_size.go index 0f3eeba1f6f..4e514eaef25 100644 --- a/vendor/github.com/go-openapi/runtime/flagext/byte_size.go +++ b/vendor/github.com/go-openapi/runtime/flagext/byte_size.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package flagext import ( diff --git a/vendor/github.com/go-openapi/runtime/go.work.sum b/vendor/github.com/go-openapi/runtime/go.work.sum index a60668ab8a0..b0c2c9a63de 100644 --- a/vendor/github.com/go-openapi/runtime/go.work.sum +++ b/vendor/github.com/go-openapi/runtime/go.work.sum @@ -43,15 +43,18 @@ golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5y golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= golang.org/x/crypto v0.42.0/go.mod h1:4+rDnOTJhQCx2q7/j6rAN5XDw8kPjeaXEUR2eL94ix8= +golang.org/x/crypto v0.43.0/go.mod h1:BFbav4mRNlXJL4wNeejLpWxB7wMbc79PdRGhWKncxR0= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.18.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= golang.org/x/mod v0.27.0/go.mod h1:rWI627Fq0DEoudcK+MBkNkCe0EetEaDSwJJkCcjpazc= +golang.org/x/mod v0.28.0/go.mod h1:yfB/L0NOf/kmEbXjzCPOx1iK1fRutOydrCMsqRhEBxI= golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg= +golang.org/x/net v0.45.0/go.mod h1:ECOoLqd5U3Lhyeyo/QDCEVQ4sNgYsqvCZ722XogGieY= golang.org/x/sync v0.0.0-20190423024810-112230192c58/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.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= @@ -70,6 +73,7 @@ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9sn golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= golang.org/x/term v0.35.0/go.mod h1:TPGtkTLesOwf2DE8CgVYiZinHAOuy5AYUYT1lENIZnA= +golang.org/x/term v0.36.0/go.mod h1:Qu394IJq6V6dCBRgwqshf3mPF85AqzYEzofzRdZkWss= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= @@ -83,6 +87,7 @@ golang.org/x/tools v0.22.0/go.mod h1:aCwcsjqvq7Yqt6TNyX7QMU2enbQ/Gt0bo6krSeEri+c golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= golang.org/x/tools v0.35.0/go.mod h1:NKdj5HkL/73byiZSJjqJgKn3ep7KjFkBOkR/Hps3VPw= golang.org/x/tools v0.36.0/go.mod h1:WBDiHKJK8YgLHlcQPYQzNCkUxUypCaa5ZegCVutKm+s= +golang.org/x/tools v0.37.0/go.mod h1:MBN5QPQtLMHVdvsbtarmTNukZDdgwdwlO5qGacAzF0w= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= diff --git a/vendor/github.com/go-openapi/runtime/headers.go b/vendor/github.com/go-openapi/runtime/headers.go index 4d111db4fec..510e396ca73 100644 --- a/vendor/github.com/go-openapi/runtime/headers.go +++ b/vendor/github.com/go-openapi/runtime/headers.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime diff --git a/vendor/github.com/go-openapi/runtime/interfaces.go b/vendor/github.com/go-openapi/runtime/interfaces.go index e3341286834..90046bf367e 100644 --- a/vendor/github.com/go-openapi/runtime/interfaces.go +++ b/vendor/github.com/go-openapi/runtime/interfaces.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime @@ -23,23 +12,23 @@ import ( ) // OperationHandlerFunc an adapter for a function to the OperationHandler interface -type OperationHandlerFunc func(interface{}) (interface{}, error) +type OperationHandlerFunc func(any) (any, error) // Handle implements the operation handler interface -func (s OperationHandlerFunc) Handle(data interface{}) (interface{}, error) { +func (s OperationHandlerFunc) Handle(data any) (any, error) { return s(data) } // OperationHandler a handler for a swagger operation type OperationHandler interface { - Handle(interface{}) (interface{}, error) + Handle(any) (any, error) } // ConsumerFunc represents a function that can be used as a consumer -type ConsumerFunc func(io.Reader, interface{}) error +type ConsumerFunc func(io.Reader, any) error // Consume consumes the reader into the data parameter -func (fn ConsumerFunc) Consume(reader io.Reader, data interface{}) error { +func (fn ConsumerFunc) Consume(reader io.Reader, data any) error { return fn(reader, data) } @@ -47,14 +36,14 @@ func (fn ConsumerFunc) Consume(reader io.Reader, data interface{}) error { // data provided by the request body type Consumer interface { // Consume performs the binding of request values - Consume(io.Reader, interface{}) error + Consume(io.Reader, any) error } // ProducerFunc represents a function that can be used as a producer -type ProducerFunc func(io.Writer, interface{}) error +type ProducerFunc func(io.Writer, any) error // Produce produces the response for the provided data -func (f ProducerFunc) Produce(writer io.Writer, data interface{}) error { +func (f ProducerFunc) Produce(writer io.Writer, data any) error { return f(writer, data) } @@ -62,14 +51,14 @@ func (f ProducerFunc) Produce(writer io.Writer, data interface{}) error { // HTTP response type Producer interface { // Produce writes to the http response - Produce(io.Writer, interface{}) error + Produce(io.Writer, any) error } // AuthenticatorFunc turns a function into an authenticator -type AuthenticatorFunc func(interface{}) (bool, interface{}, error) +type AuthenticatorFunc func(any) (bool, any, error) // Authenticate authenticates the request with the provided data -func (f AuthenticatorFunc) Authenticate(params interface{}) (bool, interface{}, error) { +func (f AuthenticatorFunc) Authenticate(params any) (bool, any, error) { return f(params) } @@ -77,14 +66,14 @@ func (f AuthenticatorFunc) Authenticate(params interface{}) (bool, interface{}, // implementations of Authenticator know how to authenticate the // request data and translate that into a valid principal object or an error type Authenticator interface { - Authenticate(interface{}) (bool, interface{}, error) + Authenticate(any) (bool, any, error) } // AuthorizerFunc turns a function into an authorizer -type AuthorizerFunc func(*http.Request, interface{}) error +type AuthorizerFunc func(*http.Request, any) error // Authorize authorizes the processing of the request for the principal -func (f AuthorizerFunc) Authorize(r *http.Request, principal interface{}) error { +func (f AuthorizerFunc) Authorize(r *http.Request, principal any) error { return f(r, principal) } @@ -92,7 +81,7 @@ func (f AuthorizerFunc) Authorize(r *http.Request, principal interface{}) error // implementations of Authorizer know how to authorize the principal object // using the request data and returns error if unauthorized type Authorizer interface { - Authorize(*http.Request, interface{}) error + Authorize(*http.Request, any) error } // Validatable types implementing this interface allow customizing their validation diff --git a/vendor/github.com/go-openapi/runtime/json.go b/vendor/github.com/go-openapi/runtime/json.go index 5a690559cc5..8f93eebfaa2 100644 --- a/vendor/github.com/go-openapi/runtime/json.go +++ b/vendor/github.com/go-openapi/runtime/json.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime @@ -21,7 +10,7 @@ import ( // JSONConsumer creates a new JSON consumer func JSONConsumer() Consumer { - return ConsumerFunc(func(reader io.Reader, data interface{}) error { + return ConsumerFunc(func(reader io.Reader, data any) error { dec := json.NewDecoder(reader) dec.UseNumber() // preserve number formats return dec.Decode(data) @@ -30,7 +19,7 @@ func JSONConsumer() Consumer { // JSONProducer creates a new JSON producer func JSONProducer() Producer { - return ProducerFunc(func(writer io.Writer, data interface{}) error { + return ProducerFunc(func(writer io.Writer, data any) error { enc := json.NewEncoder(writer) enc.SetEscapeHTML(false) return enc.Encode(data) diff --git a/vendor/github.com/go-openapi/runtime/logger/logger.go b/vendor/github.com/go-openapi/runtime/logger/logger.go index 6f4debcc145..45484deb593 100644 --- a/vendor/github.com/go-openapi/runtime/logger/logger.go +++ b/vendor/github.com/go-openapi/runtime/logger/logger.go @@ -1,10 +1,13 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package logger import "os" type Logger interface { - Printf(format string, args ...interface{}) - Debugf(format string, args ...interface{}) + Printf(format string, args ...any) + Debugf(format string, args ...any) } func DebugEnabled() bool { diff --git a/vendor/github.com/go-openapi/runtime/logger/standard.go b/vendor/github.com/go-openapi/runtime/logger/standard.go index 30035a77770..48ba27f4a3d 100644 --- a/vendor/github.com/go-openapi/runtime/logger/standard.go +++ b/vendor/github.com/go-openapi/runtime/logger/standard.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package logger import ( @@ -9,14 +12,14 @@ var _ Logger = StandardLogger{} type StandardLogger struct{} -func (StandardLogger) Printf(format string, args ...interface{}) { +func (StandardLogger) Printf(format string, args ...any) { if len(format) == 0 || format[len(format)-1] != '\n' { format += "\n" } fmt.Fprintf(os.Stderr, format, args...) } -func (StandardLogger) Debugf(format string, args ...interface{}) { +func (StandardLogger) Debugf(format string, args ...any) { if len(format) == 0 || format[len(format)-1] != '\n' { format += "\n" } diff --git a/vendor/github.com/go-openapi/runtime/middleware/context.go b/vendor/github.com/go-openapi/runtime/middleware/context.go index f2cade3ca0a..bb00b93b89b 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/context.go +++ b/vendor/github.com/go-openapi/runtime/middleware/context.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package middleware @@ -126,7 +115,7 @@ func newRoutableUntypedAPI(spec *loads.Document, api *untyped.API, context *Cont } // bind and validate the request using reflection - var bound interface{} + var bound any var validation error bound, r, validation = context.BindAndValidate(r, route) if validation != nil { @@ -287,7 +276,7 @@ func MatchedRouteFrom(req *http.Request) *MatchedRoute { } // SecurityPrincipalFrom request context value. -func SecurityPrincipalFrom(req *http.Request) interface{} { +func SecurityPrincipalFrom(req *http.Request) any { return req.Context().Value(ctxSecurityPrincipal) } @@ -466,7 +455,7 @@ func (c *Context) ResetAuth(request *http.Request) *http.Request { // Returns the principal object and a shallow copy of the request when its // context doesn't contain the principal, otherwise the same request or an error // (the last) if one of the authenticators returns one or an Unauthenticated error -func (c *Context) Authorize(request *http.Request, route *MatchedRoute) (interface{}, *http.Request, error) { +func (c *Context) Authorize(request *http.Request, route *MatchedRoute) (any, *http.Request, error) { if route == nil || !route.HasAuth() { return nil, nil, nil } @@ -504,7 +493,7 @@ func (c *Context) Authorize(request *http.Request, route *MatchedRoute) (interfa // Returns the validation map and a shallow copy of the request when its context // doesn't contain the validation, otherwise it returns the same request or an // CompositeValidationError error -func (c *Context) BindAndValidate(request *http.Request, matched *MatchedRoute) (interface{}, *http.Request, error) { +func (c *Context) BindAndValidate(request *http.Request, matched *MatchedRoute) (any, *http.Request, error) { var rCtx = request.Context() if v, ok := rCtx.Value(ctxBoundParams).(*validation); ok { @@ -530,7 +519,7 @@ func (c *Context) NotFound(rw http.ResponseWriter, r *http.Request) { } // Respond renders the response after doing some content negotiation -func (c *Context) Respond(rw http.ResponseWriter, r *http.Request, produces []string, route *MatchedRoute, data interface{}) { +func (c *Context) Respond(rw http.ResponseWriter, r *http.Request, produces []string, route *MatchedRoute, data any) { c.debugLogf("responding to %s %s with produces: %v", r.Method, r.URL.Path, produces) offers := []string{} for _, mt := range produces { diff --git a/vendor/github.com/go-openapi/runtime/middleware/denco/router.go b/vendor/github.com/go-openapi/runtime/middleware/denco/router.go index 21808ede332..b371a2cf84e 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/denco/router.go +++ b/vendor/github.com/go-openapi/runtime/middleware/denco/router.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + // Package denco provides fast URL router. package denco @@ -36,14 +39,14 @@ type Router struct { // By default, SizeHint will be determined from given records to Build. SizeHint int - static map[string]interface{} + static map[string]any } // New returns a new Router. func New() *Router { return &Router{ SizeHint: -1, - static: make(map[string]interface{}), + static: make(map[string]any), param: newDoubleArray(), } } @@ -51,7 +54,7 @@ func New() *Router { // Lookup returns data and path parameters that associated with path. // params is a slice of the Param that arranged in the order in which parameters appeared. // e.g. when built routing path is "/path/to/:id/:name" and given path is "/path/to/1/alice". params order is [{"id": "1"}, {"name": "alice"}], not [{"name": "alice"}, {"id": "1"}]. -func (rt *Router) Lookup(path string) (data interface{}, params Params, found bool) { +func (rt *Router) Lookup(path string) (data any, params Params, found bool) { if data, found = rt.static[path]; found { return data, nil, true } @@ -348,7 +351,7 @@ func (da *doubleArray) arrange(records []*record, idx, depth int, usedBase map[i // node represents a node of Double-Array. type node struct { - data interface{} + data any // Names of path parameters. paramNames []string @@ -422,11 +425,11 @@ type Record struct { Key string // Result value for Key. - Value interface{} + Value any } // NewRecord returns a new Record. -func NewRecord(key string, value interface{}) Record { +func NewRecord(key string, value any) Record { return Record{ Key: key, Value: value, diff --git a/vendor/github.com/go-openapi/runtime/middleware/denco/server.go b/vendor/github.com/go-openapi/runtime/middleware/denco/server.go index 0886713c181..8f04d93dba9 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/denco/server.go +++ b/vendor/github.com/go-openapi/runtime/middleware/denco/server.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package denco import ( diff --git a/vendor/github.com/go-openapi/runtime/middleware/denco/util.go b/vendor/github.com/go-openapi/runtime/middleware/denco/util.go index edc1f6ab80a..f002bc4693f 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/denco/util.go +++ b/vendor/github.com/go-openapi/runtime/middleware/denco/util.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package denco // NextSeparator returns an index of next separator in path. diff --git a/vendor/github.com/go-openapi/runtime/middleware/doc.go b/vendor/github.com/go-openapi/runtime/middleware/doc.go index 836a98850d7..04b83223638 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/doc.go +++ b/vendor/github.com/go-openapi/runtime/middleware/doc.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 /* Package middleware provides the library with helper functions for serving swagger APIs. diff --git a/vendor/github.com/go-openapi/runtime/middleware/header/header.go b/vendor/github.com/go-openapi/runtime/middleware/header/header.go index 13d7dc31203..6ce870d8936 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/header/header.go +++ b/vendor/github.com/go-openapi/runtime/middleware/header/header.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + // Copyright 2013 The Go Authors. All rights reserved. // // Use of this source code is governed by a BSD-style @@ -10,6 +13,7 @@ package header import ( + "maps" "net/http" "strings" "time" @@ -65,9 +69,7 @@ func init() { // Copy returns a shallow copy of the header. func Copy(header http.Header) http.Header { h := make(http.Header) - for k, vs := range header { - h[k] = vs - } + maps.Copy(h, header) return h } diff --git a/vendor/github.com/go-openapi/runtime/middleware/negotiate.go b/vendor/github.com/go-openapi/runtime/middleware/negotiate.go index d25d58cf3a3..cb0a85283c1 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/negotiate.go +++ b/vendor/github.com/go-openapi/runtime/middleware/negotiate.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + // Copyright 2013 The Go Authors. All rights reserved. // // Use of this source code is governed by a BSD-style diff --git a/vendor/github.com/go-openapi/runtime/middleware/not_implemented.go b/vendor/github.com/go-openapi/runtime/middleware/not_implemented.go index bc6942a0f1b..2e63780c70b 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/not_implemented.go +++ b/vendor/github.com/go-openapi/runtime/middleware/not_implemented.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package middleware @@ -22,7 +11,7 @@ import ( type errorResp struct { code int - response interface{} + response any headers http.Header } @@ -49,7 +38,7 @@ func NotImplemented(message string) Responder { // Error creates a generic responder for returning errors, the data will be serialized // with the matching producer for the request -func Error(code int, data interface{}, headers ...http.Header) Responder { +func Error(code int, data any, headers ...http.Header) Responder { var hdr http.Header for _, h := range headers { for k, v := range h { diff --git a/vendor/github.com/go-openapi/runtime/middleware/operation.go b/vendor/github.com/go-openapi/runtime/middleware/operation.go index 1175a63cf29..2a7ab1fadaf 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/operation.go +++ b/vendor/github.com/go-openapi/runtime/middleware/operation.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package middleware diff --git a/vendor/github.com/go-openapi/runtime/middleware/parameter.go b/vendor/github.com/go-openapi/runtime/middleware/parameter.go index 5301b4c3340..7d630d6cce6 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/parameter.go +++ b/vendor/github.com/go-openapi/runtime/middleware/parameter.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package middleware @@ -192,34 +181,34 @@ func (p *untypedParamBinder) Bind(request *http.Request, routeParams RouteParams func (p *untypedParamBinder) typeForSchema(tpe, format string, items *spec.Items) reflect.Type { switch tpe { case "boolean": - return reflect.TypeOf(true) + return reflect.TypeFor[bool]() case typeString: if tt, ok := p.formats.GetType(format); ok { return tt } - return reflect.TypeOf("") + return reflect.TypeFor[string]() case "integer": switch format { case "int8": - return reflect.TypeOf(int8(0)) + return reflect.TypeFor[int8]() case "int16": - return reflect.TypeOf(int16(0)) + return reflect.TypeFor[int16]() case "int32": - return reflect.TypeOf(int32(0)) + return reflect.TypeFor[int32]() case "int64": - return reflect.TypeOf(int64(0)) + return reflect.TypeFor[int64]() default: - return reflect.TypeOf(int64(0)) + return reflect.TypeFor[int64]() } case "number": switch format { case "float": - return reflect.TypeOf(float32(0)) + return reflect.TypeFor[float32]() case "double": - return reflect.TypeOf(float64(0)) + return reflect.TypeFor[float64]() } case typeArray: @@ -233,10 +222,10 @@ func (p *untypedParamBinder) typeForSchema(tpe, format string, items *spec.Items return reflect.MakeSlice(reflect.SliceOf(itemsType), 0, 0).Type() case "file": - return reflect.TypeOf(&runtime.File{}).Elem() + return reflect.TypeFor[runtime.File]() case "object": - return reflect.TypeOf(map[string]interface{}{}) + return reflect.TypeFor[map[string]any]() } return nil } @@ -279,7 +268,7 @@ func (p *untypedParamBinder) bindValue(data []string, hasKey bool, target reflec return p.setFieldValue(target, p.parameter.Default, d, hasKey) } -func (p *untypedParamBinder) setFieldValue(target reflect.Value, defaultValue interface{}, data string, hasKey bool) error { //nolint:gocyclo +func (p *untypedParamBinder) setFieldValue(target reflect.Value, defaultValue any, data string, hasKey bool) error { //nolint:gocyclo tpe := p.parameter.Type if p.parameter.Format != "" { tpe = p.parameter.Format @@ -341,7 +330,7 @@ func (p *untypedParamBinder) setFieldValue(target reflect.Value, defaultValue in case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: if data == "" { if target.CanSet() { - rd := defVal.Convert(reflect.TypeOf(int64(0))) + rd := defVal.Convert(reflect.TypeFor[int64]()) target.SetInt(rd.Int()) } return nil @@ -360,7 +349,7 @@ func (p *untypedParamBinder) setFieldValue(target reflect.Value, defaultValue in case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: if data == "" { if target.CanSet() { - rd := defVal.Convert(reflect.TypeOf(uint64(0))) + rd := defVal.Convert(reflect.TypeFor[uint64]()) target.SetUint(rd.Uint()) } return nil @@ -379,7 +368,7 @@ func (p *untypedParamBinder) setFieldValue(target reflect.Value, defaultValue in case reflect.Float32, reflect.Float64: if data == "" { if target.CanSet() { - rd := defVal.Convert(reflect.TypeOf(float64(0))) + rd := defVal.Convert(reflect.TypeFor[float64]()) target.SetFloat(rd.Float()) } return nil @@ -426,7 +415,7 @@ func (p *untypedParamBinder) setFieldValue(target reflect.Value, defaultValue in return nil } -func (p *untypedParamBinder) tryUnmarshaler(target reflect.Value, defaultValue interface{}, data string) (bool, error) { +func (p *untypedParamBinder) tryUnmarshaler(target reflect.Value, defaultValue any, data string) (bool, error) { if !target.CanSet() { return false, nil } @@ -458,7 +447,7 @@ func (p *untypedParamBinder) readFormattedSliceFieldValue(data string, target re return stringutils.SplitByFormat(data, p.parameter.CollectionFormat), false, nil } -func (p *untypedParamBinder) setSliceFieldValue(target reflect.Value, defaultValue interface{}, data []string, hasKey bool) error { +func (p *untypedParamBinder) setSliceFieldValue(target reflect.Value, defaultValue any, data []string, hasKey bool) error { sz := len(data) if (!hasKey || (!p.parameter.AllowEmptyValue && (sz == 0 || (sz == 1 && data[0] == "")))) && p.parameter.Required && defaultValue == nil { return errors.Required(p.Name, p.parameter.In, data) diff --git a/vendor/github.com/go-openapi/runtime/middleware/rapidoc.go b/vendor/github.com/go-openapi/runtime/middleware/rapidoc.go index ef75e7441fc..6039a26f33e 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/rapidoc.go +++ b/vendor/github.com/go-openapi/runtime/middleware/rapidoc.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package middleware import ( diff --git a/vendor/github.com/go-openapi/runtime/middleware/redoc.go b/vendor/github.com/go-openapi/runtime/middleware/redoc.go index b96b01e7f3f..cbaec73c438 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/redoc.go +++ b/vendor/github.com/go-openapi/runtime/middleware/redoc.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package middleware import ( diff --git a/vendor/github.com/go-openapi/runtime/middleware/request.go b/vendor/github.com/go-openapi/runtime/middleware/request.go index 577e4a0f107..52facfefcd2 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/request.go +++ b/vendor/github.com/go-openapi/runtime/middleware/request.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package middleware @@ -50,7 +39,7 @@ func NewUntypedRequestBinder(parameters map[string]spec.Parameter, spec *spec.Sw } // Bind perform the databinding and validation -func (o *UntypedRequestBinder) Bind(request *http.Request, routeParams RouteParams, consumer runtime.Consumer, data interface{}) error { +func (o *UntypedRequestBinder) Bind(request *http.Request, routeParams RouteParams, consumer runtime.Consumer, data any) error { val := reflect.Indirect(reflect.ValueOf(data)) isMap := val.Kind() == reflect.Map var result []error @@ -68,9 +57,9 @@ func (o *UntypedRequestBinder) Bind(request *http.Request, routeParams RoutePara tpe := binder.Type() if tpe == nil { if param.Schema.Type.Contains(typeArray) { - tpe = reflect.TypeOf([]interface{}{}) + tpe = reflect.TypeFor[[]any]() } else { - tpe = reflect.TypeOf(map[string]interface{}{}) + tpe = reflect.TypeFor[map[string]any]() } } target = reflect.Indirect(reflect.New(tpe)) diff --git a/vendor/github.com/go-openapi/runtime/middleware/router.go b/vendor/github.com/go-openapi/runtime/middleware/router.go index 0f9317903c7..16816580da8 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/router.go +++ b/vendor/github.com/go-openapi/runtime/middleware/router.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package middleware @@ -208,13 +197,13 @@ func (ra *RouteAuthenticator) CommonScopes() []string { } // Authenticate Authenticator interface implementation -func (ra *RouteAuthenticator) Authenticate(req *http.Request, route *MatchedRoute) (bool, interface{}, error) { +func (ra *RouteAuthenticator) Authenticate(req *http.Request, route *MatchedRoute) (bool, any, error) { if ra.allowAnonymous { route.Authenticator = ra return true, nil, nil } // iterate in proper order - var lastResult interface{} + var lastResult any for _, scheme := range ra.Schemes { if authenticator, ok := ra.Authenticator[scheme]; ok { applies, princ, err := authenticator.Authenticate(&security.ScopedAuthRequest{ @@ -287,7 +276,7 @@ func (ras RouteAuthenticators) AllowsAnonymous() bool { } // Authenticate method implemention so this collection can be used as authenticator -func (ras RouteAuthenticators) Authenticate(req *http.Request, route *MatchedRoute) (bool, interface{}, error) { +func (ras RouteAuthenticators) Authenticate(req *http.Request, route *MatchedRoute) (bool, any, error) { var lastError error var allowsAnon bool var anonAuth RouteAuthenticator diff --git a/vendor/github.com/go-openapi/runtime/middleware/security.go b/vendor/github.com/go-openapi/runtime/middleware/security.go index 2b061caefcb..37ecfa6fd4e 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/security.go +++ b/vendor/github.com/go-openapi/runtime/middleware/security.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package middleware diff --git a/vendor/github.com/go-openapi/runtime/middleware/spec.go b/vendor/github.com/go-openapi/runtime/middleware/spec.go index 87e17e34249..9cc9940aaa5 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/spec.go +++ b/vendor/github.com/go-openapi/runtime/middleware/spec.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package middleware diff --git a/vendor/github.com/go-openapi/runtime/middleware/swaggerui.go b/vendor/github.com/go-openapi/runtime/middleware/swaggerui.go index ec3c10cbafa..b25a3a2cff7 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/swaggerui.go +++ b/vendor/github.com/go-openapi/runtime/middleware/swaggerui.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package middleware import ( diff --git a/vendor/github.com/go-openapi/runtime/middleware/swaggerui_oauth2.go b/vendor/github.com/go-openapi/runtime/middleware/swaggerui_oauth2.go index e81212f71c8..879bdbaadea 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/swaggerui_oauth2.go +++ b/vendor/github.com/go-openapi/runtime/middleware/swaggerui_oauth2.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package middleware import ( diff --git a/vendor/github.com/go-openapi/runtime/middleware/ui_options.go b/vendor/github.com/go-openapi/runtime/middleware/ui_options.go index 7a5fb16f633..cf2f673d3cb 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/ui_options.go +++ b/vendor/github.com/go-openapi/runtime/middleware/ui_options.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package middleware import ( @@ -39,7 +42,7 @@ type uiOptions struct { // toCommonUIOptions converts any UI option type to retain the common options. // // This uses gob encoding/decoding to convert common fields from one struct to another. -func toCommonUIOptions(opts interface{}) uiOptions { +func toCommonUIOptions(opts any) uiOptions { var buf bytes.Buffer enc := gob.NewEncoder(&buf) dec := gob.NewDecoder(&buf) diff --git a/vendor/github.com/go-openapi/runtime/middleware/untyped/api.go b/vendor/github.com/go-openapi/runtime/middleware/untyped/api.go index a98d6690a4f..774da0ba0c8 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/untyped/api.go +++ b/vendor/github.com/go-openapi/runtime/middleware/untyped/api.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package untyped diff --git a/vendor/github.com/go-openapi/runtime/middleware/validation.go b/vendor/github.com/go-openapi/runtime/middleware/validation.go index 3879d754ee7..ed026d626ba 100644 --- a/vendor/github.com/go-openapi/runtime/middleware/validation.go +++ b/vendor/github.com/go-openapi/runtime/middleware/validation.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package middleware diff --git a/vendor/github.com/go-openapi/runtime/request.go b/vendor/github.com/go-openapi/runtime/request.go index 203dab2f1d0..aab7b8c055a 100644 --- a/vendor/github.com/go-openapi/runtime/request.go +++ b/vendor/github.com/go-openapi/runtime/request.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime diff --git a/vendor/github.com/go-openapi/runtime/security/authenticator.go b/vendor/github.com/go-openapi/runtime/security/authenticator.go index def3746e20c..b5b7904dc1e 100644 --- a/vendor/github.com/go-openapi/runtime/security/authenticator.go +++ b/vendor/github.com/go-openapi/runtime/security/authenticator.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package security @@ -31,8 +20,8 @@ const ( ) // HttpAuthenticator is a function that authenticates a HTTP request -func HttpAuthenticator(handler func(*http.Request) (bool, interface{}, error)) runtime.Authenticator { //nolint:revive - return runtime.AuthenticatorFunc(func(params interface{}) (bool, interface{}, error) { +func HttpAuthenticator(handler func(*http.Request) (bool, any, error)) runtime.Authenticator { //nolint:revive + return runtime.AuthenticatorFunc(func(params any) (bool, any, error) { if request, ok := params.(*http.Request); ok { return handler(request) } @@ -44,8 +33,8 @@ func HttpAuthenticator(handler func(*http.Request) (bool, interface{}, error)) r } // ScopedAuthenticator is a function that authenticates a HTTP request against a list of valid scopes -func ScopedAuthenticator(handler func(*ScopedAuthRequest) (bool, interface{}, error)) runtime.Authenticator { - return runtime.AuthenticatorFunc(func(params interface{}) (bool, interface{}, error) { +func ScopedAuthenticator(handler func(*ScopedAuthRequest) (bool, any, error)) runtime.Authenticator { + return runtime.AuthenticatorFunc(func(params any) (bool, any, error) { if request, ok := params.(*ScopedAuthRequest); ok { return handler(request) } @@ -54,22 +43,22 @@ func ScopedAuthenticator(handler func(*ScopedAuthRequest) (bool, interface{}, er } // UserPassAuthentication authentication function -type UserPassAuthentication func(string, string) (interface{}, error) +type UserPassAuthentication func(string, string) (any, error) // UserPassAuthenticationCtx authentication function with context.Context -type UserPassAuthenticationCtx func(context.Context, string, string) (context.Context, interface{}, error) +type UserPassAuthenticationCtx func(context.Context, string, string) (context.Context, any, error) // TokenAuthentication authentication function -type TokenAuthentication func(string) (interface{}, error) +type TokenAuthentication func(string) (any, error) // TokenAuthenticationCtx authentication function with context.Context -type TokenAuthenticationCtx func(context.Context, string) (context.Context, interface{}, error) +type TokenAuthenticationCtx func(context.Context, string) (context.Context, any, error) // ScopedTokenAuthentication authentication function -type ScopedTokenAuthentication func(string, []string) (interface{}, error) +type ScopedTokenAuthentication func(string, []string) (any, error) // ScopedTokenAuthenticationCtx authentication function with context.Context -type ScopedTokenAuthenticationCtx func(context.Context, string, []string) (context.Context, interface{}, error) +type ScopedTokenAuthenticationCtx func(context.Context, string, []string) (context.Context, any, error) var DefaultRealmName = "API" @@ -115,7 +104,7 @@ func BasicAuthRealm(realm string, authenticate UserPassAuthentication) runtime.A realm = DefaultRealmName } - return HttpAuthenticator(func(r *http.Request) (bool, interface{}, error) { + return HttpAuthenticator(func(r *http.Request) (bool, any, error) { if usr, pass, ok := r.BasicAuth(); ok { p, err := authenticate(usr, pass) if err != nil { @@ -139,7 +128,7 @@ func BasicAuthRealmCtx(realm string, authenticate UserPassAuthenticationCtx) run realm = DefaultRealmName } - return HttpAuthenticator(func(r *http.Request) (bool, interface{}, error) { + return HttpAuthenticator(func(r *http.Request) (bool, any, error) { if usr, pass, ok := r.BasicAuth(); ok { ctx, p, err := authenticate(r.Context(), usr, pass) if err != nil { @@ -170,7 +159,7 @@ func APIKeyAuth(name, in string, authenticate TokenAuthentication) runtime.Authe getToken = func(r *http.Request) string { return r.URL.Query().Get(name) } } - return HttpAuthenticator(func(r *http.Request) (bool, interface{}, error) { + return HttpAuthenticator(func(r *http.Request) (bool, any, error) { token := getToken(r) if token == "" { return false, nil, nil @@ -198,7 +187,7 @@ func APIKeyAuthCtx(name, in string, authenticate TokenAuthenticationCtx) runtime getToken = func(r *http.Request) string { return r.URL.Query().Get(name) } } - return HttpAuthenticator(func(r *http.Request) (bool, interface{}, error) { + return HttpAuthenticator(func(r *http.Request) (bool, any, error) { token := getToken(r) if token == "" { return false, nil, nil @@ -219,11 +208,11 @@ type ScopedAuthRequest struct { // BearerAuth for use with oauth2 flows func BearerAuth(name string, authenticate ScopedTokenAuthentication) runtime.Authenticator { const prefix = "Bearer " - return ScopedAuthenticator(func(r *ScopedAuthRequest) (bool, interface{}, error) { + return ScopedAuthenticator(func(r *ScopedAuthRequest) (bool, any, error) { var token string hdr := r.Request.Header.Get(runtime.HeaderAuthorization) - if strings.HasPrefix(hdr, prefix) { - token = strings.TrimPrefix(hdr, prefix) + if after, ok := strings.CutPrefix(hdr, prefix); ok { + token = after } if token == "" { qs := r.Request.URL.Query() @@ -249,11 +238,11 @@ func BearerAuth(name string, authenticate ScopedTokenAuthentication) runtime.Aut // BearerAuthCtx for use with oauth2 flows with support for context.Context. func BearerAuthCtx(name string, authenticate ScopedTokenAuthenticationCtx) runtime.Authenticator { const prefix = "Bearer " - return ScopedAuthenticator(func(r *ScopedAuthRequest) (bool, interface{}, error) { + return ScopedAuthenticator(func(r *ScopedAuthRequest) (bool, any, error) { var token string hdr := r.Request.Header.Get(runtime.HeaderAuthorization) - if strings.HasPrefix(hdr, prefix) { - token = strings.TrimPrefix(hdr, prefix) + if after, ok := strings.CutPrefix(hdr, prefix); ok { + token = after } if token == "" { qs := r.Request.URL.Query() diff --git a/vendor/github.com/go-openapi/runtime/security/authorizer.go b/vendor/github.com/go-openapi/runtime/security/authorizer.go index 00c1a4d6a4c..69bd497a3c2 100644 --- a/vendor/github.com/go-openapi/runtime/security/authorizer.go +++ b/vendor/github.com/go-openapi/runtime/security/authorizer.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package security @@ -23,5 +12,5 @@ import ( // Authorized provides a default implementation of the Authorizer interface where all // requests are authorized (successful) func Authorized() runtime.Authorizer { - return runtime.AuthorizerFunc(func(_ *http.Request, _ interface{}) error { return nil }) + return runtime.AuthorizerFunc(func(_ *http.Request, _ any) error { return nil }) } diff --git a/vendor/github.com/go-openapi/runtime/statuses.go b/vendor/github.com/go-openapi/runtime/statuses.go index 3b011a0bff1..7e10a5a56c2 100644 --- a/vendor/github.com/go-openapi/runtime/statuses.go +++ b/vendor/github.com/go-openapi/runtime/statuses.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime diff --git a/vendor/github.com/go-openapi/runtime/text.go b/vendor/github.com/go-openapi/runtime/text.go index d8dee9410cb..2b8e4ac09d0 100644 --- a/vendor/github.com/go-openapi/runtime/text.go +++ b/vendor/github.com/go-openapi/runtime/text.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime @@ -27,7 +16,7 @@ import ( // TextConsumer creates a new text consumer func TextConsumer() Consumer { - return ConsumerFunc(func(reader io.Reader, data interface{}) error { + return ConsumerFunc(func(reader io.Reader, data any) error { if reader == nil { return errors.New("TextConsumer requires a reader") // early exit } @@ -69,7 +58,7 @@ func TextConsumer() Consumer { // TextProducer creates a new text producer func TextProducer() Producer { - return ProducerFunc(func(writer io.Writer, data interface{}) error { + return ProducerFunc(func(writer io.Writer, data any) error { if writer == nil { return errors.New("TextProducer requires a writer") // early exit } diff --git a/vendor/github.com/go-openapi/runtime/values.go b/vendor/github.com/go-openapi/runtime/values.go index 11f5732af4e..19894e78451 100644 --- a/vendor/github.com/go-openapi/runtime/values.go +++ b/vendor/github.com/go-openapi/runtime/values.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package runtime // Values typically represent parameters on a http request. diff --git a/vendor/github.com/go-openapi/runtime/xml.go b/vendor/github.com/go-openapi/runtime/xml.go index 821c7393dfb..5060b5c8e91 100644 --- a/vendor/github.com/go-openapi/runtime/xml.go +++ b/vendor/github.com/go-openapi/runtime/xml.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package runtime @@ -21,7 +10,7 @@ import ( // XMLConsumer creates a new XML consumer func XMLConsumer() Consumer { - return ConsumerFunc(func(reader io.Reader, data interface{}) error { + return ConsumerFunc(func(reader io.Reader, data any) error { dec := xml.NewDecoder(reader) return dec.Decode(data) }) @@ -29,7 +18,7 @@ func XMLConsumer() Consumer { // XMLProducer creates a new XML producer func XMLProducer() Producer { - return ProducerFunc(func(writer io.Writer, data interface{}) error { + return ProducerFunc(func(writer io.Writer, data any) error { enc := xml.NewEncoder(writer) return enc.Encode(data) }) diff --git a/vendor/github.com/go-openapi/runtime/yamlpc/yaml.go b/vendor/github.com/go-openapi/runtime/yamlpc/yaml.go index 467408c4f66..ca63430e0b7 100644 --- a/vendor/github.com/go-openapi/runtime/yamlpc/yaml.go +++ b/vendor/github.com/go-openapi/runtime/yamlpc/yaml.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package yamlpc diff --git a/vendor/github.com/go-openapi/strfmt/.golangci.yml b/vendor/github.com/go-openapi/strfmt/.golangci.yml index 7cea1af8b52..1ad5adf47e6 100644 --- a/vendor/github.com/go-openapi/strfmt/.golangci.yml +++ b/vendor/github.com/go-openapi/strfmt/.golangci.yml @@ -16,7 +16,7 @@ linters: - godox - gosmopolitan - inamedparam - #- intrange # disabled while < go1.22 + - intrange - ireturn - lll - musttag diff --git a/vendor/github.com/go-openapi/strfmt/README.md b/vendor/github.com/go-openapi/strfmt/README.md index f6b39c6c56c..de5afe13760 100644 --- a/vendor/github.com/go-openapi/strfmt/README.md +++ b/vendor/github.com/go-openapi/strfmt/README.md @@ -35,7 +35,7 @@ It also provides convenient extensions to go-openapi users. - mac (e.g "01:02:03:04:05:06") - rgbcolor (e.g. "rgb(100,100,100)") - ssn - - uuid, uuid3, uuid4, uuid5 + - uuid, uuid3, uuid4, uuid5, uuid7 - cidr (e.g. "192.0.2.1/24", "2001:db8:a0b:12f0::1/32") - ulid (e.g. "00000PP9HGSBSSDZ1JTEXBJ0PW", [spec](https://github.com/ulid/spec)) @@ -81,7 +81,12 @@ List of defined types: - SSN - URI - UUID -- UUID3 -- UUID4 -- UUID5 +- [UUID3](https://www.rfc-editor.org/rfc/rfc9562.html#name-uuid-version-3) +- [UUID4](https://www.rfc-editor.org/rfc/rfc9562.html#name-uuid-version-4) +- [UUID5](https://www.rfc-editor.org/rfc/rfc9562.html#name-uuid-version-5) +- [UUID7](https://www.rfc-editor.org/rfc/rfc9562.html#name-uuid-version-7) - [ULID](https://github.com/ulid/spec) + +## Licensing + +This library ships under the [SPDX-License-Identifier: Apache-2.0](./LICENSE). diff --git a/vendor/github.com/go-openapi/strfmt/bson.go b/vendor/github.com/go-openapi/strfmt/bson.go index 78d6e073587..0eec8f6432c 100644 --- a/vendor/github.com/go-openapi/strfmt/bson.go +++ b/vendor/github.com/go-openapi/strfmt/bson.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package strfmt @@ -18,9 +7,6 @@ import ( "database/sql/driver" "fmt" - "go.mongodb.org/mongo-driver/bson" - - "go.mongodb.org/mongo-driver/bson/bsontype" bsonprim "go.mongodb.org/mongo-driver/bson/primitive" ) @@ -75,7 +61,7 @@ func (id *ObjectId) UnmarshalText(data []byte) error { // validation is performe } // Scan read a value from a database driver -func (id *ObjectId) Scan(raw interface{}) error { +func (id *ObjectId) Scan(raw any) error { var data []byte switch v := raw.(type) { case []byte: @@ -113,42 +99,6 @@ func (id *ObjectId) UnmarshalJSON(data []byte) error { return nil } -// MarshalBSON renders the object id as a BSON document -func (id ObjectId) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": bsonprim.ObjectID(id)}) -} - -// UnmarshalBSON reads the objectId from a BSON document -func (id *ObjectId) UnmarshalBSON(data []byte) error { - var obj struct { - Data bsonprim.ObjectID - } - if err := bson.Unmarshal(data, &obj); err != nil { - return err - } - *id = ObjectId(obj.Data) - return nil -} - -// MarshalBSONValue is an interface implemented by types that can marshal themselves -// into a BSON document represented as bytes. The bytes returned must be a valid -// BSON document if the error is nil. -func (id ObjectId) MarshalBSONValue() (bsontype.Type, []byte, error) { - oid := bsonprim.ObjectID(id) - return bson.TypeObjectID, oid[:], nil -} - -// UnmarshalBSONValue is an interface implemented by types that can unmarshal a -// BSON value representation of themselves. The BSON bytes and type can be -// assumed to be valid. UnmarshalBSONValue must copy the BSON value bytes if it -// wishes to retain the data after returning. -func (id *ObjectId) UnmarshalBSONValue(_ bsontype.Type, data []byte) error { - var oid bsonprim.ObjectID - copy(oid[:], data) - *id = ObjectId(oid) - return nil -} - // DeepCopyInto copies the receiver and writes its value into out. func (id *ObjectId) DeepCopyInto(out *ObjectId) { *out = *id diff --git a/vendor/github.com/go-openapi/strfmt/date.go b/vendor/github.com/go-openapi/strfmt/date.go index a8f52ff354d..8aa17b8ea55 100644 --- a/vendor/github.com/go-openapi/strfmt/date.go +++ b/vendor/github.com/go-openapi/strfmt/date.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package strfmt @@ -19,8 +8,6 @@ import ( "encoding/json" "fmt" "time" - - "go.mongodb.org/mongo-driver/bson" ) func init() { @@ -70,7 +57,7 @@ func (d Date) MarshalText() ([]byte, error) { } // Scan scans a Date value from database driver type. -func (d *Date) Scan(raw interface{}) error { +func (d *Date) Scan(raw any) error { switch v := raw.(type) { case []byte: return d.UnmarshalText(v) @@ -114,28 +101,6 @@ func (d *Date) UnmarshalJSON(data []byte) error { return nil } -func (d Date) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": d.String()}) -} - -func (d *Date) UnmarshalBSON(data []byte) error { - var m bson.M - if err := bson.Unmarshal(data, &m); err != nil { - return err - } - - if data, ok := m["data"].(string); ok { - rd, err := time.ParseInLocation(RFC3339FullDate, data, DefaultTimeLocation) - if err != nil { - return err - } - *d = Date(rd) - return nil - } - - return fmt.Errorf("couldn't unmarshal bson bytes value as Date: %w", ErrFormat) -} - // DeepCopyInto copies the receiver and writes its value into out. func (d *Date) DeepCopyInto(out *Date) { *out = *d diff --git a/vendor/github.com/go-openapi/strfmt/default.go b/vendor/github.com/go-openapi/strfmt/default.go index 02e11122937..8a80cfbdb8a 100644 --- a/vendor/github.com/go-openapi/strfmt/default.go +++ b/vendor/github.com/go-openapi/strfmt/default.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package strfmt @@ -19,14 +8,15 @@ import ( "encoding/base64" "encoding/json" "fmt" + "net" "net/mail" "net/netip" + "net/url" + "regexp" "strconv" "strings" - "github.com/asaskevich/govalidator" "github.com/google/uuid" - "go.mongodb.org/mongo-driver/bson" "golang.org/x/net/idna" ) @@ -60,10 +50,33 @@ const ( // // Deprecated: strfmt no longer uses regular expressions to validate UUIDs. UUID5Pattern = `(?i)(^[0-9a-f]{8}-[0-9a-f]{4}-5[0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$)|(^[0-9a-f]{12}5[0-9a-f]{3}[89ab][0-9a-f]{15}$)` + + isbn10Pattern string = "^(?:[0-9]{9}X|[0-9]{10})$" + isbn13Pattern string = "^(?:[0-9]{13})$" + usCardPattern string = "^(?:4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|(222[1-9]|22[3-9][0-9]|2[3-6][0-9]{2}|27[01][0-9]|2720)[0-9]{12}|6(?:011|5[0-9][0-9])[0-9]{12}|3[47][0-9]{13}|3(?:0[0-5]|[68][0-9])[0-9]{11}|(?:2131|1800|35\\d{3})\\d{11}|6[27][0-9]{14})$" + ssnPattern string = `^\d{3}[- ]?\d{2}[- ]?\d{4}$` + hexColorPattern string = "^#?([0-9a-fA-F]{3}|[0-9a-fA-F]{6})$" + rgbColorPattern string = "^rgb\\(\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*,\\s*(0|[1-9]\\d?|1\\d\\d?|2[0-4]\\d|25[0-5])\\s*\\)$" +) + +const ( + isbnVersion10 = 10 + isbnVersion13 = 13 + decimalBase = 10 ) -var idnaHostChecker = idna.New( - idna.ValidateForRegistration(), // shorthand for [idna.StrictDomainName], [idna.ValidateLabels], [idna.VerifyDNSLength], [idna.BidiRule] +var ( + idnaHostChecker = idna.New( + idna.ValidateForRegistration(), // shorthand for [idna.StrictDomainName], [idna.ValidateLabels], [idna.VerifyDNSLength], [idna.BidiRule] + ) + + whiteSpacesAndMinus = regexp.MustCompile(`[\s-]+`) + rxISBN10 = regexp.MustCompile(isbn10Pattern) + rxISBN13 = regexp.MustCompile(isbn13Pattern) + rxCreditCard = regexp.MustCompile(usCardPattern) + rxSSN = regexp.MustCompile(ssnPattern) + rxHexcolor = regexp.MustCompile(hexColorPattern) + rxRGBcolor = regexp.MustCompile(rgbColorPattern) ) // IsHostname returns true when the string is a valid hostname. @@ -322,6 +335,7 @@ const ( uuidV3 = 3 uuidV4 = 4 uuidV5 = 5 + uuidV7 = 7 ) // IsUUID3 returns true is the string matches a UUID v3, upper case is allowed @@ -342,6 +356,12 @@ func IsUUID5(str string) bool { return err == nil && id.Version() == uuid.Version(uuidV5) } +// IsUUID7 returns true is the string matches a UUID v7, upper case is allowed +func IsUUID7(str string) bool { + id, err := uuid.Parse(str) + return err == nil && id.Version() == uuid.Version(uuidV7) +} + // IsEmail validates an email address. func IsEmail(str string) bool { addr, e := mail.ParseAddress(str) @@ -370,8 +390,9 @@ func init() { // - uuid3 // - uuid4 // - uuid5 + // - uuid7 u := URI("") - Default.Add("uri", &u, govalidator.IsRequestURI) + Default.Add("uri", &u, isRequestURI) eml := Email("") Default.Add("email", &eml, IsEmail) @@ -380,16 +401,16 @@ func init() { Default.Add("hostname", &hn, IsHostname) ip4 := IPv4("") - Default.Add("ipv4", &ip4, govalidator.IsIPv4) + Default.Add("ipv4", &ip4, isIPv4) ip6 := IPv6("") - Default.Add("ipv6", &ip6, govalidator.IsIPv6) + Default.Add("ipv6", &ip6, isIPv6) cidr := CIDR("") - Default.Add("cidr", &cidr, govalidator.IsCIDR) + Default.Add("cidr", &cidr, isCIDR) mac := MAC("") - Default.Add("mac", &mac, govalidator.IsMAC) + Default.Add("mac", &mac, isMAC) uid := UUID("") Default.Add("uuid", &uid, IsUUID) @@ -403,29 +424,32 @@ func init() { uid5 := UUID5("") Default.Add("uuid5", &uid5, IsUUID5) + uid7 := UUID7("") + Default.Add("uuid7", &uid7, IsUUID7) + isbn := ISBN("") - Default.Add("isbn", &isbn, func(str string) bool { return govalidator.IsISBN10(str) || govalidator.IsISBN13(str) }) + Default.Add("isbn", &isbn, func(str string) bool { return isISBN10(str) || isISBN13(str) }) isbn10 := ISBN10("") - Default.Add("isbn10", &isbn10, govalidator.IsISBN10) + Default.Add("isbn10", &isbn10, isISBN10) isbn13 := ISBN13("") - Default.Add("isbn13", &isbn13, govalidator.IsISBN13) + Default.Add("isbn13", &isbn13, isISBN13) cc := CreditCard("") - Default.Add("creditcard", &cc, govalidator.IsCreditCard) + Default.Add("creditcard", &cc, isCreditCard) ssn := SSN("") - Default.Add("ssn", &ssn, govalidator.IsSSN) + Default.Add("ssn", &ssn, isSSN) hc := HexColor("") - Default.Add("hexcolor", &hc, govalidator.IsHexcolor) + Default.Add("hexcolor", &hc, isHexcolor) rc := RGBColor("") - Default.Add("rgbcolor", &rc, govalidator.IsRGBcolor) + Default.Add("rgbcolor", &rc, isRGBcolor) b64 := Base64([]byte(nil)) - Default.Add("byte", &b64, govalidator.IsBase64) + Default.Add("byte", &b64, isBase64) pw := Password("") Default.Add("password", &pw, func(_ string) bool { return true }) @@ -460,7 +484,7 @@ func (b *Base64) UnmarshalText(data []byte) error { // validation is performed l } // Scan read a value from a database driver -func (b *Base64) Scan(raw interface{}) error { +func (b *Base64) Scan(raw any) error { switch v := raw.(type) { case []byte: dbuf := make([]byte, base64.StdEncoding.DecodedLen(len(v))) @@ -510,29 +534,6 @@ func (b *Base64) UnmarshalJSON(data []byte) error { return nil } -// MarshalBSON document from this value -func (b Base64) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": b.String()}) -} - -// UnmarshalBSON document into this value -func (b *Base64) UnmarshalBSON(data []byte) error { - var m bson.M - if err := bson.Unmarshal(data, &m); err != nil { - return err - } - - if bd, ok := m["data"].(string); ok { - vb, err := base64.StdEncoding.DecodeString(bd) - if err != nil { - return err - } - *b = Base64(vb) - return nil - } - return fmt.Errorf("couldn't unmarshal bson bytes as base64: %w", ErrFormat) -} - // DeepCopyInto copies the receiver and writes its value into out. func (b *Base64) DeepCopyInto(out *Base64) { *out = *b @@ -565,7 +566,7 @@ func (u *URI) UnmarshalText(data []byte) error { // validation is performed late } // Scan read a value from a database driver -func (u *URI) Scan(raw interface{}) error { +func (u *URI) Scan(raw any) error { switch v := raw.(type) { case []byte: *u = URI(string(v)) @@ -602,25 +603,6 @@ func (u *URI) UnmarshalJSON(data []byte) error { return nil } -// MarshalBSON document from this value -func (u URI) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": u.String()}) -} - -// UnmarshalBSON document into this value -func (u *URI) UnmarshalBSON(data []byte) error { - var m bson.M - if err := bson.Unmarshal(data, &m); err != nil { - return err - } - - if ud, ok := m["data"].(string); ok { - *u = URI(ud) - return nil - } - return fmt.Errorf("couldn't unmarshal bson bytes as uri: %w", ErrFormat) -} - // DeepCopyInto copies the receiver and writes its value into out. func (u *URI) DeepCopyInto(out *URI) { *out = *u @@ -653,7 +635,7 @@ func (e *Email) UnmarshalText(data []byte) error { // validation is performed la } // Scan read a value from a database driver -func (e *Email) Scan(raw interface{}) error { +func (e *Email) Scan(raw any) error { switch v := raw.(type) { case []byte: *e = Email(string(v)) @@ -690,25 +672,6 @@ func (e *Email) UnmarshalJSON(data []byte) error { return nil } -// MarshalBSON document from this value -func (e Email) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": e.String()}) -} - -// UnmarshalBSON document into this value -func (e *Email) UnmarshalBSON(data []byte) error { - var m bson.M - if err := bson.Unmarshal(data, &m); err != nil { - return err - } - - if ud, ok := m["data"].(string); ok { - *e = Email(ud) - return nil - } - return fmt.Errorf("couldn't unmarshal bson bytes as email: %w", ErrFormat) -} - // DeepCopyInto copies the receiver and writes its value into out. func (e *Email) DeepCopyInto(out *Email) { *out = *e @@ -741,7 +704,7 @@ func (h *Hostname) UnmarshalText(data []byte) error { // validation is performed } // Scan read a value from a database driver -func (h *Hostname) Scan(raw interface{}) error { +func (h *Hostname) Scan(raw any) error { switch v := raw.(type) { case []byte: *h = Hostname(string(v)) @@ -778,25 +741,6 @@ func (h *Hostname) UnmarshalJSON(data []byte) error { return nil } -// MarshalBSON document from this value -func (h Hostname) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": h.String()}) -} - -// UnmarshalBSON document into this value -func (h *Hostname) UnmarshalBSON(data []byte) error { - var m bson.M - if err := bson.Unmarshal(data, &m); err != nil { - return err - } - - if ud, ok := m["data"].(string); ok { - *h = Hostname(ud) - return nil - } - return fmt.Errorf("couldn't unmarshal bson bytes as hostname: %w", ErrFormat) -} - // DeepCopyInto copies the receiver and writes its value into out. func (h *Hostname) DeepCopyInto(out *Hostname) { *out = *h @@ -829,7 +773,7 @@ func (u *IPv4) UnmarshalText(data []byte) error { // validation is performed lat } // Scan read a value from a database driver -func (u *IPv4) Scan(raw interface{}) error { +func (u *IPv4) Scan(raw any) error { switch v := raw.(type) { case []byte: *u = IPv4(string(v)) @@ -866,25 +810,6 @@ func (u *IPv4) UnmarshalJSON(data []byte) error { return nil } -// MarshalBSON document from this value -func (u IPv4) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": u.String()}) -} - -// UnmarshalBSON document into this value -func (u *IPv4) UnmarshalBSON(data []byte) error { - var m bson.M - if err := bson.Unmarshal(data, &m); err != nil { - return err - } - - if ud, ok := m["data"].(string); ok { - *u = IPv4(ud) - return nil - } - return fmt.Errorf("couldn't unmarshal bson bytes as ipv4: %w", ErrFormat) -} - // DeepCopyInto copies the receiver and writes its value into out. func (u *IPv4) DeepCopyInto(out *IPv4) { *out = *u @@ -917,7 +842,7 @@ func (u *IPv6) UnmarshalText(data []byte) error { // validation is performed lat } // Scan read a value from a database driver -func (u *IPv6) Scan(raw interface{}) error { +func (u *IPv6) Scan(raw any) error { switch v := raw.(type) { case []byte: *u = IPv6(string(v)) @@ -954,25 +879,6 @@ func (u *IPv6) UnmarshalJSON(data []byte) error { return nil } -// MarshalBSON document from this value -func (u IPv6) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": u.String()}) -} - -// UnmarshalBSON document into this value -func (u *IPv6) UnmarshalBSON(data []byte) error { - var m bson.M - if err := bson.Unmarshal(data, &m); err != nil { - return err - } - - if ud, ok := m["data"].(string); ok { - *u = IPv6(ud) - return nil - } - return fmt.Errorf("couldn't unmarshal bson bytes as ipv6: %w", ErrFormat) -} - // DeepCopyInto copies the receiver and writes its value into out. func (u *IPv6) DeepCopyInto(out *IPv6) { *out = *u @@ -1005,7 +911,7 @@ func (u *CIDR) UnmarshalText(data []byte) error { // validation is performed lat } // Scan read a value from a database driver -func (u *CIDR) Scan(raw interface{}) error { +func (u *CIDR) Scan(raw any) error { switch v := raw.(type) { case []byte: *u = CIDR(string(v)) @@ -1042,25 +948,6 @@ func (u *CIDR) UnmarshalJSON(data []byte) error { return nil } -// MarshalBSON document from this value -func (u CIDR) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": u.String()}) -} - -// UnmarshalBSON document into this value -func (u *CIDR) UnmarshalBSON(data []byte) error { - var m bson.M - if err := bson.Unmarshal(data, &m); err != nil { - return err - } - - if ud, ok := m["data"].(string); ok { - *u = CIDR(ud) - return nil - } - return fmt.Errorf("couldn't unmarshal bson bytes as CIDR: %w", ErrFormat) -} - // DeepCopyInto copies the receiver and writes its value into out. func (u *CIDR) DeepCopyInto(out *CIDR) { *out = *u @@ -1093,7 +980,7 @@ func (u *MAC) UnmarshalText(data []byte) error { // validation is performed late } // Scan read a value from a database driver -func (u *MAC) Scan(raw interface{}) error { +func (u *MAC) Scan(raw any) error { switch v := raw.(type) { case []byte: *u = MAC(string(v)) @@ -1130,25 +1017,6 @@ func (u *MAC) UnmarshalJSON(data []byte) error { return nil } -// MarshalBSON document from this value -func (u MAC) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": u.String()}) -} - -// UnmarshalBSON document into this value -func (u *MAC) UnmarshalBSON(data []byte) error { - var m bson.M - if err := bson.Unmarshal(data, &m); err != nil { - return err - } - - if ud, ok := m["data"].(string); ok { - *u = MAC(ud) - return nil - } - return fmt.Errorf("couldn't unmarshal bson bytes as MAC: %w", ErrFormat) -} - // DeepCopyInto copies the receiver and writes its value into out. func (u *MAC) DeepCopyInto(out *MAC) { *out = *u @@ -1181,7 +1049,7 @@ func (u *UUID) UnmarshalText(data []byte) error { // validation is performed lat } // Scan read a value from a database driver -func (u *UUID) Scan(raw interface{}) error { +func (u *UUID) Scan(raw any) error { switch v := raw.(type) { case []byte: *u = UUID(string(v)) @@ -1221,25 +1089,6 @@ func (u *UUID) UnmarshalJSON(data []byte) error { return nil } -// MarshalBSON document from this value -func (u UUID) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": u.String()}) -} - -// UnmarshalBSON document into this value -func (u *UUID) UnmarshalBSON(data []byte) error { - var m bson.M - if err := bson.Unmarshal(data, &m); err != nil { - return err - } - - if ud, ok := m["data"].(string); ok { - *u = UUID(ud) - return nil - } - return fmt.Errorf("couldn't unmarshal bson bytes as UUID: %w", ErrFormat) -} - // DeepCopyInto copies the receiver and writes its value into out. func (u *UUID) DeepCopyInto(out *UUID) { *out = *u @@ -1272,7 +1121,7 @@ func (u *UUID3) UnmarshalText(data []byte) error { // validation is performed la } // Scan read a value from a database driver -func (u *UUID3) Scan(raw interface{}) error { +func (u *UUID3) Scan(raw any) error { switch v := raw.(type) { case []byte: *u = UUID3(string(v)) @@ -1312,25 +1161,6 @@ func (u *UUID3) UnmarshalJSON(data []byte) error { return nil } -// MarshalBSON document from this value -func (u UUID3) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": u.String()}) -} - -// UnmarshalBSON document into this value -func (u *UUID3) UnmarshalBSON(data []byte) error { - var m bson.M - if err := bson.Unmarshal(data, &m); err != nil { - return err - } - - if ud, ok := m["data"].(string); ok { - *u = UUID3(ud) - return nil - } - return fmt.Errorf("couldn't unmarshal bson bytes as UUID3: %w", ErrFormat) -} - // DeepCopyInto copies the receiver and writes its value into out. func (u *UUID3) DeepCopyInto(out *UUID3) { *out = *u @@ -1363,7 +1193,7 @@ func (u *UUID4) UnmarshalText(data []byte) error { // validation is performed la } // Scan read a value from a database driver -func (u *UUID4) Scan(raw interface{}) error { +func (u *UUID4) Scan(raw any) error { switch v := raw.(type) { case []byte: *u = UUID4(string(v)) @@ -1403,25 +1233,6 @@ func (u *UUID4) UnmarshalJSON(data []byte) error { return nil } -// MarshalBSON document from this value -func (u UUID4) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": u.String()}) -} - -// UnmarshalBSON document into this value -func (u *UUID4) UnmarshalBSON(data []byte) error { - var m bson.M - if err := bson.Unmarshal(data, &m); err != nil { - return err - } - - if ud, ok := m["data"].(string); ok { - *u = UUID4(ud) - return nil - } - return fmt.Errorf("couldn't unmarshal bson bytes as UUID4: %w", ErrFormat) -} - // DeepCopyInto copies the receiver and writes its value into out. func (u *UUID4) DeepCopyInto(out *UUID4) { *out = *u @@ -1454,7 +1265,7 @@ func (u *UUID5) UnmarshalText(data []byte) error { // validation is performed la } // Scan read a value from a database driver -func (u *UUID5) Scan(raw interface{}) error { +func (u *UUID5) Scan(raw any) error { switch v := raw.(type) { case []byte: *u = UUID5(string(v)) @@ -1494,36 +1305,89 @@ func (u *UUID5) UnmarshalJSON(data []byte) error { return nil } -// MarshalBSON document from this value -func (u UUID5) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": u.String()}) +// DeepCopyInto copies the receiver and writes its value into out. +func (u *UUID5) DeepCopyInto(out *UUID5) { + *out = *u } -// UnmarshalBSON document into this value -func (u *UUID5) UnmarshalBSON(data []byte) error { - var m bson.M - if err := bson.Unmarshal(data, &m); err != nil { - return err +// DeepCopy copies the receiver into a new UUID5. +func (u *UUID5) DeepCopy() *UUID5 { + if u == nil { + return nil } + out := new(UUID5) + u.DeepCopyInto(out) + return out +} - if ud, ok := m["data"].(string); ok { - *u = UUID5(ud) +// UUID7 represents a uuid7 string format +// +// swagger:strfmt uuid7 +type UUID7 string + +// MarshalText turns this instance into text +func (u UUID7) MarshalText() ([]byte, error) { + return []byte(string(u)), nil +} + +// UnmarshalText hydrates this instance from text +func (u *UUID7) UnmarshalText(data []byte) error { // validation is performed later on + *u = UUID7(string(data)) + return nil +} + +// Scan read a value from a database driver +func (u *UUID7) Scan(raw any) error { + switch v := raw.(type) { + case []byte: + *u = UUID7(string(v)) + case string: + *u = UUID7(v) + default: + return fmt.Errorf("cannot sql.Scan() strfmt.UUID7 from: %#v: %w", v, ErrFormat) + } + + return nil +} + +// Value converts a value to a database driver value +func (u UUID7) Value() (driver.Value, error) { + return driver.Value(string(u)), nil +} + +func (u UUID7) String() string { + return string(u) +} + +// MarshalJSON returns the UUID as JSON +func (u UUID7) MarshalJSON() ([]byte, error) { + return json.Marshal(string(u)) +} + +// UnmarshalJSON sets the UUID from JSON +func (u *UUID7) UnmarshalJSON(data []byte) error { + if string(data) == jsonNull { return nil } - return fmt.Errorf("couldn't unmarshal bson bytes as UUID5: %w", ErrFormat) + var ustr string + if err := json.Unmarshal(data, &ustr); err != nil { + return err + } + *u = UUID7(ustr) + return nil } // DeepCopyInto copies the receiver and writes its value into out. -func (u *UUID5) DeepCopyInto(out *UUID5) { +func (u *UUID7) DeepCopyInto(out *UUID7) { *out = *u } -// DeepCopy copies the receiver into a new UUID5. -func (u *UUID5) DeepCopy() *UUID5 { +// DeepCopy copies the receiver into a new UUID7. +func (u *UUID7) DeepCopy() *UUID7 { if u == nil { return nil } - out := new(UUID5) + out := new(UUID7) u.DeepCopyInto(out) return out } @@ -1545,7 +1409,7 @@ func (u *ISBN) UnmarshalText(data []byte) error { // validation is performed lat } // Scan read a value from a database driver -func (u *ISBN) Scan(raw interface{}) error { +func (u *ISBN) Scan(raw any) error { switch v := raw.(type) { case []byte: *u = ISBN(string(v)) @@ -1585,25 +1449,6 @@ func (u *ISBN) UnmarshalJSON(data []byte) error { return nil } -// MarshalBSON document from this value -func (u ISBN) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": u.String()}) -} - -// UnmarshalBSON document into this value -func (u *ISBN) UnmarshalBSON(data []byte) error { - var m bson.M - if err := bson.Unmarshal(data, &m); err != nil { - return err - } - - if ud, ok := m["data"].(string); ok { - *u = ISBN(ud) - return nil - } - return fmt.Errorf("couldn't unmarshal bson bytes as ISBN: %w", ErrFormat) -} - // DeepCopyInto copies the receiver and writes its value into out. func (u *ISBN) DeepCopyInto(out *ISBN) { *out = *u @@ -1636,7 +1481,7 @@ func (u *ISBN10) UnmarshalText(data []byte) error { // validation is performed l } // Scan read a value from a database driver -func (u *ISBN10) Scan(raw interface{}) error { +func (u *ISBN10) Scan(raw any) error { switch v := raw.(type) { case []byte: *u = ISBN10(string(v)) @@ -1676,25 +1521,6 @@ func (u *ISBN10) UnmarshalJSON(data []byte) error { return nil } -// MarshalBSON document from this value -func (u ISBN10) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": u.String()}) -} - -// UnmarshalBSON document into this value -func (u *ISBN10) UnmarshalBSON(data []byte) error { - var m bson.M - if err := bson.Unmarshal(data, &m); err != nil { - return err - } - - if ud, ok := m["data"].(string); ok { - *u = ISBN10(ud) - return nil - } - return fmt.Errorf("couldn't unmarshal bson bytes as ISBN10: %w", ErrFormat) -} - // DeepCopyInto copies the receiver and writes its value into out. func (u *ISBN10) DeepCopyInto(out *ISBN10) { *out = *u @@ -1727,7 +1553,7 @@ func (u *ISBN13) UnmarshalText(data []byte) error { // validation is performed l } // Scan read a value from a database driver -func (u *ISBN13) Scan(raw interface{}) error { +func (u *ISBN13) Scan(raw any) error { switch v := raw.(type) { case []byte: *u = ISBN13(string(v)) @@ -1767,25 +1593,6 @@ func (u *ISBN13) UnmarshalJSON(data []byte) error { return nil } -// MarshalBSON document from this value -func (u ISBN13) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": u.String()}) -} - -// UnmarshalBSON document into this value -func (u *ISBN13) UnmarshalBSON(data []byte) error { - var m bson.M - if err := bson.Unmarshal(data, &m); err != nil { - return err - } - - if ud, ok := m["data"].(string); ok { - *u = ISBN13(ud) - return nil - } - return fmt.Errorf("couldn't unmarshal bson bytes as ISBN13: %w", ErrFormat) -} - // DeepCopyInto copies the receiver and writes its value into out. func (u *ISBN13) DeepCopyInto(out *ISBN13) { *out = *u @@ -1818,7 +1625,7 @@ func (u *CreditCard) UnmarshalText(data []byte) error { // validation is perform } // Scan read a value from a database driver -func (u *CreditCard) Scan(raw interface{}) error { +func (u *CreditCard) Scan(raw any) error { switch v := raw.(type) { case []byte: *u = CreditCard(string(v)) @@ -1858,25 +1665,6 @@ func (u *CreditCard) UnmarshalJSON(data []byte) error { return nil } -// MarshalBSON document from this value -func (u CreditCard) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": u.String()}) -} - -// UnmarshalBSON document into this value -func (u *CreditCard) UnmarshalBSON(data []byte) error { - var m bson.M - if err := bson.Unmarshal(data, &m); err != nil { - return err - } - - if ud, ok := m["data"].(string); ok { - *u = CreditCard(ud) - return nil - } - return fmt.Errorf("couldn't unmarshal bson bytes as CreditCard: %w", ErrFormat) -} - // DeepCopyInto copies the receiver and writes its value into out. func (u *CreditCard) DeepCopyInto(out *CreditCard) { *out = *u @@ -1909,7 +1697,7 @@ func (u *SSN) UnmarshalText(data []byte) error { // validation is performed late } // Scan read a value from a database driver -func (u *SSN) Scan(raw interface{}) error { +func (u *SSN) Scan(raw any) error { switch v := raw.(type) { case []byte: *u = SSN(string(v)) @@ -1949,25 +1737,6 @@ func (u *SSN) UnmarshalJSON(data []byte) error { return nil } -// MarshalBSON document from this value -func (u SSN) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": u.String()}) -} - -// UnmarshalBSON document into this value -func (u *SSN) UnmarshalBSON(data []byte) error { - var m bson.M - if err := bson.Unmarshal(data, &m); err != nil { - return err - } - - if ud, ok := m["data"].(string); ok { - *u = SSN(ud) - return nil - } - return fmt.Errorf("couldn't unmarshal bson bytes as SSN: %w", ErrFormat) -} - // DeepCopyInto copies the receiver and writes its value into out. func (u *SSN) DeepCopyInto(out *SSN) { *out = *u @@ -2000,7 +1769,7 @@ func (h *HexColor) UnmarshalText(data []byte) error { // validation is performed } // Scan read a value from a database driver -func (h *HexColor) Scan(raw interface{}) error { +func (h *HexColor) Scan(raw any) error { switch v := raw.(type) { case []byte: *h = HexColor(string(v)) @@ -2040,25 +1809,6 @@ func (h *HexColor) UnmarshalJSON(data []byte) error { return nil } -// MarshalBSON document from this value -func (h HexColor) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": h.String()}) -} - -// UnmarshalBSON document into this value -func (h *HexColor) UnmarshalBSON(data []byte) error { - var m bson.M - if err := bson.Unmarshal(data, &m); err != nil { - return err - } - - if ud, ok := m["data"].(string); ok { - *h = HexColor(ud) - return nil - } - return fmt.Errorf("couldn't unmarshal bson bytes as HexColor: %w", ErrFormat) -} - // DeepCopyInto copies the receiver and writes its value into out. func (h *HexColor) DeepCopyInto(out *HexColor) { *out = *h @@ -2091,7 +1841,7 @@ func (r *RGBColor) UnmarshalText(data []byte) error { // validation is performed } // Scan read a value from a database driver -func (r *RGBColor) Scan(raw interface{}) error { +func (r *RGBColor) Scan(raw any) error { switch v := raw.(type) { case []byte: *r = RGBColor(string(v)) @@ -2131,25 +1881,6 @@ func (r *RGBColor) UnmarshalJSON(data []byte) error { return nil } -// MarshalBSON document from this value -func (r RGBColor) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": r.String()}) -} - -// UnmarshalBSON document into this value -func (r *RGBColor) UnmarshalBSON(data []byte) error { - var m bson.M - if err := bson.Unmarshal(data, &m); err != nil { - return err - } - - if ud, ok := m["data"].(string); ok { - *r = RGBColor(ud) - return nil - } - return fmt.Errorf("couldn't unmarshal bson bytes as RGBColor: %w", ErrFormat) -} - // DeepCopyInto copies the receiver and writes its value into out. func (r *RGBColor) DeepCopyInto(out *RGBColor) { *out = *r @@ -2183,7 +1914,7 @@ func (r *Password) UnmarshalText(data []byte) error { // validation is performed } // Scan read a value from a database driver -func (r *Password) Scan(raw interface{}) error { +func (r *Password) Scan(raw any) error { switch v := raw.(type) { case []byte: *r = Password(string(v)) @@ -2223,25 +1954,6 @@ func (r *Password) UnmarshalJSON(data []byte) error { return nil } -// MarshalBSON document from this value -func (r Password) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": r.String()}) -} - -// UnmarshalBSON document into this value -func (r *Password) UnmarshalBSON(data []byte) error { - var m bson.M - if err := bson.Unmarshal(data, &m); err != nil { - return err - } - - if ud, ok := m["data"].(string); ok { - *r = Password(ud) - return nil - } - return fmt.Errorf("couldn't unmarshal bson bytes as Password: %w", ErrFormat) -} - // DeepCopyInto copies the receiver and writes its value into out. func (r *Password) DeepCopyInto(out *Password) { *out = *r @@ -2256,3 +1968,143 @@ func (r *Password) DeepCopy() *Password { r.DeepCopyInto(out) return out } + +func isRequestURI(rawurl string) bool { + _, err := url.ParseRequestURI(rawurl) + return err == nil +} + +// isIPv4 checks if the string is an IP version 4. +func isIPv4(str string) bool { + ip := net.ParseIP(str) + return ip != nil && strings.Contains(str, ".") +} + +// isIPv6 checks if the string is an IP version 6. +func isIPv6(str string) bool { + ip := net.ParseIP(str) + return ip != nil && strings.Contains(str, ":") +} + +// isCIDR checks if the string is an valid CIDR notiation (IPV4 & IPV6) +func isCIDR(str string) bool { + _, _, err := net.ParseCIDR(str) + return err == nil +} + +// isMAC checks if a string is valid MAC address. +// Possible MAC formats: +// 01:23:45:67:89:ab +// 01:23:45:67:89:ab:cd:ef +// 01-23-45-67-89-ab +// 01-23-45-67-89-ab-cd-ef +// 0123.4567.89ab +// 0123.4567.89ab.cdef +func isMAC(str string) bool { + _, err := net.ParseMAC(str) + return err == nil +} + +// isISBN checks if the string is an ISBN (version 10 or 13). +// If version value is not equal to 10 or 13, it will be checks both variants. +func isISBN(str string, version int) bool { + sanitized := whiteSpacesAndMinus.ReplaceAllString(str, "") + var checksum int32 + var i int32 + + switch version { + case isbnVersion10: + if !rxISBN10.MatchString(sanitized) { + return false + } + for i = range isbnVersion10 - 1 { + checksum += (i + 1) * int32(sanitized[i]-'0') + } + if sanitized[isbnVersion10-1] == 'X' { + checksum += isbnVersion10 * isbnVersion10 + } else { + checksum += isbnVersion10 * int32(sanitized[isbnVersion10-1]-'0') + } + if checksum%(isbnVersion10+1) == 0 { + return true + } + return false + case isbnVersion13: + if !rxISBN13.MatchString(sanitized) { + return false + } + factor := []int32{1, 3} + for i = range isbnVersion13 - 1 { + checksum += factor[i%2] * int32(sanitized[i]-'0') + } + return (int32(sanitized[isbnVersion13-1]-'0'))-((decimalBase-(checksum%decimalBase))%decimalBase) == 0 + default: + return isISBN(str, isbnVersion10) || isISBN(str, isbnVersion13) + } +} + +// isISBN10 checks if the string is an ISBN version 10. +func isISBN10(str string) bool { + return isISBN(str, isbnVersion10) +} + +// isISBN13 checks if the string is an ISBN version 13. +func isISBN13(str string) bool { + return isISBN(str, isbnVersion13) +} + +// isCreditCard checks if the string is a credit card. +func isCreditCard(str string) bool { + sanitized := whiteSpacesAndMinus.ReplaceAllString(str, "") + if !rxCreditCard.MatchString(sanitized) { + return false + } + + number, err := strconv.ParseInt(sanitized, 0, 64) + if err != nil { + return false + } + number, lastDigit := number/decimalBase, number%decimalBase + + var sum int64 + for i := 0; number > 0; i++ { + digit := number % decimalBase + + if i%2 == 0 { + digit *= 2 + if digit > decimalBase-1 { + digit -= decimalBase - 1 + } + } + + sum += digit + number /= decimalBase + } + + return (sum+lastDigit)%decimalBase == 0 +} + +// isSSN will validate the given string as a U.S. Social Security Number +func isSSN(str string) bool { + if str == "" || len(str) != 11 { + return false + } + return rxSSN.MatchString(str) +} + +// isHexcolor checks if the string is a hexadecimal color. +func isHexcolor(str string) bool { + return rxHexcolor.MatchString(str) +} + +// isRGBcolor checks if the string is a valid RGB color in form rgb(RRR, GGG, BBB). +func isRGBcolor(str string) bool { + return rxRGBcolor.MatchString(str) +} + +// isBase64 checks if a string is base64 encoded. +func isBase64(str string) bool { + _, err := base64.StdEncoding.DecodeString(str) + + return err == nil +} diff --git a/vendor/github.com/go-openapi/strfmt/doc.go b/vendor/github.com/go-openapi/strfmt/doc.go index 41aebe6d51a..5825b72108e 100644 --- a/vendor/github.com/go-openapi/strfmt/doc.go +++ b/vendor/github.com/go-openapi/strfmt/doc.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 // Package strfmt contains custom string formats // diff --git a/vendor/github.com/go-openapi/strfmt/duration.go b/vendor/github.com/go-openapi/strfmt/duration.go index 749c4b561c2..908c1b02f3c 100644 --- a/vendor/github.com/go-openapi/strfmt/duration.go +++ b/vendor/github.com/go-openapi/strfmt/duration.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package strfmt @@ -23,8 +12,6 @@ import ( "strconv" "strings" "time" - - "go.mongodb.org/mongo-driver/bson" ) func init() { @@ -154,7 +141,7 @@ func ParseDuration(cand string) (time.Duration, error) { } // Scan reads a Duration value from database driver type. -func (d *Duration) Scan(raw interface{}) error { +func (d *Duration) Scan(raw any) error { switch v := raw.(type) { // TODO: case []byte: // ? case int64: @@ -203,28 +190,6 @@ func (d *Duration) UnmarshalJSON(data []byte) error { return nil } -func (d Duration) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": d.String()}) -} - -func (d *Duration) UnmarshalBSON(data []byte) error { - var m bson.M - if err := bson.Unmarshal(data, &m); err != nil { - return err - } - - if data, ok := m["data"].(string); ok { - rd, err := ParseDuration(data) - if err != nil { - return err - } - *d = Duration(rd) - return nil - } - - return fmt.Errorf("couldn't unmarshal bson bytes value as Date: %w", ErrFormat) -} - // DeepCopyInto copies the receiver and writes its value into out. func (d *Duration) DeepCopyInto(out *Duration) { *out = *d diff --git a/vendor/github.com/go-openapi/strfmt/errors.go b/vendor/github.com/go-openapi/strfmt/errors.go index 9a9240363de..9faa37cf2e5 100644 --- a/vendor/github.com/go-openapi/strfmt/errors.go +++ b/vendor/github.com/go-openapi/strfmt/errors.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package strfmt type strfmtError string diff --git a/vendor/github.com/go-openapi/strfmt/format.go b/vendor/github.com/go-openapi/strfmt/format.go index 73f83af9c92..d9d9e04c208 100644 --- a/vendor/github.com/go-openapi/strfmt/format.go +++ b/vendor/github.com/go-openapi/strfmt/format.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package strfmt @@ -18,6 +7,7 @@ import ( "encoding" "fmt" "reflect" + "slices" "strings" "sync" "time" @@ -32,27 +22,6 @@ var Default = NewSeededFormats(nil, nil) // Validator represents a validator for a string format. type Validator func(string) bool -// Format represents a string format. -// -// All implementations of Format provide a string representation and text -// marshaling/unmarshaling interface to be used by encoders (e.g. encoding/json). -type Format interface { - String() string - encoding.TextMarshaler - encoding.TextUnmarshaler -} - -// Registry is a registry of string formats, with a validation method. -type Registry interface { - Add(string, Format, Validator) bool - DelByName(string) bool - GetType(string) (reflect.Type, bool) - ContainsName(string) bool - Validates(string, string) bool - Parse(string, string) (any, error) - MapStructureHookFunc() mapstructure.DecodeHookFunc -} - // NewFormats creates a new formats registry seeded with the values from the default func NewFormats() Registry { //nolint:forcetypeassert @@ -64,10 +33,9 @@ func NewSeededFormats(seeds []knownFormat, normalizer NameNormalizer) Registry { if normalizer == nil { normalizer = DefaultNameNormalizer } - // copy here, don't modify original - d := append([]knownFormat(nil), seeds...) + // copy here, don't modify the original return &defaultFormats{ - data: d, + data: slices.Clone(seeds), normalizeName: normalizer, } } @@ -139,6 +107,8 @@ func (f *defaultFormats) MapStructureHookFunc() mapstructure.DecodeHookFunc { return UUID4(data), nil case "uuid5": return UUID5(data), nil + case "uuid7": + return UUID7(data), nil case "hostname": return Hostname(data), nil case "ipv4": diff --git a/vendor/github.com/go-openapi/strfmt/ifaces.go b/vendor/github.com/go-openapi/strfmt/ifaces.go new file mode 100644 index 00000000000..1b9e72c64eb --- /dev/null +++ b/vendor/github.com/go-openapi/strfmt/ifaces.go @@ -0,0 +1,32 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + +package strfmt + +import ( + "encoding" + "reflect" + + "github.com/go-viper/mapstructure/v2" +) + +// Format represents a string format. +// +// All implementations of Format provide a string representation and text +// marshaling/unmarshaling interface to be used by encoders (e.g. encoding/json). +type Format interface { + String() string + encoding.TextMarshaler + encoding.TextUnmarshaler +} + +// Registry is a registry of string formats, with a validation method. +type Registry interface { + Add(string, Format, Validator) bool + DelByName(string) bool + GetType(string) (reflect.Type, bool) + ContainsName(string) bool + Validates(string, string) bool + Parse(string, string) (any, error) + MapStructureHookFunc() mapstructure.DecodeHookFunc +} diff --git a/vendor/github.com/go-openapi/strfmt/mongo.go b/vendor/github.com/go-openapi/strfmt/mongo.go new file mode 100644 index 00000000000..641fed9b1a6 --- /dev/null +++ b/vendor/github.com/go-openapi/strfmt/mongo.go @@ -0,0 +1,646 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + +package strfmt + +import ( + "encoding/base64" + "encoding/binary" + "fmt" + "time" + + "github.com/oklog/ulid" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/bsontype" + bsonprim "go.mongodb.org/mongo-driver/bson/primitive" +) + +var ( + _ bson.Marshaler = Date{} + _ bson.Unmarshaler = &Date{} + _ bson.Marshaler = Base64{} + _ bson.Unmarshaler = &Base64{} + _ bson.Marshaler = Duration(0) + _ bson.Unmarshaler = (*Duration)(nil) + _ bson.Marshaler = DateTime{} + _ bson.Unmarshaler = &DateTime{} + _ bson.Marshaler = ULID{} + _ bson.Unmarshaler = &ULID{} + _ bson.Marshaler = URI("") + _ bson.Unmarshaler = (*URI)(nil) + _ bson.Marshaler = Email("") + _ bson.Unmarshaler = (*Email)(nil) + _ bson.Marshaler = Hostname("") + _ bson.Unmarshaler = (*Hostname)(nil) + _ bson.Marshaler = IPv4("") + _ bson.Unmarshaler = (*IPv4)(nil) + _ bson.Marshaler = IPv6("") + _ bson.Unmarshaler = (*IPv6)(nil) + _ bson.Marshaler = CIDR("") + _ bson.Unmarshaler = (*CIDR)(nil) + _ bson.Marshaler = MAC("") + _ bson.Unmarshaler = (*MAC)(nil) + _ bson.Marshaler = Password("") + _ bson.Unmarshaler = (*Password)(nil) + _ bson.Marshaler = UUID("") + _ bson.Unmarshaler = (*UUID)(nil) + _ bson.Marshaler = UUID3("") + _ bson.Unmarshaler = (*UUID3)(nil) + _ bson.Marshaler = UUID4("") + _ bson.Unmarshaler = (*UUID4)(nil) + _ bson.Marshaler = UUID5("") + _ bson.Unmarshaler = (*UUID5)(nil) + _ bson.Marshaler = UUID7("") + _ bson.Unmarshaler = (*UUID7)(nil) + _ bson.Marshaler = ISBN("") + _ bson.Unmarshaler = (*ISBN)(nil) + _ bson.Marshaler = ISBN10("") + _ bson.Unmarshaler = (*ISBN10)(nil) + _ bson.Marshaler = ISBN13("") + _ bson.Unmarshaler = (*ISBN13)(nil) + _ bson.Marshaler = CreditCard("") + _ bson.Unmarshaler = (*CreditCard)(nil) + _ bson.Marshaler = SSN("") + _ bson.Unmarshaler = (*SSN)(nil) + _ bson.Marshaler = HexColor("") + _ bson.Unmarshaler = (*HexColor)(nil) + _ bson.Marshaler = RGBColor("") + _ bson.Unmarshaler = (*RGBColor)(nil) + _ bson.Marshaler = ObjectId{} + _ bson.Unmarshaler = &ObjectId{} + + _ bson.ValueMarshaler = DateTime{} + _ bson.ValueUnmarshaler = &DateTime{} + _ bson.ValueMarshaler = ObjectId{} + _ bson.ValueUnmarshaler = &ObjectId{} +) + +const ( + millisec = 1000 + microsec = 1_000_000 + bsonDateTimeSize = 8 +) + +func (d Date) MarshalBSON() ([]byte, error) { + return bson.Marshal(bson.M{"data": d.String()}) +} + +func (d *Date) UnmarshalBSON(data []byte) error { + var m bson.M + if err := bson.Unmarshal(data, &m); err != nil { + return err + } + + if data, ok := m["data"].(string); ok { + rd, err := time.ParseInLocation(RFC3339FullDate, data, DefaultTimeLocation) + if err != nil { + return err + } + *d = Date(rd) + return nil + } + + return fmt.Errorf("couldn't unmarshal bson bytes value as Date: %w", ErrFormat) +} + +// MarshalBSON document from this value +func (b Base64) MarshalBSON() ([]byte, error) { + return bson.Marshal(bson.M{"data": b.String()}) +} + +// UnmarshalBSON document into this value +func (b *Base64) UnmarshalBSON(data []byte) error { + var m bson.M + if err := bson.Unmarshal(data, &m); err != nil { + return err + } + + if bd, ok := m["data"].(string); ok { + vb, err := base64.StdEncoding.DecodeString(bd) + if err != nil { + return err + } + *b = Base64(vb) + return nil + } + return fmt.Errorf("couldn't unmarshal bson bytes as base64: %w", ErrFormat) +} + +func (d Duration) MarshalBSON() ([]byte, error) { + return bson.Marshal(bson.M{"data": d.String()}) +} + +func (d *Duration) UnmarshalBSON(data []byte) error { + var m bson.M + if err := bson.Unmarshal(data, &m); err != nil { + return err + } + + if data, ok := m["data"].(string); ok { + rd, err := ParseDuration(data) + if err != nil { + return err + } + *d = Duration(rd) + return nil + } + + return fmt.Errorf("couldn't unmarshal bson bytes value as Date: %w", ErrFormat) +} + +// MarshalBSON renders the DateTime as a BSON document +func (t DateTime) MarshalBSON() ([]byte, error) { + return bson.Marshal(bson.M{"data": t}) +} + +// UnmarshalBSON reads the DateTime from a BSON document +func (t *DateTime) UnmarshalBSON(data []byte) error { + var obj struct { + Data DateTime + } + + if err := bson.Unmarshal(data, &obj); err != nil { + return err + } + + *t = obj.Data + + return nil +} + +// MarshalBSONValue is an interface implemented by types that can marshal themselves +// into a BSON document represented as bytes. The bytes returned must be a valid +// BSON document if the error is nil. +// +// Marshals a DateTime as a bson.TypeDateTime, an int64 representing +// milliseconds since epoch. +func (t DateTime) MarshalBSONValue() (bsontype.Type, []byte, error) { + // UnixNano cannot be used directly, the result of calling UnixNano on the zero + // Time is undefined. Thats why we use time.Nanosecond() instead. + + tNorm := NormalizeTimeForMarshal(time.Time(t)) + i64 := tNorm.Unix()*millisec + int64(tNorm.Nanosecond())/microsec + buf := make([]byte, bsonDateTimeSize) + binary.LittleEndian.PutUint64(buf, uint64(i64)) //nolint:gosec // it's okay to handle negative int64 this way + + return bson.TypeDateTime, buf, nil +} + +// UnmarshalBSONValue is an interface implemented by types that can unmarshal a +// BSON value representation of themselves. The BSON bytes and type can be +// assumed to be valid. UnmarshalBSONValue must copy the BSON value bytes if it +// wishes to retain the data after returning. +func (t *DateTime) UnmarshalBSONValue(tpe bsontype.Type, data []byte) error { + if tpe == bson.TypeNull { + *t = DateTime{} + return nil + } + + if len(data) != bsonDateTimeSize { + return fmt.Errorf("bson date field length not exactly %d bytes: %w", bsonDateTimeSize, ErrFormat) + } + + i64 := int64(binary.LittleEndian.Uint64(data)) //nolint:gosec // it's okay if we overflow and get a negative datetime + *t = DateTime(time.Unix(i64/millisec, i64%millisec*microsec)) + + return nil +} + +// MarshalBSON document from this value +func (u ULID) MarshalBSON() ([]byte, error) { + return bson.Marshal(bson.M{"data": u.String()}) +} + +// UnmarshalBSON document into this value +func (u *ULID) UnmarshalBSON(data []byte) error { + var m bson.M + if err := bson.Unmarshal(data, &m); err != nil { + return err + } + + if ud, ok := m["data"].(string); ok { + id, err := ulid.ParseStrict(ud) + if err != nil { + return fmt.Errorf("couldn't parse bson bytes as ULID: %w: %w", err, ErrFormat) + } + u.ULID = id + return nil + } + return fmt.Errorf("couldn't unmarshal bson bytes as ULID: %w", ErrFormat) +} + +// MarshalBSON document from this value +func (u URI) MarshalBSON() ([]byte, error) { + return bson.Marshal(bson.M{"data": u.String()}) +} + +// UnmarshalBSON document into this value +func (u *URI) UnmarshalBSON(data []byte) error { + var m bson.M + if err := bson.Unmarshal(data, &m); err != nil { + return err + } + + if ud, ok := m["data"].(string); ok { + *u = URI(ud) + return nil + } + return fmt.Errorf("couldn't unmarshal bson bytes as uri: %w", ErrFormat) +} + +// MarshalBSON document from this value +func (e Email) MarshalBSON() ([]byte, error) { + return bson.Marshal(bson.M{"data": e.String()}) +} + +// UnmarshalBSON document into this value +func (e *Email) UnmarshalBSON(data []byte) error { + var m bson.M + if err := bson.Unmarshal(data, &m); err != nil { + return err + } + + if ud, ok := m["data"].(string); ok { + *e = Email(ud) + return nil + } + return fmt.Errorf("couldn't unmarshal bson bytes as email: %w", ErrFormat) +} + +// MarshalBSON document from this value +func (h Hostname) MarshalBSON() ([]byte, error) { + return bson.Marshal(bson.M{"data": h.String()}) +} + +// UnmarshalBSON document into this value +func (h *Hostname) UnmarshalBSON(data []byte) error { + var m bson.M + if err := bson.Unmarshal(data, &m); err != nil { + return err + } + + if ud, ok := m["data"].(string); ok { + *h = Hostname(ud) + return nil + } + return fmt.Errorf("couldn't unmarshal bson bytes as hostname: %w", ErrFormat) +} + +// MarshalBSON document from this value +func (u IPv4) MarshalBSON() ([]byte, error) { + return bson.Marshal(bson.M{"data": u.String()}) +} + +// UnmarshalBSON document into this value +func (u *IPv4) UnmarshalBSON(data []byte) error { + var m bson.M + if err := bson.Unmarshal(data, &m); err != nil { + return err + } + + if ud, ok := m["data"].(string); ok { + *u = IPv4(ud) + return nil + } + return fmt.Errorf("couldn't unmarshal bson bytes as ipv4: %w", ErrFormat) +} + +// MarshalBSON document from this value +func (u IPv6) MarshalBSON() ([]byte, error) { + return bson.Marshal(bson.M{"data": u.String()}) +} + +// UnmarshalBSON document into this value +func (u *IPv6) UnmarshalBSON(data []byte) error { + var m bson.M + if err := bson.Unmarshal(data, &m); err != nil { + return err + } + + if ud, ok := m["data"].(string); ok { + *u = IPv6(ud) + return nil + } + return fmt.Errorf("couldn't unmarshal bson bytes as ipv6: %w", ErrFormat) +} + +// MarshalBSON document from this value +func (u CIDR) MarshalBSON() ([]byte, error) { + return bson.Marshal(bson.M{"data": u.String()}) +} + +// UnmarshalBSON document into this value +func (u *CIDR) UnmarshalBSON(data []byte) error { + var m bson.M + if err := bson.Unmarshal(data, &m); err != nil { + return err + } + + if ud, ok := m["data"].(string); ok { + *u = CIDR(ud) + return nil + } + return fmt.Errorf("couldn't unmarshal bson bytes as CIDR: %w", ErrFormat) +} + +// MarshalBSON document from this value +func (u MAC) MarshalBSON() ([]byte, error) { + return bson.Marshal(bson.M{"data": u.String()}) +} + +// UnmarshalBSON document into this value +func (u *MAC) UnmarshalBSON(data []byte) error { + var m bson.M + if err := bson.Unmarshal(data, &m); err != nil { + return err + } + + if ud, ok := m["data"].(string); ok { + *u = MAC(ud) + return nil + } + return fmt.Errorf("couldn't unmarshal bson bytes as MAC: %w", ErrFormat) +} + +// MarshalBSON document from this value +func (r Password) MarshalBSON() ([]byte, error) { + return bson.Marshal(bson.M{"data": r.String()}) +} + +// UnmarshalBSON document into this value +func (r *Password) UnmarshalBSON(data []byte) error { + var m bson.M + if err := bson.Unmarshal(data, &m); err != nil { + return err + } + + if ud, ok := m["data"].(string); ok { + *r = Password(ud) + return nil + } + return fmt.Errorf("couldn't unmarshal bson bytes as Password: %w", ErrFormat) +} + +// MarshalBSON document from this value +func (u UUID) MarshalBSON() ([]byte, error) { + return bson.Marshal(bson.M{"data": u.String()}) +} + +// UnmarshalBSON document into this value +func (u *UUID) UnmarshalBSON(data []byte) error { + var m bson.M + if err := bson.Unmarshal(data, &m); err != nil { + return err + } + + if ud, ok := m["data"].(string); ok { + *u = UUID(ud) + return nil + } + return fmt.Errorf("couldn't unmarshal bson bytes as UUID: %w", ErrFormat) +} + +// MarshalBSON document from this value +func (u UUID3) MarshalBSON() ([]byte, error) { + return bson.Marshal(bson.M{"data": u.String()}) +} + +// UnmarshalBSON document into this value +func (u *UUID3) UnmarshalBSON(data []byte) error { + var m bson.M + if err := bson.Unmarshal(data, &m); err != nil { + return err + } + + if ud, ok := m["data"].(string); ok { + *u = UUID3(ud) + return nil + } + return fmt.Errorf("couldn't unmarshal bson bytes as UUID3: %w", ErrFormat) +} + +// MarshalBSON document from this value +func (u UUID4) MarshalBSON() ([]byte, error) { + return bson.Marshal(bson.M{"data": u.String()}) +} + +// UnmarshalBSON document into this value +func (u *UUID4) UnmarshalBSON(data []byte) error { + var m bson.M + if err := bson.Unmarshal(data, &m); err != nil { + return err + } + + if ud, ok := m["data"].(string); ok { + *u = UUID4(ud) + return nil + } + return fmt.Errorf("couldn't unmarshal bson bytes as UUID4: %w", ErrFormat) +} + +// MarshalBSON document from this value +func (u UUID5) MarshalBSON() ([]byte, error) { + return bson.Marshal(bson.M{"data": u.String()}) +} + +// UnmarshalBSON document into this value +func (u *UUID5) UnmarshalBSON(data []byte) error { + var m bson.M + if err := bson.Unmarshal(data, &m); err != nil { + return err + } + + if ud, ok := m["data"].(string); ok { + *u = UUID5(ud) + return nil + } + return fmt.Errorf("couldn't unmarshal bson bytes as UUID5: %w", ErrFormat) +} + +// MarshalBSON document from this value +func (u UUID7) MarshalBSON() ([]byte, error) { + return bson.Marshal(bson.M{"data": u.String()}) +} + +// UnmarshalBSON document into this value +func (u *UUID7) UnmarshalBSON(data []byte) error { + var m bson.M + if err := bson.Unmarshal(data, &m); err != nil { + return err + } + + if ud, ok := m["data"].(string); ok { + *u = UUID7(ud) + return nil + } + return fmt.Errorf("couldn't unmarshal bson bytes as UUID7: %w", ErrFormat) +} + +// MarshalBSON document from this value +func (u ISBN) MarshalBSON() ([]byte, error) { + return bson.Marshal(bson.M{"data": u.String()}) +} + +// UnmarshalBSON document into this value +func (u *ISBN) UnmarshalBSON(data []byte) error { + var m bson.M + if err := bson.Unmarshal(data, &m); err != nil { + return err + } + + if ud, ok := m["data"].(string); ok { + *u = ISBN(ud) + return nil + } + return fmt.Errorf("couldn't unmarshal bson bytes as ISBN: %w", ErrFormat) +} + +// MarshalBSON document from this value +func (u ISBN10) MarshalBSON() ([]byte, error) { + return bson.Marshal(bson.M{"data": u.String()}) +} + +// UnmarshalBSON document into this value +func (u *ISBN10) UnmarshalBSON(data []byte) error { + var m bson.M + if err := bson.Unmarshal(data, &m); err != nil { + return err + } + + if ud, ok := m["data"].(string); ok { + *u = ISBN10(ud) + return nil + } + return fmt.Errorf("couldn't unmarshal bson bytes as ISBN10: %w", ErrFormat) +} + +// MarshalBSON document from this value +func (u ISBN13) MarshalBSON() ([]byte, error) { + return bson.Marshal(bson.M{"data": u.String()}) +} + +// UnmarshalBSON document into this value +func (u *ISBN13) UnmarshalBSON(data []byte) error { + var m bson.M + if err := bson.Unmarshal(data, &m); err != nil { + return err + } + + if ud, ok := m["data"].(string); ok { + *u = ISBN13(ud) + return nil + } + return fmt.Errorf("couldn't unmarshal bson bytes as ISBN13: %w", ErrFormat) +} + +// MarshalBSON document from this value +func (u CreditCard) MarshalBSON() ([]byte, error) { + return bson.Marshal(bson.M{"data": u.String()}) +} + +// UnmarshalBSON document into this value +func (u *CreditCard) UnmarshalBSON(data []byte) error { + var m bson.M + if err := bson.Unmarshal(data, &m); err != nil { + return err + } + + if ud, ok := m["data"].(string); ok { + *u = CreditCard(ud) + return nil + } + return fmt.Errorf("couldn't unmarshal bson bytes as CreditCard: %w", ErrFormat) +} + +// MarshalBSON document from this value +func (u SSN) MarshalBSON() ([]byte, error) { + return bson.Marshal(bson.M{"data": u.String()}) +} + +// UnmarshalBSON document into this value +func (u *SSN) UnmarshalBSON(data []byte) error { + var m bson.M + if err := bson.Unmarshal(data, &m); err != nil { + return err + } + + if ud, ok := m["data"].(string); ok { + *u = SSN(ud) + return nil + } + return fmt.Errorf("couldn't unmarshal bson bytes as SSN: %w", ErrFormat) +} + +// MarshalBSON document from this value +func (h HexColor) MarshalBSON() ([]byte, error) { + return bson.Marshal(bson.M{"data": h.String()}) +} + +// UnmarshalBSON document into this value +func (h *HexColor) UnmarshalBSON(data []byte) error { + var m bson.M + if err := bson.Unmarshal(data, &m); err != nil { + return err + } + + if ud, ok := m["data"].(string); ok { + *h = HexColor(ud) + return nil + } + return fmt.Errorf("couldn't unmarshal bson bytes as HexColor: %w", ErrFormat) +} + +// MarshalBSON document from this value +func (r RGBColor) MarshalBSON() ([]byte, error) { + return bson.Marshal(bson.M{"data": r.String()}) +} + +// UnmarshalBSON document into this value +func (r *RGBColor) UnmarshalBSON(data []byte) error { + var m bson.M + if err := bson.Unmarshal(data, &m); err != nil { + return err + } + + if ud, ok := m["data"].(string); ok { + *r = RGBColor(ud) + return nil + } + return fmt.Errorf("couldn't unmarshal bson bytes as RGBColor: %w", ErrFormat) +} + +// MarshalBSON renders the object id as a BSON document +func (id ObjectId) MarshalBSON() ([]byte, error) { + return bson.Marshal(bson.M{"data": bsonprim.ObjectID(id)}) +} + +// UnmarshalBSON reads the objectId from a BSON document +func (id *ObjectId) UnmarshalBSON(data []byte) error { + var obj struct { + Data bsonprim.ObjectID + } + if err := bson.Unmarshal(data, &obj); err != nil { + return err + } + *id = ObjectId(obj.Data) + return nil +} + +// MarshalBSONValue is an interface implemented by types that can marshal themselves +// into a BSON document represented as bytes. The bytes returned must be a valid +// BSON document if the error is nil. +func (id ObjectId) MarshalBSONValue() (bsontype.Type, []byte, error) { + oid := bsonprim.ObjectID(id) + return bson.TypeObjectID, oid[:], nil +} + +// UnmarshalBSONValue is an interface implemented by types that can unmarshal a +// BSON value representation of themselves. The BSON bytes and type can be +// assumed to be valid. UnmarshalBSONValue must copy the BSON value bytes if it +// wishes to retain the data after returning. +func (id *ObjectId) UnmarshalBSONValue(_ bsontype.Type, data []byte) error { + var oid bsonprim.ObjectID + copy(oid[:], data) + *id = ObjectId(oid) + return nil +} diff --git a/vendor/github.com/go-openapi/strfmt/time.go b/vendor/github.com/go-openapi/strfmt/time.go index 84e2412b937..8085aaf6965 100644 --- a/vendor/github.com/go-openapi/strfmt/time.go +++ b/vendor/github.com/go-openapi/strfmt/time.go @@ -1,31 +1,15 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package strfmt import ( "database/sql/driver" - "encoding/binary" "encoding/json" "fmt" "regexp" "strings" "time" - - "go.mongodb.org/mongo-driver/bson" - - "go.mongodb.org/mongo-driver/bson/bsontype" ) var ( @@ -178,7 +162,7 @@ func (t *DateTime) UnmarshalText(text []byte) error { } // Scan scans a DateTime value from database driver type. -func (t *DateTime) Scan(raw interface{}) error { +func (t *DateTime) Scan(raw any) error { // TODO: case int64: and case float64: ? switch v := raw.(type) { case []byte: @@ -224,69 +208,6 @@ func (t *DateTime) UnmarshalJSON(data []byte) error { return nil } -// MarshalBSON renders the DateTime as a BSON document -func (t DateTime) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": t}) -} - -// UnmarshalBSON reads the DateTime from a BSON document -func (t *DateTime) UnmarshalBSON(data []byte) error { - var obj struct { - Data DateTime - } - - if err := bson.Unmarshal(data, &obj); err != nil { - return err - } - - *t = obj.Data - - return nil -} - -const bsonDateLength = 8 - -// MarshalBSONValue is an interface implemented by types that can marshal themselves -// into a BSON document represented as bytes. The bytes returned must be a valid -// BSON document if the error is nil. -// -// Marshals a DateTime as a bsontype.DateTime, an int64 representing -// milliseconds since epoch. -func (t DateTime) MarshalBSONValue() (bsontype.Type, []byte, error) { - // UnixNano cannot be used directly, the result of calling UnixNano on the zero - // Time is undefined. That's why we use time.Nanosecond() instead. - tNorm := NormalizeTimeForMarshal(time.Time(t)) - i64 := tNorm.UnixMilli() - - buf := make([]byte, bsonDateLength) - // int64 -> uint64 conversion is safe here - binary.LittleEndian.PutUint64(buf, uint64(i64)) //nolint:gosec - - return bson.TypeDateTime, buf, nil -} - -// UnmarshalBSONValue is an interface implemented by types that can unmarshal a -// BSON value representation of themselves. The BSON bytes and type can be -// assumed to be valid. UnmarshalBSONValue must copy the BSON value bytes if it -// wishes to retain the data after returning. -func (t *DateTime) UnmarshalBSONValue(tpe bsontype.Type, data []byte) error { - if tpe == bson.TypeNull { - *t = DateTime{} - return nil - } - - if len(data) != bsonDateLength { - return fmt.Errorf("bson date field length not exactly 8 bytes: %w", ErrFormat) - } - - // it's ok to get negative values after conversion - i64 := int64(binary.LittleEndian.Uint64(data)) //nolint:gosec - // TODO: Use bsonprim.DateTime.Time() method - *t = DateTime(time.UnixMilli(i64)) - - return nil -} - // DeepCopyInto copies the receiver and writes its value into out. func (t *DateTime) DeepCopyInto(out *DateTime) { *out = *t diff --git a/vendor/github.com/go-openapi/strfmt/ulid.go b/vendor/github.com/go-openapi/strfmt/ulid.go index 434eb01baa5..85c5b53e6c7 100644 --- a/vendor/github.com/go-openapi/strfmt/ulid.go +++ b/vendor/github.com/go-openapi/strfmt/ulid.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package strfmt import ( @@ -9,7 +12,6 @@ import ( "sync" "github.com/oklog/ulid" - "go.mongodb.org/mongo-driver/bson" ) // ULID represents a ulid string format @@ -28,12 +30,12 @@ type ULID struct { var ( ulidEntropyPool = sync.Pool{ - New: func() interface{} { + New: func() any { return cryptorand.Reader }, } - ULIDScanDefaultFunc = func(raw interface{}) (ULID, error) { + ULIDScanDefaultFunc = func(raw any) (ULID, error) { u := NewULIDZero() switch x := raw.(type) { case nil: @@ -111,7 +113,7 @@ func NewULID() (ULID, error) { } // GetULID returns underlying instance of ULID -func (u *ULID) GetULID() interface{} { +func (u *ULID) GetULID() any { return u.ULID } @@ -126,7 +128,7 @@ func (u *ULID) UnmarshalText(data []byte) error { // validation is performed lat } // Scan reads a value from a database driver -func (u *ULID) Scan(raw interface{}) error { +func (u *ULID) Scan(raw any) error { ul, err := ULIDScanOverrideFunc(raw) if err == nil { *u = ul @@ -165,29 +167,6 @@ func (u *ULID) UnmarshalJSON(data []byte) error { return nil } -// MarshalBSON document from this value -func (u ULID) MarshalBSON() ([]byte, error) { - return bson.Marshal(bson.M{"data": u.String()}) -} - -// UnmarshalBSON document into this value -func (u *ULID) UnmarshalBSON(data []byte) error { - var m bson.M - if err := bson.Unmarshal(data, &m); err != nil { - return err - } - - if ud, ok := m["data"].(string); ok { - id, err := ulid.ParseStrict(ud) - if err != nil { - return fmt.Errorf("couldn't parse bson bytes as ULID: %w: %w", err, ErrFormat) - } - u.ULID = id - return nil - } - return fmt.Errorf("couldn't unmarshal bson bytes as ULID: %w", ErrFormat) -} - // DeepCopyInto copies the receiver and writes its value into out. func (u *ULID) DeepCopyInto(out *ULID) { *out = *u diff --git a/vendor/github.com/go-openapi/swag/.golangci.yml b/vendor/github.com/go-openapi/swag/.golangci.yml index 4129e7e57ee..126264a6b89 100644 --- a/vendor/github.com/go-openapi/swag/.golangci.yml +++ b/vendor/github.com/go-openapi/swag/.golangci.yml @@ -21,6 +21,7 @@ linters: - ireturn - lll - musttag + - modernize - nestif - nlreturn - nonamedreturns diff --git a/vendor/github.com/go-openapi/swag/README.md b/vendor/github.com/go-openapi/swag/README.md index 786b92fd3a2..371fd55fdc3 100644 --- a/vendor/github.com/go-openapi/swag/README.md +++ b/vendor/github.com/go-openapi/swag/README.md @@ -18,6 +18,7 @@ You may also use it standalone for your projects. * [Contents](#contents) * [Dependencies](#dependencies) * [Release Notes](#release-notes) +* [Licensing](#licensing) * [Note to contributors](#note-to-contributors) * [TODOs, suggestions and plans](#todos-suggestions-and-plans) @@ -62,6 +63,42 @@ dependencies outside of the standard library. ## Release notes +### v0.25.4 + +** mangling** + +Bug fix + +* [x] mangler may panic with pluralized overlapping initialisms + +Tests + +* [x] introduced fuzz tests + +### v0.25.3 + +** mangling** + +Bug fix + +* [x] mangler may panic with pluralized initialisms + +### v0.25.2 + +Minor changes due to internal maintenance that don't affect the behavior of the library. + +* [x] removed indirect test dependencies by switching all tests to `go-openapi/testify`, + a fork of `stretch/testify` with zero-dependencies. +* [x] improvements to CI to catch test reports. +* [x] modernized licensing annotations in source code, using the more compact SPDX annotations + rather than the full license terms. +* [x] simplified a bit JSON & YAML testing by using newly available assertions +* started the journey to an OpenSSF score card badge: + * [x] explicited permissions in CI workflows + * [x] published security policy + * pinned dependencies to github actions + * introduced fuzzing in tests + ### v0.25.1 * fixes a data race that could occur when using the standard library implementation of a JSON ordered map @@ -74,7 +111,7 @@ dependencies outside of the standard library. * removes the dependency to `mailru/easyjson` by default (#68) * functionality remains the same, but performance may somewhat degrade for applications that relied on `easyjson` - * users of the JSON or YAML utilities who want to use `easyjson` as their prefered JSON serializer library + * users of the JSON or YAML utilities who want to use `easyjson` as their preferred JSON serializer library will be able to do so by registering this the corresponding JSON adapter at runtime. See below. * ordered keys in JSON and YAML objects: this feature used to rely solely on `easyjson`. With this release, an implementation relying on the standard `encoding/json` is provided. @@ -96,10 +133,13 @@ Moving forward, we want to : The following would maintain how JSON utilities proposed by `swag` used work, up to `v0.24.1`. ```go - import "github.com/go-openapi/swag/jsonutils/adapters/easyjson/json" + import ( + "github.com/go-openapi/swag/jsonutils/adapters" + easyjson "github.com/go-openapi/swag/jsonutils/adapters/easyjson/json" + ) func init() { - json.Register() + easyjson.Register(adapters.Registry) } ``` @@ -107,6 +147,9 @@ Subsequent calls to `jsonutils.ReadJSON()` or `jsonutils.WriteJSON()` will switc whenever the passed data structures implement the `easyjson.Unmarshaler` or `easyjson.Marshaler` respectively, or fallback to the standard library. +For more details, you may also look at our +[integration tests](jsonutils/adapters/testintegration/integration_suite_test.go#29). + ### v0.24.0 With this release, we have largely modernized the API of `swag`: @@ -133,6 +176,10 @@ With this release, we have largely modernized the API of `swag`: --- +## Licensing + +This library ships under the [SPDX-License-Identifier: Apache-2.0](./LICENSE). + ## Note to contributors A mono-repo structure comes with some unavoidable extra pains... diff --git a/vendor/github.com/go-openapi/swag/SECURITY.md b/vendor/github.com/go-openapi/swag/SECURITY.md new file mode 100644 index 00000000000..72296a83135 --- /dev/null +++ b/vendor/github.com/go-openapi/swag/SECURITY.md @@ -0,0 +1,19 @@ +# Security Policy + +This policy outlines the commitment and practices of the go-openapi maintainers regarding security. + +## Supported Versions + +| Version | Supported | +| ------- | ------------------ | +| 0.25.x | :white_check_mark: | + +## Reporting a vulnerability + +If you become aware of a security vulnerability that affects the current repository, +please report it privately to the maintainers. + +Please follow the instructions provided by github to +[Privately report a security vulnerability](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing-information-about-vulnerabilities/privately-reporting-a-security-vulnerability#privately-reporting-a-security-vulnerability). + +TL;DR: on Github, navigate to the project's "Security" tab then click on "Report a vulnerability". diff --git a/vendor/github.com/go-openapi/swag/TODO.md b/vendor/github.com/go-openapi/swag/TODO.md deleted file mode 100644 index 129888038b2..00000000000 --- a/vendor/github.com/go-openapi/swag/TODO.md +++ /dev/null @@ -1 +0,0 @@ -fix data race https://github.com/go-openapi/swag/actions/runs/17989156861/job/51174860188 diff --git a/vendor/github.com/go-openapi/swag/cmdutils/cmd_utils.go b/vendor/github.com/go-openapi/swag/cmdutils/cmd_utils.go index bc01ec2bb94..6c7bbb26f03 100644 --- a/vendor/github.com/go-openapi/swag/cmdutils/cmd_utils.go +++ b/vendor/github.com/go-openapi/swag/cmdutils/cmd_utils.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package cmdutils @@ -20,5 +9,5 @@ package cmdutils type CommandLineOptionsGroup struct { ShortDescription string LongDescription string - Options interface{} + Options any } diff --git a/vendor/github.com/go-openapi/swag/cmdutils/doc.go b/vendor/github.com/go-openapi/swag/cmdutils/doc.go index 63ac1d17eef..31f2c37538a 100644 --- a/vendor/github.com/go-openapi/swag/cmdutils/doc.go +++ b/vendor/github.com/go-openapi/swag/cmdutils/doc.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 // Package cmdutils brings helpers for CLIs produced by go-openapi package cmdutils diff --git a/vendor/github.com/go-openapi/swag/cmdutils_iface.go b/vendor/github.com/go-openapi/swag/cmdutils_iface.go index 1eaf36f157b..bd0c1fc1280 100644 --- a/vendor/github.com/go-openapi/swag/cmdutils_iface.go +++ b/vendor/github.com/go-openapi/swag/cmdutils_iface.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package swag diff --git a/vendor/github.com/go-openapi/swag/conv/convert.go b/vendor/github.com/go-openapi/swag/conv/convert.go index b9b8698543a..f205c391345 100644 --- a/vendor/github.com/go-openapi/swag/conv/convert.go +++ b/vendor/github.com/go-openapi/swag/conv/convert.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package conv diff --git a/vendor/github.com/go-openapi/swag/conv/convert_types.go b/vendor/github.com/go-openapi/swag/conv/convert_types.go index 423e8663f8e..cf4c6495ebc 100644 --- a/vendor/github.com/go-openapi/swag/conv/convert_types.go +++ b/vendor/github.com/go-openapi/swag/conv/convert_types.go @@ -1,20 +1,13 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package conv -// The original version of this file, eons ago, was taken from the aws go sdk +// Unlicensed credits (idea, concept) +// +// The idea to convert values to pointers and the other way around, was inspired, eons ago, by the aws go sdk. +// +// Nowadays, all sensible API sdk's expose a similar functionality. // Pointer returns a pointer to the value passed in. func Pointer[T any](v T) *T { diff --git a/vendor/github.com/go-openapi/swag/conv/doc.go b/vendor/github.com/go-openapi/swag/conv/doc.go index b02711f422c..1bd6ead6e2d 100644 --- a/vendor/github.com/go-openapi/swag/conv/doc.go +++ b/vendor/github.com/go-openapi/swag/conv/doc.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 // Package conv exposes utilities to convert types. // diff --git a/vendor/github.com/go-openapi/swag/conv/format.go b/vendor/github.com/go-openapi/swag/conv/format.go index db7562a4a34..5b87b8e146b 100644 --- a/vendor/github.com/go-openapi/swag/conv/format.go +++ b/vendor/github.com/go-openapi/swag/conv/format.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package conv diff --git a/vendor/github.com/go-openapi/swag/conv/sizeof.go b/vendor/github.com/go-openapi/swag/conv/sizeof.go index 646f8be9aa3..49434655738 100644 --- a/vendor/github.com/go-openapi/swag/conv/sizeof.go +++ b/vendor/github.com/go-openapi/swag/conv/sizeof.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package conv import "unsafe" diff --git a/vendor/github.com/go-openapi/swag/conv/type_constraints.go b/vendor/github.com/go-openapi/swag/conv/type_constraints.go index 3c61498361c..81135e827e5 100644 --- a/vendor/github.com/go-openapi/swag/conv/type_constraints.go +++ b/vendor/github.com/go-openapi/swag/conv/type_constraints.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package conv diff --git a/vendor/github.com/go-openapi/swag/conv_iface.go b/vendor/github.com/go-openapi/swag/conv_iface.go index 9991acb6510..eea7b2e56e3 100644 --- a/vendor/github.com/go-openapi/swag/conv_iface.go +++ b/vendor/github.com/go-openapi/swag/conv_iface.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package swag diff --git a/vendor/github.com/go-openapi/swag/doc.go b/vendor/github.com/go-openapi/swag/doc.go index a079fe81066..b54b57478af 100644 --- a/vendor/github.com/go-openapi/swag/doc.go +++ b/vendor/github.com/go-openapi/swag/doc.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 // Package swag contains a bunch of helper functions for go-openapi and go-swagger projects. // diff --git a/vendor/github.com/go-openapi/swag/fileutils/doc.go b/vendor/github.com/go-openapi/swag/fileutils/doc.go index 4b48e71960e..859a200d841 100644 --- a/vendor/github.com/go-openapi/swag/fileutils/doc.go +++ b/vendor/github.com/go-openapi/swag/fileutils/doc.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 // Package fileutils exposes utilities to deal with files and paths. // diff --git a/vendor/github.com/go-openapi/swag/fileutils/file.go b/vendor/github.com/go-openapi/swag/fileutils/file.go index b17eaba58fb..5ad4cfaeafa 100644 --- a/vendor/github.com/go-openapi/swag/fileutils/file.go +++ b/vendor/github.com/go-openapi/swag/fileutils/file.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package fileutils diff --git a/vendor/github.com/go-openapi/swag/fileutils/path.go b/vendor/github.com/go-openapi/swag/fileutils/path.go index 0de77e12d48..dd09f690bf8 100644 --- a/vendor/github.com/go-openapi/swag/fileutils/path.go +++ b/vendor/github.com/go-openapi/swag/fileutils/path.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package fileutils diff --git a/vendor/github.com/go-openapi/swag/fileutils_iface.go b/vendor/github.com/go-openapi/swag/fileutils_iface.go index 0c639e8c16a..f3e79a0e4bc 100644 --- a/vendor/github.com/go-openapi/swag/fileutils_iface.go +++ b/vendor/github.com/go-openapi/swag/fileutils_iface.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package swag diff --git a/vendor/github.com/go-openapi/swag/go.work.sum b/vendor/github.com/go-openapi/swag/go.work.sum index bee4481a708..c1308cafa67 100644 --- a/vendor/github.com/go-openapi/swag/go.work.sum +++ b/vendor/github.com/go-openapi/swag/go.work.sum @@ -1,4 +1,7 @@ -github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= -github.com/stretchr/testify v1.11.0/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= -go.yaml.in/yaml/v3 v3.0.4 h1:tfq32ie2Jv2UxXFdLJdh3jXuOzWiL1fo0bu/FbuKpbc= -go.yaml.in/yaml/v3 v3.0.4/go.mod h1:DhzuOOF2ATzADvBadXxruRBLzYTpT36CKvDb3+aBEFg= +github.com/go-openapi/testify/v2 v2.0.1/go.mod h1:HCPmvFFnheKK2BuwSA0TbbdxJ3I16pjwMkYkP4Ywn54= +golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0= +golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY= +golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= +golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ= +golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0= diff --git a/vendor/github.com/go-openapi/swag/jsonname/doc.go b/vendor/github.com/go-openapi/swag/jsonname/doc.go index b2e0c80fc3a..79232eaca47 100644 --- a/vendor/github.com/go-openapi/swag/jsonname/doc.go +++ b/vendor/github.com/go-openapi/swag/jsonname/doc.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 // Package jsonname is a provider of json property names from go properties. package jsonname diff --git a/vendor/github.com/go-openapi/swag/jsonname/name_provider.go b/vendor/github.com/go-openapi/swag/jsonname/name_provider.go index e87aac2f78b..8eaf1bece8d 100644 --- a/vendor/github.com/go-openapi/swag/jsonname/name_provider.go +++ b/vendor/github.com/go-openapi/swag/jsonname/name_provider.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package jsonname @@ -90,7 +79,7 @@ func newNameIndex(tpe reflect.Type) nameIndex { } // GetJSONNames gets all the json property names for a type -func (n *NameProvider) GetJSONNames(subject interface{}) []string { +func (n *NameProvider) GetJSONNames(subject any) []string { n.lock.Lock() defer n.lock.Unlock() tpe := reflect.Indirect(reflect.ValueOf(subject)).Type() @@ -107,7 +96,7 @@ func (n *NameProvider) GetJSONNames(subject interface{}) []string { } // GetJSONName gets the json name for a go property name -func (n *NameProvider) GetJSONName(subject interface{}, name string) (string, bool) { +func (n *NameProvider) GetJSONName(subject any, name string) (string, bool) { tpe := reflect.Indirect(reflect.ValueOf(subject)).Type() return n.GetJSONNameForType(tpe, name) } @@ -125,7 +114,7 @@ func (n *NameProvider) GetJSONNameForType(tpe reflect.Type, name string) (string } // GetGoName gets the go name for a json property name -func (n *NameProvider) GetGoName(subject interface{}, name string) (string, bool) { +func (n *NameProvider) GetGoName(subject any, name string) (string, bool) { tpe := reflect.Indirect(reflect.ValueOf(subject)).Type() return n.GetGoNameForType(tpe, name) } diff --git a/vendor/github.com/go-openapi/swag/jsonname_iface.go b/vendor/github.com/go-openapi/swag/jsonname_iface.go index 555369d75a0..303a007f6f4 100644 --- a/vendor/github.com/go-openapi/swag/jsonname_iface.go +++ b/vendor/github.com/go-openapi/swag/jsonname_iface.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package swag diff --git a/vendor/github.com/go-openapi/swag/jsonutils/README.md b/vendor/github.com/go-openapi/swag/jsonutils/README.md index c8d0cab67b6..d745cdb466e 100644 --- a/vendor/github.com/go-openapi/swag/jsonutils/README.md +++ b/vendor/github.com/go-openapi/swag/jsonutils/README.md @@ -78,7 +78,7 @@ Each adapter is an independent go module. Hence you'll pick its dependencies onl At this moment we provide: * `stdlib`: JSON adapter based on the standard library -* `easyjson`: JSON adapter based on the `github.com/mailru/easyyjson` +* `easyjson`: JSON adapter based on the `github.com/mailru/easyjson` The adapters provide the basic `Marshal` and `Unmarshal` capabilities, plus an implementation of the `MapSlice` pattern. diff --git a/vendor/github.com/go-openapi/swag/jsonutils/adapters/doc.go b/vendor/github.com/go-openapi/swag/jsonutils/adapters/doc.go index dbb38c2f0cf..76d3898fca5 100644 --- a/vendor/github.com/go-openapi/swag/jsonutils/adapters/doc.go +++ b/vendor/github.com/go-openapi/swag/jsonutils/adapters/doc.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 // Package adapters exposes a registry of adapters to multiple // JSON serialization libraries. diff --git a/vendor/github.com/go-openapi/swag/jsonutils/adapters/ifaces/doc.go b/vendor/github.com/go-openapi/swag/jsonutils/adapters/ifaces/doc.go index 49649859af6..1fd43a1fad5 100644 --- a/vendor/github.com/go-openapi/swag/jsonutils/adapters/ifaces/doc.go +++ b/vendor/github.com/go-openapi/swag/jsonutils/adapters/ifaces/doc.go @@ -1,2 +1,5 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + // Package ifaces exposes all interfaces to work with adapters. package ifaces diff --git a/vendor/github.com/go-openapi/swag/jsonutils/adapters/ifaces/ifaces.go b/vendor/github.com/go-openapi/swag/jsonutils/adapters/ifaces/ifaces.go index 4927d872dab..7805e5e5e39 100644 --- a/vendor/github.com/go-openapi/swag/jsonutils/adapters/ifaces/ifaces.go +++ b/vendor/github.com/go-openapi/swag/jsonutils/adapters/ifaces/ifaces.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package ifaces import ( diff --git a/vendor/github.com/go-openapi/swag/jsonutils/adapters/ifaces/registry_iface.go b/vendor/github.com/go-openapi/swag/jsonutils/adapters/ifaces/registry_iface.go index d1fe6a0adb6..2d6c69f4e60 100644 --- a/vendor/github.com/go-openapi/swag/jsonutils/adapters/ifaces/registry_iface.go +++ b/vendor/github.com/go-openapi/swag/jsonutils/adapters/ifaces/registry_iface.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package ifaces import ( diff --git a/vendor/github.com/go-openapi/swag/jsonutils/adapters/registry.go b/vendor/github.com/go-openapi/swag/jsonutils/adapters/registry.go index b34a2305181..3062acaff26 100644 --- a/vendor/github.com/go-openapi/swag/jsonutils/adapters/registry.go +++ b/vendor/github.com/go-openapi/swag/jsonutils/adapters/registry.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package adapters diff --git a/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/adapter.go b/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/adapter.go index 4df831b62dd..0213ff5c29f 100644 --- a/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/adapter.go +++ b/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/adapter.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package json diff --git a/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/doc.go b/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/doc.go index 2ff6b212fc8..5ea1b440425 100644 --- a/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/doc.go +++ b/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/doc.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 // Package json implements an [ifaces.Adapter] using the standard library. package json diff --git a/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/lexer.go b/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/lexer.go index 6d919199d03..b5aa1c7972e 100644 --- a/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/lexer.go +++ b/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/lexer.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package json diff --git a/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/ordered_map.go b/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/ordered_map.go index 18e6294e50e..54deef406f3 100644 --- a/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/ordered_map.go +++ b/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/ordered_map.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package json diff --git a/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/pool.go b/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/pool.go index 0f51d3a20cd..709b97c3046 100644 --- a/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/pool.go +++ b/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/pool.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package json diff --git a/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/register.go b/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/register.go index 18bbc377450..fc8818694ea 100644 --- a/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/register.go +++ b/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/register.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package json diff --git a/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/writer.go b/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/writer.go index 38e9b6e034a..dc2325c1a30 100644 --- a/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/writer.go +++ b/vendor/github.com/go-openapi/swag/jsonutils/adapters/stdlib/json/writer.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package json diff --git a/vendor/github.com/go-openapi/swag/jsonutils/concat.go b/vendor/github.com/go-openapi/swag/jsonutils/concat.go index 049d4698bf8..2068503af05 100644 --- a/vendor/github.com/go-openapi/swag/jsonutils/concat.go +++ b/vendor/github.com/go-openapi/swag/jsonutils/concat.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package jsonutils @@ -34,7 +23,7 @@ func init() { // ConcatJSON concatenates multiple json objects or arrays efficiently. // -// Note that [ConcatJSON] performs a very simmple (and fast) concatenation +// Note that [ConcatJSON] performs a very simple (and fast) concatenation // operation: it does not attempt to merge objects. func ConcatJSON(blobs ...[]byte) []byte { if len(blobs) == 0 { diff --git a/vendor/github.com/go-openapi/swag/jsonutils/doc.go b/vendor/github.com/go-openapi/swag/jsonutils/doc.go index 495ef834134..3926cc58d1b 100644 --- a/vendor/github.com/go-openapi/swag/jsonutils/doc.go +++ b/vendor/github.com/go-openapi/swag/jsonutils/doc.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 // Package jsonutils provides helpers to work with JSON. // diff --git a/vendor/github.com/go-openapi/swag/jsonutils/json.go b/vendor/github.com/go-openapi/swag/jsonutils/json.go index a33b89bd4d9..40753ce03fd 100644 --- a/vendor/github.com/go-openapi/swag/jsonutils/json.go +++ b/vendor/github.com/go-openapi/swag/jsonutils/json.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package jsonutils diff --git a/vendor/github.com/go-openapi/swag/jsonutils/ordered_map.go b/vendor/github.com/go-openapi/swag/jsonutils/ordered_map.go index 931ce2559d8..38dd3e24442 100644 --- a/vendor/github.com/go-openapi/swag/jsonutils/ordered_map.go +++ b/vendor/github.com/go-openapi/swag/jsonutils/ordered_map.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package jsonutils diff --git a/vendor/github.com/go-openapi/swag/jsonutils_iface.go b/vendor/github.com/go-openapi/swag/jsonutils_iface.go index 63e23f0b69d..7bd4105fa51 100644 --- a/vendor/github.com/go-openapi/swag/jsonutils_iface.go +++ b/vendor/github.com/go-openapi/swag/jsonutils_iface.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package swag @@ -33,17 +22,17 @@ type JSONMapItem = jsonutils.JSONMapItem // WriteJSON writes json data. // // Deprecated: use [jsonutils.WriteJSON] instead. -func WriteJSON(data interface{}) ([]byte, error) { return jsonutils.WriteJSON(data) } +func WriteJSON(data any) ([]byte, error) { return jsonutils.WriteJSON(data) } // ReadJSON reads json data. // // Deprecated: use [jsonutils.ReadJSON] instead. -func ReadJSON(data []byte, value interface{}) error { return jsonutils.ReadJSON(data, value) } +func ReadJSON(data []byte, value any) error { return jsonutils.ReadJSON(data, value) } // DynamicJSONToStruct converts an untyped JSON structure into a target data type. // // Deprecated: use [jsonutils.FromDynamicJSON] instead. -func DynamicJSONToStruct(data interface{}, target interface{}) error { +func DynamicJSONToStruct(data any, target any) error { return jsonutils.FromDynamicJSON(data, target) } @@ -57,8 +46,8 @@ func ConcatJSON(blobs ...[]byte) []byte { return jsonutils.ConcatJSON(blobs...) // It is the same as [FromDynamicJSON], but doesn't check for errors. // // Deprecated: this function is a misnomer and is unsafe. Use [jsonutils.FromDynamicJSON] instead. -func ToDynamicJSON(value interface{}) interface{} { - var res interface{} +func ToDynamicJSON(value any) any { + var res any if err := FromDynamicJSON(value, &res); err != nil { log.Println(err) } @@ -68,9 +57,9 @@ func ToDynamicJSON(value interface{}) interface{} { // FromDynamicJSON turns a go value into a properly JSON typed structure. // -// "Dynamic JSON" refers to what you get when unmarshaling JSON into an untyped interface{}, -// i.e. objects are represented by map[string]interface{}, arrays by []interface{}, and all -// scalar values are interface{}. +// "Dynamic JSON" refers to what you get when unmarshaling JSON into an untyped any, +// i.e. objects are represented by map[string]any, arrays by []any, and all +// scalar values are any. // // Deprecated: use [jsonutils.FromDynamicJSON] instead. -func FromDynamicJSON(data, target interface{}) error { return jsonutils.FromDynamicJSON(data, target) } +func FromDynamicJSON(data, target any) error { return jsonutils.FromDynamicJSON(data, target) } diff --git a/vendor/github.com/go-openapi/swag/loading/doc.go b/vendor/github.com/go-openapi/swag/loading/doc.go index 62585615e1e..8cf7bcb8b9d 100644 --- a/vendor/github.com/go-openapi/swag/loading/doc.go +++ b/vendor/github.com/go-openapi/swag/loading/doc.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 // Package loading provides tools to load a file from http or from a local file system. package loading diff --git a/vendor/github.com/go-openapi/swag/loading/errors.go b/vendor/github.com/go-openapi/swag/loading/errors.go index ca45732a7a6..b3964289c74 100644 --- a/vendor/github.com/go-openapi/swag/loading/errors.go +++ b/vendor/github.com/go-openapi/swag/loading/errors.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package loading diff --git a/vendor/github.com/go-openapi/swag/loading/json.go b/vendor/github.com/go-openapi/swag/loading/json.go index aadf9991357..59db12f5cfd 100644 --- a/vendor/github.com/go-openapi/swag/loading/json.go +++ b/vendor/github.com/go-openapi/swag/loading/json.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package loading import ( diff --git a/vendor/github.com/go-openapi/swag/loading/loading.go b/vendor/github.com/go-openapi/swag/loading/loading.go index bd955535f71..269fb74d167 100644 --- a/vendor/github.com/go-openapi/swag/loading/loading.go +++ b/vendor/github.com/go-openapi/swag/loading/loading.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package loading diff --git a/vendor/github.com/go-openapi/swag/loading/options.go b/vendor/github.com/go-openapi/swag/loading/options.go index a51329e938b..6674ac69e62 100644 --- a/vendor/github.com/go-openapi/swag/loading/options.go +++ b/vendor/github.com/go-openapi/swag/loading/options.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package loading @@ -81,7 +70,7 @@ func WithCustomHeaders(headers map[string]string) Option { } } -// WithHTTClient overrides the default HTTP client used to fetch a remote file. +// WithHTTPClient overrides the default HTTP client used to fetch a remote file. // // By default, [http.DefaultClient] is used. func WithHTTPClient(client *http.Client) Option { @@ -90,7 +79,7 @@ func WithHTTPClient(client *http.Client) Option { } } -// WithFileFS sets a file system for the local file loader. +// WithFS sets a file system for the local file loader. // // If the provided file system is a [fs.ReadFileFS], the ReadFile function is used. // Otherwise, ReadFile is wrapped using [fs.ReadFile]. diff --git a/vendor/github.com/go-openapi/swag/loading/yaml.go b/vendor/github.com/go-openapi/swag/loading/yaml.go index 40bd2a769f9..3ebb53668c4 100644 --- a/vendor/github.com/go-openapi/swag/loading/yaml.go +++ b/vendor/github.com/go-openapi/swag/loading/yaml.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package loading @@ -38,7 +27,7 @@ func YAMLDoc(path string, opts ...Option) (json.RawMessage, error) { } // YAMLData loads a yaml document from either http or a file. -func YAMLData(path string, opts ...Option) (interface{}, error) { +func YAMLData(path string, opts ...Option) (any, error) { data, err := LoadFromFileOrHTTP(path, opts...) if err != nil { return nil, err diff --git a/vendor/github.com/go-openapi/swag/loading_iface.go b/vendor/github.com/go-openapi/swag/loading_iface.go index 38d825bc5ea..27ec3fb8c37 100644 --- a/vendor/github.com/go-openapi/swag/loading_iface.go +++ b/vendor/github.com/go-openapi/swag/loading_iface.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package swag @@ -84,7 +73,7 @@ func YAMLDoc(path string) (json.RawMessage, error) { // YAMLData loads a yaml document from either http or a file. // // Deprecated: use [loading.YAMLData] instead. -func YAMLData(path string) (interface{}, error) { +func YAMLData(path string) (any, error) { return loading.YAMLData(path) } diff --git a/vendor/github.com/go-openapi/swag/mangling/doc.go b/vendor/github.com/go-openapi/swag/mangling/doc.go index dbe806828c3..ce0d8904857 100644 --- a/vendor/github.com/go-openapi/swag/mangling/doc.go +++ b/vendor/github.com/go-openapi/swag/mangling/doc.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 // Package mangling provides name mangling capabilities. // diff --git a/vendor/github.com/go-openapi/swag/mangling/initialism_index.go b/vendor/github.com/go-openapi/swag/mangling/initialism_index.go index cf0786f812c..e5b70c14938 100644 --- a/vendor/github.com/go-openapi/swag/mangling/initialism_index.go +++ b/vendor/github.com/go-openapi/swag/mangling/initialism_index.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package mangling @@ -190,6 +179,19 @@ const ( simplePlural ) +func (f pluralForm) String() string { + switch f { + case notPlural: + return "notPlural" + case invariantPlural: + return "invariantPlural" + case simplePlural: + return "simplePlural" + default: + return "" + } +} + // pluralForm indicates how we want to pluralize a given initialism. // // Besides configured invariant forms (like HTTP and HTTPS), diff --git a/vendor/github.com/go-openapi/swag/mangling/name_lexem.go b/vendor/github.com/go-openapi/swag/mangling/name_lexem.go index 02004b4f3ab..bc837e3b9f5 100644 --- a/vendor/github.com/go-openapi/swag/mangling/name_lexem.go +++ b/vendor/github.com/go-openapi/swag/mangling/name_lexem.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package mangling diff --git a/vendor/github.com/go-openapi/swag/mangling/name_mangler.go b/vendor/github.com/go-openapi/swag/mangling/name_mangler.go index 94ae555a7b6..da685681d08 100644 --- a/vendor/github.com/go-openapi/swag/mangling/name_mangler.go +++ b/vendor/github.com/go-openapi/swag/mangling/name_mangler.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package mangling diff --git a/vendor/github.com/go-openapi/swag/mangling/options.go b/vendor/github.com/go-openapi/swag/mangling/options.go index 66ad2e46c78..3c92b2f18bf 100644 --- a/vendor/github.com/go-openapi/swag/mangling/options.go +++ b/vendor/github.com/go-openapi/swag/mangling/options.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package mangling diff --git a/vendor/github.com/go-openapi/swag/mangling/pools.go b/vendor/github.com/go-openapi/swag/mangling/pools.go index d85b4038776..f8104351445 100644 --- a/vendor/github.com/go-openapi/swag/mangling/pools.go +++ b/vendor/github.com/go-openapi/swag/mangling/pools.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package mangling diff --git a/vendor/github.com/go-openapi/swag/mangling/split.go b/vendor/github.com/go-openapi/swag/mangling/split.go index 40e4a2e0e1d..ed12ea25674 100644 --- a/vendor/github.com/go-openapi/swag/mangling/split.go +++ b/vendor/github.com/go-openapi/swag/mangling/split.go @@ -1,20 +1,10 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package mangling import ( + "fmt" "unicode" ) @@ -47,6 +37,13 @@ type ( initialismMatches []initialismMatch ) +// String representation of a match, e.g. for debugging. +func (m initialismMatch) String() string { + return fmt.Sprintf("{body: %s (%d), start: %d, end; %d, complete: %t, hasPlural: %v}", + string(m.body), len(m.body), m.start, m.end, m.complete, m.hasPlural, + ) +} + func (m initialismMatch) isZero() bool { return m.start == 0 && m.end == 0 } @@ -83,116 +80,148 @@ func (s splitter) split(name string) *[]nameLexem { } func (s splitter) gatherInitialismMatches(nameRunes []rune) *initialismMatches { - var matches *initialismMatches + matches := poolOfMatches.BorrowMatches() + const minLenInitialism = 1 + if len(nameRunes) < minLenInitialism+1 { + // can't match initialism with 0 or 1 rune + return matches + } + + // first iteration + s.findMatches(matches, nameRunes, nameRunes[0], 0) - for currentRunePosition, currentRune := range nameRunes { - // recycle these allocations as we loop over runes + for i, currentRune := range nameRunes[1:] { + currentRunePosition := i + 1 + // recycle allocations as we loop over runes // with such recycling, only 2 slices should be allocated per call // instead of o(n). + // + // BorrowMatches always yields slices with zero length (with some capacity) newMatches := poolOfMatches.BorrowMatches() // check current initialism matches - if matches != nil { // skip first iteration - for _, match := range *matches { - if keepCompleteMatch := match.complete; keepCompleteMatch { - *newMatches = append(*newMatches, match) - - // the match is complete: keep it then move on to next rune - continue - } + for _, match := range *matches { + if keepCompleteMatch := match.complete; keepCompleteMatch { + // the match is already complete: keep it then move on to the next match + *newMatches = append(*newMatches, match) + continue + } - currentMatchRune := match.body[currentRunePosition-match.start] - if currentMatchRune != currentRune { - // failed match, move on to next rune - continue - } + if currentRunePosition-match.start == len(match.body) { + // unmatched: skip + continue + } - // try to complete ongoing match - if currentRunePosition-match.start == len(match.body)-1 { - // we are close; the next step is to check the symbol ahead - // if it is a lowercase letter, then it is not the end of match - // but the beginning of the next word. - // - // NOTE(fredbi): this heuristic sometimes leads to counterintuitive splits and - // perhaps (not sure yet) we should check against case _alternance_. - // - // Example: - // - // In the current version, in the sentence "IDS initialism", "ID" is recognized as an initialism, - // leading to a split like "id_s_initialism" (or IDSInitialism), - // whereas in the sentence "IDx initialism", it is not and produces something like - // "i_d_x_initialism" (or IDxInitialism). The generated file name is not great. - // - // Both go identifiers are tolerated by linters. - // - // Notice that the slightly different input "IDs initialism" is correctly detected - // as a pluralized initialism and produces something like "ids_initialism" (or IDsInitialism). - - if currentRunePosition < len(nameRunes)-1 { - nextRune := nameRunes[currentRunePosition+1] - - // recognize a plural form for this initialism (only simple pluralization is supported) - if nextRune == 's' && match.hasPlural == simplePlural { - // detected a pluralized initialism - match.body = append(match.body, nextRune) - currentRunePosition++ - if currentRunePosition < len(nameRunes)-1 { - nextRune = nameRunes[currentRunePosition+1] - if newWord := unicode.IsLower(nextRune); newWord { - // it is the start of a new word. - // Match is only partial and the initialism is not recognized : move on - continue - } - } + // 1. by construction of the matches, we can't have currentRunePosition - match.start < 0 + // because matches have been computed with their start <= currentRunePosition in the previous + // iterations. + // 2. by construction of the matches, we can't have currentRunePosition - match.start >= len(match.body) - // this is a pluralized match: keep it - match.complete = true - match.hasPlural = simplePlural - match.end = currentRunePosition - *newMatches = append(*newMatches, match) + currentMatchRune := match.body[currentRunePosition-match.start] + if currentMatchRune != currentRune { + // failed match, discard it then move on to the next match + continue + } - // match is complete: keep it then move on to next rune - continue + // try to complete the current match + if currentRunePosition-match.start == len(match.body)-1 { + // we are close: the next step is to check the symbol ahead + // if it is a lowercase letter, then it is not the end of match + // but the beginning of the next word. + // + // NOTE(fredbi): this heuristic sometimes leads to counterintuitive splits and + // perhaps (not sure yet) we should check against case _alternance_. + // + // Example: + // + // In the current version, in the sentence "IDS initialism", "ID" is recognized as an initialism, + // leading to a split like "id_s_initialism" (or IDSInitialism), + // whereas in the sentence "IDx initialism", it is not and produces something like + // "i_d_x_initialism" (or IDxInitialism). The generated file name is not great. + // + // Both go identifiers are tolerated by linters. + // + // Notice that the slightly different input "IDs initialism" is correctly detected + // as a pluralized initialism and produces something like "ids_initialism" (or IDsInitialism). + + if currentRunePosition < len(nameRunes)-1 { // when before the last rune + nextRune := nameRunes[currentRunePosition+1] + + // recognize a plural form for this initialism (only simple english pluralization is supported). + if nextRune == 's' && match.hasPlural == simplePlural { + // detected a pluralized initialism + match.body = append(match.body, nextRune) + lookAhead := currentRunePosition + 1 + if lookAhead < len(nameRunes)-1 { + nextRune = nameRunes[lookAhead+1] + if newWord := unicode.IsLower(nextRune); newWord { + // it is the start of a new word. + // Match is only partial and the initialism is not recognized: + // move on to the next match, but do not advance the rune position + continue + } } - if newWord := unicode.IsLower(nextRune); newWord { - // it is the start of a new word - // Match is only partial and the initialism is not recognized : move on - continue - } + // this is a pluralized match: keep it + currentRunePosition++ + match.complete = true + match.hasPlural = simplePlural + match.end = currentRunePosition + *newMatches = append(*newMatches, match) + + // match is complete: keep it then move on to the next match + continue } - match.complete = true - match.end = currentRunePosition + // other cases + // example: invariant plural such as "TLS" + if newWord := unicode.IsLower(nextRune); newWord { + // it is the start of a new word + // Match is only partial and the initialism is not recognized : move on + continue + } } - // append the ongoing matching attempt (not necessarily complete) - *newMatches = append(*newMatches, match) + match.complete = true + match.end = currentRunePosition } - } - // check for new initialism matches - for i, r := range s.initialismsRunes { - if r[0] == currentRune { - *newMatches = append(*newMatches, initialismMatch{ - start: currentRunePosition, - body: r, - complete: false, - hasPlural: s.initialismsPluralForm[i], - }) - } + // append the ongoing matching attempt: it is not necessarily complete, but was successful so far. + // Let's see if it still matches on the next rune. + *newMatches = append(*newMatches, match) } - if matches != nil { - poolOfMatches.RedeemMatches(matches) - } + s.findMatches(newMatches, nameRunes, currentRune, currentRunePosition) + + poolOfMatches.RedeemMatches(matches) matches = newMatches } - // up to the caller to redeem this last slice + // it is up to the caller to redeem this last slice return matches } +func (s splitter) findMatches(newMatches *initialismMatches, nameRunes []rune, currentRune rune, currentRunePosition int) { + // check for new initialism matches, based on the first character + for i, r := range s.initialismsRunes { + if r[0] != currentRune { + continue + } + + if currentRunePosition+len(r) > len(nameRunes) { + continue // not eligible: would spilll over the initial string + } + + // possible matches: all initialisms starting with the current rune and that can fit the given string (nameRunes) + *newMatches = append(*newMatches, initialismMatch{ + start: currentRunePosition, + body: r, + complete: false, + hasPlural: s.initialismsPluralForm[i], + }) + } +} + func (s splitter) mapMatchesToNameLexems(nameRunes []rune, matches *initialismMatches) *[]nameLexem { nameLexems := poolOfLexems.BorrowLexems() diff --git a/vendor/github.com/go-openapi/swag/mangling/string_bytes.go b/vendor/github.com/go-openapi/swag/mangling/string_bytes.go index 06351434d38..28daaf72b1a 100644 --- a/vendor/github.com/go-openapi/swag/mangling/string_bytes.go +++ b/vendor/github.com/go-openapi/swag/mangling/string_bytes.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package mangling diff --git a/vendor/github.com/go-openapi/swag/mangling/util.go b/vendor/github.com/go-openapi/swag/mangling/util.go index c289dc6bddb..0636417e360 100644 --- a/vendor/github.com/go-openapi/swag/mangling/util.go +++ b/vendor/github.com/go-openapi/swag/mangling/util.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package mangling diff --git a/vendor/github.com/go-openapi/swag/mangling_iface.go b/vendor/github.com/go-openapi/swag/mangling_iface.go index 2d0d07ddb62..98b9a999293 100644 --- a/vendor/github.com/go-openapi/swag/mangling_iface.go +++ b/vendor/github.com/go-openapi/swag/mangling_iface.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package swag diff --git a/vendor/github.com/go-openapi/swag/netutils/doc.go b/vendor/github.com/go-openapi/swag/netutils/doc.go index ed6d8a022b8..74282f8e51c 100644 --- a/vendor/github.com/go-openapi/swag/netutils/doc.go +++ b/vendor/github.com/go-openapi/swag/netutils/doc.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 // Package netutils provides helpers for network-related tasks. package netutils diff --git a/vendor/github.com/go-openapi/swag/netutils/net.go b/vendor/github.com/go-openapi/swag/netutils/net.go index 3d0182fc5a1..82a1544af7b 100644 --- a/vendor/github.com/go-openapi/swag/netutils/net.go +++ b/vendor/github.com/go-openapi/swag/netutils/net.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package netutils diff --git a/vendor/github.com/go-openapi/swag/netutils_iface.go b/vendor/github.com/go-openapi/swag/netutils_iface.go index 537314e3645..d658de25b3f 100644 --- a/vendor/github.com/go-openapi/swag/netutils_iface.go +++ b/vendor/github.com/go-openapi/swag/netutils_iface.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package swag diff --git a/vendor/github.com/go-openapi/swag/stringutils/collection_formats.go b/vendor/github.com/go-openapi/swag/stringutils/collection_formats.go index 1ff96dcbd81..28056ad25c3 100644 --- a/vendor/github.com/go-openapi/swag/stringutils/collection_formats.go +++ b/vendor/github.com/go-openapi/swag/stringutils/collection_formats.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package stringutils diff --git a/vendor/github.com/go-openapi/swag/stringutils/doc.go b/vendor/github.com/go-openapi/swag/stringutils/doc.go index b5d18e517d2..c6d17a1160b 100644 --- a/vendor/github.com/go-openapi/swag/stringutils/doc.go +++ b/vendor/github.com/go-openapi/swag/stringutils/doc.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 // Package stringutils exposes helpers to search and process strings. package stringutils diff --git a/vendor/github.com/go-openapi/swag/stringutils/strings.go b/vendor/github.com/go-openapi/swag/stringutils/strings.go index 086592317f8..cd792b7d083 100644 --- a/vendor/github.com/go-openapi/swag/stringutils/strings.go +++ b/vendor/github.com/go-openapi/swag/stringutils/strings.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package stringutils diff --git a/vendor/github.com/go-openapi/swag/stringutils_iface.go b/vendor/github.com/go-openapi/swag/stringutils_iface.go index 00d7e021251..dbfa4848430 100644 --- a/vendor/github.com/go-openapi/swag/stringutils_iface.go +++ b/vendor/github.com/go-openapi/swag/stringutils_iface.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package swag diff --git a/vendor/github.com/go-openapi/swag/typeutils/doc.go b/vendor/github.com/go-openapi/swag/typeutils/doc.go index 67e49d12ec5..66bed20dff0 100644 --- a/vendor/github.com/go-openapi/swag/typeutils/doc.go +++ b/vendor/github.com/go-openapi/swag/typeutils/doc.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 // Package typeutils exposes utilities to inspect generic types. package typeutils diff --git a/vendor/github.com/go-openapi/swag/typeutils/types.go b/vendor/github.com/go-openapi/swag/typeutils/types.go index f0ddd3cd3df..55487a673c4 100644 --- a/vendor/github.com/go-openapi/swag/typeutils/types.go +++ b/vendor/github.com/go-openapi/swag/typeutils/types.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package typeutils diff --git a/vendor/github.com/go-openapi/swag/typeutils_iface.go b/vendor/github.com/go-openapi/swag/typeutils_iface.go index b104a8040aa..b63813ea408 100644 --- a/vendor/github.com/go-openapi/swag/typeutils_iface.go +++ b/vendor/github.com/go-openapi/swag/typeutils_iface.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package swag @@ -20,4 +9,4 @@ import "github.com/go-openapi/swag/typeutils" // This allows for safer checking of interface values. // // Deprecated: use [typeutils.IsZero] instead. -func IsZero(data interface{}) bool { return typeutils.IsZero(data) } +func IsZero(data any) bool { return typeutils.IsZero(data) } diff --git a/vendor/github.com/go-openapi/swag/yamlutils/doc.go b/vendor/github.com/go-openapi/swag/yamlutils/doc.go index 4aeadc22480..7bb92a82f1b 100644 --- a/vendor/github.com/go-openapi/swag/yamlutils/doc.go +++ b/vendor/github.com/go-openapi/swag/yamlutils/doc.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 // Package yamlutils provides utilities to work with YAML documents. // diff --git a/vendor/github.com/go-openapi/swag/yamlutils/errors.go b/vendor/github.com/go-openapi/swag/yamlutils/errors.go index 014f227d965..e87bc5e8beb 100644 --- a/vendor/github.com/go-openapi/swag/yamlutils/errors.go +++ b/vendor/github.com/go-openapi/swag/yamlutils/errors.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package yamlutils diff --git a/vendor/github.com/go-openapi/swag/yamlutils/ordered_map.go b/vendor/github.com/go-openapi/swag/yamlutils/ordered_map.go index af1d7bb518a..3daf68dbba0 100644 --- a/vendor/github.com/go-openapi/swag/yamlutils/ordered_map.go +++ b/vendor/github.com/go-openapi/swag/yamlutils/ordered_map.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package yamlutils import ( diff --git a/vendor/github.com/go-openapi/swag/yamlutils/yaml.go b/vendor/github.com/go-openapi/swag/yamlutils/yaml.go index 67fba8fd7c8..e3aff3c2fde 100644 --- a/vendor/github.com/go-openapi/swag/yamlutils/yaml.go +++ b/vendor/github.com/go-openapi/swag/yamlutils/yaml.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package yamlutils diff --git a/vendor/github.com/go-openapi/swag/yamlutils_iface.go b/vendor/github.com/go-openapi/swag/yamlutils_iface.go index 49e646486e3..57767efc567 100644 --- a/vendor/github.com/go-openapi/swag/yamlutils_iface.go +++ b/vendor/github.com/go-openapi/swag/yamlutils_iface.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package swag @@ -23,9 +12,9 @@ import ( // YAMLToJSON converts YAML unmarshaled data into json compatible data // // Deprecated: use [yamlutils.YAMLToJSON] instead. -func YAMLToJSON(data interface{}) (json.RawMessage, error) { return yamlutils.YAMLToJSON(data) } +func YAMLToJSON(data any) (json.RawMessage, error) { return yamlutils.YAMLToJSON(data) } // BytesToYAMLDoc converts a byte slice into a YAML document // // Deprecated: use [yamlutils.BytesToYAMLDoc] instead. -func BytesToYAMLDoc(data []byte) (interface{}, error) { return yamlutils.BytesToYAMLDoc(data) } +func BytesToYAMLDoc(data []byte) (any, error) { return yamlutils.BytesToYAMLDoc(data) } diff --git a/vendor/github.com/go-openapi/validate/.golangci.yml b/vendor/github.com/go-openapi/validate/.golangci.yml index 43e2576479a..10c513342fc 100644 --- a/vendor/github.com/go-openapi/validate/.golangci.yml +++ b/vendor/github.com/go-openapi/validate/.golangci.yml @@ -17,7 +17,7 @@ linters: - gomoddirectives - gosmopolitan - inamedparam - #- intrange # disabled while < go1.22 + - intrange - ireturn - lll - musttag diff --git a/vendor/github.com/go-openapi/validate/README.md b/vendor/github.com/go-openapi/validate/README.md index e8e1bb218d9..73d87ce4f01 100644 --- a/vendor/github.com/go-openapi/validate/README.md +++ b/vendor/github.com/go-openapi/validate/README.md @@ -24,6 +24,10 @@ Reference can be found here: https://github.com/OAI/OpenAPI-Specification/blob/m [Documentation](https://pkg.go.dev/github.com/go-openapi/validate) +## Licensing + +This library ships under the [SPDX-License-Identifier: Apache-2.0](./LICENSE). + ## FAQ * Does this library support OpenAPI 3? diff --git a/vendor/github.com/go-openapi/validate/context.go b/vendor/github.com/go-openapi/validate/context.go index d54791c9d05..b4587dcd560 100644 --- a/vendor/github.com/go-openapi/validate/context.go +++ b/vendor/github.com/go-openapi/validate/context.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package validate import ( diff --git a/vendor/github.com/go-openapi/validate/debug.go b/vendor/github.com/go-openapi/validate/debug.go index 8815fd93597..79145a4495d 100644 --- a/vendor/github.com/go-openapi/validate/debug.go +++ b/vendor/github.com/go-openapi/validate/debug.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package validate @@ -38,7 +27,7 @@ func debugOptions() { validateLogger = log.New(os.Stdout, "validate:", log.LstdFlags) } -func debugLog(msg string, args ...interface{}) { +func debugLog(msg string, args ...any) { // A private, trivial trace logger, based on go-openapi/spec/expander.go:debugLog() if Debug { _, file1, pos1, _ := runtime.Caller(1) diff --git a/vendor/github.com/go-openapi/validate/default_validator.go b/vendor/github.com/go-openapi/validate/default_validator.go index e82bb30178e..79a431677e4 100644 --- a/vendor/github.com/go-openapi/validate/default_validator.go +++ b/vendor/github.com/go-openapi/validate/default_validator.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package validate diff --git a/vendor/github.com/go-openapi/validate/doc.go b/vendor/github.com/go-openapi/validate/doc.go index d2b901eab9a..a99893e1a38 100644 --- a/vendor/github.com/go-openapi/validate/doc.go +++ b/vendor/github.com/go-openapi/validate/doc.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 /* Package validate provides methods to validate a swagger specification, diff --git a/vendor/github.com/go-openapi/validate/example_validator.go b/vendor/github.com/go-openapi/validate/example_validator.go index 0663b21dc5e..e4ef52c6dc1 100644 --- a/vendor/github.com/go-openapi/validate/example_validator.go +++ b/vendor/github.com/go-openapi/validate/example_validator.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package validate diff --git a/vendor/github.com/go-openapi/validate/formats.go b/vendor/github.com/go-openapi/validate/formats.go index f4e35521306..85ee6349418 100644 --- a/vendor/github.com/go-openapi/validate/formats.go +++ b/vendor/github.com/go-openapi/validate/formats.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package validate @@ -54,7 +43,7 @@ func (f *formatValidator) SetPath(path string) { f.Path = path } -func (f *formatValidator) Applies(source interface{}, kind reflect.Kind) bool { +func (f *formatValidator) Applies(source any, kind reflect.Kind) bool { if source == nil || f.KnownFormats == nil { return false } @@ -73,7 +62,7 @@ func (f *formatValidator) Applies(source interface{}, kind reflect.Kind) bool { } } -func (f *formatValidator) Validate(val interface{}) *Result { +func (f *formatValidator) Validate(val any) *Result { if f.Options.recycleValidators { defer func() { f.redeem() diff --git a/vendor/github.com/go-openapi/validate/helpers.go b/vendor/github.com/go-openapi/validate/helpers.go index 16840da6331..49b130473a9 100644 --- a/vendor/github.com/go-openapi/validate/helpers.go +++ b/vendor/github.com/go-openapi/validate/helpers.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package validate @@ -139,7 +128,7 @@ func (h *pathHelper) stripParametersInPath(path string) string { rexParsePathParam := mustCompileRegexp(`{[^{}]+?}`) strippedSegments := []string{} - for _, segment := range strings.Split(path, "/") { + for segment := range strings.SplitSeq(path, "/") { strippedSegments = append(strippedSegments, rexParsePathParam.ReplaceAllString(segment, "X")) } return strings.Join(strippedSegments, "/") @@ -149,7 +138,7 @@ func (h *pathHelper) extractPathParams(path string) (params []string) { // Extracts all params from a path, with surrounding "{}" rexParsePathParam := mustCompileRegexp(`{[^{}]+?}`) - for _, segment := range strings.Split(path, "/") { + for segment := range strings.SplitSeq(path, "/") { for _, v := range rexParsePathParam.FindAllStringSubmatch(segment, -1) { params = append(params, v...) } @@ -161,7 +150,7 @@ type valueHelper struct { // A collection of unexported helpers for value validation } -func (h *valueHelper) asInt64(val interface{}) int64 { +func (h *valueHelper) asInt64(val any) int64 { // Number conversion function for int64, without error checking // (implements an implicit type upgrade). v := reflect.ValueOf(val) @@ -178,7 +167,7 @@ func (h *valueHelper) asInt64(val interface{}) int64 { } } -func (h *valueHelper) asUint64(val interface{}) uint64 { +func (h *valueHelper) asUint64(val any) uint64 { // Number conversion function for uint64, without error checking // (implements an implicit type upgrade). v := reflect.ValueOf(val) @@ -196,7 +185,7 @@ func (h *valueHelper) asUint64(val interface{}) uint64 { } // Same for unsigned floats -func (h *valueHelper) asFloat64(val interface{}) float64 { +func (h *valueHelper) asFloat64(val any) float64 { // Number conversion function for float64, without error checking // (implements an implicit type upgrade). v := reflect.ValueOf(val) diff --git a/vendor/github.com/go-openapi/validate/object_validator.go b/vendor/github.com/go-openapi/validate/object_validator.go index 76301d0e887..cf98ed377d5 100644 --- a/vendor/github.com/go-openapi/validate/object_validator.go +++ b/vendor/github.com/go-openapi/validate/object_validator.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package validate diff --git a/vendor/github.com/go-openapi/validate/options.go b/vendor/github.com/go-openapi/validate/options.go index cfe9b0660f6..f5e7f7131c7 100644 --- a/vendor/github.com/go-openapi/validate/options.go +++ b/vendor/github.com/go-openapi/validate/options.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package validate diff --git a/vendor/github.com/go-openapi/validate/pools.go b/vendor/github.com/go-openapi/validate/pools.go index 3ddce4dcc2b..1e734be493b 100644 --- a/vendor/github.com/go-openapi/validate/pools.go +++ b/vendor/github.com/go-openapi/validate/pools.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + //go:build !validatedebug package validate diff --git a/vendor/github.com/go-openapi/validate/pools_debug.go b/vendor/github.com/go-openapi/validate/pools_debug.go index 12949f02a7e..d123ed4093f 100644 --- a/vendor/github.com/go-openapi/validate/pools_debug.go +++ b/vendor/github.com/go-openapi/validate/pools_debug.go @@ -1,3 +1,6 @@ +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + //go:build validatedebug package validate diff --git a/vendor/github.com/go-openapi/validate/result.go b/vendor/github.com/go-openapi/validate/result.go index 1955cff7837..69219e99823 100644 --- a/vendor/github.com/go-openapi/validate/result.go +++ b/vendor/github.com/go-openapi/validate/result.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package validate diff --git a/vendor/github.com/go-openapi/validate/rexp.go b/vendor/github.com/go-openapi/validate/rexp.go index 76de03e1f41..795f148d0cf 100644 --- a/vendor/github.com/go-openapi/validate/rexp.go +++ b/vendor/github.com/go-openapi/validate/rexp.go @@ -1,20 +1,10 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package validate import ( + "maps" re "regexp" "sync" "sync/atomic" @@ -62,9 +52,7 @@ func cacheRegexp(r *re.Regexp) { r.String(): r, } - for k, v := range cache { - newCache[k] = v - } + maps.Copy(newCache, cache) reDict.Store(newCache) } diff --git a/vendor/github.com/go-openapi/validate/schema.go b/vendor/github.com/go-openapi/validate/schema.go index 8c48899b0b1..375a98765d7 100644 --- a/vendor/github.com/go-openapi/validate/schema.go +++ b/vendor/github.com/go-openapi/validate/schema.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package validate @@ -30,7 +19,7 @@ type SchemaValidator struct { in string Schema *spec.Schema validators [8]valueValidator - Root interface{} + Root any KnownFormats strfmt.Registry Options *SchemaValidatorOptions } @@ -38,7 +27,7 @@ type SchemaValidator struct { // AgainstSchema validates the specified data against the provided schema, using a registry of supported formats. // // When no pre-parsed *spec.Schema structure is provided, it uses a JSON schema as default. See example. -func AgainstSchema(schema *spec.Schema, data interface{}, formats strfmt.Registry, options ...Option) error { +func AgainstSchema(schema *spec.Schema, data any, formats strfmt.Registry, options ...Option) error { res := NewSchemaValidator(schema, nil, "", formats, append(options, WithRecycleValidators(true), withRecycleResults(true))..., ).Validate(data) @@ -56,7 +45,7 @@ func AgainstSchema(schema *spec.Schema, data interface{}, formats strfmt.Registr // NewSchemaValidator creates a new schema validator. // // Panics if the provided schema is invalid. -func NewSchemaValidator(schema *spec.Schema, rootSchema interface{}, root string, formats strfmt.Registry, options ...Option) *SchemaValidator { +func NewSchemaValidator(schema *spec.Schema, rootSchema any, root string, formats strfmt.Registry, options ...Option) *SchemaValidator { opts := new(SchemaValidatorOptions) for _, o := range options { o(opts) @@ -65,7 +54,7 @@ func NewSchemaValidator(schema *spec.Schema, rootSchema interface{}, root string return newSchemaValidator(schema, rootSchema, root, formats, opts) } -func newSchemaValidator(schema *spec.Schema, rootSchema interface{}, root string, formats strfmt.Registry, opts *SchemaValidatorOptions) *SchemaValidator { +func newSchemaValidator(schema *spec.Schema, rootSchema any, root string, formats strfmt.Registry, opts *SchemaValidatorOptions) *SchemaValidator { if schema == nil { return nil } @@ -120,13 +109,13 @@ func (s *SchemaValidator) SetPath(path string) { } // Applies returns true when this schema validator applies -func (s *SchemaValidator) Applies(source interface{}, _ reflect.Kind) bool { +func (s *SchemaValidator) Applies(source any, _ reflect.Kind) bool { _, ok := source.(*spec.Schema) return ok } // Validate validates the data against the schema -func (s *SchemaValidator) Validate(data interface{}) *Result { +func (s *SchemaValidator) Validate(data any) *Result { if s == nil { return emptyResult } diff --git a/vendor/github.com/go-openapi/validate/schema_messages.go b/vendor/github.com/go-openapi/validate/schema_messages.go index 786e2e3554e..e8c7c48ad7f 100644 --- a/vendor/github.com/go-openapi/validate/schema_messages.go +++ b/vendor/github.com/go-openapi/validate/schema_messages.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package validate diff --git a/vendor/github.com/go-openapi/validate/schema_option.go b/vendor/github.com/go-openapi/validate/schema_option.go index 65eeebeaab3..d9fd21a75a1 100644 --- a/vendor/github.com/go-openapi/validate/schema_option.go +++ b/vendor/github.com/go-openapi/validate/schema_option.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package validate diff --git a/vendor/github.com/go-openapi/validate/schema_props.go b/vendor/github.com/go-openapi/validate/schema_props.go index b8bdee82c58..485f536adc3 100644 --- a/vendor/github.com/go-openapi/validate/schema_props.go +++ b/vendor/github.com/go-openapi/validate/schema_props.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package validate @@ -34,7 +23,7 @@ type schemaPropsValidator struct { allOfValidators []*SchemaValidator oneOfValidators []*SchemaValidator notValidator *SchemaValidator - Root interface{} + Root any KnownFormats strfmt.Registry Options *SchemaValidatorOptions } @@ -44,7 +33,7 @@ func (s *schemaPropsValidator) SetPath(path string) { } func newSchemaPropsValidator( - path string, in string, allOf, oneOf, anyOf []spec.Schema, not *spec.Schema, deps spec.Dependencies, root interface{}, formats strfmt.Registry, + path string, in string, allOf, oneOf, anyOf []spec.Schema, not *spec.Schema, deps spec.Dependencies, root any, formats strfmt.Registry, opts *SchemaValidatorOptions) *schemaPropsValidator { if opts == nil { opts = new(SchemaValidatorOptions) @@ -93,12 +82,12 @@ func newSchemaPropsValidator( return s } -func (s *schemaPropsValidator) Applies(source interface{}, _ reflect.Kind) bool { +func (s *schemaPropsValidator) Applies(source any, _ reflect.Kind) bool { _, isSchema := source.(*spec.Schema) return isSchema } -func (s *schemaPropsValidator) Validate(data interface{}) *Result { +func (s *schemaPropsValidator) Validate(data any) *Result { var mainResult *Result if s.Options.recycleResult { mainResult = pools.poolOfResults.BorrowResult() @@ -150,7 +139,7 @@ func (s *schemaPropsValidator) Validate(data interface{}) *Result { return mainResult.Merge(keepResultAllOf, keepResultOneOf, keepResultAnyOf) } -func (s *schemaPropsValidator) validateAnyOf(data interface{}, mainResult, keepResultAnyOf *Result) { +func (s *schemaPropsValidator) validateAnyOf(data any, mainResult, keepResultAnyOf *Result) { // Validates at least one in anyOf schemas var bestFailures *Result @@ -192,7 +181,7 @@ func (s *schemaPropsValidator) validateAnyOf(data interface{}, mainResult, keepR mainResult.Merge(bestFailures) } -func (s *schemaPropsValidator) validateOneOf(data interface{}, mainResult, keepResultOneOf *Result) { +func (s *schemaPropsValidator) validateOneOf(data any, mainResult, keepResultOneOf *Result) { // Validates exactly one in oneOf schemas var ( firstSuccess, bestFailures *Result @@ -251,7 +240,7 @@ func (s *schemaPropsValidator) validateOneOf(data interface{}, mainResult, keepR } } -func (s *schemaPropsValidator) validateAllOf(data interface{}, mainResult, keepResultAllOf *Result) { +func (s *schemaPropsValidator) validateAllOf(data any, mainResult, keepResultAllOf *Result) { // Validates all of allOf schemas var validated int @@ -277,7 +266,7 @@ func (s *schemaPropsValidator) validateAllOf(data interface{}, mainResult, keepR } } -func (s *schemaPropsValidator) validateNot(data interface{}, mainResult *Result) { +func (s *schemaPropsValidator) validateNot(data any, mainResult *Result) { result := s.notValidator.Validate(data) if s.Options.recycleValidators { s.notValidator = nil @@ -291,8 +280,8 @@ func (s *schemaPropsValidator) validateNot(data interface{}, mainResult *Result) } } -func (s *schemaPropsValidator) validateDependencies(data interface{}, mainResult *Result) { - val := data.(map[string]interface{}) +func (s *schemaPropsValidator) validateDependencies(data any, mainResult *Result) { + val := data.(map[string]any) for key := range val { dep, ok := s.Dependencies[key] if !ok { diff --git a/vendor/github.com/go-openapi/validate/slice_validator.go b/vendor/github.com/go-openapi/validate/slice_validator.go index 7b0dede290d..4a5a2089687 100644 --- a/vendor/github.com/go-openapi/validate/slice_validator.go +++ b/vendor/github.com/go-openapi/validate/slice_validator.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package validate @@ -30,7 +19,7 @@ type schemaSliceValidator struct { UniqueItems bool AdditionalItems *spec.SchemaOrBool Items *spec.SchemaOrArray - Root interface{} + Root any KnownFormats strfmt.Registry Options *SchemaValidatorOptions } @@ -38,7 +27,7 @@ type schemaSliceValidator struct { func newSliceValidator(path, in string, maxItems, minItems *int64, uniqueItems bool, additionalItems *spec.SchemaOrBool, items *spec.SchemaOrArray, - root interface{}, formats strfmt.Registry, opts *SchemaValidatorOptions) *schemaSliceValidator { + root any, formats strfmt.Registry, opts *SchemaValidatorOptions) *schemaSliceValidator { if opts == nil { opts = new(SchemaValidatorOptions) } @@ -68,13 +57,13 @@ func (s *schemaSliceValidator) SetPath(path string) { s.Path = path } -func (s *schemaSliceValidator) Applies(source interface{}, kind reflect.Kind) bool { +func (s *schemaSliceValidator) Applies(source any, kind reflect.Kind) bool { _, ok := source.(*spec.Schema) r := ok && kind == reflect.Slice return r } -func (s *schemaSliceValidator) Validate(data interface{}) *Result { +func (s *schemaSliceValidator) Validate(data any) *Result { if s.Options.recycleValidators { defer func() { s.redeem() diff --git a/vendor/github.com/go-openapi/validate/spec.go b/vendor/github.com/go-openapi/validate/spec.go index aef0cc36eca..8616a861f28 100644 --- a/vendor/github.com/go-openapi/validate/spec.go +++ b/vendor/github.com/go-openapi/validate/spec.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package validate @@ -19,6 +8,7 @@ import ( "encoding/gob" "encoding/json" "fmt" + "slices" "sort" "strings" @@ -458,11 +448,8 @@ func (s *SpecValidator) validatePathParamPresence(path string, fromPath, fromOpe for _, p := range fromOperation { var matched bool - for _, r := range fromPath { - if "{"+p+"}" == r { - matched = true - break - } + if slices.Contains(fromPath, "{"+p+"}") { + matched = true } if !matched { res.AddErrors(pathParamNotInPathMsg(path, p)) diff --git a/vendor/github.com/go-openapi/validate/spec_messages.go b/vendor/github.com/go-openapi/validate/spec_messages.go index 8da22cfb853..9b079af647a 100644 --- a/vendor/github.com/go-openapi/validate/spec_messages.go +++ b/vendor/github.com/go-openapi/validate/spec_messages.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package validate @@ -217,10 +206,10 @@ func emptyPathParameterMsg(path string) errors.Error { func nonUniqueOperationIDMsg(path string, i int) errors.Error { return errors.New(errors.CompositeErrorCode, NonUniqueOperationIDError, path, i) } -func circularAncestryDefinitionMsg(path string, args interface{}) errors.Error { +func circularAncestryDefinitionMsg(path string, args any) errors.Error { return errors.New(errors.CompositeErrorCode, CircularAncestryDefinitionError, path, args) } -func duplicatePropertiesMsg(path string, args interface{}) errors.Error { +func duplicatePropertiesMsg(path string, args any) errors.Error { return errors.New(errors.CompositeErrorCode, DuplicatePropertiesError, path, args) } func pathParamNotInPathMsg(path, param string) errors.Error { @@ -262,7 +251,7 @@ func pathParamRequiredMsg(operation, param string) errors.Error { func bothFormDataAndBodyMsg(operation string) errors.Error { return errors.New(errors.CompositeErrorCode, BothFormDataAndBodyError, operation) } -func multipleBodyParamMsg(operation string, args interface{}) errors.Error { +func multipleBodyParamMsg(operation string, args any) errors.Error { return errors.New(errors.CompositeErrorCode, MultipleBodyParamError, operation, args) } func pathParamNotUniqueMsg(path, param, arg string) errors.Error { @@ -304,7 +293,7 @@ func defaultValueHeaderDoesNotValidateMsg(operation, header, path string) errors func defaultValueHeaderItemsDoesNotValidateMsg(operation, header, path string) errors.Error { return errors.New(errors.CompositeErrorCode, DefaultValueHeaderItemsDoesNotValidateError, operation, header, path) } -func invalidPatternInHeaderMsg(operation, header, path, pattern string, args interface{}) errors.Error { +func invalidPatternInHeaderMsg(operation, header, path, pattern string, args any) errors.Error { return errors.New(errors.CompositeErrorCode, InvalidPatternInHeaderError, operation, header, path, pattern, args) } func invalidPatternInMsg(path, in, pattern string) errors.Error { diff --git a/vendor/github.com/go-openapi/validate/type.go b/vendor/github.com/go-openapi/validate/type.go index 91ae3413cd0..9b9ab8d917d 100644 --- a/vendor/github.com/go-openapi/validate/type.go +++ b/vendor/github.com/go-openapi/validate/type.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package validate @@ -60,7 +49,7 @@ func (t *typeValidator) SetPath(path string) { t.Path = path } -func (t *typeValidator) Applies(source interface{}, _ reflect.Kind) bool { +func (t *typeValidator) Applies(source any, _ reflect.Kind) bool { // typeValidator applies to Schema, Parameter and Header objects switch source.(type) { case *spec.Schema: @@ -73,7 +62,7 @@ func (t *typeValidator) Applies(source interface{}, _ reflect.Kind) bool { return (len(t.Type) > 0 || t.Format != "") } -func (t *typeValidator) Validate(data interface{}) *Result { +func (t *typeValidator) Validate(data any) *Result { if t.Options.recycleValidators { defer func() { t.redeem() @@ -120,7 +109,7 @@ func (t *typeValidator) Validate(data interface{}) *Result { return emptyResult } -func (t *typeValidator) schemaInfoForType(data interface{}) (string, string) { +func (t *typeValidator) schemaInfoForType(data any) (string, string) { // internal type to JSON type with swagger 2.0 format (with go-openapi/strfmt extensions), // see https://github.com/go-openapi/strfmt/blob/master/README.md // TODO: this switch really is some sort of reverse lookup for formats. It should be provided by strfmt. diff --git a/vendor/github.com/go-openapi/validate/validator.go b/vendor/github.com/go-openapi/validate/validator.go index b76b8636141..289a847fc7b 100644 --- a/vendor/github.com/go-openapi/validate/validator.go +++ b/vendor/github.com/go-openapi/validate/validator.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package validate @@ -25,18 +14,18 @@ import ( // An EntityValidator is an interface for things that can validate entities type EntityValidator interface { - Validate(interface{}) *Result + Validate(any) *Result } type valueValidator interface { SetPath(path string) - Applies(interface{}, reflect.Kind) bool - Validate(interface{}) *Result + Applies(any, reflect.Kind) bool + Validate(any) *Result } type itemsValidator struct { items *spec.Items - root interface{} + root any path string in string validators [6]valueValidator @@ -44,7 +33,7 @@ type itemsValidator struct { Options *SchemaValidatorOptions } -func newItemsValidator(path, in string, items *spec.Items, root interface{}, formats strfmt.Registry, opts *SchemaValidatorOptions) *itemsValidator { +func newItemsValidator(path, in string, items *spec.Items, root any, formats strfmt.Registry, opts *SchemaValidatorOptions) *itemsValidator { if opts == nil { opts = new(SchemaValidatorOptions) } @@ -73,7 +62,7 @@ func newItemsValidator(path, in string, items *spec.Items, root interface{}, for return iv } -func (i *itemsValidator) Validate(index int, data interface{}) *Result { +func (i *itemsValidator) Validate(index int, data any) *Result { if i.Options.recycleValidators { defer func() { i.redeemChildren() @@ -226,12 +215,12 @@ func (i *itemsValidator) redeemChildren() { type basicCommonValidator struct { Path string In string - Default interface{} - Enum []interface{} + Default any + Enum []any Options *SchemaValidatorOptions } -func newBasicCommonValidator(path, in string, def interface{}, enum []interface{}, opts *SchemaValidatorOptions) *basicCommonValidator { +func newBasicCommonValidator(path, in string, def any, enum []any, opts *SchemaValidatorOptions) *basicCommonValidator { if opts == nil { opts = new(SchemaValidatorOptions) } @@ -256,7 +245,7 @@ func (b *basicCommonValidator) SetPath(path string) { b.Path = path } -func (b *basicCommonValidator) Applies(source interface{}, _ reflect.Kind) bool { +func (b *basicCommonValidator) Applies(source any, _ reflect.Kind) bool { switch source.(type) { case *spec.Parameter, *spec.Schema, *spec.Header: return true @@ -265,7 +254,7 @@ func (b *basicCommonValidator) Applies(source interface{}, _ reflect.Kind) bool } } -func (b *basicCommonValidator) Validate(data interface{}) (res *Result) { +func (b *basicCommonValidator) Validate(data any) (res *Result) { if b.Options.recycleValidators { defer func() { b.redeem() @@ -352,7 +341,7 @@ func newHeaderValidator(name string, header *spec.Header, formats strfmt.Registr } // Validate the value of the header against its schema -func (p *HeaderValidator) Validate(data interface{}) *Result { +func (p *HeaderValidator) Validate(data any) *Result { if p.Options.recycleValidators { defer func() { p.redeemChildren() @@ -543,7 +532,7 @@ func newParamValidator(param *spec.Parameter, formats strfmt.Registry, opts *Sch } // Validate the data against the description of the parameter -func (p *ParamValidator) Validate(data interface{}) *Result { +func (p *ParamValidator) Validate(data any) *Result { if data == nil { return nil } @@ -685,20 +674,20 @@ func (p *ParamValidator) redeemChildren() { type basicSliceValidator struct { Path string In string - Default interface{} + Default any MaxItems *int64 MinItems *int64 UniqueItems bool Items *spec.Items - Source interface{} + Source any KnownFormats strfmt.Registry Options *SchemaValidatorOptions } func newBasicSliceValidator( path, in string, - def interface{}, maxItems, minItems *int64, uniqueItems bool, items *spec.Items, - source interface{}, formats strfmt.Registry, + def any, maxItems, minItems *int64, uniqueItems bool, items *spec.Items, + source any, formats strfmt.Registry, opts *SchemaValidatorOptions) *basicSliceValidator { if opts == nil { opts = new(SchemaValidatorOptions) @@ -729,7 +718,7 @@ func (s *basicSliceValidator) SetPath(path string) { s.Path = path } -func (s *basicSliceValidator) Applies(source interface{}, kind reflect.Kind) bool { +func (s *basicSliceValidator) Applies(source any, kind reflect.Kind) bool { switch source.(type) { case *spec.Parameter, *spec.Items, *spec.Header: return kind == reflect.Slice @@ -738,7 +727,7 @@ func (s *basicSliceValidator) Applies(source interface{}, kind reflect.Kind) boo } } -func (s *basicSliceValidator) Validate(data interface{}) *Result { +func (s *basicSliceValidator) Validate(data any) *Result { if s.Options.recycleValidators { defer func() { s.redeem() @@ -792,7 +781,7 @@ func (s *basicSliceValidator) redeem() { type numberValidator struct { Path string In string - Default interface{} + Default any MultipleOf *float64 Maximum *float64 ExclusiveMaximum bool @@ -805,7 +794,7 @@ type numberValidator struct { } func newNumberValidator( - path, in string, def interface{}, + path, in string, def any, multipleOf, maximum *float64, exclusiveMaximum bool, minimum *float64, exclusiveMinimum bool, typ, format string, opts *SchemaValidatorOptions) *numberValidator { @@ -839,7 +828,7 @@ func (n *numberValidator) SetPath(path string) { n.Path = path } -func (n *numberValidator) Applies(source interface{}, kind reflect.Kind) bool { +func (n *numberValidator) Applies(source any, kind reflect.Kind) bool { switch source.(type) { case *spec.Parameter, *spec.Schema, *spec.Items, *spec.Header: isInt := kind >= reflect.Int && kind <= reflect.Uint64 @@ -871,7 +860,7 @@ func (n *numberValidator) Applies(source interface{}, kind reflect.Kind) bool { // TODO: consider replacing boundary check errors by simple warnings. // // TODO: default boundaries with MAX_SAFE_INTEGER are not checked (specific to json.Number?) -func (n *numberValidator) Validate(val interface{}) *Result { +func (n *numberValidator) Validate(val any) *Result { if n.Options.recycleValidators { defer func() { n.redeem() @@ -958,7 +947,7 @@ func (n *numberValidator) redeem() { type stringValidator struct { Path string In string - Default interface{} + Default any Required bool AllowEmptyValue bool MaxLength *int64 @@ -969,7 +958,7 @@ type stringValidator struct { func newStringValidator( path, in string, - def interface{}, required, allowEmpty bool, maxLength, minLength *int64, pattern string, + def any, required, allowEmpty bool, maxLength, minLength *int64, pattern string, opts *SchemaValidatorOptions) *stringValidator { if opts == nil { opts = new(SchemaValidatorOptions) @@ -999,7 +988,7 @@ func (s *stringValidator) SetPath(path string) { s.Path = path } -func (s *stringValidator) Applies(source interface{}, kind reflect.Kind) bool { +func (s *stringValidator) Applies(source any, kind reflect.Kind) bool { switch source.(type) { case *spec.Parameter, *spec.Schema, *spec.Items, *spec.Header: return kind == reflect.String @@ -1008,7 +997,7 @@ func (s *stringValidator) Applies(source interface{}, kind reflect.Kind) bool { } } -func (s *stringValidator) Validate(val interface{}) *Result { +func (s *stringValidator) Validate(val any) *Result { if s.Options.recycleValidators { defer func() { s.redeem() diff --git a/vendor/github.com/go-openapi/validate/values.go b/vendor/github.com/go-openapi/validate/values.go index 1bfa6f3c8cf..e7dd5c8d3ab 100644 --- a/vendor/github.com/go-openapi/validate/values.go +++ b/vendor/github.com/go-openapi/validate/values.go @@ -1,16 +1,5 @@ -// Copyright 2015 go-swagger maintainers -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 package validate diff --git a/vendor/github.com/gofrs/uuid/.gitignore b/vendor/github.com/gofrs/uuid/.gitignore deleted file mode 100644 index 666dbbb5bcd..00000000000 --- a/vendor/github.com/gofrs/uuid/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -# Binaries for programs and plugins -*.exe -*.exe~ -*.dll -*.so -*.dylib - -# Test binary, build with `go test -c` -*.test - -# Output of the go coverage tool, specifically when used with LiteIDE -*.out - -# binary bundle generated by go-fuzz -uuid-fuzz.zip diff --git a/vendor/github.com/gofrs/uuid/LICENSE b/vendor/github.com/gofrs/uuid/LICENSE deleted file mode 100644 index 926d5498702..00000000000 --- a/vendor/github.com/gofrs/uuid/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -Copyright (C) 2013-2018 by Maxim Bublis - -Permission is hereby granted, free of charge, to any person obtaining -a copy of this software and associated documentation files (the -"Software"), to deal in the Software without restriction, including -without limitation the rights to use, copy, modify, merge, publish, -distribute, sublicense, and/or sell copies of the Software, and to -permit persons to whom the Software is furnished to do so, subject to -the following conditions: - -The above copyright notice and this permission notice shall be -included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/vendor/github.com/gofrs/uuid/README.md b/vendor/github.com/gofrs/uuid/README.md deleted file mode 100644 index 4f73bec82c0..00000000000 --- a/vendor/github.com/gofrs/uuid/README.md +++ /dev/null @@ -1,117 +0,0 @@ -# UUID - -[![License](https://img.shields.io/github/license/gofrs/uuid.svg)](https://github.com/gofrs/uuid/blob/master/LICENSE) -[![Build Status](https://travis-ci.org/gofrs/uuid.svg?branch=master)](https://travis-ci.org/gofrs/uuid) -[![GoDoc](http://godoc.org/github.com/gofrs/uuid?status.svg)](http://godoc.org/github.com/gofrs/uuid) -[![Coverage Status](https://codecov.io/gh/gofrs/uuid/branch/master/graphs/badge.svg?branch=master)](https://codecov.io/gh/gofrs/uuid/) -[![Go Report Card](https://goreportcard.com/badge/github.com/gofrs/uuid)](https://goreportcard.com/report/github.com/gofrs/uuid) - -Package uuid provides a pure Go implementation of Universally Unique Identifiers -(UUID) variant as defined in RFC-4122. This package supports both the creation -and parsing of UUIDs in different formats. - -This package supports the following UUID versions: -* Version 1, based on timestamp and MAC address (RFC-4122) -* Version 3, based on MD5 hashing of a named value (RFC-4122) -* Version 4, based on random numbers (RFC-4122) -* Version 5, based on SHA-1 hashing of a named value (RFC-4122) - -This package also supports experimental Universally Unique Identifier implementations based on a -[draft RFC](https://www.ietf.org/archive/id/draft-peabody-dispatch-new-uuid-format-04.html) that updates RFC-4122 -* Version 6, a k-sortable id based on timestamp, and field-compatible with v1 (draft-peabody-dispatch-new-uuid-format, RFC-4122) -* Version 7, a k-sortable id based on timestamp (draft-peabody-dispatch-new-uuid-format, RFC-4122) - -The v6 and v7 IDs are **not** considered a part of the stable API, and may be subject to behavior or API changes as part of minor releases -to this package. They will be updated as the draft RFC changes, and will become stable if and when the draft RFC is accepted. - -## Project History - -This project was originally forked from the -[github.com/satori/go.uuid](https://github.com/satori/go.uuid) repository after -it appeared to be no longer maintained, while exhibiting [critical -flaws](https://github.com/satori/go.uuid/issues/73). We have decided to take -over this project to ensure it receives regular maintenance for the benefit of -the larger Go community. - -We'd like to thank Maxim Bublis for his hard work on the original iteration of -the package. - -## License - -This source code of this package is released under the MIT License. Please see -the [LICENSE](https://github.com/gofrs/uuid/blob/master/LICENSE) for the full -content of the license. - -## Recommended Package Version - -We recommend using v2.0.0+ of this package, as versions prior to 2.0.0 were -created before our fork of the original package and have some known -deficiencies. - -## Installation - -It is recommended to use a package manager like `dep` that understands tagged -releases of a package, as well as semantic versioning. - -If you are unable to make use of a dependency manager with your project, you can -use the `go get` command to download it directly: - -```Shell -$ go get github.com/gofrs/uuid -``` - -## Requirements - -Due to subtests not being supported in older versions of Go, this package is -only regularly tested against Go 1.7+. This package may work perfectly fine with -Go 1.2+, but support for these older versions is not actively maintained. - -## Go 1.11 Modules - -As of v3.2.0, this repository no longer adopts Go modules, and v3.2.0 no longer has a `go.mod` file. As a result, v3.2.0 also drops support for the `github.com/gofrs/uuid/v3` import path. Only module-based consumers are impacted. With the v3.2.0 release, _all_ gofrs/uuid consumers should use the `github.com/gofrs/uuid` import path. - -An existing module-based consumer will continue to be able to build using the `github.com/gofrs/uuid/v3` import path using any valid consumer `go.mod` that worked prior to the publishing of v3.2.0, but any module-based consumer should start using the `github.com/gofrs/uuid` import path when possible and _must_ use the `github.com/gofrs/uuid` import path prior to upgrading to v3.2.0. - -Please refer to [Issue #61](https://github.com/gofrs/uuid/issues/61) and [Issue #66](https://github.com/gofrs/uuid/issues/66) for more details. - -## Usage - -Here is a quick overview of how to use this package. For more detailed -documentation, please see the [GoDoc Page](http://godoc.org/github.com/gofrs/uuid). - -```go -package main - -import ( - "log" - - "github.com/gofrs/uuid" -) - -// Create a Version 4 UUID, panicking on error. -// Use this form to initialize package-level variables. -var u1 = uuid.Must(uuid.NewV4()) - -func main() { - // Create a Version 4 UUID. - u2, err := uuid.NewV4() - if err != nil { - log.Fatalf("failed to generate UUID: %v", err) - } - log.Printf("generated Version 4 UUID %v", u2) - - // Parse a UUID from a string. - s := "6ba7b810-9dad-11d1-80b4-00c04fd430c8" - u3, err := uuid.FromString(s) - if err != nil { - log.Fatalf("failed to parse UUID %q: %v", s, err) - } - log.Printf("successfully parsed UUID %v", u3) -} -``` - -## References - -* [RFC-4122](https://tools.ietf.org/html/rfc4122) -* [DCE 1.1: Authentication and Security Services](http://pubs.opengroup.org/onlinepubs/9696989899/chap5.htm#tagcjh_08_02_01_01) -* [New UUID Formats RFC Draft (Peabody) Rev 04](https://www.ietf.org/archive/id/draft-peabody-dispatch-new-uuid-format-04.html#) diff --git a/vendor/github.com/gofrs/uuid/codec.go b/vendor/github.com/gofrs/uuid/codec.go deleted file mode 100644 index 665026414c3..00000000000 --- a/vendor/github.com/gofrs/uuid/codec.go +++ /dev/null @@ -1,234 +0,0 @@ -// Copyright (C) 2013-2018 by Maxim Bublis -// -// 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 uuid - -import ( - "errors" - "fmt" -) - -// FromBytes returns a UUID generated from the raw byte slice input. -// It will return an error if the slice isn't 16 bytes long. -func FromBytes(input []byte) (UUID, error) { - u := UUID{} - err := u.UnmarshalBinary(input) - return u, err -} - -// FromBytesOrNil returns a UUID generated from the raw byte slice input. -// Same behavior as FromBytes(), but returns uuid.Nil instead of an error. -func FromBytesOrNil(input []byte) UUID { - uuid, err := FromBytes(input) - if err != nil { - return Nil - } - return uuid -} - -var errInvalidFormat = errors.New("uuid: invalid UUID format") - -func fromHexChar(c byte) byte { - switch { - case '0' <= c && c <= '9': - return c - '0' - case 'a' <= c && c <= 'f': - return c - 'a' + 10 - case 'A' <= c && c <= 'F': - return c - 'A' + 10 - } - return 255 -} - -// Parse parses the UUID stored in the string text. Parsing and supported -// formats are the same as UnmarshalText. -func (u *UUID) Parse(s string) error { - switch len(s) { - case 32: // hash - case 36: // canonical - case 34, 38: - if s[0] != '{' || s[len(s)-1] != '}' { - return fmt.Errorf("uuid: incorrect UUID format in string %q", s) - } - s = s[1 : len(s)-1] - case 41, 45: - if s[:9] != "urn:uuid:" { - return fmt.Errorf("uuid: incorrect UUID format in string %q", s[:9]) - } - s = s[9:] - default: - return fmt.Errorf("uuid: incorrect UUID length %d in string %q", len(s), s) - } - // canonical - if len(s) == 36 { - if s[8] != '-' || s[13] != '-' || s[18] != '-' || s[23] != '-' { - return fmt.Errorf("uuid: incorrect UUID format in string %q", s) - } - for i, x := range [16]byte{ - 0, 2, 4, 6, - 9, 11, - 14, 16, - 19, 21, - 24, 26, 28, 30, 32, 34, - } { - v1 := fromHexChar(s[x]) - v2 := fromHexChar(s[x+1]) - if v1|v2 == 255 { - return errInvalidFormat - } - u[i] = (v1 << 4) | v2 - } - return nil - } - // hash like - for i := 0; i < 32; i += 2 { - v1 := fromHexChar(s[i]) - v2 := fromHexChar(s[i+1]) - if v1|v2 == 255 { - return errInvalidFormat - } - u[i/2] = (v1 << 4) | v2 - } - return nil -} - -// FromString returns a UUID parsed from the input string. -// Input is expected in a form accepted by UnmarshalText. -func FromString(text string) (UUID, error) { - var u UUID - err := u.Parse(text) - return u, err -} - -// FromStringOrNil returns a UUID parsed from the input string. -// Same behavior as FromString(), but returns uuid.Nil instead of an error. -func FromStringOrNil(input string) UUID { - uuid, err := FromString(input) - if err != nil { - return Nil - } - return uuid -} - -// MarshalText implements the encoding.TextMarshaler interface. -// The encoding is the same as returned by the String() method. -func (u UUID) MarshalText() ([]byte, error) { - var buf [36]byte - encodeCanonical(buf[:], u) - return buf[:], nil -} - -// UnmarshalText implements the encoding.TextUnmarshaler interface. -// Following formats are supported: -// -// "6ba7b810-9dad-11d1-80b4-00c04fd430c8", -// "{6ba7b810-9dad-11d1-80b4-00c04fd430c8}", -// "urn:uuid:6ba7b810-9dad-11d1-80b4-00c04fd430c8" -// "6ba7b8109dad11d180b400c04fd430c8" -// "{6ba7b8109dad11d180b400c04fd430c8}", -// "urn:uuid:6ba7b8109dad11d180b400c04fd430c8" -// -// ABNF for supported UUID text representation follows: -// -// URN := 'urn' -// UUID-NID := 'uuid' -// -// hexdig := '0' | '1' | '2' | '3' | '4' | '5' | '6' | '7' | '8' | '9' | -// 'a' | 'b' | 'c' | 'd' | 'e' | 'f' | -// 'A' | 'B' | 'C' | 'D' | 'E' | 'F' -// -// hexoct := hexdig hexdig -// 2hexoct := hexoct hexoct -// 4hexoct := 2hexoct 2hexoct -// 6hexoct := 4hexoct 2hexoct -// 12hexoct := 6hexoct 6hexoct -// -// hashlike := 12hexoct -// canonical := 4hexoct '-' 2hexoct '-' 2hexoct '-' 6hexoct -// -// plain := canonical | hashlike -// uuid := canonical | hashlike | braced | urn -// -// braced := '{' plain '}' | '{' hashlike '}' -// urn := URN ':' UUID-NID ':' plain -func (u *UUID) UnmarshalText(b []byte) error { - switch len(b) { - case 32: // hash - case 36: // canonical - case 34, 38: - if b[0] != '{' || b[len(b)-1] != '}' { - return fmt.Errorf("uuid: incorrect UUID format in string %q", b) - } - b = b[1 : len(b)-1] - case 41, 45: - if string(b[:9]) != "urn:uuid:" { - return fmt.Errorf("uuid: incorrect UUID format in string %q", b[:9]) - } - b = b[9:] - default: - return fmt.Errorf("uuid: incorrect UUID length %d in string %q", len(b), b) - } - if len(b) == 36 { - if b[8] != '-' || b[13] != '-' || b[18] != '-' || b[23] != '-' { - return fmt.Errorf("uuid: incorrect UUID format in string %q", b) - } - for i, x := range [16]byte{ - 0, 2, 4, 6, - 9, 11, - 14, 16, - 19, 21, - 24, 26, 28, 30, 32, 34, - } { - v1 := fromHexChar(b[x]) - v2 := fromHexChar(b[x+1]) - if v1|v2 == 255 { - return errInvalidFormat - } - u[i] = (v1 << 4) | v2 - } - return nil - } - for i := 0; i < 32; i += 2 { - v1 := fromHexChar(b[i]) - v2 := fromHexChar(b[i+1]) - if v1|v2 == 255 { - return errInvalidFormat - } - u[i/2] = (v1 << 4) | v2 - } - return nil -} - -// MarshalBinary implements the encoding.BinaryMarshaler interface. -func (u UUID) MarshalBinary() ([]byte, error) { - return u.Bytes(), nil -} - -// UnmarshalBinary implements the encoding.BinaryUnmarshaler interface. -// It will return an error if the slice isn't 16 bytes long. -func (u *UUID) UnmarshalBinary(data []byte) error { - if len(data) != Size { - return fmt.Errorf("uuid: UUID must be exactly 16 bytes long, got %d bytes", len(data)) - } - copy(u[:], data) - - return nil -} diff --git a/vendor/github.com/gofrs/uuid/fuzz.go b/vendor/github.com/gofrs/uuid/fuzz.go deleted file mode 100644 index ccf8d4ca296..00000000000 --- a/vendor/github.com/gofrs/uuid/fuzz.go +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) 2018 Andrei Tudor Călin -// -// Permission is hereby granted, free of charge, to any person obtaining -// a copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to -// permit persons to whom the Software is furnished to do so, subject to -// the following conditions: -// -// The above copyright notice and this permission notice shall be -// included in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, -// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND -// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE -// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION -// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION -// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -//go:build gofuzz -// +build gofuzz - -package uuid - -// Fuzz implements a simple fuzz test for FromString / UnmarshalText. -// -// To run: -// -// $ go get github.com/dvyukov/go-fuzz/... -// $ cd $GOPATH/src/github.com/gofrs/uuid -// $ go-fuzz-build github.com/gofrs/uuid -// $ go-fuzz -bin=uuid-fuzz.zip -workdir=./testdata -// -// If you make significant changes to FromString / UnmarshalText and add -// new cases to fromStringTests (in codec_test.go), please run -// -// $ go test -seed_fuzz_corpus -// -// to seed the corpus with the new interesting inputs, then run the fuzzer. -func Fuzz(data []byte) int { - _, err := FromString(string(data)) - if err != nil { - return 0 - } - return 1 -} diff --git a/vendor/github.com/gofrs/uuid/generator.go b/vendor/github.com/gofrs/uuid/generator.go deleted file mode 100644 index 44be9e15854..00000000000 --- a/vendor/github.com/gofrs/uuid/generator.go +++ /dev/null @@ -1,456 +0,0 @@ -// Copyright (C) 2013-2018 by Maxim Bublis -// -// 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 uuid - -import ( - "crypto/md5" - "crypto/rand" - "crypto/sha1" - "encoding/binary" - "fmt" - "hash" - "io" - "net" - "sync" - "time" -) - -// Difference in 100-nanosecond intervals between -// UUID epoch (October 15, 1582) and Unix epoch (January 1, 1970). -const epochStart = 122192928000000000 - -// EpochFunc is the function type used to provide the current time. -type EpochFunc func() time.Time - -// HWAddrFunc is the function type used to provide hardware (MAC) addresses. -type HWAddrFunc func() (net.HardwareAddr, error) - -// DefaultGenerator is the default UUID Generator used by this package. -var DefaultGenerator Generator = NewGen() - -// NewV1 returns a UUID based on the current timestamp and MAC address. -func NewV1() (UUID, error) { - return DefaultGenerator.NewV1() -} - -// NewV3 returns a UUID based on the MD5 hash of the namespace UUID and name. -func NewV3(ns UUID, name string) UUID { - return DefaultGenerator.NewV3(ns, name) -} - -// NewV4 returns a randomly generated UUID. -func NewV4() (UUID, error) { - return DefaultGenerator.NewV4() -} - -// NewV5 returns a UUID based on SHA-1 hash of the namespace UUID and name. -func NewV5(ns UUID, name string) UUID { - return DefaultGenerator.NewV5(ns, name) -} - -// NewV6 returns a k-sortable UUID based on a timestamp and 48 bits of -// pseudorandom data. The timestamp in a V6 UUID is the same as V1, with the bit -// order being adjusted to allow the UUID to be k-sortable. -// -// This is implemented based on revision 03 of the Peabody UUID draft, and may -// be subject to change pending further revisions. Until the final specification -// revision is finished, changes required to implement updates to the spec will -// not be considered a breaking change. They will happen as a minor version -// releases until the spec is final. -func NewV6() (UUID, error) { - return DefaultGenerator.NewV6() -} - -// NewV7 returns a k-sortable UUID based on the current millisecond precision -// UNIX epoch and 74 bits of pseudorandom data. It supports single-node batch generation (multiple UUIDs in the same timestamp) with a Monotonic Random counter. -// -// This is implemented based on revision 04 of the Peabody UUID draft, and may -// be subject to change pending further revisions. Until the final specification -// revision is finished, changes required to implement updates to the spec will -// not be considered a breaking change. They will happen as a minor version -// releases until the spec is final. -func NewV7() (UUID, error) { - return DefaultGenerator.NewV7() -} - -// Generator provides an interface for generating UUIDs. -type Generator interface { - NewV1() (UUID, error) - NewV3(ns UUID, name string) UUID - NewV4() (UUID, error) - NewV5(ns UUID, name string) UUID - NewV6() (UUID, error) - NewV7() (UUID, error) -} - -// Gen is a reference UUID generator based on the specifications laid out in -// RFC-4122 and DCE 1.1: Authentication and Security Services. This type -// satisfies the Generator interface as defined in this package. -// -// For consumers who are generating V1 UUIDs, but don't want to expose the MAC -// address of the node generating the UUIDs, the NewGenWithHWAF() function has been -// provided as a convenience. See the function's documentation for more info. -// -// The authors of this package do not feel that the majority of users will need -// to obfuscate their MAC address, and so we recommend using NewGen() to create -// a new generator. -type Gen struct { - clockSequenceOnce sync.Once - hardwareAddrOnce sync.Once - storageMutex sync.Mutex - - rand io.Reader - - epochFunc EpochFunc - hwAddrFunc HWAddrFunc - lastTime uint64 - clockSequence uint16 - hardwareAddr [6]byte -} - -// GenOption is a function type that can be used to configure a Gen generator. -type GenOption func(*Gen) - -// interface check -- build will fail if *Gen doesn't satisfy Generator -var _ Generator = (*Gen)(nil) - -// NewGen returns a new instance of Gen with some default values set. Most -// people should use this. -func NewGen() *Gen { - return NewGenWithHWAF(defaultHWAddrFunc) -} - -// NewGenWithHWAF builds a new UUID generator with the HWAddrFunc provided. Most -// consumers should use NewGen() instead. -// -// This is used so that consumers can generate their own MAC addresses, for use -// in the generated UUIDs, if there is some concern about exposing the physical -// address of the machine generating the UUID. -// -// The Gen generator will only invoke the HWAddrFunc once, and cache that MAC -// address for all the future UUIDs generated by it. If you'd like to switch the -// MAC address being used, you'll need to create a new generator using this -// function. -func NewGenWithHWAF(hwaf HWAddrFunc) *Gen { - return NewGenWithOptions(WithHWAddrFunc(hwaf)) -} - -// NewGenWithOptions returns a new instance of Gen with the options provided. -// Most people should use NewGen() or NewGenWithHWAF() instead. -// -// To customize the generator, you can pass in one or more GenOption functions. -// For example: -// -// gen := NewGenWithOptions( -// WithHWAddrFunc(myHWAddrFunc), -// WithEpochFunc(myEpochFunc), -// WithRandomReader(myRandomReader), -// ) -// -// NewGenWithOptions(WithHWAddrFunc(myHWAddrFunc)) is equivalent to calling -// NewGenWithHWAF(myHWAddrFunc) -// NewGenWithOptions() is equivalent to calling NewGen() -func NewGenWithOptions(opts ...GenOption) *Gen { - gen := &Gen{ - epochFunc: time.Now, - hwAddrFunc: defaultHWAddrFunc, - rand: rand.Reader, - } - - for _, opt := range opts { - opt(gen) - } - - return gen -} - -// WithHWAddrFunc is a GenOption that allows you to provide your own HWAddrFunc -// function. -// When this option is nil, the defaultHWAddrFunc is used. -func WithHWAddrFunc(hwaf HWAddrFunc) GenOption { - return func(gen *Gen) { - if hwaf == nil { - hwaf = defaultHWAddrFunc - } - - gen.hwAddrFunc = hwaf - } -} - -// WithEpochFunc is a GenOption that allows you to provide your own EpochFunc -// function. -// When this option is nil, time.Now is used. -func WithEpochFunc(epochf EpochFunc) GenOption { - return func(gen *Gen) { - if epochf == nil { - epochf = time.Now - } - - gen.epochFunc = epochf - } -} - -// WithRandomReader is a GenOption that allows you to provide your own random -// reader. -// When this option is nil, the default rand.Reader is used. -func WithRandomReader(reader io.Reader) GenOption { - return func(gen *Gen) { - if reader == nil { - reader = rand.Reader - } - - gen.rand = reader - } -} - -// NewV1 returns a UUID based on the current timestamp and MAC address. -func (g *Gen) NewV1() (UUID, error) { - u := UUID{} - - timeNow, clockSeq, err := g.getClockSequence(false) - if err != nil { - return Nil, err - } - binary.BigEndian.PutUint32(u[0:], uint32(timeNow)) - binary.BigEndian.PutUint16(u[4:], uint16(timeNow>>32)) - binary.BigEndian.PutUint16(u[6:], uint16(timeNow>>48)) - binary.BigEndian.PutUint16(u[8:], clockSeq) - - hardwareAddr, err := g.getHardwareAddr() - if err != nil { - return Nil, err - } - copy(u[10:], hardwareAddr) - - u.SetVersion(V1) - u.SetVariant(VariantRFC4122) - - return u, nil -} - -// NewV3 returns a UUID based on the MD5 hash of the namespace UUID and name. -func (g *Gen) NewV3(ns UUID, name string) UUID { - u := newFromHash(md5.New(), ns, name) - u.SetVersion(V3) - u.SetVariant(VariantRFC4122) - - return u -} - -// NewV4 returns a randomly generated UUID. -func (g *Gen) NewV4() (UUID, error) { - u := UUID{} - if _, err := io.ReadFull(g.rand, u[:]); err != nil { - return Nil, err - } - u.SetVersion(V4) - u.SetVariant(VariantRFC4122) - - return u, nil -} - -// NewV5 returns a UUID based on SHA-1 hash of the namespace UUID and name. -func (g *Gen) NewV5(ns UUID, name string) UUID { - u := newFromHash(sha1.New(), ns, name) - u.SetVersion(V5) - u.SetVariant(VariantRFC4122) - - return u -} - -// NewV6 returns a k-sortable UUID based on a timestamp and 48 bits of -// pseudorandom data. The timestamp in a V6 UUID is the same as V1, with the bit -// order being adjusted to allow the UUID to be k-sortable. -// -// This is implemented based on revision 03 of the Peabody UUID draft, and may -// be subject to change pending further revisions. Until the final specification -// revision is finished, changes required to implement updates to the spec will -// not be considered a breaking change. They will happen as a minor version -// releases until the spec is final. -func (g *Gen) NewV6() (UUID, error) { - var u UUID - - if _, err := io.ReadFull(g.rand, u[10:]); err != nil { - return Nil, err - } - - timeNow, clockSeq, err := g.getClockSequence(false) - if err != nil { - return Nil, err - } - - binary.BigEndian.PutUint32(u[0:], uint32(timeNow>>28)) // set time_high - binary.BigEndian.PutUint16(u[4:], uint16(timeNow>>12)) // set time_mid - binary.BigEndian.PutUint16(u[6:], uint16(timeNow&0xfff)) // set time_low (minus four version bits) - binary.BigEndian.PutUint16(u[8:], clockSeq&0x3fff) // set clk_seq_hi_res (minus two variant bits) - - u.SetVersion(V6) - u.SetVariant(VariantRFC4122) - - return u, nil -} - -// getClockSequence returns the epoch and clock sequence for V1,V6 and V7 UUIDs. -// -// When useUnixTSMs is false, it uses the Coordinated Universal Time (UTC) as a count of 100- -// -// nanosecond intervals since 00:00:00.00, 15 October 1582 (the date of Gregorian reform to the Christian calendar). -func (g *Gen) getClockSequence(useUnixTSMs bool) (uint64, uint16, error) { - var err error - g.clockSequenceOnce.Do(func() { - buf := make([]byte, 2) - if _, err = io.ReadFull(g.rand, buf); err != nil { - return - } - g.clockSequence = binary.BigEndian.Uint16(buf) - }) - if err != nil { - return 0, 0, err - } - - g.storageMutex.Lock() - defer g.storageMutex.Unlock() - - var timeNow uint64 - if useUnixTSMs { - timeNow = uint64(g.epochFunc().UnixMilli()) - } else { - timeNow = g.getEpoch() - } - // Clock didn't change since last UUID generation. - // Should increase clock sequence. - if timeNow <= g.lastTime { - g.clockSequence++ - } - g.lastTime = timeNow - - return timeNow, g.clockSequence, nil -} - -// NewV7 returns a k-sortable UUID based on the current millisecond precision -// UNIX epoch and 74 bits of pseudorandom data. -// -// This is implemented based on revision 04 of the Peabody UUID draft, and may -// be subject to change pending further revisions. Until the final specification -// revision is finished, changes required to implement updates to the spec will -// not be considered a breaking change. They will happen as a minor version -// releases until the spec is final. -func (g *Gen) NewV7() (UUID, error) { - var u UUID - /* https://www.ietf.org/archive/id/draft-peabody-dispatch-new-uuid-format-04.html#name-uuid-version-7 - 0 1 2 3 - 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | unix_ts_ms | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | unix_ts_ms | ver | rand_a | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - |var| rand_b | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ - | rand_b | - +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ */ - - ms, clockSeq, err := g.getClockSequence(true) - if err != nil { - return Nil, err - } - //UUIDv7 features a 48 bit timestamp. First 32bit (4bytes) represents seconds since 1970, followed by 2 bytes for the ms granularity. - u[0] = byte(ms >> 40) //1-6 bytes: big-endian unsigned number of Unix epoch timestamp - u[1] = byte(ms >> 32) - u[2] = byte(ms >> 24) - u[3] = byte(ms >> 16) - u[4] = byte(ms >> 8) - u[5] = byte(ms) - - //support batching by using a monotonic pseudo-random sequence - //The 6th byte contains the version and partially rand_a data. - //We will lose the most significant bites from the clockSeq (with SetVersion), but it is ok, we need the least significant that contains the counter to ensure the monotonic property - binary.BigEndian.PutUint16(u[6:8], clockSeq) // set rand_a with clock seq which is random and monotonic - - //override first 4bits of u[6]. - u.SetVersion(V7) - - //set rand_b 64bits of pseudo-random bits (first 2 will be overridden) - if _, err = io.ReadFull(g.rand, u[8:16]); err != nil { - return Nil, err - } - //override first 2 bits of byte[8] for the variant - u.SetVariant(VariantRFC4122) - - return u, nil -} - -// Returns the hardware address. -func (g *Gen) getHardwareAddr() ([]byte, error) { - var err error - g.hardwareAddrOnce.Do(func() { - var hwAddr net.HardwareAddr - if hwAddr, err = g.hwAddrFunc(); err == nil { - copy(g.hardwareAddr[:], hwAddr) - return - } - - // Initialize hardwareAddr randomly in case - // of real network interfaces absence. - if _, err = io.ReadFull(g.rand, g.hardwareAddr[:]); err != nil { - return - } - // Set multicast bit as recommended by RFC-4122 - g.hardwareAddr[0] |= 0x01 - }) - if err != nil { - return []byte{}, err - } - return g.hardwareAddr[:], nil -} - -// Returns the difference between UUID epoch (October 15, 1582) -// and current time in 100-nanosecond intervals. -func (g *Gen) getEpoch() uint64 { - return epochStart + uint64(g.epochFunc().UnixNano()/100) -} - -// Returns the UUID based on the hashing of the namespace UUID and name. -func newFromHash(h hash.Hash, ns UUID, name string) UUID { - u := UUID{} - h.Write(ns[:]) - h.Write([]byte(name)) - copy(u[:], h.Sum(nil)) - - return u -} - -var netInterfaces = net.Interfaces - -// Returns the hardware address. -func defaultHWAddrFunc() (net.HardwareAddr, error) { - ifaces, err := netInterfaces() - if err != nil { - return []byte{}, err - } - for _, iface := range ifaces { - if len(iface.HardwareAddr) >= 6 { - return iface.HardwareAddr, nil - } - } - return []byte{}, fmt.Errorf("uuid: no HW address found") -} diff --git a/vendor/github.com/gofrs/uuid/sql.go b/vendor/github.com/gofrs/uuid/sql.go deleted file mode 100644 index 01d5d88496c..00000000000 --- a/vendor/github.com/gofrs/uuid/sql.go +++ /dev/null @@ -1,116 +0,0 @@ -// Copyright (C) 2013-2018 by Maxim Bublis -// -// 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 uuid - -import ( - "database/sql" - "database/sql/driver" - "fmt" -) - -var _ driver.Valuer = UUID{} -var _ sql.Scanner = (*UUID)(nil) - -// Value implements the driver.Valuer interface. -func (u UUID) Value() (driver.Value, error) { - return u.String(), nil -} - -// Scan implements the sql.Scanner interface. -// A 16-byte slice will be handled by UnmarshalBinary, while -// a longer byte slice or a string will be handled by UnmarshalText. -func (u *UUID) Scan(src interface{}) error { - switch src := src.(type) { - case UUID: // support gorm convert from UUID to NullUUID - *u = src - return nil - - case []byte: - if len(src) == Size { - return u.UnmarshalBinary(src) - } - return u.UnmarshalText(src) - - case string: - uu, err := FromString(src) - *u = uu - return err - } - - return fmt.Errorf("uuid: cannot convert %T to UUID", src) -} - -// NullUUID can be used with the standard sql package to represent a -// UUID value that can be NULL in the database. -type NullUUID struct { - UUID UUID - Valid bool -} - -// Value implements the driver.Valuer interface. -func (u NullUUID) Value() (driver.Value, error) { - if !u.Valid { - return nil, nil - } - // Delegate to UUID Value function - return u.UUID.Value() -} - -// Scan implements the sql.Scanner interface. -func (u *NullUUID) Scan(src interface{}) error { - if src == nil { - u.UUID, u.Valid = Nil, false - return nil - } - - // Delegate to UUID Scan function - u.Valid = true - return u.UUID.Scan(src) -} - -var nullJSON = []byte("null") - -// MarshalJSON marshals the NullUUID as null or the nested UUID -func (u NullUUID) MarshalJSON() ([]byte, error) { - if !u.Valid { - return nullJSON, nil - } - var buf [38]byte - buf[0] = '"' - encodeCanonical(buf[1:37], u.UUID) - buf[37] = '"' - return buf[:], nil -} - -// UnmarshalJSON unmarshals a NullUUID -func (u *NullUUID) UnmarshalJSON(b []byte) error { - if string(b) == "null" { - u.UUID, u.Valid = Nil, false - return nil - } - if n := len(b); n >= 2 && b[0] == '"' { - b = b[1 : n-1] - } - err := u.UUID.UnmarshalText(b) - u.Valid = (err == nil) - return err -} diff --git a/vendor/github.com/gofrs/uuid/uuid.go b/vendor/github.com/gofrs/uuid/uuid.go deleted file mode 100644 index 5320fb53894..00000000000 --- a/vendor/github.com/gofrs/uuid/uuid.go +++ /dev/null @@ -1,285 +0,0 @@ -// Copyright (C) 2013-2018 by Maxim Bublis -// -// 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 uuid provides implementations of the Universally Unique Identifier -// (UUID), as specified in RFC-4122 and the Peabody RFC Draft (revision 03). -// -// RFC-4122[1] provides the specification for versions 1, 3, 4, and 5. The -// Peabody UUID RFC Draft[2] provides the specification for the new k-sortable -// UUIDs, versions 6 and 7. -// -// DCE 1.1[3] provides the specification for version 2, but version 2 support -// was removed from this package in v4 due to some concerns with the -// specification itself. Reading the spec, it seems that it would result in -// generating UUIDs that aren't very unique. In having read the spec it seemed -// that our implementation did not meet the spec. It also seems to be at-odds -// with RFC 4122, meaning we would need quite a bit of special code to support -// it. Lastly, there were no Version 2 implementations that we could find to -// ensure we were understanding the specification correctly. -// -// [1] https://tools.ietf.org/html/rfc4122 -// [2] https://datatracker.ietf.org/doc/html/draft-peabody-dispatch-new-uuid-format-03 -// [3] http://pubs.opengroup.org/onlinepubs/9696989899/chap5.htm#tagcjh_08_02_01_01 -package uuid - -import ( - "encoding/binary" - "encoding/hex" - "fmt" - "time" -) - -// Size of a UUID in bytes. -const Size = 16 - -// UUID is an array type to represent the value of a UUID, as defined in RFC-4122. -type UUID [Size]byte - -// UUID versions. -const ( - _ byte = iota - V1 // Version 1 (date-time and MAC address) - _ // Version 2 (date-time and MAC address, DCE security version) [removed] - V3 // Version 3 (namespace name-based) - V4 // Version 4 (random) - V5 // Version 5 (namespace name-based) - V6 // Version 6 (k-sortable timestamp and random data, field-compatible with v1) [peabody draft] - V7 // Version 7 (k-sortable timestamp and random data) [peabody draft] - _ // Version 8 (k-sortable timestamp, meant for custom implementations) [peabody draft] [not implemented] -) - -// UUID layout variants. -const ( - VariantNCS byte = iota - VariantRFC4122 - VariantMicrosoft - VariantFuture -) - -// UUID DCE domains. -const ( - DomainPerson = iota - DomainGroup - DomainOrg -) - -// Timestamp is the count of 100-nanosecond intervals since 00:00:00.00, -// 15 October 1582 within a V1 UUID. This type has no meaning for other -// UUID versions since they don't have an embedded timestamp. -type Timestamp uint64 - -const _100nsPerSecond = 10000000 - -// Time returns the UTC time.Time representation of a Timestamp -func (t Timestamp) Time() (time.Time, error) { - secs := uint64(t) / _100nsPerSecond - nsecs := 100 * (uint64(t) % _100nsPerSecond) - - return time.Unix(int64(secs)-(epochStart/_100nsPerSecond), int64(nsecs)), nil -} - -// TimestampFromV1 returns the Timestamp embedded within a V1 UUID. -// Returns an error if the UUID is any version other than 1. -func TimestampFromV1(u UUID) (Timestamp, error) { - if u.Version() != 1 { - err := fmt.Errorf("uuid: %s is version %d, not version 1", u, u.Version()) - return 0, err - } - - low := binary.BigEndian.Uint32(u[0:4]) - mid := binary.BigEndian.Uint16(u[4:6]) - hi := binary.BigEndian.Uint16(u[6:8]) & 0xfff - - return Timestamp(uint64(low) + (uint64(mid) << 32) + (uint64(hi) << 48)), nil -} - -// TimestampFromV6 returns the Timestamp embedded within a V6 UUID. This -// function returns an error if the UUID is any version other than 6. -// -// This is implemented based on revision 03 of the Peabody UUID draft, and may -// be subject to change pending further revisions. Until the final specification -// revision is finished, changes required to implement updates to the spec will -// not be considered a breaking change. They will happen as a minor version -// releases until the spec is final. -func TimestampFromV6(u UUID) (Timestamp, error) { - if u.Version() != 6 { - return 0, fmt.Errorf("uuid: %s is version %d, not version 6", u, u.Version()) - } - - hi := binary.BigEndian.Uint32(u[0:4]) - mid := binary.BigEndian.Uint16(u[4:6]) - low := binary.BigEndian.Uint16(u[6:8]) & 0xfff - - return Timestamp(uint64(low) + (uint64(mid) << 12) + (uint64(hi) << 28)), nil -} - -// Nil is the nil UUID, as specified in RFC-4122, that has all 128 bits set to -// zero. -var Nil = UUID{} - -// Predefined namespace UUIDs. -var ( - NamespaceDNS = Must(FromString("6ba7b810-9dad-11d1-80b4-00c04fd430c8")) - NamespaceURL = Must(FromString("6ba7b811-9dad-11d1-80b4-00c04fd430c8")) - NamespaceOID = Must(FromString("6ba7b812-9dad-11d1-80b4-00c04fd430c8")) - NamespaceX500 = Must(FromString("6ba7b814-9dad-11d1-80b4-00c04fd430c8")) -) - -// IsNil returns if the UUID is equal to the nil UUID -func (u UUID) IsNil() bool { - return u == Nil -} - -// Version returns the algorithm version used to generate the UUID. -func (u UUID) Version() byte { - return u[6] >> 4 -} - -// Variant returns the UUID layout variant. -func (u UUID) Variant() byte { - switch { - case (u[8] >> 7) == 0x00: - return VariantNCS - case (u[8] >> 6) == 0x02: - return VariantRFC4122 - case (u[8] >> 5) == 0x06: - return VariantMicrosoft - case (u[8] >> 5) == 0x07: - fallthrough - default: - return VariantFuture - } -} - -// Bytes returns a byte slice representation of the UUID. -func (u UUID) Bytes() []byte { - return u[:] -} - -// encodeCanonical encodes the canonical RFC-4122 form of UUID u into the -// first 36 bytes dst. -func encodeCanonical(dst []byte, u UUID) { - const hextable = "0123456789abcdef" - dst[8] = '-' - dst[13] = '-' - dst[18] = '-' - dst[23] = '-' - for i, x := range [16]byte{ - 0, 2, 4, 6, - 9, 11, - 14, 16, - 19, 21, - 24, 26, 28, 30, 32, 34, - } { - c := u[i] - dst[x] = hextable[c>>4] - dst[x+1] = hextable[c&0x0f] - } -} - -// String returns a canonical RFC-4122 string representation of the UUID: -// xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx. -func (u UUID) String() string { - var buf [36]byte - encodeCanonical(buf[:], u) - return string(buf[:]) -} - -// Format implements fmt.Formatter for UUID values. -// -// The behavior is as follows: -// The 'x' and 'X' verbs output only the hex digits of the UUID, using a-f for 'x' and A-F for 'X'. -// The 'v', '+v', 's' and 'q' verbs return the canonical RFC-4122 string representation. -// The 'S' verb returns the RFC-4122 format, but with capital hex digits. -// The '#v' verb returns the "Go syntax" representation, which is a 16 byte array initializer. -// All other verbs not handled directly by the fmt package (like '%p') are unsupported and will return -// "%!verb(uuid.UUID=value)" as recommended by the fmt package. -func (u UUID) Format(f fmt.State, c rune) { - if c == 'v' && f.Flag('#') { - fmt.Fprintf(f, "%#v", [Size]byte(u)) - return - } - switch c { - case 'x', 'X': - b := make([]byte, 32) - hex.Encode(b, u[:]) - if c == 'X' { - toUpperHex(b) - } - _, _ = f.Write(b) - case 'v', 's', 'S': - b, _ := u.MarshalText() - if c == 'S' { - toUpperHex(b) - } - _, _ = f.Write(b) - case 'q': - b := make([]byte, 38) - b[0] = '"' - encodeCanonical(b[1:], u) - b[37] = '"' - _, _ = f.Write(b) - default: - // invalid/unsupported format verb - fmt.Fprintf(f, "%%!%c(uuid.UUID=%s)", c, u.String()) - } -} - -func toUpperHex(b []byte) { - for i, c := range b { - if 'a' <= c && c <= 'f' { - b[i] = c - ('a' - 'A') - } - } -} - -// SetVersion sets the version bits. -func (u *UUID) SetVersion(v byte) { - u[6] = (u[6] & 0x0f) | (v << 4) -} - -// SetVariant sets the variant bits. -func (u *UUID) SetVariant(v byte) { - switch v { - case VariantNCS: - u[8] = (u[8]&(0xff>>1) | (0x00 << 7)) - case VariantRFC4122: - u[8] = (u[8]&(0xff>>2) | (0x02 << 6)) - case VariantMicrosoft: - u[8] = (u[8]&(0xff>>3) | (0x06 << 5)) - case VariantFuture: - fallthrough - default: - u[8] = (u[8]&(0xff>>3) | (0x07 << 5)) - } -} - -// Must is a helper that wraps a call to a function returning (UUID, error) -// and panics if the error is non-nil. It is intended for use in variable -// initializations such as -// -// var packageUUID = uuid.Must(uuid.FromString("123e4567-e89b-12d3-a456-426655440000")) -func Must(u UUID, err error) UUID { - if err != nil { - panic(err) - } - return u -} diff --git a/vendor/github.com/prometheus/alertmanager/api/api.go b/vendor/github.com/prometheus/alertmanager/api/api.go index 6839d2d2829..7c2a7c35861 100644 --- a/vendor/github.com/prometheus/alertmanager/api/api.go +++ b/vendor/github.com/prometheus/alertmanager/api/api.go @@ -14,17 +14,21 @@ package api import ( + "context" "errors" "fmt" "log/slog" "net/http" "runtime" + "strings" "time" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/prometheus/common/model" "github.com/prometheus/common/promslog" "github.com/prometheus/common/route" + "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" apiv2 "github.com/prometheus/alertmanager/api/v2" "github.com/prometheus/alertmanager/cluster" @@ -40,6 +44,7 @@ type API struct { v2 *apiv2.API deprecationRouter *V1DeprecationRouter + requestDuration *prometheus.HistogramVec requestsInFlight prometheus.Gauge concurrencyLimitExceeded prometheus.Counter timeout time.Duration @@ -75,10 +80,12 @@ type Options struct { // Registry is used to register Prometheus metrics. If nil, no metrics // registration will happen. Registry prometheus.Registerer + // RequestDuration is used to measure the duration of HTTP requests. + RequestDuration *prometheus.HistogramVec // GroupFunc returns a list of alert groups. The alerts are grouped // according to the current active configuration. Alerts returned are // filtered by the arguments provided to the function. - GroupFunc func(func(*dispatch.Route) bool, func(*types.Alert, time.Time) bool) (dispatch.AlertGroups, map[model.Fingerprint][]string) + GroupFunc func(context.Context, func(*dispatch.Route) bool, func(*types.Alert, time.Time) bool) (dispatch.AlertGroups, map[model.Fingerprint][]string, error) } func (o Options) validate() error { @@ -112,10 +119,7 @@ func New(opts Options) (*API, error) { } concurrency := opts.Concurrency if concurrency < 1 { - concurrency = runtime.GOMAXPROCS(0) - if concurrency < 8 { - concurrency = 8 - } + concurrency = max(runtime.GOMAXPROCS(0), 8) } v2, err := apiv2.NewAPI( @@ -132,8 +136,6 @@ func New(opts Options) (*API, error) { return nil, err } - // TODO(beorn7): For now, this hardcodes the method="get" label. Other - // methods should get the same instrumentation. requestsInFlight := prometheus.NewGauge(prometheus.GaugeOpts{ Name: "alertmanager_http_requests_in_flight", Help: "Current number of HTTP requests being processed.", @@ -156,6 +158,7 @@ func New(opts Options) (*API, error) { return &API{ deprecationRouter: NewV1DeprecationRouter(l.With("version", "v1")), v2: v2, + requestDuration: opts.RequestDuration, requestsInFlight: requestsInFlight, concurrencyLimitExceeded: concurrencyLimitExceeded, timeout: opts.Timeout, @@ -181,13 +184,17 @@ func (api *API) Register(r *route.Router, routePrefix string) *http.ServeMux { if routePrefix != "/" { apiPrefix = routePrefix } - // TODO(beorn7): HTTP instrumentation is only in place for Router. Since - // /api/v2 works on the Handler level, it is currently not instrumented - // at all (with the exception of requestsInFlight, which is handled in - // limitHandler below). mux.Handle( apiPrefix+"/api/v2/", - api.limitHandler(http.StripPrefix(apiPrefix, api.v2.Handler)), + api.instrumentHandler( + apiPrefix, + api.limitHandler( + http.StripPrefix( + apiPrefix, + api.v2.Handler, + ), + ), + ), ) return mux @@ -195,7 +202,7 @@ func (api *API) Register(r *route.Router, routePrefix string) *http.ServeMux { // Update config and resolve timeout of each API. APIv2 also needs // setAlertStatus to be updated. -func (api *API) Update(cfg *config.Config, setAlertStatus func(model.LabelSet)) { +func (api *API) Update(cfg *config.Config, setAlertStatus func(ctx context.Context, labels model.LabelSet)) { api.v2.Update(cfg, setAlertStatus) } @@ -226,3 +233,17 @@ func (api *API) limitHandler(h http.Handler) http.Handler { "Exceeded configured timeout of %v.\n", api.timeout, )) } + +func (api *API) instrumentHandler(prefix string, h http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + path, _ := strings.CutPrefix(r.URL.Path, prefix) + // avoid high cardinality label values by replacing the actual silence IDs with a placeholder + if strings.HasPrefix(path, "/api/v2/silence/") { + path = "/api/v2/silence/{silenceID}" + } + promhttp.InstrumentHandlerDuration( + api.requestDuration.MustCurryWith(prometheus.Labels{"handler": path}), + otelhttp.WithRouteTag(path, h), + ).ServeHTTP(w, r) + }) +} diff --git a/vendor/github.com/prometheus/alertmanager/api/metrics/metrics.go b/vendor/github.com/prometheus/alertmanager/api/metrics/metrics.go index 439010166d0..6f212c3179d 100644 --- a/vendor/github.com/prometheus/alertmanager/api/metrics/metrics.go +++ b/vendor/github.com/prometheus/alertmanager/api/metrics/metrics.go @@ -13,7 +13,10 @@ package metrics -import "github.com/prometheus/client_golang/prometheus" +import ( + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" +) // Alerts stores metrics for alerts. type Alerts struct { @@ -25,19 +28,19 @@ type Alerts struct { // NewAlerts returns an *Alerts struct for the given API version. // Since v1 was deprecated in 0.27, v2 is now hardcoded. func NewAlerts(r prometheus.Registerer) *Alerts { - numReceivedAlerts := prometheus.NewCounterVec(prometheus.CounterOpts{ + if r == nil { + return nil + } + numReceivedAlerts := promauto.With(r).NewCounterVec(prometheus.CounterOpts{ Name: "alertmanager_alerts_received_total", Help: "The total number of received alerts.", ConstLabels: prometheus.Labels{"version": "v2"}, }, []string{"status"}) - numInvalidAlerts := prometheus.NewCounter(prometheus.CounterOpts{ + numInvalidAlerts := promauto.With(r).NewCounter(prometheus.CounterOpts{ Name: "alertmanager_alerts_invalid_total", Help: "The total number of received alerts that were invalid.", ConstLabels: prometheus.Labels{"version": "v2"}, }) - if r != nil { - r.MustRegister(numReceivedAlerts, numInvalidAlerts) - } return &Alerts{ firing: numReceivedAlerts.WithLabelValues("firing"), resolved: numReceivedAlerts.WithLabelValues("resolved"), diff --git a/vendor/github.com/prometheus/alertmanager/api/v2/api.go b/vendor/github.com/prometheus/alertmanager/api/v2/api.go index dd0ffd6f608..dda91fea271 100644 --- a/vendor/github.com/prometheus/alertmanager/api/v2/api.go +++ b/vendor/github.com/prometheus/alertmanager/api/v2/api.go @@ -14,11 +14,13 @@ package v2 import ( + "context" "errors" "fmt" "log/slog" "net/http" "regexp" + "slices" "sort" "sync" "time" @@ -31,6 +33,8 @@ import ( prometheus_model "github.com/prometheus/common/model" "github.com/prometheus/common/version" "github.com/rs/cors" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/codes" "github.com/prometheus/alertmanager/api/metrics" open_api_models "github.com/prometheus/alertmanager/api/v2/models" @@ -52,6 +56,8 @@ import ( "github.com/prometheus/alertmanager/types" ) +var tracer = otel.Tracer("github.com/prometheus/alertmanager/api/v2") + // API represents an Alertmanager API v2. type API struct { peer cluster.ClusterPeer @@ -77,10 +83,10 @@ type API struct { } type ( - groupsFn func(func(*dispatch.Route) bool, func(*types.Alert, time.Time) bool) (dispatch.AlertGroups, map[prometheus_model.Fingerprint][]string) + groupsFn func(context.Context, func(*dispatch.Route) bool, func(*types.Alert, time.Time) bool) (dispatch.AlertGroups, map[prometheus_model.Fingerprint][]string, error) groupMutedFunc func(routeID, groupKey string) ([]string, bool) getAlertStatusFn func(prometheus_model.Fingerprint) types.AlertStatus - setAlertStatusFn func(prometheus_model.LabelSet) + setAlertStatusFn func(ctx context.Context, labels prometheus_model.LabelSet) ) // NewAPI returns a new Alertmanager API v2. @@ -171,6 +177,9 @@ func (api *API) getStatusHandler(params general_ops.GetStatusParams) middleware. api.mtx.RLock() defer api.mtx.RUnlock() + _, span := tracer.Start(params.HTTPRequest.Context(), "api.getStatusHandler") + defer span.End() + original := api.alertmanagerConfig.String() uptime := strfmt.DateTime(api.uptime) @@ -227,6 +236,9 @@ func (api *API) getReceiversHandler(params receiver_ops.GetReceiversParams) midd api.mtx.RLock() defer api.mtx.RUnlock() + _, span := tracer.Start(params.HTTPRequest.Context(), "api.getReceiversHandler") + defer span.End() + receivers := make([]*open_api_models.Receiver, 0, len(api.alertmanagerConfig.Receivers)) for i := range api.alertmanagerConfig.Receivers { receivers = append(receivers, &open_api_models.Receiver{Name: &api.alertmanagerConfig.Receivers[i].Name}) @@ -241,11 +253,13 @@ func (api *API) getAlertsHandler(params alert_ops.GetAlertsParams) middleware.Re // Initialize result slice to prevent api returning `null` when there // are no alerts present res = open_api_models.GettableAlerts{} - ctx = params.HTTPRequest.Context() logger = api.requestLogger(params.HTTPRequest) ) + ctx, span := tracer.Start(params.HTTPRequest.Context(), "api.getAlertsHandler") + defer span.End() + matchers, err := parseFilter(params.Filter) if err != nil { logger.Debug("Failed to parse matchers", "err", err) @@ -272,6 +286,7 @@ func (api *API) getAlertsHandler(params alert_ops.GetAlertsParams) middleware.Re api.mtx.RLock() for a := range alerts.Next() { + alert := a.Data if err = alerts.Err(); err != nil { break } @@ -279,23 +294,23 @@ func (api *API) getAlertsHandler(params alert_ops.GetAlertsParams) middleware.Re break } - routes := api.route.Match(a.Labels) + routes := api.route.Match(alert.Labels) receivers := make([]string, 0, len(routes)) for _, r := range routes { receivers = append(receivers, r.RouteOpts.Receiver) } - if receiverFilter != nil && !receiversMatchFilter(receivers, receiverFilter) { + if receiverFilter != nil && !slices.ContainsFunc(receivers, receiverFilter.MatchString) { continue } - if !alertFilter(a, now) { + if !alertFilter(alert, now) { continue } - alert := AlertToOpenAPIAlert(a, api.getAlertStatus(a.Fingerprint()), receivers, nil) + openAlert := AlertToOpenAPIAlert(alert, api.getAlertStatus(alert.Fingerprint()), receivers, nil) - res = append(res, alert) + res = append(res, openAlert) } api.mtx.RUnlock() @@ -313,7 +328,11 @@ func (api *API) getAlertsHandler(params alert_ops.GetAlertsParams) middleware.Re func (api *API) postAlertsHandler(params alert_ops.PostAlertsParams) middleware.Responder { logger := api.requestLogger(params.HTTPRequest) - alerts := OpenAPIAlertsToAlerts(params.Alerts) + ctx, span := tracer.Start(params.HTTPRequest.Context(), "api.postAlertsHandler") + defer span.End() + + alerts := OpenAPIAlertsToAlerts(ctx, params.Alerts) + now := time.Now() api.mtx.RLock() @@ -359,13 +378,19 @@ func (api *API) postAlertsHandler(params alert_ops.PostAlertsParams) middleware. } validAlerts = append(validAlerts, a) } - if err := api.alerts.Put(validAlerts...); err != nil { - logger.Error("Failed to create alerts", "err", err) + if err := api.alerts.Put(ctx, validAlerts...); err != nil { + message := "Failed to create alerts" + logger.Error(message, "err", err) + span.SetStatus(codes.Error, message) + span.RecordError(err) return alert_ops.NewPostAlertsInternalServerError().WithPayload(err.Error()) } if validationErrs.Len() > 0 { - logger.Error("Failed to validate alerts", "err", validationErrs.Error()) + message := "Failed to validate alerts" + logger.Error(message, "err", validationErrs.Error()) + span.SetStatus(codes.Error, message) + span.RecordError(validationErrs) return alert_ops.NewPostAlertsBadRequest().WithPayload(validationErrs.Error()) } @@ -375,6 +400,9 @@ func (api *API) postAlertsHandler(params alert_ops.PostAlertsParams) middleware. func (api *API) getAlertGroupsHandler(params alertgroup_ops.GetAlertGroupsParams) middleware.Responder { logger := api.requestLogger(params.HTTPRequest) + ctx, span := tracer.Start(params.HTTPRequest.Context(), "api.getAlertGroupsHandler") + defer span.End() + matchers, err := parseFilter(params.Filter) if err != nil { logger.Debug("Failed to parse matchers", "err", err) @@ -405,7 +433,14 @@ func (api *API) getAlertGroupsHandler(params alertgroup_ops.GetAlertGroupsParams }(receiverFilter) af := api.alertFilter(matchers, *params.Silenced, *params.Inhibited, *params.Active) - alertGroups, allReceivers := api.alertGroups(rf, af) + alertGroups, allReceivers, err := api.alertGroups(ctx, rf, af) + if err != nil { + message := "Failed to get alert groups" + logger.Error(message, "err", err) + span.SetStatus(codes.Error, message) + span.RecordError(err) + return alertgroup_ops.NewGetAlertGroupsInternalServerError() + } res := make(open_api_models.AlertGroups, 0, len(alertGroups)) @@ -436,12 +471,15 @@ func (api *API) getAlertGroupsHandler(params alertgroup_ops.GetAlertGroupsParams func (api *API) alertFilter(matchers []*labels.Matcher, silenced, inhibited, active bool) func(a *types.Alert, now time.Time) bool { return func(a *types.Alert, now time.Time) bool { + ctx, span := tracer.Start(context.Background(), "alertFilter") + defer span.End() + if !a.EndsAt.IsZero() && a.EndsAt.Before(now) { return false } // Set alert's current status based on its label set. - api.setAlertStatus(a.Labels) + api.setAlertStatus(ctx, a.Labels) // Get alert's current status after seeing if it is suppressed. status := api.getAlertStatus(a.Fingerprint()) @@ -470,16 +508,6 @@ func removeEmptyLabels(ls prometheus_model.LabelSet) { } } -func receiversMatchFilter(receivers []string, filter *regexp.Regexp) bool { - for _, r := range receivers { - if filter.MatchString(r) { - return true - } - } - - return false -} - func alertMatchesFilterLabels(a *prometheus_model.Alert, matchers []*labels.Matcher) bool { sms := make(map[string]string) for name, value := range a.Labels { @@ -515,13 +543,16 @@ func matchFilterLabels(matchers []*labels.Matcher, sms map[string]string) bool { func (api *API) getSilencesHandler(params silence_ops.GetSilencesParams) middleware.Responder { logger := api.requestLogger(params.HTTPRequest) + ctx, span := tracer.Start(params.HTTPRequest.Context(), "api.getSilencesHandler") + defer span.End() + matchers, err := parseFilter(params.Filter) if err != nil { logger.Debug("Failed to parse matchers", "err", err) return silence_ops.NewGetSilencesBadRequest().WithPayload(err.Error()) } - psils, _, err := api.silences.Query() + psils, _, err := api.silences.Query(ctx) if err != nil { logger.Error("Failed to get silences", "err", err) return silence_ops.NewGetSilencesInternalServerError().WithPayload(err.Error()) @@ -611,7 +642,10 @@ func CheckSilenceMatchesFilterLabels(s *silencepb.Silence, matchers []*labels.Ma func (api *API) getSilenceHandler(params silence_ops.GetSilenceParams) middleware.Responder { logger := api.requestLogger(params.HTTPRequest) - sils, _, err := api.silences.Query(silence.QIDs(params.SilenceID.String())) + ctx, span := tracer.Start(params.HTTPRequest.Context(), "api.getSilenceHandler") + defer span.End() + + sils, _, err := api.silences.Query(ctx, silence.QIDs(params.SilenceID.String())) if err != nil { logger.Error("Failed to get silence by id", "err", err, "id", params.SilenceID.String()) return silence_ops.NewGetSilenceInternalServerError().WithPayload(err.Error()) @@ -634,8 +668,11 @@ func (api *API) getSilenceHandler(params silence_ops.GetSilenceParams) middlewar func (api *API) deleteSilenceHandler(params silence_ops.DeleteSilenceParams) middleware.Responder { logger := api.requestLogger(params.HTTPRequest) + ctx, span := tracer.Start(params.HTTPRequest.Context(), "api.deleteSilenceHandler") + defer span.End() + sid := params.SilenceID.String() - if err := api.silences.Expire(sid); err != nil { + if err := api.silences.Expire(ctx, sid); err != nil { logger.Error("Failed to expire silence", "err", err) if errors.Is(err, silence.ErrNotFound) { return silence_ops.NewDeleteSilenceNotFound() @@ -648,6 +685,9 @@ func (api *API) deleteSilenceHandler(params silence_ops.DeleteSilenceParams) mid func (api *API) postSilencesHandler(params silence_ops.PostSilencesParams) middleware.Responder { logger := api.requestLogger(params.HTTPRequest) + ctx, span := tracer.Start(params.HTTPRequest.Context(), "api.postSilencesHandler") + defer span.End() + sil, err := PostableSilenceToProto(params.Silence) if err != nil { logger.Error("Failed to marshal silence to proto", "err", err) @@ -668,7 +708,7 @@ func (api *API) postSilencesHandler(params silence_ops.PostSilencesParams) middl return silence_ops.NewPostSilencesBadRequest().WithPayload(msg) } - if err = api.silences.Set(sil); err != nil { + if err = api.silences.Set(ctx, sil); err != nil { logger.Error("Failed to create silence", "err", err) if errors.Is(err, silence.ErrNotFound) { return silence_ops.NewPostSilencesNotFound().WithPayload(err.Error()) diff --git a/vendor/github.com/prometheus/alertmanager/api/v2/client/alert/get_alerts_parameters.go b/vendor/github.com/prometheus/alertmanager/api/v2/client/alert/get_alerts_parameters.go index 89ff1880eeb..b5fdac356f0 100644 --- a/vendor/github.com/prometheus/alertmanager/api/v2/client/alert/get_alerts_parameters.go +++ b/vendor/github.com/prometheus/alertmanager/api/v2/client/alert/get_alerts_parameters.go @@ -86,7 +86,7 @@ type GetAlertsParams struct { /* Filter. - A list of matchers to filter alerts by + A matcher expression to filter alerts. For example `alertname="MyAlert"`. It can be repeated to apply multiple matchers. */ Filter []string diff --git a/vendor/github.com/prometheus/alertmanager/api/v2/client/alertgroup/get_alert_groups_parameters.go b/vendor/github.com/prometheus/alertmanager/api/v2/client/alertgroup/get_alert_groups_parameters.go index 81020fcf679..1c96b29cfa4 100644 --- a/vendor/github.com/prometheus/alertmanager/api/v2/client/alertgroup/get_alert_groups_parameters.go +++ b/vendor/github.com/prometheus/alertmanager/api/v2/client/alertgroup/get_alert_groups_parameters.go @@ -86,7 +86,7 @@ type GetAlertGroupsParams struct { /* Filter. - A list of matchers to filter alerts by + A matcher expression to filter alert groups. For example `alertname="MyAlert"`. It can be repeated to apply multiple matchers. */ Filter []string diff --git a/vendor/github.com/prometheus/alertmanager/api/v2/client/silence/get_silences_parameters.go b/vendor/github.com/prometheus/alertmanager/api/v2/client/silence/get_silences_parameters.go index d964efefa26..8e02101200c 100644 --- a/vendor/github.com/prometheus/alertmanager/api/v2/client/silence/get_silences_parameters.go +++ b/vendor/github.com/prometheus/alertmanager/api/v2/client/silence/get_silences_parameters.go @@ -78,7 +78,7 @@ type GetSilencesParams struct { /* Filter. - A list of matchers to filter silences by + A matcher expression to filter silences. For example `alertname="MyAlert"`. It can be repeated to apply multiple matchers. */ Filter []string diff --git a/vendor/github.com/prometheus/alertmanager/api/v2/compat.go b/vendor/github.com/prometheus/alertmanager/api/v2/compat.go index 8954f2f752d..cc860911148 100644 --- a/vendor/github.com/prometheus/alertmanager/api/v2/compat.go +++ b/vendor/github.com/prometheus/alertmanager/api/v2/compat.go @@ -14,6 +14,7 @@ package v2 import ( + "context" "fmt" "time" @@ -170,7 +171,10 @@ func AlertToOpenAPIAlert(alert *types.Alert, status types.AlertStatus, receivers } // OpenAPIAlertsToAlerts converts open_api_models.PostableAlerts to []*types.Alert. -func OpenAPIAlertsToAlerts(apiAlerts open_api_models.PostableAlerts) []*types.Alert { +func OpenAPIAlertsToAlerts(ctx context.Context, apiAlerts open_api_models.PostableAlerts) []*types.Alert { + _, span := tracer.Start(ctx, "OpenAPIAlertsToAlerts") + defer span.End() + alerts := []*types.Alert{} for _, apiAlert := range apiAlerts { alert := types.Alert{ diff --git a/vendor/github.com/prometheus/alertmanager/api/v2/openapi.yaml b/vendor/github.com/prometheus/alertmanager/api/v2/openapi.yaml index bc525ff37a9..c40f009b25f 100644 --- a/vendor/github.com/prometheus/alertmanager/api/v2/openapi.yaml +++ b/vendor/github.com/prometheus/alertmanager/api/v2/openapi.yaml @@ -60,7 +60,7 @@ paths: parameters: - name: filter in: query - description: A list of matchers to filter silences by + description: A matcher expression to filter silences. For example `alertname="MyAlert"`. It can be repeated to apply multiple matchers. required: false type: array collectionFormat: multi @@ -162,7 +162,7 @@ paths: default: true - name: filter in: query - description: A list of matchers to filter alerts by + description: A matcher expression to filter alerts. For example `alertname="MyAlert"`. It can be repeated to apply multiple matchers. required: false type: array collectionFormat: multi @@ -230,7 +230,7 @@ paths: default: true - name: filter in: query - description: A list of matchers to filter alerts by + description: A matcher expression to filter alert groups. For example `alertname="MyAlert"`. It can be repeated to apply multiple matchers. required: false type: array collectionFormat: multi diff --git a/vendor/github.com/prometheus/alertmanager/api/v2/restapi/embedded_spec.go b/vendor/github.com/prometheus/alertmanager/api/v2/restapi/embedded_spec.go index 37938bdc147..09605d2d815 100644 --- a/vendor/github.com/prometheus/alertmanager/api/v2/restapi/embedded_spec.go +++ b/vendor/github.com/prometheus/alertmanager/api/v2/restapi/embedded_spec.go @@ -92,7 +92,7 @@ func init() { "type": "string" }, "collectionFormat": "multi", - "description": "A list of matchers to filter alerts by", + "description": "A matcher expression to filter alerts. For example ` + "`" + `alertname=\"MyAlert\"` + "`" + `. It can be repeated to apply multiple matchers.", "name": "filter", "in": "query" }, @@ -190,7 +190,7 @@ func init() { "type": "string" }, "collectionFormat": "multi", - "description": "A list of matchers to filter alerts by", + "description": "A matcher expression to filter alert groups. For example ` + "`" + `alertname=\"MyAlert\"` + "`" + `. It can be repeated to apply multiple matchers.", "name": "filter", "in": "query" }, @@ -312,7 +312,7 @@ func init() { "type": "string" }, "collectionFormat": "multi", - "description": "A list of matchers to filter silences by", + "description": "A matcher expression to filter silences. For example ` + "`" + `alertname=\"MyAlert\"` + "`" + `. It can be repeated to apply multiple matchers.", "name": "filter", "in": "query" } @@ -896,7 +896,7 @@ func init() { "type": "string" }, "collectionFormat": "multi", - "description": "A list of matchers to filter alerts by", + "description": "A matcher expression to filter alerts. For example ` + "`" + `alertname=\"MyAlert\"` + "`" + `. It can be repeated to apply multiple matchers.", "name": "filter", "in": "query" }, @@ -1006,7 +1006,7 @@ func init() { "type": "string" }, "collectionFormat": "multi", - "description": "A list of matchers to filter alerts by", + "description": "A matcher expression to filter alert groups. For example ` + "`" + `alertname=\"MyAlert\"` + "`" + `. It can be repeated to apply multiple matchers.", "name": "filter", "in": "query" }, @@ -1140,7 +1140,7 @@ func init() { "type": "string" }, "collectionFormat": "multi", - "description": "A list of matchers to filter silences by", + "description": "A matcher expression to filter silences. For example ` + "`" + `alertname=\"MyAlert\"` + "`" + `. It can be repeated to apply multiple matchers.", "name": "filter", "in": "query" } diff --git a/vendor/github.com/prometheus/alertmanager/api/v2/restapi/operations/alert/get_alerts_parameters.go b/vendor/github.com/prometheus/alertmanager/api/v2/restapi/operations/alert/get_alerts_parameters.go index 9f5a915c6fa..e26761dd658 100644 --- a/vendor/github.com/prometheus/alertmanager/api/v2/restapi/operations/alert/get_alerts_parameters.go +++ b/vendor/github.com/prometheus/alertmanager/api/v2/restapi/operations/alert/get_alerts_parameters.go @@ -69,7 +69,7 @@ type GetAlertsParams struct { Default: true */ Active *bool - /*A list of matchers to filter alerts by + /*A matcher expression to filter alerts. For example `alertname="MyAlert"`. It can be repeated to apply multiple matchers. In: query Collection Format: multi */ diff --git a/vendor/github.com/prometheus/alertmanager/api/v2/restapi/operations/alertgroup/get_alert_groups_parameters.go b/vendor/github.com/prometheus/alertmanager/api/v2/restapi/operations/alertgroup/get_alert_groups_parameters.go index e8b3e72eb35..4523167bb8e 100644 --- a/vendor/github.com/prometheus/alertmanager/api/v2/restapi/operations/alertgroup/get_alert_groups_parameters.go +++ b/vendor/github.com/prometheus/alertmanager/api/v2/restapi/operations/alertgroup/get_alert_groups_parameters.go @@ -69,7 +69,7 @@ type GetAlertGroupsParams struct { Default: true */ Active *bool - /*A list of matchers to filter alerts by + /*A matcher expression to filter alert groups. For example `alertname="MyAlert"`. It can be repeated to apply multiple matchers. In: query Collection Format: multi */ diff --git a/vendor/github.com/prometheus/alertmanager/api/v2/restapi/operations/silence/get_silences_parameters.go b/vendor/github.com/prometheus/alertmanager/api/v2/restapi/operations/silence/get_silences_parameters.go index 0724540b846..48f4aa9cbd2 100644 --- a/vendor/github.com/prometheus/alertmanager/api/v2/restapi/operations/silence/get_silences_parameters.go +++ b/vendor/github.com/prometheus/alertmanager/api/v2/restapi/operations/silence/get_silences_parameters.go @@ -45,7 +45,7 @@ type GetSilencesParams struct { // HTTP Request Object HTTPRequest *http.Request `json:"-"` - /*A list of matchers to filter silences by + /*A matcher expression to filter silences. For example `alertname="MyAlert"`. It can be repeated to apply multiple matchers. In: query Collection Format: multi */ diff --git a/vendor/github.com/prometheus/alertmanager/asset/asset.go b/vendor/github.com/prometheus/alertmanager/asset/asset.go index b4959299b1d..11d3736275a 100644 --- a/vendor/github.com/prometheus/alertmanager/asset/asset.go +++ b/vendor/github.com/prometheus/alertmanager/asset/asset.go @@ -12,7 +12,6 @@ // limitations under the License. //go:build dev -// +build dev package asset diff --git a/vendor/github.com/prometheus/alertmanager/asset/assets_vfsdata.go b/vendor/github.com/prometheus/alertmanager/asset/assets_vfsdata.go index 3dd06e052bd..85ce36dd3b6 100644 --- a/vendor/github.com/prometheus/alertmanager/asset/assets_vfsdata.go +++ b/vendor/github.com/prometheus/alertmanager/asset/assets_vfsdata.go @@ -150,9 +150,9 @@ var Assets = func() http.FileSystem { "/static/script.js": &vfsgen۰CompressedFileInfo{ name: "script.js", modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), - uncompressedSize: 110586, + uncompressedSize: 111077, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xdc\xbd\x0b\x7b\xdb\xb8\xae\x28\xfa\x57\x1c\xed\x6c\x2f\x72\x0c\xab\x76\x5e\x6d\xe5\x70\xf9\xa6\xef\xf7\x23\x49\x3b\x99\x66\x72\x72\x28\x99\x76\xd4\xd8\x94\x4b\x51\x71\xd2\xd8\xfb\x6f\xdc\x1f\x74\xff\xd8\xfd\x08\xea\xed\xc7\x74\xf6\x5e\xfb\x9c\x73\xef\x5a\xf3\xa5\xb2\x04\x82\x20\x09\x82\x00\x08\x82\x5b\xc3\x44\x06\x3a\x8c\x24\x91\xf4\xde\x49\x62\xd1\x88\xb5\x0a\x03\xed\xf4\xb2\x0f\x0d\x45\x24\x28\xd0\xf4\x5e\x09\x9d\x28\xd9\xd0\x2e\x67\x12\xb4\x3b\x64\x0a\xf4\x22\x07\x1b\x93\x02\x44\x91\x1d\xd0\x90\xa3\x56\xf9\x87\x72\x6d\x19\x3a\xa2\x40\xd2\xc5\x82\x16\xa8\x06\x44\x94\x50\xed\x82\x28\x50\xe9\x65\x54\x1b\xb1\x0b\xa2\xc1\xe2\x2f\x57\xa0\x49\x52\xaa\x60\x0f\x92\xa2\x02\xb1\x8c\xed\xef\xd6\x99\x10\x01\x79\xad\xe5\x6a\x03\xc2\x4b\xd5\xee\x03\x2f\xaa\x4d\x96\x11\xfe\x0b\x28\xe1\x24\x81\x32\x2d\x65\x62\x04\x09\x4a\xc4\x1c\x40\x50\x10\xc3\x97\x71\xfe\xf7\xd0\x17\x10\x0e\x35\x0a\xcb\x24\x26\x24\x2a\x91\xf8\x10\xa2\x82\xc4\x60\x19\xed\xff\x32\xaa\x23\x12\xc0\x32\xdd\x65\xc2\x39\x09\x4b\x84\x3f\x82\xb0\x20\x3c\x5a\xc6\xfc\xbf\xb3\x2d\x21\x89\x60\x65\x6b\xca\xcd\x89\xc8\xb0\xd4\x9c\xc7\x30\x2c\x9a\x13\x2e\x23\xff\x3f\xac\x85\x43\x12\xc2\xba\x36\x96\x1b\x39\xab\x89\xb9\x1d\xc6\x98\x74\x79\x5f\xba\x43\x62\xde\x7b\xa6\x1e\xa2\x4b\x25\xee\x6c\x09\x28\x88\xdc\xad\x96\x01\x91\x97\x22\xa2\x54\xf0\x36\x2b\x08\x45\x93\xf7\xea\x45\x21\x29\x17\x26\x49\xa9\xfc\x4d\x51\x1e\x8a\x7e\xdc\x5f\xc6\x00\xbc\x86\x83\xf0\x12\x9a\x61\x19\x0d\x14\x63\x74\xb0\x0a\x11\x04\xcb\xa8\x48\x50\xc2\xe6\x57\xb1\x41\xc1\x06\x0f\x57\xe3\x83\x68\x25\x46\x12\x95\x90\xc6\x75\xa4\x50\x30\xdc\xa3\x75\x68\x21\x5c\x87\x98\x84\x74\x71\xc3\x55\x23\x64\x03\x52\xb0\x8a\x1d\xf6\x61\xa4\x88\xf9\x26\xd8\x91\x52\xfc\x8e\x48\x0a\x09\xeb\xf4\x92\x43\xd9\x4b\x5a\x2d\x2a\xce\x93\x0b\xa6\x89\x6a\x25\xb4\x97\xad\x2d\x0b\x0a\xdb\x6c\x5c\xc1\x54\xe0\xd1\x05\x1e\xc1\x3a\x3d\x71\x28\x9b\x4d\xe5\xfa\x3d\xd1\x6a\x51\x7d\x2e\x2e\x98\x72\x39\x28\x66\x5e\xe5\x0b\xeb\x58\xc8\x91\xbe\x62\x02\x2e\xcd\xb2\x45\x17\x14\x26\x8c\xd4\x2b\xc8\x26\xe2\xb9\xbc\x58\x50\xd8\xd4\x90\x0c\x21\x24\x29\x2d\x82\x02\x67\x9d\x1e\x3f\x14\x3d\xde\x6a\xd1\xe4\x9c\x5f\x30\x7d\xce\x2f\x32\x0a\x92\x73\x79\xc1\x14\x24\x0b\x0a\xeb\x9b\xa5\x32\xac\x59\x4f\xe9\x56\x37\xeb\x2b\x5d\xf4\x95\x3a\x4f\x72\xbc\xe2\x5c\x5f\x30\x09\xe2\xd7\xe9\x35\xc8\x04\x22\x53\xcc\xcc\x4c\x7d\x9e\x5c\x80\xca\xbb\x5e\xfd\x22\xa6\x76\xb7\xd7\x39\x64\xa2\x27\xda\xed\x1c\x91\xa8\x21\xa2\xbd\xbf\xd3\xd6\x15\x2d\x95\xc4\xb4\xb5\xc2\x16\xff\xe5\x51\x41\x69\xd4\xe2\x60\x46\x27\xc7\x9c\xac\xc4\x9c\x73\x4f\x3c\x0e\x03\x81\x2d\xf8\x0b\x0a\x54\x41\x81\x6c\x0b\xe0\x19\x1d\x2d\x92\xe4\xd4\x1d\x26\xfd\xec\xd1\x4b\x28\x85\x80\x75\x7a\xc1\xa1\xe8\x05\xad\x16\xe5\xe7\x81\x19\xdf\xe0\xa2\x67\x70\xda\x2f\x49\xf6\xa5\x25\x0c\x4f\x05\xf9\xd8\xf3\x15\xcc\x54\x1a\xc5\x35\x9f\x82\x48\xc6\xd1\x58\xb8\xe3\x68\x44\x64\xcb\xf1\x1a\x4e\xeb\x8a\x50\x0a\x6a\x41\x0b\xcd\xf4\x8a\x64\xf0\xce\x61\x28\xb5\x50\x92\x8f\xe3\x7f\x3a\x85\xf8\x98\x9a\x75\x40\x5f\xa9\x68\xd6\x78\xae\x54\xa4\x88\x73\xa5\xf5\x34\xf6\x1e\x3c\x18\x85\xfa\x2a\xf1\xdd\x20\x9a\x3c\x10\xe3\xc9\x83\x20\x52\xe2\x81\x3f\x8e\xfc\x07\x5d\xb7\xe3\x76\x1e\x5c\x85\x52\xc7\x0f\x9c\x96\x6c\x39\xee\x64\xe0\x94\x24\xd2\xa8\xc6\x22\x20\xd8\xf9\x05\x24\xec\x1a\xbb\xb9\x03\x82\xf6\x92\x66\x93\x68\x26\xdc\x69\x34\x25\x94\xf6\xcc\x37\xed\x72\xd0\xae\x8f\xdf\x4b\xc3\x99\x63\xbd\x2e\x96\x92\x70\x48\xba\x9d\xce\xa1\xa6\x19\x3b\xb9\xd3\x24\xbe\x22\x97\x58\x2f\x85\xad\x4e\x2f\x1c\x12\xc9\x18\x53\x29\x84\x7d\xe3\x44\xfe\x77\x11\x68\x67\x8b\xe9\xbb\xa9\x88\x86\x0d\x39\x9f\xcb\x64\x3c\x36\x42\x32\x7f\xca\x8a\x38\x59\xc5\x0e\xcb\xc1\x9b\xcd\x29\xd9\xa7\xb0\xd5\xed\x65\x6d\x4b\x1a\xa1\x6c\x48\x77\xfb\xb0\xd3\x6c\x12\xc9\x7c\x6d\x64\x99\x32\xff\x1a\x42\x24\x0d\x87\x64\xeb\x9a\x48\x9c\x99\xe6\x8f\x6e\x75\x4d\xf3\x52\xaa\xba\xbd\x8c\x3c\x14\xb9\x47\x6c\x4c\x46\x14\x4e\xd8\xea\x01\xdf\x1a\xa5\x8c\x5b\x8c\xee\x69\xc6\xb8\x2b\x5b\x97\x75\x0f\xf6\x44\xbf\xe3\xc9\x43\xd5\x6f\x77\xbd\xae\xe9\x8b\x2d\xe9\x6e\xa7\xdf\x89\x66\xa7\x44\x1a\x49\xeb\x72\x4a\xe7\xf3\xf4\xb7\x0f\xca\xf5\x29\xed\x6b\xcf\xfc\x0a\x40\xb9\x01\xc5\x76\xf7\xa4\xeb\xa3\x9c\x6e\x36\xb7\xaa\x65\x7b\x92\x61\x39\x23\xb1\xf3\x21\xd4\xf3\xb9\xc1\xd6\xef\x7a\xca\xf5\x4d\xfd\x1d\xbb\xc0\x3c\x5f\xd3\x4c\xdb\x28\x7a\xd8\x59\x50\xf8\xb6\x56\xb4\xa7\x40\xdd\xf5\xd3\xa3\x73\x78\x9a\x4d\xf4\xb5\x10\x2c\x03\xa1\xf0\x7d\x99\x9c\xf4\x6b\x2e\x07\x0f\x3b\xfd\x1b\xed\xa9\xfe\x40\x7b\x63\xbd\xa0\xf0\x94\x75\x8a\xa1\xb8\x2c\xa3\xbe\xe7\x9e\x04\xdf\x53\x8b\x82\x7d\xdf\x54\x65\x51\x06\x01\x81\xa7\x4b\x50\xef\x2c\x96\x6c\xda\xdc\x2f\xb0\xc7\x35\x72\x19\xb5\x4b\xc4\xb9\xbe\x28\x5e\x2a\xfb\x52\x99\x97\xb9\x6c\x35\xa5\x3f\xb0\x31\x79\x55\xe2\x94\x57\x16\xb1\xe1\x13\x63\xbd\xca\x51\x89\xad\x73\x3e\x69\xa9\x94\x35\xfc\xec\x95\xea\x59\x21\xff\xda\x0e\x72\x3a\xc2\xbd\x92\xa4\x36\xdc\x60\xdf\x52\xc1\x84\xeb\x17\xa0\xd9\xf8\x23\x3d\x67\xec\x7e\xdb\xeb\x2c\x0a\x82\x5e\x57\xfa\x6b\xdb\xeb\x42\xde\x67\x06\xfe\x23\x1b\x93\xd7\x25\xfa\x8f\x8d\x98\xca\xaa\x55\xec\x0c\x34\x93\xa9\xec\xed\xe9\x76\xbb\x47\x95\xa9\xf8\x5c\x57\x17\xae\xbc\xf8\xd7\x6a\xf1\xf3\x8b\x12\xd9\xca\x4a\x0f\xe9\xf2\x52\x49\x03\xf7\x73\xa3\x0a\x74\x7e\xd1\xc3\x39\xa0\x8d\x76\x62\x38\x1e\x34\xd3\xa6\x17\x2c\x3a\x5c\x9d\x50\xa4\xf1\x42\x9c\x1d\x1b\x1d\x97\xc2\x33\x46\x74\x0d\xb3\x11\x6b\xb9\x50\x29\xe3\x6e\x36\x45\xb5\x02\xc0\x6e\xa6\x89\xad\xe6\xae\xa8\x06\x44\xb5\xaa\xc4\x54\x15\x2c\xd5\x63\x14\xea\xac\x26\xbe\x54\x53\xb3\x99\xac\xaa\x0e\x12\x96\xb8\x3e\xe5\xb6\xd2\xdb\x6a\xa5\x90\x54\x2b\xe6\xa6\x62\xb1\xa2\x62\xa3\x89\x67\x55\x07\xab\xab\x6e\x36\xf9\xfa\xfa\x81\x33\xee\xfa\x34\xb0\x54\xdc\x2c\x53\x01\xbc\x4a\x49\x50\x9b\xfd\x1a\x0a\xa3\xe7\x98\x18\xa6\x70\xe3\x48\xe9\x75\x22\x06\xa5\x39\x8a\xf2\x05\xfe\x07\x2f\x2b\xf2\xe8\x17\xb1\xb1\x99\x81\x2c\xf3\x25\x63\x6c\xac\xfb\x1d\xcf\x3c\xdc\x68\x94\xc9\x58\xc1\x3a\x41\x25\x5b\x46\x07\x83\x17\x6b\xa5\xa1\x6c\x6f\xd0\x13\xe4\x6f\x58\xfa\xf3\xfa\xd2\x0f\x36\x95\x7e\xa0\xe6\x1d\xfc\xfc\x9e\xeb\x2b\x77\x1a\xcd\xd6\xeb\x2a\xff\x2e\x57\xe1\xf9\x77\x26\xb3\x96\x77\xcc\x52\xdb\x9f\x92\x6e\x97\x7a\x9d\x43\xd5\x6c\xca\xc3\xce\x7c\xae\xcc\xea\xd9\x39\x94\x7d\xd5\x92\x5e\xaa\x6d\x62\x65\x5c\x73\xb9\x43\x51\x04\xbd\x67\xf8\x26\x10\xe1\x18\xbe\xd8\xe7\xe1\x38\x8a\x14\x3c\xb1\x3f\x54\x94\xc8\x01\xfc\xb0\x3f\xc6\xd1\xa8\xb7\xae\x39\xcd\xe6\xa6\xc6\xce\xe7\x9b\xbe\x6e\x31\x66\x94\x2b\x43\xcf\x27\xb6\x69\xac\x7a\x7f\xeb\xe3\xaf\xe9\xd2\x76\x55\xe0\x4c\xb9\xc1\x15\x57\x4f\xa3\x81\x38\xd2\x24\xa1\x3d\x7e\xb8\xbf\xbf\xf3\xf8\x60\x3e\xdf\x3f\xd8\xed\x3e\x3e\xe4\x7d\x52\xd6\xb8\xc1\xa8\xe0\x5e\xf9\x55\x4b\x9d\x27\xad\x2e\x7e\x61\x3b\x74\x91\xab\x50\xdf\xa3\x50\x12\xc7\xa1\x1b\x0d\x9b\xf3\x0b\xa8\xe8\xc6\xd6\x06\xc9\x49\x33\x2a\x4e\xb0\x44\x61\xd2\x6a\x41\x50\xa5\x32\x98\xcf\x09\x6f\xd9\x02\x86\x42\x90\x84\x53\x23\x0a\x70\x66\xf3\x9c\x2c\x5d\x22\xab\xf7\xb7\xec\xa2\x8c\x26\x6d\x69\xd2\xbf\x4c\x93\xce\x69\xb2\xd6\x90\x59\xcb\x16\x85\x36\x8e\xa3\xff\x96\xfd\x0a\x2d\xc6\xa4\x4a\xe9\x48\x18\x1a\x55\xbc\x4a\x87\xa0\x3d\x5b\x47\xc2\xf8\x3f\xd9\xfe\xc1\xee\x4e\xa7\xd9\xdc\x7f\xb8\xbb\xb7\xfb\x4f\xc6\xfb\xfa\xbc\xdd\x16\x17\xad\xc4\x4b\xaa\x14\xc0\xef\xeb\x78\x4f\xb9\xf1\x74\x1c\x1a\xa9\xb5\xa0\xf0\xc7\x7a\x28\xec\x53\x04\x92\x92\xfd\xa2\xb5\xf4\x0b\x5c\x6b\x17\xe2\xfb\xd4\x80\x32\x6b\x71\x52\xe5\x05\x4d\x51\x31\x27\x82\x25\xf5\xe6\x26\x7d\x75\xde\x6e\xeb\x8b\x96\xf0\x0a\xfd\xb8\xb3\xc8\x14\xe5\xb4\xdf\x95\x64\xff\x32\x32\xb6\x7e\x9d\x8e\xee\x22\x27\x88\x82\x96\xeb\xf4\xf3\xad\xff\x50\x6e\x28\x07\xe2\xf6\xe3\xd0\xf6\xae\x58\x07\x6a\x04\x61\x0d\x36\x59\x0b\x9b\xe9\x39\x87\x79\x0b\x8d\xf6\x3d\xe6\xb1\x7e\x9d\x23\x60\xf9\xb7\x76\x06\xbe\xa0\xc0\x97\x71\xda\xae\xca\x55\xa7\x70\x48\xf4\x61\x37\xd3\xf6\xce\x4a\x8a\x5d\x07\x50\x0d\x69\x77\x0f\x89\x28\xd3\x8a\xd6\x59\xa6\x7d\x08\x0a\xa2\xc5\x74\x55\xe7\xc0\x91\x0a\xd6\x35\xc7\xa8\x7a\x1d\x18\x64\xba\xde\x3a\x51\x69\xc0\xba\x20\x0a\xb0\xc2\xd3\xba\x04\xb7\x0b\x43\x4f\xc2\x28\x53\x1d\x87\x9b\xaa\xde\x43\xa5\xfb\xca\x93\x8b\x94\x50\x7f\x6d\xbf\xe3\xcf\x73\x75\x61\x46\x27\xde\x30\x4f\x52\x38\xd0\x08\x39\x96\xab\x95\xbb\x3a\x30\x88\x8b\xf5\xfa\xd9\x32\x30\x24\x17\x9b\xb4\xaa\x55\x05\x80\x63\x91\x64\x65\x91\x92\x2f\xb3\x56\x08\x02\x2c\xc6\xd7\x14\x2b\x39\x2d\x97\x0a\x42\x84\x45\xa3\xb5\x45\x4b\xae\xc9\x15\x85\x21\xbc\x58\xb5\xfa\x68\x75\x97\x15\xba\x31\xaf\xde\x9c\x7c\xfc\xe0\x4e\xb9\x8a\x05\x6a\x66\x01\xd7\xc1\x55\xc9\x99\x3d\xd1\x64\x46\xae\x34\x38\xa7\x57\x61\xdc\x08\xe3\x86\x8c\x74\xe3\x86\x8f\xc3\x41\xc3\x94\xdc\x6a\x38\x2d\xe9\x4e\x44\x1c\xf3\x91\x00\x83\xc0\x28\x47\x03\xc3\x05\x37\xb2\xc4\x66\x37\x69\xed\xf1\x2c\x44\xfc\xee\x36\xbd\x0f\x78\x2c\x1a\xbb\x5e\xea\x20\xf0\xa3\x68\x2c\x78\xc9\x3f\xa0\xfa\x33\xa3\x2c\x7a\x57\x92\x38\xbc\xf1\xe4\xe3\xc7\x77\x8e\xd1\xfa\xb0\xd4\x4e\x56\x4a\x26\x13\x5f\xa8\xc2\x4a\x57\x7d\x04\x97\x8d\xd7\x1f\x4e\x0d\xb8\x47\xd4\x21\x6b\xef\x74\xf7\x1e\xee\x3d\xda\x3d\xd8\x7b\x38\x9f\x17\xcf\x87\x4c\xcd\xe7\xa4\x33\x57\xd4\x68\x22\xb4\xd9\x24\x5b\x61\xfc\x22\x94\xa1\x36\x5d\x31\x9f\xab\x7f\xef\xd2\x3a\x3a\x24\xc9\xd2\xb0\x57\xa3\x61\x0d\xe1\x2f\xde\x7d\x3c\x3a\x2d\x28\x3f\xc8\x4a\xd5\xed\xc6\xac\x94\x6a\x84\x32\xd6\x5c\x06\xe6\xe5\x09\x02\xe1\x97\x96\xe3\x64\x28\x4f\x4e\x8f\x5f\x7f\x78\x59\xe0\x7c\xec\x65\xb2\x2d\x75\xba\x98\x02\xd2\x0d\x2c\xbc\x79\x59\xc0\xee\x67\xb0\xa5\x96\x3c\xcc\xde\xa1\x96\xe4\x86\xb1\xd5\x96\x14\xed\x6f\x4b\xeb\xba\x80\xe3\xac\xee\x77\xaf\x4f\x4a\xad\x79\xf4\xd7\x25\x27\x32\x2d\x2a\x1b\x47\xc7\xc7\x47\x7f\x14\x85\xbb\x1d\x2f\x93\x9f\x83\x95\x0e\x25\x55\xb8\x91\xe6\xf3\xad\xcc\x44\xcf\xc4\x6b\x8a\xf4\xe3\x93\x37\xcf\x9f\x9e\x36\x66\xa1\xbe\x6a\xf0\xc6\x30\x14\xe3\x41\x43\xf2\x89\x18\x34\xfe\xa7\xd3\xd2\x2d\xe7\x7f\x62\x85\x56\x0a\xdf\xa4\x44\x9d\xeb\xc2\xc5\x19\x0a\x22\x68\x5f\x78\xc8\xe8\x53\x6d\x66\x10\x5a\x3d\x96\xc4\xae\x67\xc8\x13\xb8\xc2\xd5\xdb\x58\x23\xa4\x68\x5d\x38\x24\x2a\x5f\x65\x74\x05\xac\xf1\xee\xe3\x87\x97\xcf\x8f\x1b\x1c\x71\x35\x3e\x08\x31\x68\xe0\x62\xd0\x40\x62\x1b\x7e\xa2\x1b\x91\x1c\xdf\x35\x62\x21\x1a\x4e\x2b\x43\xd3\x72\x1a\x42\x6a\x15\x8a\x18\x2b\xf8\x85\x96\x8c\xea\x2d\xd9\xf1\xfe\xb2\x8b\xff\xa2\x81\xb6\xa7\xf3\xee\x4c\x80\x33\xbb\xc4\x25\x76\x60\xb0\xd9\x57\x3c\xfe\x38\x93\x9f\x54\x34\x15\x4a\xdf\x91\x84\xd2\xfb\x12\xb5\xc9\x85\x55\x16\x90\x54\x5a\x16\x31\x53\x0d\x49\x4a\x2f\x67\xaf\xc9\x25\xb1\xbf\xa0\x50\x5e\x67\x9a\xbc\xd6\xa4\x68\xd0\xae\x57\x18\xbf\xd2\x1d\x42\xc4\xa4\x3b\x82\x90\x75\x7a\xe1\x61\x94\xaf\xc8\xad\x56\x4a\x40\x74\x1e\x5e\xa4\x83\x53\xad\x5e\xf4\x02\x16\x10\x53\x59\xa9\xa6\x20\xab\x65\xcf\x2b\xc8\xaf\xf5\x34\xbe\xbe\xc2\x92\x46\x34\x88\xb4\xc4\x7e\x4e\xd7\x90\x9d\x81\x6f\xa8\xea\xf9\xae\xdf\xf3\x99\xef\xfa\x29\x31\xbe\xf5\xe9\x84\x43\x52\x23\x65\xc8\x5e\x1b\x84\x30\xcc\x89\x99\x68\x72\x87\x2d\x1f\xd2\xbc\xe9\x5e\x4d\x38\x5b\x17\x51\xfa\xb5\x53\x9a\xe1\xd2\xb4\xaa\xf0\xdb\x6c\x6f\x76\xcd\xaf\xdc\x1c\xb8\xb7\x3d\x6c\x05\x38\xee\x0d\xa4\x3d\x18\x54\x07\x70\xa4\xcd\xb2\x83\x03\x88\xfb\x09\x81\xcb\x4b\xfd\x69\xac\x84\x92\x4f\x7b\x52\xde\x42\x9d\x91\x48\x40\x4e\xc6\x8a\x0d\x55\xbb\xf1\x54\x94\xbe\xaa\x6a\x16\xf9\x12\xf5\xfc\x76\x2a\x02\x1d\xca\x91\x59\x94\x70\x31\x2a\xfc\xf2\x32\xf7\xd8\x2d\x7b\xb2\xa5\xbb\x6d\x56\x80\xdc\x85\xbb\xd5\xed\x2d\xad\x53\x1d\xaf\xda\xf5\xd2\xe5\x06\x8f\xcb\x7b\xe9\x32\x96\xae\x4b\xe9\xd2\x90\xca\xfa\x8a\xc8\xdd\xea\xd4\xc5\xb5\x1b\x20\x8e\x20\x13\xc3\xa9\x4c\xcd\x26\x6c\x0a\x36\x95\xb9\xff\x38\x17\x9c\x39\x86\x01\x62\x18\x34\x9b\xcb\x50\x25\x5a\x05\x42\x89\x55\x50\xbb\x05\xd4\x10\xa1\x86\xcd\xe6\xc8\x40\x8d\x40\xb9\xa3\x62\x1a\xe4\x50\x57\x08\x75\xb5\x0a\x57\xbe\xb8\x94\x10\x94\xd8\x6f\xb4\x5e\x6b\xde\x2a\x54\xee\x62\x10\x4a\xea\x73\x4f\x1c\x6a\xdc\xc8\x34\xcc\x67\x2a\xc6\x4d\xb5\x73\x71\xb1\xce\xfb\x3f\x5b\xab\x88\xa2\xc2\x63\x57\xdf\x70\x78\x47\x14\x18\x01\x08\x92\xb6\x1c\xa7\xac\x18\xdf\x95\x39\x50\x22\xce\xdb\x4d\xe6\x9d\xdd\xc8\xd4\xa9\x1e\x7c\x2d\x99\x41\x5b\xa0\x3b\x2a\xa1\xbb\xdf\xf6\x3a\xc0\x8d\xd2\x9c\x7f\x3e\xa9\x7e\xee\xd6\x3e\x9f\x56\x3f\xef\x80\xef\x49\x08\x3c\x53\x85\xd5\xd2\x9f\x6f\xd0\xd2\x77\x11\x7a\x80\x8a\x3f\x7c\xdb\x00\xb8\x57\x02\xc4\x56\x7c\x97\x65\x9f\xfc\x53\x24\x42\xa2\xeb\x19\x84\xf7\x5d\xb6\x5a\xa9\xa9\x80\x3d\x78\xe5\x9d\x5f\x2c\x32\x09\x79\x66\x60\x41\x16\x2d\xb8\x2c\xcf\xf8\x53\x49\xca\xd3\x5c\x92\x23\x49\x9e\x1a\x00\x4a\xcb\xf3\xfc\x4d\x4a\xa0\x74\xaf\xac\x81\xa4\x28\x20\x62\x6c\xf2\xbb\x4a\x4b\xca\x63\x51\x43\xff\xc6\x7e\x05\x5b\x0d\x56\x61\x9b\xf7\x41\xb2\xad\x2e\xbc\x92\xc6\x32\xcb\x2b\xc5\x0a\x8c\x9c\x78\x25\x53\x4f\x36\x85\xad\x0f\xa9\xbf\xdb\x94\xe8\xf4\x24\x7b\x25\xdd\xf8\x2a\x1c\x6a\x42\x7b\x74\xab\x1c\x15\x82\x3b\x3a\xca\x1d\xa6\x16\xb3\x34\xf3\xc9\xdd\x36\x2c\xde\xb1\xfb\x62\x5d\xf3\x4f\x0e\x37\x32\xb6\xe7\x08\xc5\x8f\xec\x51\xe5\x8e\x98\xf9\x19\xa2\x88\x35\x93\xc7\x36\xc8\x20\xc4\x0f\x3e\x31\xe8\xcc\x72\x93\x41\x2e\xc4\x38\x16\x86\x5a\x0c\x1e\xc9\xf7\x19\xdc\xa1\x1b\x60\xd5\x7e\xa5\x27\x0c\x1e\x69\xba\x10\x5d\x10\xe1\x90\xec\x5b\x6a\x52\xf2\x94\x7b\x55\x9d\x83\x69\xc5\x43\xac\xf8\x2a\x6b\x32\xc5\x4a\x1b\x86\x06\xc3\x5d\xe8\x84\xec\x78\x5d\x63\x0a\x1a\x50\x08\x3d\xe5\x8e\x16\x90\x95\x1d\x2c\x16\x0b\x22\x69\x0f\x7b\x7b\xb1\xd8\x60\xcd\xbd\x36\x03\x25\x40\xba\xc1\x33\xf3\xe7\xb1\xf9\xb3\x57\x2c\x08\xcb\x31\x37\xf4\x7e\xb1\xa8\xec\xe0\xbd\xae\x19\x72\x76\xed\x9a\x91\x81\x04\x09\xaa\xaf\xdc\xe1\x98\x8f\x62\xef\x26\x0a\x07\x8d\x0e\xed\xe1\x2a\x36\x9f\x4f\x49\xea\x16\x8d\xd8\xfd\x02\x42\x46\x02\xa6\x09\x2e\x65\x66\x25\x66\x9c\xf8\x10\x9a\x45\x71\x85\xed\x0f\x02\xa5\x94\x30\x1a\xd0\x47\x99\x79\xa7\x3e\x1a\xf1\xd4\x4b\x5c\xde\x6c\x12\xa2\x99\x9e\xcf\xef\x17\xf4\x5c\x5c\xb0\xc4\xe5\x04\xcd\x24\x30\x10\x2b\x10\x0a\x76\x3f\x42\x8b\xda\x92\xb8\x80\x84\x49\x37\x00\x6e\x74\x64\x30\x7a\x8e\x40\x3d\x67\x98\x6f\x4f\xb9\x57\xec\xa9\x24\x33\xf2\x5c\xe6\x1d\xd5\x28\x87\x2c\xe1\x17\x09\xf7\xdb\xde\x3e\xf8\x5e\x99\x19\xec\xde\x8d\x74\x79\xc5\x9d\xec\x6e\xf7\xef\x08\x07\x81\xc2\xcd\x0b\x9a\xcd\xa8\x7f\x8b\x31\x7d\xca\x0d\x41\xb9\xdf\xcd\xdb\x3b\x7c\x11\xf4\x95\x6b\x86\xda\xbc\x32\xc3\x00\xd2\xf5\x29\x5d\x90\xb2\x7f\x4d\x2f\x48\x04\x7e\x69\x80\x7c\xdb\x54\x33\x26\x02\xa4\xe9\xd6\x21\x09\x8d\xae\x00\x8a\xc2\x4b\x49\x22\x08\x5c\x1f\x12\x12\xd2\x1c\x47\xf5\x2d\xf0\xfe\xfd\x34\x52\x3a\xf6\xf8\xc2\xbb\x4f\x77\xb7\x24\xbb\x5f\xe0\x00\x1e\xff\xaa\x4c\x50\xee\x88\xd4\x45\xc2\x9a\xf5\x62\x46\xde\x49\x90\xee\x15\xa4\x62\x5b\x55\x59\xee\xeb\xe6\x68\x30\x14\xe6\xd7\x9e\x82\xb1\x11\xe8\x85\x6c\xfb\x59\x97\xe8\x13\xf3\xdd\xb4\xe1\xd9\x46\x51\x2e\x3d\x09\x51\xcd\x87\xf3\x32\x5f\x8c\x90\x85\x20\xc9\x76\x3a\x91\x2d\x5f\x48\xb2\xd5\x01\x05\x09\x2e\x74\x14\xcc\xef\x2e\xe8\xfc\xb7\xa4\x6f\xd2\xf5\xf4\x7e\xdb\x73\x86\xb7\x0e\x70\x2f\x39\x17\x17\xf3\xf9\x7d\xe8\x9d\xc1\x77\xef\xac\x12\xb5\xf6\xa2\x34\x6f\x53\x2d\x49\xe5\x5a\x52\xd7\xb3\x13\x40\xb9\xd7\xc0\x19\xe1\x2c\x81\x88\x09\x98\x11\xd9\xff\x28\xcf\xf9\x85\x2b\x3c\xfb\xef\xb0\xa2\xe7\x15\x5b\x89\x51\x4f\xe1\x76\xd5\x0f\x6a\x44\xe7\xd4\xc8\x8d\x7c\x09\x36\x3a\x62\xb1\x1d\x65\x26\x08\xd1\xe7\xc9\x85\xa9\x86\x43\xc2\x48\x82\xce\x66\x5a\xa2\x1b\x64\x3f\x71\x43\xf6\x9a\x70\x48\xdc\x90\x7a\x89\xfb\x3d\xfd\xf1\x9d\x42\x42\x73\x67\x42\x61\x48\x28\x77\xd2\x0b\x5c\xdf\x98\x04\xae\x4f\xb1\xad\x86\x39\x4d\x6b\xd3\x8a\x7b\x15\xb7\x05\x92\x91\xf6\x89\x1b\x81\x86\xfb\xa9\xa7\x5c\x09\x3f\x3c\xb1\xb0\xcb\x14\x87\xa8\xe8\xbc\xcf\xd8\xdc\x8f\xf2\x5c\x5e\x34\x9b\x53\xb2\x5b\xea\xd7\xf7\x55\xae\x43\x48\x40\x48\x76\x2f\xbc\x2f\x12\x94\xa7\x80\x7b\x4f\xe4\x02\xbe\xe6\x6b\xe0\x97\xb5\x5a\x4e\x25\x6c\xe5\x49\x3e\xe1\x35\x04\xec\xfc\x02\x22\x86\x98\x5d\x65\xa4\x9d\x66\x1d\xa8\x4d\x0f\x3b\x18\xb1\xd0\xa7\xe1\x44\x44\x49\x49\x66\x67\xab\x35\xa5\x0b\xd0\xf9\x60\x94\x3e\x07\x63\xc1\x55\x56\x4c\xa1\x3f\x28\x83\xb2\x75\xfa\x2c\xb4\xed\x72\x83\x35\x7e\xff\x9e\xca\x36\x2d\x69\xa1\x02\x06\x90\xb0\x88\x28\xb4\x09\xad\x79\x92\xe9\x8f\x1c\xc3\xa2\xf8\x05\x29\x02\xe5\xc2\x05\x85\xfb\x38\xf1\xe3\x40\x85\xbe\xa8\x88\xbd\x20\x5b\xd5\x17\x90\xc8\xd5\x20\x44\x9a\x25\x20\x48\x1d\xf6\x94\x96\x5c\xcb\xf4\xb0\x33\x9f\x07\xb8\x31\x80\xbe\xfc\x2e\x5d\xd8\x59\xfb\x43\xf6\xd6\x48\x9e\x55\x06\x0d\xee\x85\xd2\x4c\xcd\xfa\x24\x99\x93\xc8\x81\x18\x86\x52\x0c\x0a\xdb\x7c\x10\x05\xc9\x44\x48\xdd\xcf\x1e\xbc\xfb\xd2\x8e\xff\xdb\x5c\x39\xe2\xd3\xa9\x90\x83\xa7\x57\xe1\x78\x60\x3a\x7c\xd5\x02\x2b\x98\x70\x65\x34\x10\xc5\xb2\x31\xe5\x4a\x48\xfd\x21\x1a\x08\x57\x89\xe9\x98\x07\xc2\x22\xd8\x56\x44\x96\x97\xdc\x05\x05\x41\xe1\xbe\x22\x6f\x7e\x5f\xa9\xcb\x9a\x96\xfc\x51\xe1\xc7\xb2\x5b\xf4\x2f\x36\xc1\x3a\xa5\x31\xbf\xcf\x64\x08\xef\x89\x16\x4b\x5c\x7f\x3e\xef\x40\xba\x97\x95\x14\x5b\x6c\xad\x62\x97\x0a\x85\x6c\xe0\x05\x30\xf0\x06\x0a\xe3\x1f\x3d\x0d\x43\x8f\x83\xef\x09\xd4\x10\x48\xba\xe2\x83\x54\xff\x1d\x04\xfe\x1a\x89\x3b\xbf\x44\xa2\xdd\x99\x51\x9b\xb4\xf4\xef\x9e\xc4\x25\xc5\xf7\xba\x2d\xa2\xb0\x72\x5a\x19\x20\xad\x6a\x65\xf6\xcd\xf2\x03\x13\x4f\xc1\x75\xa6\x59\x2c\xd6\x08\x0e\xad\xc8\xb9\x04\x75\xb1\x42\xef\xb2\x7a\x63\xca\xb4\x42\x6d\x30\x86\x2c\x0e\xd0\xab\xb0\x64\x61\xcf\x0b\x74\xa7\x2b\xb6\x41\x21\xcc\xf1\x80\x58\x85\xa9\x08\x87\x46\x5c\x5c\x31\xb2\x71\x03\xa0\x84\x0e\x92\x55\x08\xcb\x61\xd2\x8b\x5f\xd8\x20\xa8\x20\x04\xbe\x0a\x65\x35\x72\x7a\xf1\x4b\x5b\x08\x35\xb4\x10\xac\x42\x5c\x8f\xa5\x5e\xfc\xe2\x36\xc3\x12\x72\x88\x56\xa1\x5f\x0e\xae\x5e\xfc\xf2\x66\xc4\x8a\x2a\x20\x5c\x55\xc9\xaa\x60\xeb\xc5\xfa\xc8\x0d\xa3\x9f\xf0\x8e\x53\xd2\x81\x28\x04\x1b\x66\x8a\xc3\xbb\x65\x60\x88\x36\xc2\xee\x54\x60\xc3\x8d\xb0\xbb\x65\xd8\xde\xba\x79\x80\xa0\x7b\x06\x54\x41\xe4\xdd\x0f\xb1\x84\x5e\x54\xa6\xea\x50\x15\xb2\xd4\x31\x6b\xd1\x54\x3b\xc6\xa0\x72\xa6\x8e\x27\xd7\xcc\x51\xd3\x09\x68\xae\x6d\xf7\x67\x84\x2b\x30\x0a\x07\xd1\x4c\x82\x64\x63\x81\xfb\x8b\x11\x35\x02\x47\xb8\xdb\x46\x34\xf7\xef\x88\x2f\x40\x1e\xee\xf6\x63\xe5\x8d\x15\xc4\xc2\xa8\xbe\xc2\xe5\xd4\x9b\x91\xa1\x48\xfd\xc4\x0b\x4a\xbd\x34\x3e\x0d\x44\xb6\x9b\xa7\x20\x5e\xd7\x0f\x8d\x4b\x22\xed\x72\x6c\x44\xa2\x19\xb3\xb5\x3d\x16\xbc\xf3\x0c\x68\xf0\x8e\x02\x7f\xe2\x29\x97\x3f\x01\x7e\x63\xfe\xbd\xa9\x74\x05\xca\xc5\x92\x2e\x78\xbf\x28\x85\x95\xe5\x4e\x23\x0e\x82\x69\x77\x1b\x12\xa6\x5d\x89\x21\x00\x51\xcf\x0c\xde\x16\x63\xa2\x4f\x34\x53\xa8\xba\x12\xf3\x0f\x33\xab\x97\x19\x2c\xc6\x98\x68\x36\x9d\x60\xcc\xe3\xd8\xfc\x48\xfa\x37\x8a\x68\x7b\x5a\x01\x55\x48\x4e\x3d\xfb\xf5\x03\x9f\x88\x1c\x42\x59\x08\x85\x10\x8b\xe5\x30\xb8\x1b\x55\xd1\xbb\x99\x3c\x57\x17\x3d\xf3\x87\x89\xbe\x68\x39\x0d\xa7\xa5\xbd\xd2\x79\xb5\x6d\x55\x75\x7f\x6d\x67\x16\x78\xbe\x45\x60\x20\xdc\x6b\x8c\xf0\xbc\x66\xd2\x9d\x60\xfc\x31\xcd\xbc\x07\x39\xd8\x27\xe9\x06\x4a\x70\x2d\x4e\xc5\x2d\x2e\xe1\x36\xda\x2e\x1c\x92\x3d\x04\x2b\x79\x77\xa5\x7b\x8d\x26\xe4\xf7\x9e\xf9\x24\xdc\xed\x1e\x5d\xda\x03\x48\xfa\x09\x3b\x4f\x40\xb8\xdf\x2f\xbc\x6c\x27\xda\x28\xc8\x46\x69\xb8\xee\xd9\xb8\x8f\xfb\xef\x5e\x02\x53\x4f\x65\x0e\x1e\x12\xb0\x6d\x45\x04\x18\x1b\x59\x8c\x27\x97\xe2\x46\x48\x7d\x69\x54\x8c\x4b\x25\x86\x8c\x43\xb0\x08\x87\x64\xb7\x4c\xf5\x44\x11\x63\xc0\x5e\x11\xe9\x8e\x28\x28\x90\xee\x80\x42\xd0\xcb\x1d\xf8\xfd\xbc\x59\xcf\xc7\xc2\xa8\x3b\x1f\x4e\x88\x74\x87\x80\x1b\x59\xf5\x6f\xb8\xbd\xd5\xfb\x21\x9b\x4d\x87\x9b\xf9\xe2\x06\xcd\x66\xe0\xf2\xc1\xe0\xb9\x21\xe4\x5d\x18\x6b\x21\x85\x22\x4e\x30\x0e\x83\x6b\x07\x7e\x48\x12\x50\x0a\x86\x84\xb4\xe6\xdc\xb9\x18\xa1\x51\xbd\x62\xdb\xe0\xad\x24\x01\x6c\x2b\xd2\x35\x8d\xe8\x47\xe7\xe1\x85\x67\xfe\xe0\x46\x40\xae\x68\x06\x25\x9f\xb6\x5a\x72\xae\x1b\xf3\x4b\x97\x43\x56\x7a\x46\x24\x99\x81\xe8\xaf\xf4\x25\x30\xe9\xc6\xfa\x6e\x2c\x56\x46\xa4\x2e\x88\x84\x84\x7a\xe9\xe4\xaf\x62\x28\xdb\x7e\xd2\x0c\xc8\x8b\x18\xb9\x08\x9f\xcc\x34\x28\xcc\x41\x5d\x84\xf2\x88\x0b\x08\x98\x31\xf5\x0c\xeb\x70\x74\x03\x05\xf6\xaf\xfb\xc3\xdd\x66\x8c\x71\x34\xec\xdc\x1f\x8c\xf7\x82\x48\xea\x50\x26\x62\x21\x5d\x25\x26\xd1\x8d\xa8\x76\xb4\x30\x2b\x50\x50\x38\x34\x42\x30\x53\xb9\x74\xee\x27\xb3\x29\x86\xee\x0f\xd0\xec\x06\x45\x07\xc8\x6c\x0b\x44\xd3\x52\xaf\x41\x62\xc4\x98\xa2\xa0\x98\x76\x39\x70\x96\xf4\x93\xc3\xdd\xbe\x72\xb9\x67\x84\x88\xa7\x40\xb3\xae\x99\xa2\xca\xf5\xbd\x5d\xc6\x92\x66\x13\x65\x4a\xc0\x88\x6e\x36\x4d\x17\x46\xd3\x4f\x2a\x9a\xf2\x11\xb7\xcb\x0d\x90\x9d\x25\xf0\x1b\x6a\x40\xa7\x0a\x19\xf7\x99\x18\xf2\x64\xac\x09\x85\x90\xf6\x04\x0b\xdc\xef\x3d\x1b\xdc\xbb\x1c\xb5\x2e\x28\x67\x82\x70\xda\x43\x1f\x58\xc1\x44\xb9\x35\x12\xb5\xdb\x3d\x03\x73\x1e\x5d\x18\x30\x63\x47\x4c\x17\x01\xe1\xe8\x25\xc9\xd6\x6e\xf7\x07\x93\x30\x5c\x10\x05\x9c\x82\x5c\xe6\x5b\x01\x01\xf8\xaa\xd9\xbc\x9f\xf2\x38\x0e\x6f\x84\x37\x36\x75\x1e\xee\x18\xed\xc1\x08\xb6\xc0\xba\xe0\xd6\x8f\x85\x05\xcb\x54\x3d\x64\x11\xe4\x9d\xdd\x55\xdc\x97\xab\xba\x96\xe3\x4a\xb1\x3e\x3d\xd1\x97\x6e\x2c\xf4\x91\xd6\x2a\xf4\x13\x2d\x88\x3d\x62\x96\xd6\x5b\x7a\x4d\x17\x39\x7f\xee\xfd\xbd\x3a\x20\x61\xc2\x1d\xa2\xb4\x89\x96\xea\xfb\x70\x42\x12\x58\x5d\xa7\xfd\x54\xd4\x7b\xc3\xc7\x89\xc8\x45\xfd\x95\x08\xae\xc5\x20\xfd\x89\xce\x36\xc6\x12\x33\x27\xd0\x0d\x47\x17\x0b\xad\xee\xee\x67\xa1\x1c\x44\xb3\x15\x62\x43\x3b\x76\x57\xe0\x23\x8a\x4a\xd7\x9a\x66\xf9\xa6\xe6\xfd\x02\x9c\x74\x60\x1c\xb8\x1f\x09\xed\x95\x54\x1b\x5f\xb1\xad\x8e\x51\x4d\x8a\x50\x8a\xd2\xce\x55\x65\x09\x38\xcf\xa3\xcc\x47\xa9\xec\x80\x0e\x2d\x9f\x70\x9e\xaa\xb2\x09\x77\xbf\xed\x29\x50\x9e\x86\xd8\x13\xa0\x53\x3d\x1e\x92\x4c\xa1\xcf\x1d\x25\x45\x30\x51\x69\xeb\x45\x55\xce\x7b\x60\xec\x65\x26\x98\xa4\x51\x13\x8c\x36\x61\x26\x63\xb2\xc5\x98\x15\x05\xdd\x2d\xec\xb1\x1d\x7c\x51\xf6\x76\x4c\xcd\xda\xd9\x01\x81\x1b\xa2\x6c\xb5\x1f\xc7\xc8\xd4\x5f\x3c\xcc\x64\x96\xd7\xfc\x48\x5a\x6a\xc9\x49\xd7\x18\x4a\xd2\x1d\x80\xf0\x04\x0c\x3d\xb3\x0e\xf8\x9e\x74\xfd\xc5\xc2\x08\x06\xce\xba\x8b\xd4\xf7\xc4\x53\xcf\xd3\x7e\x65\x37\x78\x0c\x91\xa9\x1c\x42\x16\xe4\xfb\x8a\x2c\x64\x8c\xe5\x12\x7e\xd8\x6c\x86\x66\xa6\x0e\x59\x70\x1e\x1a\xe6\x30\xb2\xdd\x74\xc0\xb0\xdc\x56\xa2\x70\x21\xbe\xa6\x3d\xf3\xa0\xcc\x8a\x6c\x15\xa3\xda\xd8\xb9\xd7\xa0\xdc\x6b\xf0\xcd\xf8\x61\xb9\xce\xa1\x9f\x47\x97\x61\x7f\x75\x41\x80\x4f\xf3\xd0\x91\x8c\xd8\xd8\xac\xcd\x30\x66\xca\xfd\x0e\x03\xb6\xd5\x85\x1b\x53\x1d\x2e\xd6\x37\x66\xb1\x1e\xb0\xad\x0e\x2c\xad\xd8\x71\x3f\x66\xe7\x31\xdc\x98\x15\x3b\x4e\xc3\xb7\xcd\x8a\x7d\xc3\x6e\xdc\xeb\x7c\x65\xdb\x66\x2a\x45\xb5\xbd\x1e\xd5\xb8\x3f\x66\xe7\x63\xd8\x36\xa8\xc6\x16\xd5\xb6\x41\xb5\xcd\xb6\xdd\xeb\xac\x89\x83\x66\x33\x4e\x9b\xb3\xc5\xd8\x38\x7d\xec\xd7\xb9\xc1\x23\x64\xb0\x6e\xda\xb3\x4e\x4f\x1f\x16\x67\x0c\xec\x4e\x9e\x3c\xd7\x17\x86\x13\xcf\xf5\xc5\x8a\x6d\x3c\x12\xc3\x98\x7a\x31\x63\x6c\x4c\xe7\x73\xac\x67\x07\x04\x8c\x6d\x17\x9b\x7e\xbf\x81\x6d\xc3\xd2\xad\xee\xd2\xde\x37\x0e\x82\x74\x39\xee\x2b\xf2\x74\x0c\x76\xd1\x8d\xcd\x97\xb6\xd1\x11\xdd\x2c\x9f\x21\x70\x5b\x0f\x33\x5a\x82\xb8\xce\x20\x76\x3d\xdc\x3f\xbe\xc2\x7a\xae\xd6\x4e\x13\x9f\xdd\x19\x2e\x19\x80\x32\xaa\x87\x9f\xd2\xb3\x87\x3c\xd1\xf3\x99\x72\xc3\x62\xc3\xb5\xdc\x82\x0c\x72\xdf\x72\x4f\xd9\x81\x5c\xa2\x26\x49\x97\xf4\x5e\xbe\xa1\x6c\xd6\xb6\x74\x37\xb7\x4f\x08\x2f\xd7\x4e\x4b\x95\x73\x63\x8c\x66\x72\x81\x7a\x25\x8a\x4b\x67\x8e\x55\x4d\xc1\xc8\x2c\xb5\x22\xf4\x43\x52\xa3\xd6\x6c\xe1\xd2\x6a\xd4\x93\xec\x69\x37\x7f\xda\xc3\xa7\xbe\x0d\x14\xe9\x93\x88\xc9\xf3\xe4\x82\x32\xc6\x88\x0d\x73\xa6\xcd\x66\x2a\xbf\xd3\x12\x99\xfc\xb6\x32\x28\xd5\x79\x74\xb3\x49\x48\xc0\x22\x6a\x94\x13\x12\x31\x4e\xdd\x6d\xdc\x86\x0e\x5c\x0e\x51\x7a\xdc\x8a\x08\x26\xec\x7e\x8b\xd5\xeb\x2b\xbf\x75\x3f\x55\xc0\x74\xdf\x71\x32\x55\x4a\x9b\x0a\x76\xed\x5b\x2b\x4b\xd1\x56\x33\x62\x69\x08\x51\x26\x5e\xbd\xe5\x93\x3e\xe7\xc9\x85\x41\x63\x56\x0a\x2f\xed\xe4\xec\x68\x9a\xa9\x11\x12\xd3\xd9\x75\x82\xb0\xdb\xc2\x34\x62\x06\x7b\xaf\x42\x74\x68\x04\x62\x58\x3e\xdb\x59\x1c\xe2\x2e\xc9\xf0\x4c\x72\x0b\x94\xdc\x02\x24\x4b\x32\x41\xa7\x18\xcf\xa6\x99\x3a\x94\x7d\x1c\xd4\x03\x10\x70\x7f\xe3\x29\x08\x3d\x3c\xdc\xe0\xc9\x43\x95\xf2\xc1\x43\xfb\x49\x82\xf0\xf8\xa2\x50\x8b\x03\x26\x0f\x55\x1f\x2d\x57\xd6\xe9\x45\x87\x41\x2f\xca\x82\x41\x42\x96\x9c\x47\x17\xbd\x91\x22\x21\xf0\xf3\xe8\x02\x34\xb4\x5a\x36\x76\x35\x44\x67\x54\x89\x4b\xaf\xd5\xea\x03\x39\xc0\xd9\xfd\x22\xf3\x45\x5b\x05\xdc\x34\x63\x98\x0b\x68\xf0\x59\x98\x3d\xc6\xac\x03\x63\xd6\x81\x01\x13\xbd\xf8\x70\xd8\x6c\x8e\x0f\xfd\x74\x83\xf5\x06\xb6\x19\xb9\x61\xd1\x79\x7c\x41\x5d\x0e\x13\x46\x9e\xb3\xf0\x7c\x8c\x3f\xae\xd8\x8d\xeb\xc3\x94\x3d\x77\x7d\x23\xd8\xb7\xb7\x18\x9b\xd8\x52\x23\x98\xc1\x1d\xdc\xc2\x35\x1c\xc1\x89\x29\xdc\xea\x5e\xc0\xa9\x29\xd8\xea\xe2\x22\x70\xd2\x6c\x92\x19\x3b\x71\x7d\xb8\x63\x13\xc3\xa6\x23\x76\x62\xf8\x0b\x4e\x9b\x4d\x72\xcd\x4e\x5d\x1f\x8e\x98\xd1\x90\xc9\x2d\x3b\xc5\x0f\x47\xcd\xe6\x1d\x1d\x29\x72\x05\xd7\x90\x40\xab\x35\xa0\x70\xa2\x30\xd9\xc4\x36\x4c\x61\x6c\x54\xb2\x41\x8b\x5d\x59\x4f\xe1\x69\xf6\x65\x66\x21\x07\x2d\x36\xb3\x5f\xe2\x16\xdb\x81\x71\x8b\xed\x58\xfd\x32\x1c\x92\x23\x3a\x68\xb5\x32\x5c\x93\x0c\x57\x5e\xd3\xa0\x8c\x37\x6e\xb1\x6e\xb5\xf4\x1d\xcd\xeb\xba\xca\xeb\x4a\xa1\x47\x8a\xcc\x60\x9a\x51\xbb\x4c\x43\xb7\x97\x6d\x2e\x6f\x9d\xcc\xe7\xa3\x2d\xc6\x6e\xa9\xaf\x04\xbf\xee\xd5\x71\xd6\xa9\xab\xd5\x71\xbd\xbe\x8e\x9d\x85\xd5\x64\xb1\x3d\x65\x5a\xf2\x16\xb5\x60\xdc\x6a\x2d\x70\x5b\x20\x3e\x1c\xf6\xb2\xf6\x94\x06\xdd\x8e\xf3\x72\x41\x7b\xbc\xb2\xe0\x95\xe7\xf0\x8d\x7d\x9b\xcf\xcf\x2f\x7a\x29\xbd\x25\x5e\x79\xee\xfa\x90\x2a\x54\xdf\x28\xd6\x48\x3a\x87\xd9\x94\x9a\xcf\x3b\x87\x41\xfe\xfc\x2d\x93\xa0\x8f\xcc\xcc\x99\x79\x09\xdc\x7a\x01\xdc\x79\xdf\xd2\x0d\x9f\x23\xc5\x9c\x4b\x31\x9e\xfc\x7e\xf0\xe4\x5d\x29\xa9\xcd\x89\x5a\xb5\x35\x8d\xe7\x0f\x4d\x0f\x07\xd9\xda\x91\x1e\x0a\xbb\x57\x5e\x02\x47\x5e\xc0\xee\x03\xaf\x03\x3f\x3d\x01\xe6\x45\x9c\x7b\x6f\x53\x3d\xc3\x94\x67\x01\x9a\x51\xc6\x4e\x0d\xdc\x80\xde\xd7\x30\x2c\x28\x04\x6e\xc0\x76\xd2\x1d\xee\x8a\xe2\x12\xb8\x3f\x41\x40\x04\x81\xab\x0c\x94\x62\x89\x45\x1b\xb8\xb1\x1b\xb3\xfb\x99\x17\x59\x0c\x8b\x8c\xfa\xd6\x91\xca\x5c\x99\x45\x70\xca\xf2\x4a\x94\xb7\x8b\xe7\xc1\x05\xdc\x92\x96\x11\x12\x54\x09\x11\xc0\xdd\x9f\x10\x40\x92\x2e\xee\x53\x45\x14\x3c\x86\xc4\x74\x70\x00\x47\x46\x34\x2d\x4e\xab\x34\xd8\x30\x84\x7b\xc5\x72\xd8\xcc\x83\x8e\x9d\x72\x1f\x78\xdd\x52\xbf\xa9\xf2\xda\xf9\xbc\x24\x95\xb6\x4a\xdb\xe6\x35\x8f\xa9\x15\x76\x46\x49\xed\xd9\x70\xbe\xd0\x55\x96\xa9\xcc\xda\xca\x53\xb6\xf2\x21\x66\xa1\x55\x9e\xcd\x10\xc4\xfd\xe7\x86\x1e\xed\x5e\x43\xe8\xc6\x10\x51\xef\x11\xbe\x25\xa1\xab\x99\x82\xd0\x4d\x58\x04\x9d\x43\x62\xe4\x5b\xec\xce\x68\xae\x26\xda\xea\x7d\xe8\xa4\xd5\x53\xef\xf1\x72\x41\x62\xea\x8a\xcd\xb2\x12\xbb\x47\x6e\xcc\x94\x45\xb5\x19\x11\xf5\xca\x38\x28\x6c\x11\xd3\xaa\x56\x0b\x37\x4b\x09\x36\x8b\xfe\x33\x67\xc0\x04\xb9\x78\xcc\xb4\x6d\xd3\x1e\xea\x5f\xb9\xf0\x1e\x30\x9d\x2a\x95\x03\xab\x54\x0e\x0a\x35\xd1\x54\x3c\xb0\x1d\xd8\xea\x42\x00\x6a\x85\x6b\xc8\xce\x91\x1b\xa6\x5d\xd1\xcb\x94\xd4\xe0\x2a\x1c\x0f\x3e\x44\x03\x11\xe7\xcb\xcf\x84\x75\x7a\x93\xc3\x9b\x6c\x21\x9b\x64\x6b\xcf\x95\xb1\xfc\xd9\xb8\x7f\x73\x3e\xb9\xf0\xcc\x1f\x94\xf0\xad\x16\x6f\x11\x3b\xf1\x71\x2a\xf0\x43\x36\x6c\x36\x87\x87\x6c\xda\x6c\x92\x84\x49\xb2\x7d\x3e\xb9\x80\xab\x74\x6c\xa7\x90\xf7\x41\xad\x07\xf2\x2e\xe8\x71\x36\x5d\xe4\xfd\x91\xd9\x66\xd0\x01\xe5\xfa\x50\x4e\xac\xf2\x4d\x2d\x6d\x5a\xa0\xab\x2e\x53\x91\xa5\x47\x4a\xcc\x06\xdf\xcd\xb3\x2e\x07\x26\x7e\x57\xab\x14\x65\x55\x56\x94\xeb\xb6\xb2\x06\x51\x8b\x1c\x59\xda\x87\xcf\xf5\xe0\x95\x4e\x22\x26\x4b\xdb\x7f\xa0\xd9\x36\x32\x2c\xed\xe9\x15\xe3\x35\x9f\x93\x55\xaf\xad\x97\xa9\x3e\xb6\x3d\xd1\x6c\xea\x2d\xc6\x64\xb3\x59\xdb\x56\xd4\x20\x4b\x47\x98\x71\xb7\x3c\x06\xe5\x26\xb5\x58\xfa\xd4\x89\xe6\x26\xe6\x3b\x85\xfa\x66\xbb\xcc\x90\x3e\xe3\x9a\x93\x0e\xc8\x5c\xe7\x29\x41\xe7\x6a\xbd\xed\x5a\x37\xae\x2b\xf3\xab\x48\xef\xaf\x7a\xe9\x7e\x67\xca\x8d\xbd\x55\x9f\xd8\xfd\x77\xcf\x34\x61\xea\x29\x37\x59\x64\x55\x1f\x78\xe5\xf3\x53\x71\x9a\x86\x45\xbb\x21\x86\x2e\x66\x1e\x0c\xdb\x23\xb2\xc4\xf6\xe7\xda\xbd\x29\x54\x3e\x99\x85\x83\x16\x0a\x13\x41\x7c\x14\xd5\xbd\x4a\x41\xc1\x4c\xd1\x9e\xc8\xd7\xaa\xb4\xa6\x50\xc6\x42\xe9\x27\x62\x18\x29\x41\xb6\x15\x49\x30\x5e\xd2\x4d\x28\xf0\x7a\x3d\x8f\x8d\x09\xb3\x95\xd6\x40\x0b\x27\x42\x79\x83\xb8\x44\xb6\xe9\x67\x2b\xc0\xb5\x7b\x54\x36\x56\x1a\x9d\x2d\xb3\x00\x29\xf4\xab\xad\x2d\x1c\xb8\x31\xb3\xb3\xc0\x9d\xe5\x43\xf6\x68\x15\xbb\x66\x5e\x12\xdb\x91\xd5\x2f\xe1\xb0\xec\x6e\xd0\x2c\x77\x0f\x3f\x4b\xb7\xca\x5f\x28\x3e\x42\x3f\x71\x9e\x0b\xa7\xdc\x3f\x99\xfa\x7c\x2e\x2e\xdc\xa3\xde\x5b\x69\x2c\x4b\xc6\x58\xe2\x06\xfd\xc4\x8d\x3d\xd3\x5f\xee\x4f\xec\xae\x52\x24\xd3\x82\x68\xf7\xce\x1e\xda\xcf\x1b\x50\x64\xae\x60\xda\xbd\x4d\x03\x13\x92\x72\x60\x42\xba\xce\x27\xe7\xdc\x68\xba\x81\x7b\x04\x11\xdb\x41\x47\x44\xd0\x8f\x6c\x5d\x51\x5a\x57\xaf\x36\x6c\x11\x54\x86\x3a\x70\xd5\x05\x5d\x88\x66\x13\x77\xfe\x45\x29\x30\xc6\xe6\x55\xa8\x1e\xef\x50\x6e\x4c\x24\xed\x0d\xac\x67\xd3\x9b\x92\x6e\x87\x2e\x16\x24\xc1\x74\x21\x0c\xa7\x28\x91\x4c\xe4\xed\x2b\x85\x6a\x3e\x55\x69\x04\xa4\x4d\x2e\x65\x58\xfe\xf4\x6e\x2a\x32\xd6\xf8\x5d\x12\xe9\x6a\x71\xab\x9f\x46\x52\x0b\x69\x8f\xff\x75\xb7\xd6\x80\x3a\x4e\xd1\x49\x59\xa2\x01\x9e\xb9\xf0\x62\xa8\x1f\xef\x2c\x9d\xee\x54\xec\x35\x99\x91\x50\x41\xe2\x4a\x3e\x11\x90\xb8\x68\x21\xe2\x8e\x48\x71\xe2\x5e\xba\x9a\x8f\x3e\xf0\x89\x70\x75\xf4\x2e\x9a\x09\xf5\x94\xc7\x82\x50\x08\xd8\x19\x5a\x16\x45\x07\x82\x28\xbc\x3f\x58\x57\xc0\x5e\x93\xa7\x8a\x44\xe7\xe2\x82\x42\x90\xf7\xe7\x1d\xf9\x03\x8f\xa9\x42\x50\x89\xa5\x50\x20\x41\x97\x36\x69\x31\xd4\x10\xf3\x78\x3c\x33\x7f\x1e\x9b\x3f\xa5\x60\x45\x3c\xcd\x9e\x45\xd8\x0f\x7c\x48\x58\x80\xdd\x03\x9c\x3d\x55\xa5\x48\x95\x77\x95\x78\x8b\xdc\x4d\x2e\x70\xa2\xb1\x2b\xa3\xa8\x2a\x33\x62\xdf\x14\x31\x6b\x97\x59\x3d\x8c\xc9\xb7\x28\x36\xe2\x2f\x2b\x5b\xe8\x96\x4c\x51\x25\x53\xac\x25\x53\x80\x2c\x85\x33\xdc\xa2\x6b\xfc\xd6\x1e\x01\x40\xb2\x03\x33\xb5\x74\xa8\xc7\x02\x22\xf3\xe8\x47\x83\x3b\x08\x4d\x13\xa2\xf5\x4d\xf8\x21\x59\x62\xc3\x18\x18\xc7\x33\xff\xec\x0f\x49\x1c\x53\xd4\xa1\xe4\x8c\x12\xe5\x06\x3c\x6d\x5d\x68\xd6\x9d\xc8\xb4\x2e\x82\x10\x0c\x5b\x43\xc8\x34\xfc\x90\xac\x03\x01\x3a\x55\x82\x83\x66\x93\x64\x44\x30\x3c\x0e\x7d\x40\x6d\xf3\xe1\x8d\x5a\x19\x38\xa3\xc4\x8f\x44\xc4\xfa\x48\x86\x13\xdc\x01\x78\xa1\xf8\x44\xf4\x57\xbe\xad\xc4\xfd\x94\xe2\x9d\x24\x74\xc5\xee\x83\x83\x0e\x2d\x45\xdc\xbc\x53\xc4\x7a\x62\x89\x4e\x4f\xc0\x94\xa3\xa3\x39\xa1\xf7\x09\x6a\x27\x49\xbf\xe3\x91\x37\x8a\x70\x0a\xb8\xd3\xda\xcd\x27\x59\xed\x24\x1e\x93\xa0\xfa\x04\x61\x50\xfc\xa0\xb2\xd2\x35\xea\x5a\xc7\xfe\xb4\x48\x12\xb6\x53\x8e\xa2\xff\xa0\x8a\x0d\xf4\xe7\xc2\x74\xcd\x38\x0a\xb0\x45\xee\x95\x59\x84\x5d\x3e\x9f\x4f\x49\x97\x2e\xd6\xc6\x33\x46\x11\x7c\x13\x95\x90\x2f\x7a\xaf\x9a\xcd\xab\x30\xd6\x91\xba\x73\x47\x11\x51\x14\x24\xb1\x69\x1a\xb0\xa5\xaf\xd6\xee\x02\xaf\xc6\x96\xa1\x32\x86\xc8\x89\xe6\x5a\xa0\xcf\xdc\x81\x12\x5e\x38\x53\x6b\x53\x28\x6c\x46\x9a\xea\x00\xeb\xf0\xde\xd7\xdd\xf9\x65\xef\xfc\x02\x56\xec\x98\x78\xd5\x80\x62\x78\xbd\x9a\xad\xec\x6e\x41\xdf\xfe\xe3\x9d\xa9\xf2\xbe\x7f\x35\xd0\xe4\x52\x92\x5a\x40\x5d\x39\xb7\x29\xbd\x7f\x2a\x49\x82\x01\x60\x45\x82\xd3\xe5\x1d\x20\x55\xdd\x01\xc2\xd3\xd2\x25\x42\xf5\x9a\xbd\x1f\x1b\x72\xb7\x2a\x86\x22\x3d\xc3\x53\x3e\xc5\xa4\x68\xff\x5a\xe3\x2e\xbe\x77\xa4\xcb\x7b\xf1\x1f\x53\x5e\x5f\x11\x3d\xab\xe8\xfd\x1b\x55\x1e\x17\x1b\xe8\x9e\x05\xa9\xb9\x23\xa1\xd3\x4d\xda\x27\x77\xaf\x07\x66\xae\x28\x22\xfb\x47\x92\x18\x99\x46\xbd\x13\x49\x06\xb8\xe1\x67\x27\x31\x46\xed\xaa\x6a\xd4\x6e\x11\x28\xf7\xb1\x2e\x5a\xb2\xd5\xea\x5c\x5d\x10\x0a\x4f\x37\xc5\xed\x6a\xb6\x1c\x70\xf2\x5a\xb9\x71\xa0\xa2\xf1\x18\x21\xe1\xe9\xa2\x1e\xf8\x58\x6d\x19\x86\x3a\x6a\x42\x4b\x67\x06\xf4\x86\x78\x8f\xf5\xe4\xa6\xb5\xbe\x13\x43\x63\x86\x65\x3f\x4f\xa3\x29\xd3\x69\x23\x0c\xee\xaf\x8a\xfd\x55\x82\x99\x5c\xe3\x0d\x98\x6a\xf1\xc3\xc2\xeb\x17\xb1\x4e\x2f\x68\x36\xa3\x43\x6e\x17\xd1\xd0\x68\x33\xc5\x21\x7d\x63\xde\x33\x79\x1e\xb5\x5a\xb8\x11\x76\xae\x5a\xad\x8b\x66\x93\x74\x3b\x8c\x85\x7d\xa2\x5b\x2d\x10\xac\x4b\x3d\x22\x5a\x2d\xc0\x34\x0e\x8c\x91\x83\xdd\xbd\x47\x8f\x9a\x21\xed\xd7\xca\x79\xdd\x62\xff\xfb\x0d\x09\xfa\xca\x6b\x77\xd3\x28\x2c\xf8\xb9\x21\x2a\x4c\x1d\xe6\x66\x51\xb5\x0a\x5d\xa5\x94\xf6\x25\xd1\x6e\x9c\xf8\xb1\x36\x86\xc9\x0e\xa5\x7d\xd5\xda\xf1\xda\x5d\x4f\x12\x7d\xae\x2e\x68\xdf\xf9\x53\xa2\xbb\xf6\x5c\x5d\xf4\xdb\x3b\x9e\x6a\x75\xcd\xd7\x76\x77\x41\xe1\xd9\xa6\xb0\xb4\x6a\x3d\x46\xbb\x59\x50\x78\xa9\x56\x66\x41\xe8\xc9\xc2\x0a\x93\x99\x22\xa7\xab\xa9\x0f\xec\xfe\xb5\x3e\xdc\x7b\x34\x9f\xef\x3f\x2c\x32\xa8\xc9\x42\xab\xa2\xf0\x42\x6d\x4c\x6f\xd1\xe9\x15\xfd\xd2\x53\x85\x72\x5a\x23\xb6\xbd\xf7\x08\xb7\xe7\x0e\x3b\xf3\xb9\x3c\x64\x49\xea\x89\x13\x4c\xfe\x26\x5a\xc9\x22\x8f\xc9\x51\x76\x1c\x3e\xab\x0d\xa9\x1d\x3a\x2b\xdb\x26\x56\xb5\x6d\xef\xd1\x3f\xc5\x7c\x2e\xfe\xb9\xff\x90\x86\x43\x72\xb0\x6f\x7f\x3d\xec\xa0\x7e\x28\x0e\x1f\x3f\x9c\xcf\xbb\x9d\x9d\x43\x91\x92\xa3\x59\xf7\xe0\x37\xdd\x12\xed\x47\x0f\xad\x5f\x2f\x7f\xb1\xbf\xdf\xab\xbe\xd8\x7b\x54\x10\x2d\x31\x1c\xb0\xf7\x57\xcc\x9f\x94\xf2\x26\x20\x43\xf3\xc3\x4e\x3f\x9b\x01\x1e\x6f\xc9\xc2\xef\x1d\xa4\xce\x99\xa8\x36\x0d\x5a\x2d\xda\x33\x4c\x1f\xf5\x89\x60\x5d\xd0\x36\x9d\xcb\x12\xd3\x47\xb4\xd9\x34\xb0\x8b\x9c\xcd\x79\xca\xe1\x36\x7d\x4e\xa5\x77\xcb\x11\x81\x35\x41\x69\xe3\x3a\x24\x93\x62\xd6\x38\x7b\xff\xee\x95\xd6\xd3\x63\xab\x86\x98\x91\x83\xd3\x21\xd1\x8c\x53\x63\x2d\x2f\xef\x41\x4f\x55\x34\x52\x22\x8e\x9d\x8a\x44\xc9\xda\xf8\x34\x9a\x4c\x13\xcd\xfd\xb1\x68\x36\x9f\x9a\xf9\xc2\xc9\x7d\x10\x78\x46\x19\xe0\x03\x31\x80\x60\xe0\x49\x57\x47\x9a\x8f\xed\x6a\xb0\x22\xc8\xc0\x11\x4a\x45\xca\xa9\xc4\xe5\x91\x13\x49\x8e\x86\x6b\x4b\x68\xab\x1e\x2d\x97\x39\x59\x5f\xc6\x10\x54\x2b\xb0\xca\xcc\x5b\x71\x74\x62\xc0\x71\xd7\x3f\x9e\x46\x32\x16\x5f\x8e\xdf\x81\x7f\xe2\xdd\x07\x57\x9e\x74\x63\xcd\x75\x12\x43\xf0\x2e\x7f\x3e\x15\xb7\x7a\x01\xc1\xcf\x15\x47\x5c\xb6\x23\x9b\xa0\xa4\xc8\xc2\x56\x4c\x05\x99\xe6\x78\x71\xfe\x54\x7f\x4a\x87\xc2\xea\x74\x33\xc0\x21\xb0\x46\x89\x31\xe1\x32\x26\x74\xbc\x86\x43\x7b\x9d\xc3\x08\xf5\xb6\x20\x95\x58\xa1\x1c\x91\x0e\x44\x46\x83\x2e\xbf\xda\x69\x45\x14\x14\xbb\x23\x1f\x86\xe5\xe4\xdf\xc5\x1a\x71\xad\xc9\xa9\xb1\x6a\xfb\xbc\xe5\x00\x66\x55\xe0\x1e\xa7\x0b\x3c\xc6\x9a\x87\x9e\x11\x69\x96\xd7\xa3\xf1\xf8\x38\xed\x95\x57\x82\x0f\x84\x8a\x09\xa5\x10\x94\x7b\xcb\x1e\xb9\xc2\xbd\x49\xdb\x3f\x87\x3b\x9d\xce\x7c\xbe\xdb\xe9\x1c\xb2\xec\x15\xcd\xc5\xa2\x51\xcd\x59\x51\xd8\xf4\x25\x9c\x48\x72\x3b\x34\xeb\x74\x4f\x31\x45\x74\x4d\x6b\x38\xb2\xb1\x7f\x1e\x59\x5b\x78\x46\xee\x86\x36\xa1\x98\x59\x3e\x89\x84\xc4\x0d\x70\xf3\x75\x41\x7b\x5a\xdd\xdd\x4b\x37\x9a\x0a\x49\x12\x37\x78\x0f\x89\x3b\xe0\xb0\xd5\x59\xce\x3e\x81\xbc\x75\x3d\x24\x06\xc0\xa0\xd9\x5a\x9f\xad\x26\xf8\xd9\xd3\xae\xdf\xb3\x59\xe3\x30\x88\x24\x9d\x69\xb6\x8b\xcc\x0c\xb1\xd9\xcd\x5c\xdf\x58\xda\x39\xb9\x77\x53\x14\x7c\xca\xf5\x41\xba\xb3\x50\x5f\x3d\x55\x62\x20\xa4\x0e\xf9\x38\x36\x36\xd0\xc0\xcc\x52\xe5\x06\xfb\xd4\x58\xcc\x6e\x3a\x03\x4c\x91\x7d\x97\xdb\x86\x65\xe9\x05\x12\x37\xe0\x45\x14\x46\x2c\xe4\x80\x3c\x1f\x12\x41\xfb\x64\x05\x3d\x4e\x6a\x3e\xb7\x0d\x05\x8e\x3d\xec\x2e\x5c\x9f\x7a\xf8\x54\x56\x42\x5c\xee\x47\x4a\x13\xba\xa8\x6b\x3b\xd5\x50\xd3\x0e\xf8\x9e\x76\x7d\xe0\x95\x29\x20\x99\x11\x0d\x85\xf3\x6d\x46\xbe\x0d\xf3\xfc\xf4\x48\xf7\x17\xb5\x26\xad\x8d\x33\x72\x7a\xd2\x0d\x3e\x36\x9b\x44\xb7\x98\x33\x71\xcc\xfc\x0e\x44\xfa\x33\x74\xec\x38\x16\xec\x7b\x2c\x46\xcf\x6f\xa7\x48\xd5\xf2\x48\x1e\x69\xa3\x59\x3f\x59\xaf\xf3\xcb\x64\x3c\x46\x83\x6f\x92\x96\xdc\x9c\x52\x16\xd2\x5d\xc4\x8e\x99\x99\x36\xd4\x24\x4b\xe1\x03\x11\x6b\x77\x7b\xbc\xd5\x3a\x94\xcd\x26\x86\xc3\x8a\x5b\x11\x90\x80\xd2\x66\x33\xda\x2a\x43\xf6\x0a\x84\x61\x1e\xc1\xd5\xee\xc2\x30\x0d\x57\x09\xcd\xf4\x0e\x33\x3f\x3f\x13\xe7\xe1\x45\x6f\x78\xde\x6e\x87\x17\xcc\x37\x8a\xb3\x8f\x6a\x73\x92\xa5\xf1\xfb\xee\x83\x38\xef\x5c\x80\xb0\x22\x02\x38\x1c\xe3\xa9\x7d\x1b\x8c\x92\x55\x9a\xcf\xe6\xe2\x15\xd3\x90\x26\x18\xd4\xe5\x65\xc5\x66\xcb\x4a\x3d\x48\x9d\x3c\xdf\x5d\x66\x00\xd5\x74\xcd\x70\x48\x82\x56\xeb\x9f\x2c\xc9\xb5\x90\x92\xe3\x85\xab\x11\x6a\xe7\x59\x18\x47\x7b\x17\xb2\x74\xd1\xca\x34\x52\xe5\x29\x9e\x72\xc8\x73\x75\xd1\xd3\xe7\xed\x36\x86\xb3\x5e\x6b\x22\xb0\xb1\x79\x9e\x7f\x6c\xae\x84\x02\x7c\xa9\x8a\x9d\x0b\x08\xe0\x38\x57\xf5\x29\xfc\xd8\xac\x09\xe9\x6c\x4c\xcb\x63\x59\x19\xd9\x9e\xcc\x65\x72\x90\x0d\xab\xa0\xe9\xfe\x99\xd5\x40\xf2\x00\x56\x7b\x78\x87\x43\x2a\xaf\x29\xad\x22\xce\xbd\xfb\x35\x78\x4a\x61\xe5\xc0\x7c\x5a\x6b\x01\xcb\xe6\xa6\x14\x75\x1b\x33\xe0\xfd\x8f\x0d\x25\xd5\xe1\xa1\x5c\xd0\xde\xd9\xda\x7a\xd5\x3f\xff\x29\x37\x64\x3a\xfe\x27\x7e\xee\x55\x12\x2c\x8a\x75\xc7\x21\xf3\xf3\x5e\xaf\xa5\x16\xea\x86\x8f\xcb\x56\xd0\x53\x49\xc4\xc6\xd3\x5e\x79\x21\x45\x6b\xe7\x71\xdf\x96\xa2\xdb\x1b\x33\xf2\x5d\x83\xf3\xa7\x6c\x34\x1a\x0d\x07\x66\xe4\x29\xfe\x72\x40\x96\xf7\x43\x7e\x2f\x97\xb8\x23\x97\x7a\x6d\x03\x5b\x46\xdd\xef\x18\x49\x96\x17\xfe\xa3\x5c\xf8\xf1\xc3\x43\x46\x24\x3b\xc3\xa3\x56\xcd\xa6\x3c\x64\xdd\x9d\x9d\x02\x56\xea\x02\x36\x07\x3b\x64\x8f\x3b\xcd\xe6\xc1\xfe\x21\x2b\xf9\x43\xd5\x6a\xc8\xfd\x87\xcd\xe6\xde\xa3\x0a\xa4\x2e\x41\x5a\x62\xe6\x73\xac\x67\x3e\x47\x24\xa5\xbb\x30\x74\x25\xbb\x40\x71\x01\x45\xe5\xbd\xcb\x4b\x37\x3c\xac\x29\x11\x94\xde\x3b\x0e\xda\x34\xa8\xf8\x6a\xf6\x11\x42\xcd\x26\x30\xd4\x8c\x54\x3c\x15\xa5\xc3\xc6\xca\x0d\x30\xbf\xf0\x00\x92\x75\x6c\x76\x47\x42\x0d\xd2\xdd\xee\x6b\x2f\xc1\xd8\x69\x6e\x46\xb8\xfc\x31\x01\xfc\xc7\x22\xb6\xe6\xc7\x9a\x73\x7d\x36\xaa\xb6\xbd\x83\x3b\x64\xdb\xd5\xac\xb8\x46\xf3\x32\x64\x48\xe0\xec\x0e\xdd\xeb\x3e\x68\x37\x80\x3b\x32\x44\xcc\xa0\x5d\x81\x39\x91\x13\x50\x8c\x83\x66\x02\xcf\x7f\xf8\xab\x34\xc7\x06\x16\x5a\x6b\x07\xce\x48\xa4\xc1\x66\x18\x46\xc3\x03\xce\x0c\x17\x41\xbc\x12\x95\x64\x12\x7e\x01\x9d\x2c\x63\x1a\x6b\xd6\x85\x81\x66\x3b\x70\xa3\x59\x07\xb6\xf5\x5a\xd9\xb1\xa0\x30\x59\xa9\xfb\xe6\x39\x20\xe0\x4a\x6f\x3a\x0f\x9c\xa7\xf9\xa5\x30\xdd\x00\xd8\x29\x03\x8e\x36\x00\x76\xcb\x80\xb3\x35\xa4\xa5\x27\xfe\xe0\x6e\xcd\xf7\x9d\xf4\xfb\xad\x66\x2f\xe1\xfa\x2f\x90\x1c\x69\x66\xea\x5d\xc0\x89\x66\x4a\xc2\xa9\x66\x1f\xe0\xb9\x66\x33\x09\xdf\x56\x0f\x48\xcb\x71\x16\xf0\x5d\xaf\xf7\x48\xfe\x01\x12\xbe\xda\x3c\xb3\xf0\x74\x2d\xdc\x31\x99\x91\xdf\xc1\xe6\x89\xa1\x70\xa9\xd9\x46\xa6\xdd\xd2\xf5\x34\xce\x02\xf3\xe9\x5a\x86\xc5\x3c\xff\x59\x4a\xe7\x32\x83\xc2\x1b\xcd\x7e\xc2\xbb\xbf\x40\xde\xcd\x52\x67\xe7\x2a\x79\x5a\x83\x84\x84\xa9\x76\x17\x6b\x88\x34\x96\xeb\x49\x26\x40\xb1\x04\x34\xe3\xa6\x82\x0f\x7a\xfd\xcc\x7d\x67\x67\xce\x99\x69\xe0\xab\x0d\x70\x6f\x0c\xdc\x8c\x7c\xd0\xd0\x81\xdf\x15\x51\xb4\xdd\xa5\x36\xd7\xf7\x59\x75\x08\xb2\xe0\xde\x92\x49\xdd\x29\x65\xf4\xae\x24\x00\x55\x7d\xe5\x75\x3b\x3b\x7b\xbf\x11\xd5\xc6\x0f\xb4\x55\x29\xd8\xa5\x6d\x4c\x16\xd9\x3a\xd8\xdf\xdf\x3d\x58\xc0\xeb\x35\x33\xf9\x52\x43\xa4\xd3\x89\xf5\xf1\xef\x90\x83\xae\xcd\x3a\x4d\x97\x44\x1a\x15\x4d\xa6\xeb\x7d\x97\x52\xcf\xbe\x6a\xc9\xf3\x6e\xf1\x7e\x87\x52\x54\x77\xe0\x78\x5d\xb7\x39\x7f\xca\x3f\x25\x71\x5a\xdf\x34\x91\xad\x2e\x6d\x11\x87\x36\x9c\xd6\x5b\x45\xbe\xea\x34\x91\x09\x7c\x5d\xd9\xa2\x19\xf9\x69\xba\xfb\x8c\x2e\xe0\xe7\x32\x72\xe9\xa5\x7c\xb1\x22\x03\x51\xf9\x08\x94\x44\xde\x5b\xf2\xc2\x7e\xcc\xf2\x71\x76\x6d\x32\x87\x22\xac\x36\x4f\xf7\x00\xb2\x74\x05\x08\xf9\x43\x11\xb3\x00\x70\xbb\x52\x29\xb3\x52\xce\xc8\x89\x06\xad\x4d\x87\x13\xa3\x35\x19\x5d\x1b\xd9\x2f\xe9\x3b\xae\xd3\xd2\x9e\x73\xfe\x0f\xcc\x56\xf6\x8f\x0b\xc7\x72\x3c\x37\x0c\x99\x1f\x11\x69\xe4\x1b\xf1\x59\xb4\x81\x0f\x01\x73\xce\x6d\x5f\xb9\x9c\xb6\x9c\x0b\xa7\x8c\x37\xd8\x84\x65\xc7\xcb\x4e\xe9\x70\xd3\xae\xc8\xf5\x71\xca\x44\xae\x9f\x9d\x0a\x0b\x19\x51\xae\xdf\x77\x4e\xaf\x44\xe3\x4d\x1c\x49\xf7\x99\x08\xa2\x81\x70\x23\x29\x3e\x0e\x1b\x5c\x37\xbe\xc7\x91\x74\x5a\x56\xfd\x70\xe0\x35\x36\xd3\x73\x96\x40\x1d\xda\x72\x1a\x43\x1e\x8e\x31\x27\x5b\x43\x5f\x89\xc6\x30\x1a\x8f\xa3\x99\xcd\x28\xf5\x4d\x93\xdf\x15\x89\xa8\x81\x9a\xf1\xbb\xd8\x73\x7a\x35\xc5\xc6\x28\x33\xd8\xa0\x10\x66\xe4\x95\x86\x63\x8d\xd1\x37\x0b\xc9\x38\x13\x2c\xc2\xdb\x57\x12\xa6\x4a\x4d\x4c\xb5\x50\xe7\x98\xcb\x46\x28\x75\xd4\xe0\x2b\x5a\x80\xa9\xed\x64\xd4\x98\x46\x71\x1c\xfa\xe1\x38\xd4\xa1\x88\x9d\x96\x6d\xf4\xfa\xf6\x6d\x39\xc5\xf6\x6f\x80\x03\x1f\x61\xb6\xf9\x74\xe0\x43\x86\xe5\x3f\xa9\xc8\x1f\x8b\x89\xad\xc4\x34\x19\x37\x59\xd7\x61\x6d\x39\x9e\x69\x26\x6a\x70\xde\x72\xd9\x51\x78\x23\xa4\xc5\x80\x70\x0e\x6d\x91\xb7\x8a\xcc\xc8\x73\x0d\x7b\x80\x5d\x97\xbe\x0e\x8c\xe8\x7a\xa6\x37\x1c\xfe\x2d\x2f\x5a\x10\x78\x1a\x06\x78\x50\x1a\x5e\xe2\x81\xec\x17\x9a\xbd\x87\xcf\x6b\x45\xda\x0f\xa2\xe8\x83\x1f\xd6\x88\x7c\xaf\xd9\x0b\x4d\x66\xe4\xb3\x86\x1d\xd8\xdd\xa1\x14\xbe\x68\x76\x4b\x9e\x19\x61\xf7\x5e\xc3\x4b\xf3\x1f\x85\x27\x9a\x85\xf0\x63\xfd\x42\x8d\x47\x9f\x21\x5c\xab\x8c\xdb\xba\x3e\x69\x76\x04\x6f\x35\xfb\x02\xbf\xaf\x5e\xbb\xb2\x6c\xb2\xf0\xc7\xda\xaa\xb2\x9b\x16\xfa\x98\xbd\x1b\xa4\x60\x2f\x40\x09\xb6\x0d\x5a\xac\x76\x54\xf7\x32\x83\x7d\x46\x94\x80\xdd\x1d\x90\xd6\x8f\xe5\x83\xb6\xf3\x2b\xed\x4a\xed\xf2\x45\x96\x01\x4f\x14\xab\xd9\x6b\x14\x19\x76\x55\x41\x23\x5d\xfc\x55\x3d\x2f\x34\x51\x0f\x76\x77\x72\x39\x93\xfb\xbd\x0b\x02\x5c\xde\x93\x6c\x46\xb4\x40\x49\x97\x61\x4e\x96\x31\x63\xd2\x40\x91\x61\xde\xdd\xf9\x4d\xb9\x02\x04\x7b\x9b\x8e\xd8\xee\x0e\xe8\x76\x97\x52\x90\x4c\xf6\x0d\x0f\xba\x23\xea\x29\x77\x04\x06\xbb\x30\xd8\x4d\xe9\x5e\x7e\x7e\xfb\x99\x86\xdf\x0d\xd4\x90\xb6\x34\xcc\xc8\x1f\x18\x3a\xff\xdb\x7b\x4d\x11\xb2\xc8\xaa\x57\x86\x4c\xb9\x00\x3f\x53\xe0\x82\x3d\x87\x40\x6c\xd8\x89\x49\x17\x6d\x75\xd8\x29\xda\x9d\x08\xd8\xea\xc2\xfd\xc8\x13\x20\x3c\xfd\x60\x77\x67\xde\x81\xa1\x97\xa4\x2e\x16\xce\x52\xcd\xea\x8e\x3c\xc1\x36\xa1\x03\xa6\x67\x54\x4b\xc5\x54\xdb\x34\x92\x69\x10\x76\xb4\x38\x08\x0a\x09\x4b\xf0\xc4\xf2\xca\x0e\xeb\x1c\xca\xfc\x14\xe9\xbf\xef\xee\x80\x60\x88\x57\x83\x6c\xeb\xd2\xfe\xde\x0d\x09\x84\xa9\xa9\xad\x4d\x0d\x12\xce\xa0\x08\xf7\xf8\xa2\x0d\x37\x8b\x15\x3c\xba\x25\xdd\xed\x05\x0c\x05\xf3\x25\xf8\x82\xc5\x12\x62\xb1\x59\x81\x1b\x57\xbf\xaf\x58\xb8\x32\xce\xae\x05\x68\x75\x6b\x81\x59\x3b\xb9\xbc\xca\x6e\x37\x5b\x2c\x60\x20\x18\xd7\x70\x23\xd8\xe6\xb3\xf8\xf7\xfc\xc0\xe3\xe0\x07\x9e\x02\x9e\x78\x02\xfc\xc4\xd3\xe0\xdf\x79\x12\x82\x53\x0f\xfb\x72\x5b\x30\x2d\x61\x22\x36\xcf\xcb\x2b\xc1\xa4\x84\xa9\x58\x2b\x08\x0e\xbb\x7d\xe5\xdd\x91\x2b\xc3\x7b\x13\x7b\x4c\xd1\xb0\xcd\x48\x30\x2e\x61\xb6\xb1\x9c\xe3\xd8\x82\x1d\x48\x6f\x52\xb9\x13\x6b\x8e\x4f\x75\x30\x4e\xa6\xa2\xd6\x80\x60\x7b\xbb\x78\x58\x61\x6f\x9f\x31\xdd\xef\x7a\x1d\x48\x98\xe8\x25\x45\x68\x53\xab\x55\xc4\xdf\xd6\x12\xb4\x63\x50\x64\xba\x4d\x95\x9f\xe6\x3a\xd2\x3d\xc5\xba\x9d\xdf\x54\x8b\x97\xb6\x63\x12\xc6\x44\xff\x48\x7b\xd7\x9a\xd8\x9a\xda\xca\x53\x74\x01\xb7\xeb\xe6\x44\x38\x24\x81\xa9\x64\x3e\x9f\x91\x6d\x01\xce\xff\xe5\x40\x42\x4b\x75\x58\x8a\x66\x64\x24\xc0\xf1\xcc\x37\xa4\x26\x5d\xc7\x39\xae\xe3\x55\xe0\x80\x71\x3c\xf7\x79\x27\xc8\x8c\x4c\x05\x04\xad\x2e\x66\xeb\x49\xc5\x0d\x2f\x4c\xc7\x23\xdd\xe3\x2c\xf7\xb9\x5e\x6b\x32\x24\x37\x02\x75\xd9\x99\xb0\xd1\xc4\x3c\x3b\xdd\xb2\x58\x02\x4a\xe0\x48\xe7\x5f\x29\x5c\x8b\x95\xab\x91\x6d\x9d\xa8\x37\x28\x49\x1b\xf4\xc0\x01\xeb\x81\x4a\x4c\x83\x12\x96\x14\xf9\xb4\x6e\xc8\xad\xa5\x65\x6a\x38\x55\x50\xc4\x88\x94\x25\x65\x82\x52\x30\x83\x29\x4b\x66\x01\x47\x62\x85\xc1\x60\x29\xd1\x75\x4a\x44\x4a\x49\xdf\x01\xab\xfa\x09\x9b\x66\x54\x14\x94\xdc\x92\x6b\x53\xc5\xb5\xb6\xfd\x29\x5a\x5d\xd0\xd4\xd0\x83\xd4\x08\x74\xd8\x56\x41\x6d\xcf\x18\x52\x4e\x56\x8a\xa0\x40\x97\xf2\xc3\xa6\x84\xe8\x94\x90\x7f\xcb\x92\xe0\x1a\x93\xe9\x5e\x33\x5d\x10\x72\x47\x8e\xca\x84\xe8\x56\x17\x93\xa1\x21\x19\xba\xbc\xd5\x91\x02\x1e\xa5\x97\xd2\x9d\x0a\x26\x24\x3c\x17\xab\xf5\xe9\x53\x01\x78\xcd\x96\xf7\xe0\x81\x03\x92\xf6\x67\xe4\xc4\x4c\x32\xac\xe2\x21\x48\x4a\xbd\x02\x26\xae\x00\x75\x2d\xd0\x23\x04\x32\xea\xfe\xb7\xe5\x19\xd9\xeb\xd1\xce\x02\xbe\x0b\x76\x24\x41\x4a\xf6\x5d\x98\xc9\xf8\x74\x2d\xb3\x88\x22\x41\x8c\x40\x2e\x16\xf6\xf8\x09\xcf\xde\x5b\xee\x8e\x18\xb7\xef\x23\x3b\x5a\x11\xc2\x46\x25\x58\x0b\x51\x4a\x9a\x92\xc0\x0c\x43\xce\x66\x18\xd1\x85\x97\x29\xb8\x1c\xf6\x3b\x9d\x43\xdd\x47\x33\xc9\x90\xf1\x5a\x1b\x15\xd5\xbb\x25\x4f\x85\xf5\x9a\xb4\xba\xa8\x84\x16\x5d\xbb\x8c\x4a\xad\xf9\xaa\xea\xaf\xab\x17\x27\x5c\x8a\xf5\x5b\xed\x79\xfd\x1d\xcb\x45\x6f\x2a\x5c\x54\xbe\xea\xe5\x8e\x5c\x0a\x58\x1f\x07\xa4\xc1\x5e\x02\x96\x3b\x57\x28\xbc\x13\xec\xb9\x84\x0f\x62\x5d\xd0\xc8\x8c\xbc\x13\xab\x76\xd8\xbe\x0b\xa2\x30\xea\xc6\xa2\x79\x55\x21\x5f\x63\xf0\xd9\x6a\x14\xea\x57\x50\xcf\xd2\x7b\x7f\xe9\xc2\x4c\x61\x5b\xc5\x99\x60\xc7\x12\x5e\xaf\x5d\x14\x2e\x25\x41\x8c\x67\xc2\xb6\x91\xda\x5b\x06\x36\x78\x9a\x3e\xac\xac\xbe\xb3\x00\xa2\xd8\x8c\xbc\x11\xf0\x3a\x45\x05\xd8\xaf\xaf\x04\x89\x34\x85\xef\x82\x9c\x51\x48\xad\x52\xb1\xa1\x02\x64\xee\x05\x85\x63\xb9\xde\xbb\xf2\x41\xa4\xcb\x57\xef\xa3\x74\x4f\x79\x7c\xcd\xee\x7d\x4f\x4a\x08\x3c\x2e\x8d\x92\x2e\x41\x78\xc7\x12\x86\xf9\xb9\xe4\x22\xa8\x48\x94\xf4\x07\xfe\xce\xdb\xea\x82\xff\xdd\x73\x1c\xf0\xaf\x2b\xd9\x4e\x8f\x2b\x70\xc2\x9b\x46\xe0\x7f\xab\x40\x7c\xad\x40\x9c\x7a\xc7\x82\x38\x0e\x05\xfe\x35\x7b\xba\xf1\xee\xf9\x77\xef\x48\x03\xbf\x36\x7f\x83\x5b\x4f\x02\x9f\xe2\x0b\x85\x7f\x7f\xe2\xdf\x23\x9c\xf4\x71\x5e\xfe\x2c\x7b\xf2\x07\xe6\xbb\xff\x39\xfb\xfd\xc6\xdb\xea\x96\xb3\xf7\x95\xea\x27\x33\x72\x1b\xa1\xf8\x46\xa9\x72\x17\x41\x17\x24\xf5\x24\x6d\x39\x0f\xf8\x34\x7c\x70\xb3\x53\xba\x1f\xf0\x99\xd8\x98\x06\xf6\x65\xf5\xf3\x7e\xed\xf3\x0b\xb1\xca\xcd\x56\x64\x97\xab\x7e\xde\xad\x7d\x7e\x2f\x36\xe6\x98\xfd\x52\xfd\xbc\x57\xfb\xfc\x64\x73\xdd\x3f\x36\xd7\xfd\x69\x33\xf2\xb7\x9b\xdb\xfd\xfb\x66\xca\xff\xd8\xdc\xa9\x32\xd9\x48\xb9\x4a\x36\x96\xd6\xc9\x46\xca\x45\xb2\x91\xf2\x24\xd9\xd8\x2d\xbc\x46\x5a\xbd\x65\xc1\xe6\xe2\x51\x52\xde\x2b\x47\x23\xc3\xb6\x0e\x56\xae\x93\x9f\x23\x63\xa4\xcc\xc8\xef\x51\xea\xf6\xb4\x4e\xa1\x02\x5f\x98\x6c\xbe\xd9\xf8\x8e\xbc\x47\x14\x76\xff\xb8\x48\xef\x91\x54\x12\x8e\x3e\x89\xea\xfb\x92\x23\x32\x41\xb1\xa4\x69\xe6\xb3\xbb\x13\xa5\x3d\x69\xe5\x6e\xf7\xa3\x84\xfc\xe3\xb5\xb4\x17\x4b\x84\x52\x8b\x91\x50\x5e\xc3\xf9\x47\x4b\xb6\xfe\xe1\xfc\x83\x7a\x41\x88\xf1\x06\xd9\xf2\x13\x25\x24\xcd\xf6\x2d\x06\xd6\x35\xa3\x69\x8b\x38\x8d\x41\x38\x0a\x75\x0c\x98\x46\x7f\x14\x69\xfb\x09\xeb\x36\xb2\x0f\x92\x90\xe8\x90\x28\xdc\x91\x2c\x52\x92\x26\x65\xe3\xa7\x74\x13\x70\x42\x64\x71\xd0\x96\xe3\xc9\x0b\x1f\x02\xb6\x85\xca\x6e\x6f\x45\x2f\xd9\xa6\xdd\x90\x69\x08\x09\x48\x0c\x28\xf0\x5f\x82\x74\xf9\x09\x6e\x9b\xe0\x5e\x26\xc7\x1b\x9f\xec\xad\x8e\x41\x7e\x00\x8e\x68\x68\x77\x8d\xf4\xa8\x0c\x11\xa7\xd4\xc3\x2e\x0f\xa0\x03\xf7\xfc\x04\x1d\x21\x45\x6a\x04\xdf\x58\x38\x2f\x3d\x61\x46\xdc\xe5\x8b\xf2\x88\x8c\xcb\x8c\x31\x0a\xc9\x8c\x5c\x85\x36\x0b\xec\x23\xe4\x8f\x72\xfb\x07\x65\x58\xd3\xb1\xd9\x30\x0c\xf8\x9d\x67\x7b\xb0\xb2\x43\x77\x53\xee\x2f\x32\x23\xb3\x10\xf6\x40\xd2\xf9\x7c\x0b\x9f\xbb\x9d\x0e\x48\xf4\x22\x9a\x0f\xf8\xa3\x54\x78\xbb\x54\x98\x10\xd9\x66\x5d\xfa\x60\x6f\xde\xa1\x6d\x22\x1f\x74\x3b\x9d\x79\x87\xb6\x88\x7c\xb0\x87\x4f\xa5\xd4\x3a\x7f\xc9\x97\xd7\xa6\x79\x6f\x23\x8c\x7e\x2d\xb2\x6d\x24\x15\x98\xe7\x61\x65\x40\xfc\x9b\x72\x7e\xf8\xa4\x32\x53\x9e\x86\x70\x1a\x56\xb6\x16\x47\xc9\x2f\xee\x4b\xde\x91\x57\x21\x26\xe4\xb7\x57\x06\x18\xc3\x33\xaa\x60\x9a\x95\x31\xc9\xbe\xa3\x55\x22\x1c\xcf\x19\xf2\x71\x2c\x4a\x2b\xc5\x5d\x05\xcc\xdd\x9e\xcf\x1d\x67\x2b\xbd\x7f\xda\xac\x5a\xc5\xb1\xf0\x32\xe0\x67\x33\xd6\x97\x11\xbc\x0f\xe1\x54\x13\xd9\x72\x98\x53\x61\xf6\xeb\x64\xed\x0e\xa5\x73\xe9\xd8\x14\xd5\xb5\xad\xca\xa3\x0a\x21\xac\x60\xa5\xc7\x96\x95\xaa\x13\x83\xc9\x4a\xf8\xca\xbf\x60\x56\xcc\xe7\x9d\x43\x76\x47\x64\xb8\x4a\xa8\xe9\x0a\xed\x0b\xc0\xbb\x10\xfe\xcb\x13\xa9\x97\x47\x7d\x95\x32\xb4\x57\x39\xe4\x93\xe9\x04\xa7\x7c\x4f\xef\x69\xb2\x71\x91\x7a\xbe\x79\x99\xf9\x56\x9e\x18\xd2\xdd\xee\x9f\x26\xde\xf3\x84\xda\x1b\x1c\x8a\xd3\x82\x9b\xeb\x78\xba\xb9\x8e\xcb\x6a\x13\xd4\x10\x24\xc8\x61\x39\xe1\x7a\x15\x20\x1b\x68\x8b\xa7\x04\xf7\xae\x0c\x17\x27\xe4\x4d\x52\x15\x11\x1f\xca\xf3\xf5\x28\x24\xc7\xe4\x7c\x46\x06\x21\x04\x21\xf9\x9e\x90\x0e\xa5\xf0\x2e\x21\x27\x09\xee\x93\x00\x7e\xc9\x3e\x3f\xc5\x97\x70\x99\x90\xe5\xc1\x76\xfe\xfc\xd3\x8e\xf2\x3a\x80\xad\xce\x22\xc3\xf7\x0b\xa8\xec\x39\xc5\xfc\x1a\x60\x7a\x51\x6e\xc1\xab\xda\xec\x4b\x1d\x22\xd5\xd1\x38\xab\x02\x61\x48\x90\x4c\x63\xe9\x8b\x94\xe4\x35\xa0\xe2\xcb\xc7\xa4\xbc\x87\xe5\x7f\x2b\x42\xc7\x82\x57\x2d\x63\x20\x0f\xc1\x71\x60\x46\x3e\x87\x90\x68\x38\x4b\x8c\x14\x1f\x02\x4e\xef\xd7\x09\x7c\x32\x75\x7d\xa4\x14\x7e\x84\x66\x71\xc3\x65\xb2\xa5\xcc\x3f\x25\x45\xba\x5a\xc3\x4f\xf4\x2a\x7d\xc1\xdd\xa3\x13\xcc\x14\x76\x8a\x93\xf7\x18\x33\x8b\xbf\xc2\xfd\x01\xce\x41\x2e\x6f\x2b\x4d\x86\x39\x3d\x01\x4d\xe3\x0a\xb7\x8b\x7b\xce\x64\x39\x8d\x38\x9a\x21\x48\xe5\xc7\xc4\xfe\x7b\xad\xe1\x4b\x48\x9c\x61\x38\xd6\x42\x19\x79\x94\x6e\x2d\x45\x6c\x46\x5e\x84\xab\x75\x95\xdb\x24\x13\xa2\x74\x01\xaf\x88\x84\x63\x72\x7e\x49\x9c\x38\x1c\x0b\x19\x88\x81\x83\x3e\x84\xc4\x52\xb5\x85\xee\x0c\x33\xd6\xc4\x09\xe5\x55\xe8\x87\x7a\x19\x42\x64\x10\x93\x64\xc5\xd7\x24\xfb\xca\x03\x8d\x69\x9d\xca\x9f\x3b\x46\x80\xd8\xcf\x4a\x04\x22\xbc\x11\xca\x81\xbb\x94\xbd\x88\x33\x52\x51\x32\x75\x20\x32\x1c\x94\xeb\x05\x9d\x43\xdc\x2c\xea\x3b\xfd\x6c\x0f\xa5\x69\x40\x3c\xa7\x24\xe2\xbf\x26\xa9\x7e\xd4\xb6\xc7\xe7\xb6\xe7\xf3\xf4\x69\x50\x7a\x16\x45\x4f\xcb\x5e\x01\x2c\x2c\x90\x7d\xe0\xc5\x28\x0f\x70\x90\x05\x64\xdb\xd3\x1a\xd3\xc7\x6b\x4c\x1f\xaf\x5d\x51\x38\xa7\x2e\x43\x63\xa8\xa0\x3c\x0e\x00\x7f\xda\xe3\xcd\x18\x13\x82\xc9\x62\x04\xcd\xde\x67\x49\x46\xf3\x94\xd6\x58\x51\x98\x56\x14\x62\x45\xa1\x1b\x80\x66\x84\xb3\xd0\x1d\x50\x53\x9e\x71\x57\x40\xc0\xc2\x5a\xa5\x1d\xe0\xae\x0f\x3c\xab\x74\x89\x86\xc8\xf5\x21\x72\x03\x88\xdc\x01\x44\x86\x06\x4d\x33\x48\x43\x86\x42\x32\x0a\x4b\xec\xbf\xd2\x87\x83\xac\x0f\x07\xcb\x7d\x68\xba\x40\x60\x03\x13\xbc\x32\x97\x33\xe1\x06\x10\x30\x61\xc8\x62\x62\xa9\x27\x43\x5c\x05\x87\x6c\x45\x6f\x6a\x5c\xdd\x8a\xde\xcc\x12\x0c\xd8\xde\x2c\x17\x14\x8c\xe0\x75\x58\x14\xab\x25\x66\x5e\x09\x8a\x95\x4b\xac\x5c\x62\xe5\x72\xa9\x47\xb3\x60\x99\x94\x16\xa2\xcc\x80\xd3\x95\x83\xd9\x85\x10\x86\x20\x96\x68\x29\xf5\xe9\xb3\x25\x5d\xe7\xcb\x10\x26\x55\x2d\xe6\x65\x15\x66\xe2\xe7\x9b\xf4\x85\xb5\x5a\xd3\xa9\x7c\xb8\x0f\x84\x31\xfa\x83\x8f\xc6\x9a\xae\xc0\x7e\xae\xc2\x7e\x43\x2d\x21\x32\x0d\xc1\x7f\x8d\xda\x31\x1d\xc2\xa5\x0f\x2f\x12\xe2\x9c\xb7\xcf\xff\xfc\xf3\xe2\x7e\x41\xe8\x6f\xad\xbe\x0b\x7f\xfe\xf9\xe7\x9f\xff\x63\x7b\xfe\x6f\x7f\xfe\x19\x5f\x38\x94\xc2\x1d\x79\xe3\xa3\xdf\xf5\x32\x5a\x7d\x18\x27\x78\xbb\x30\xda\x91\x59\x04\xa8\x75\x8b\xd4\x0d\xa1\xf7\x75\xc9\xee\xdc\x67\xd3\x18\x30\x76\xed\x8d\x30\xd2\x4d\x52\xda\x72\x16\x4e\x65\x52\x7f\xd9\x6c\xb2\x3d\xa9\xad\xe0\xf5\x25\xfc\x47\xcd\x22\xac\xaf\xe1\x9f\xaa\xdf\x1f\xd7\x0d\xe9\xea\xe7\x47\x75\x43\xfa\xd7\xb5\xd8\x5b\x59\xd5\x62\xef\xab\x03\xf6\x47\x19\xd3\xef\x09\xb1\xe2\x59\xf2\x89\x70\xe0\xcc\x27\x66\xd4\xac\x74\xb4\x69\x9d\xd2\x77\xdf\x52\x21\x1d\x1f\x8b\x91\xb8\x75\xe0\xad\x59\x48\xfc\xab\xec\xed\xf3\x1f\x09\x1f\x9b\xee\x9d\x0e\xe1\x99\x6f\x97\xbe\xb7\x43\x43\xc3\x88\xd6\x16\x68\xc9\x57\x87\xc3\x29\x5e\x2c\x79\x33\xf2\xd2\x30\x42\x77\x6f\xaf\x43\x5b\x0f\xbb\x8f\xf7\x0e\x1e\x19\x09\xa5\x0e\x3b\x7d\xd5\xee\xee\x1d\x74\x1e\x1f\x78\x8a\x3e\xc0\xa7\x87\xf3\x8e\x99\xa5\xf6\xf5\xc3\xdf\xb4\x99\x7e\xa2\x4d\x04\x7e\x45\xb3\x44\x3c\xd8\x3d\xd8\xdf\xb1\xc6\x8a\x7d\xfd\xf8\x60\xde\xa1\xd4\xbc\x9e\x67\xd1\xb9\xf7\xfc\x77\x8f\x48\x26\xda\x64\xf7\x60\xff\xb7\xa4\x45\x92\xd4\xbc\x49\x52\xf3\x86\xd2\x36\x21\xdd\xfd\xdd\xdf\x88\x62\x64\xff\x37\xd9\xda\xa1\x0f\xba\xfb\xbb\xa6\x86\x1d\xfa\x60\xdf\xfc\xdb\x05\x3e\xf5\x04\x53\x2d\xa2\x0e\xbb\x9d\xfe\xae\xd7\x7e\x4c\xc1\xdf\xf5\x92\xd6\x5e\xa7\xf3\x9b\x6e\x91\x9d\x43\xd1\xef\x78\xdd\xb2\xa9\xa3\x79\x65\xfe\xc8\x18\xf6\x60\x46\x74\x0c\x22\x46\x2e\x25\x4e\xdb\x30\xb0\x8c\x61\x07\x56\x6d\xd6\xd5\xb7\xea\xba\xb5\xad\xba\x9d\xda\x56\xdd\x6e\x2d\x33\xc3\x5e\x2d\x8f\xc3\x7e\xed\x38\xfa\x41\xf5\xf6\xc3\xc6\xc3\xda\xcd\x83\x8f\x6a\x89\x00\x1e\xd7\xae\xca\xea\x76\xea\x57\x5f\x75\xbb\xf5\xdd\xc2\xee\xce\x62\x41\x66\xe4\x93\x9f\x36\xba\xda\xea\x19\x79\xef\x17\xbd\x71\x5a\x7a\xff\xa5\xf4\xde\x2b\xbd\xff\xb1\xe6\xbd\x2a\xf5\xaa\x9b\xbe\xdf\x85\x19\x79\x92\x57\x8c\xff\x6b\x39\xdf\x4a\x62\x41\xf0\x8a\x2a\x76\x65\x73\x98\x5a\x71\xef\x8f\xa8\x59\x86\x8a\x7d\x92\xfb\xe0\x95\x87\x72\xef\xa3\xb7\xa5\x9a\x4d\xbc\xdc\x7c\x3e\xd7\x7d\x7c\xde\xf1\x76\xbd\x2e\x3a\x44\x5d\xff\x5b\xd9\xd5\x54\x99\x11\x87\x9d\x54\x65\x1d\xc7\x64\xe5\x44\xaf\x07\x13\x49\x34\xc3\x54\x29\x36\xa8\x71\x49\xd4\x03\x31\xef\xf4\x65\x8b\x7c\xd3\xf6\x99\xb6\x88\x6e\x39\x0d\x87\x52\x0f\x77\xd9\x42\xbb\x7d\xb0\xc0\x09\xec\x00\x0f\x8d\x21\x00\x83\x98\xe2\x49\x8f\xc2\xcf\x55\xa2\x6d\x2b\x77\x19\x34\x9b\x5b\x65\x9f\x41\xe6\x41\xb0\x4e\x83\x92\x13\xac\xdc\x30\x33\xad\xac\xdf\xc0\xa8\xc8\x93\x18\x24\xec\xd1\x76\xfa\xd4\xed\x74\x68\x2b\x7b\xdb\xe9\x94\x29\x88\xf8\xff\x1f\xd9\xbd\xf0\xdc\x95\x9b\x87\x71\x0f\x5d\xc3\x89\xf7\xd5\x66\x75\x6a\xcd\xea\xd6\x9a\xb5\x53\x6b\xd6\x6e\xad\x59\x7b\xb5\x66\xed\xd7\x9a\x75\x50\x6b\xd6\xc3\x5a\xb3\x1e\xd5\x5b\xf5\xb8\x7e\x55\x5d\xb7\xb3\xd4\xcc\xb2\xdf\x7d\x58\x9a\x45\x44\xb0\x19\x99\xe1\xb0\xa3\xcc\xc6\xdb\x9a\xa4\x99\x51\xf8\xda\xe8\x6c\x28\xb0\xf1\xbd\xce\xc1\x8d\xaa\xd4\xdd\x3b\xe8\xe2\x6b\x51\x81\xcd\x95\x77\x23\x67\x55\xab\xdb\xe9\xfc\x26\x5b\x7b\xbf\xe9\x96\x70\x79\x8b\x08\xd7\xef\x77\xbd\xb2\x5b\xca\x2f\x53\xa3\x98\x21\x8e\x29\x26\x29\xdc\x73\xed\xc9\x76\xc0\x89\x42\xc1\xad\xca\x01\xd3\xa3\xd8\xe8\x85\xbb\xa8\x1e\x72\x5d\xc2\x16\x97\xd9\xfc\xd1\xc1\x9e\x40\x46\x7f\xd8\x7d\xdc\x3d\x28\xdf\x13\x33\xe6\x95\x25\xfc\x4d\x0c\xdd\x5d\x2b\x77\x4a\x2e\x3d\x5e\x8f\x09\xef\x4f\x34\x71\x4e\xae\xa2\x64\x3c\xc0\x1b\x7c\x7d\xd1\x10\x93\xa9\xbe\x73\xa8\x37\x23\xaf\x63\xd8\xd6\xc4\xf9\x5d\x45\x72\xd4\x78\x7d\xf2\xf1\xd1\x41\xa7\xdb\x18\x46\x6a\xc2\xb5\x43\x61\x5a\x33\xee\x6f\xca\x04\xbc\x23\xd7\x11\xdc\x1f\x1b\x41\xb3\xd5\xa1\x70\x92\x3d\x9c\x66\x0f\x5f\xb2\x87\x57\xe6\xe1\xbd\x31\xa9\xde\x08\x10\x1c\xe5\x64\xd9\xa7\xb0\x5d\x46\x1b\xa0\xdc\x92\x94\x6e\xa2\xbb\xea\xa6\x9a\x54\x04\x6c\xf0\x0a\xcd\xa0\x8f\x56\xb8\x7d\xab\x86\x4a\xa6\xd3\x44\xd7\xa5\xc0\x25\xd9\xea\xc2\x56\xa7\x9e\x1e\xd4\xbe\xee\xd6\xd3\x08\x5d\x92\xad\x0e\x42\xd7\x18\xd6\xbe\x37\xab\x33\xa1\x98\x97\x31\x97\xea\xfe\xc8\xf4\x41\xe2\xfa\x14\xfc\x2b\x4f\x82\x1f\x79\xca\x08\x72\x51\xf6\x59\x56\xd7\x89\x2c\xb7\x56\xea\xfb\xf3\xbf\x63\x87\x7c\x1a\x0b\x43\x4a\x10\x4d\xa6\x63\xa1\x45\x83\x0f\x06\xa1\x1c\x61\x08\x1e\x9e\x9e\x32\x56\xb6\xa7\x5c\xbf\x3f\xd3\xb6\xbf\x27\x78\x3f\xa8\x67\xca\xbe\xb7\x00\x71\x83\x2b\x81\x99\x32\x42\x25\x06\x65\x3f\xd6\xb4\xca\x60\xbf\x9b\x45\x4f\xc4\x70\x4b\x7e\xc4\xd0\xed\x1a\x2b\x2c\x06\xe4\xbb\x9d\x6c\xb9\x2b\x79\x49\x97\x99\xb3\x5b\x67\xce\x19\xdf\xb8\x1d\x73\x57\xed\x00\x6b\xce\xf2\xaf\x76\x20\x3f\xa3\xd7\x82\x9f\xa1\x41\x14\xa3\x41\x74\xd3\x2b\xb6\x01\x67\xe4\x6a\x0c\xdb\x46\x69\xe5\xa7\xb8\x1b\x98\xbd\x30\x26\xa4\x17\x40\x6c\x5f\xdc\x8c\x81\xe3\x66\x1f\xfe\xfa\x1c\x9b\xa9\xfd\x8d\x42\x82\xdb\x7e\x0a\xfc\xcf\xf6\xc3\x00\x23\xb1\x6a\x3b\x7f\xb7\xe5\x16\x1a\x2b\x92\x48\x86\x63\x46\xdd\xed\xfe\x64\xec\x99\xd6\x55\x9c\x44\xd7\x7c\xe3\xfe\xd1\xd1\xe6\xde\x38\x29\x57\x77\x35\x24\x47\xe3\xea\x64\x3c\xdd\x5c\xfc\x39\xdf\xec\x74\xdc\xfc\xf9\x7b\x45\xa3\xa8\x26\xd8\x29\x39\x1d\xab\x52\x10\x95\xf7\x33\xab\xbb\xcf\xc8\xe7\xb1\x8d\xb1\xc8\x6d\xb7\x3f\xff\xec\x5b\x0f\x90\xcb\x0f\x28\xa5\xae\xdf\xbf\xc4\x54\xf0\xca\xf5\xad\x03\x2d\x0b\x38\x55\xae\x8f\x31\x19\xd4\xbb\x24\xce\x03\x07\x8e\xf2\xf3\x47\x58\xc9\xf1\x18\x5e\x8c\xe1\x1d\x91\x70\xcf\x0f\x70\x2f\x37\xf1\x0c\x9e\xe0\xd4\x30\xfe\x82\xe2\x78\x7c\x8b\xcc\xbb\x92\x03\xb4\x44\x2a\x92\xdd\x5b\xca\x9c\x96\xad\x7d\x99\x6d\x66\xca\x57\x57\xc1\xd4\xac\x2a\x3e\xec\x78\x15\x73\xac\xf8\xb0\xeb\x95\x2f\xe9\x2f\x7f\xe9\x14\x5f\x0e\x2a\x1f\xf2\xa5\xf5\xc9\xb8\xb6\x96\x7e\x19\xd7\x16\xdb\x1f\xe3\xba\xe4\x79\x3f\x2e\x0d\xde\x1b\xbe\x71\x63\xf2\x1d\xdf\x6c\x87\x7e\xa8\x7e\x7f\x58\xfb\xfc\x8a\x6f\xb4\x33\xcf\xaa\x9f\x0f\x6a\x9f\x5f\x97\xc6\xe1\xa3\x2e\xed\x04\x76\xd3\x6b\x4d\xa4\x67\xcc\x23\x54\x49\xa9\x6b\x0c\xc1\x4f\x21\x44\x98\xd0\x99\x56\xef\xf5\xfd\x58\xb5\x7b\xf4\x00\x8e\xc9\xb9\x1c\x10\x87\x8f\x85\xd2\x0d\xfc\xdb\x9e\x71\x25\x43\x39\x72\xe8\x05\x35\x9f\x93\x01\x41\x02\xaa\x06\xe5\x71\x19\x93\x4a\x88\x36\x4b\x95\x3f\xc0\xb0\x4e\x54\xc7\x39\x7c\xf4\x3a\xa9\xde\xbd\xa8\x48\xbd\xaf\x55\x22\x06\x03\xc8\xee\x9d\x88\x45\x75\xba\xfe\xac\x42\xfe\x31\x06\xe7\x4a\x89\xa1\x03\x0f\xfe\xc7\x77\x7e\xc3\xed\xfd\x2f\xde\x83\xd0\xd5\x22\xd6\x84\x48\x26\x69\x7e\xda\xf3\xc1\x9f\xf1\x83\x11\x38\x0e\xa5\x98\x74\xb8\xec\xaf\xa9\x62\x7d\x23\xea\xfb\xaf\x25\x67\x6d\x62\x7b\xb1\xee\xb2\x9d\x62\xc7\x21\x79\x70\x3b\x20\xce\xa5\x3f\xe6\xf2\xba\xd4\x63\x12\x7b\x0b\x5e\x9b\x09\x3a\x1b\xc0\x1d\x26\x73\x3b\xab\x74\xc3\xcb\x8a\xe4\x36\xba\x98\x2c\x07\x30\x9d\x0c\xe0\x0c\x70\x27\xe0\x28\x1f\x25\x2d\x6e\x75\x5b\x46\x33\xc5\xa7\xa5\xba\x54\xcb\xf1\xcc\x4f\x0a\x33\x72\x9d\xc3\xce\xda\xdd\x4e\x07\xa1\x9e\x2d\x8f\xde\x0b\xbe\x29\x22\x6c\x3e\x5f\x19\x00\x36\xcd\x71\xfb\x5a\x36\x7c\x2d\xdb\x51\xa2\xc7\xa1\x14\xed\x50\x0e\xa3\x86\x1f\xa9\x81\x50\xed\x8e\x43\x01\x3b\xc6\xd2\x37\x23\x71\x5e\x6c\xc8\x1b\x43\xde\xc6\x12\xc1\x15\x57\xba\x31\x51\xed\x1d\x24\xf1\x8c\x42\x32\x20\xce\x49\x94\xa8\x40\x60\x5b\x3c\xf3\xbb\xbc\xce\x7e\xde\xdc\x5d\xba\x4c\x5c\x1b\x7d\xcc\x88\xbe\x31\xf1\xd3\x3a\x90\x18\xb1\xd4\x86\x78\x92\x51\xae\xc2\xd1\x95\x6e\x77\x1a\xd8\xcb\xd6\xed\x6d\xba\xf4\x66\x00\x4e\x12\x0b\xd5\x8e\xc5\x58\x04\xda\x01\x27\x94\xa1\x0e\xf9\x38\xff\xda\x9e\x44\x3f\xdb\x7f\x01\x32\x13\xfe\x75\xa8\xff\x02\x2a\x25\x24\x88\xc6\x91\x72\xc0\xf9\xb7\x20\x08\x2a\xe3\xfc\x0f\x96\x6f\xf1\xdb\xe1\x1e\xae\x6c\xce\xa8\x3d\xe4\x03\x31\xa8\x0c\x51\x2c\x82\x48\x0e\xb8\xba\x73\x28\x7c\xe5\xe4\x98\x93\x4b\x8c\x02\xa3\x14\x26\x03\xe2\xbc\xc0\xcd\x86\x86\x7f\xd7\xd0\x57\x61\xdc\x18\x73\x5f\x8c\x4b\x55\x3b\x2d\x1c\x94\x0a\x0f\xbd\x2f\x6b\xcd\xff\xf6\x20\xdd\x6a\x88\x1f\x48\x31\xeb\xdb\xbd\x0b\xe6\xb4\xde\x87\xe4\x7d\x4d\x21\xfe\x52\x1a\xc8\xb3\x84\x48\xd7\x3f\x71\xfd\x8f\x95\xe8\x86\xbf\xc9\x6b\xef\x39\x59\x9a\xc6\xb9\x52\xf5\xc4\x6e\x2f\x77\xd2\xbd\x11\x5f\x9b\x1a\x71\x0f\x68\x1d\x83\xfa\x62\x3c\x6e\xc7\x63\x1e\x5f\xb5\xa3\x65\x16\xb5\xcd\xb4\x3c\x6a\xcf\x02\xc1\x26\x72\x07\x5c\x8e\x4c\xc7\x56\x08\x2e\x77\x97\xd3\x52\xbf\x40\xc9\x3a\x3a\x06\x48\x48\xa9\x77\x9f\x54\x67\xf6\xf7\x41\xed\xcc\xef\x8f\xea\x77\x51\x5a\x01\xc2\x91\x34\xac\x39\x6c\x07\x42\x1a\x66\xc8\xab\xb4\x3c\x70\x69\x44\xa1\xff\xb9\xc6\x05\x9f\x56\x08\xf3\x2b\xd3\x66\x07\xf0\xb6\x2c\x09\xc7\x83\x32\xfc\xdb\xcd\x1a\xd8\xef\x7c\xa3\x3b\xf8\x8f\xd5\x56\x8b\x2c\x6f\x08\xa6\x76\xc3\x96\x9e\xcf\xf1\xe4\x2c\x5a\x0f\x3b\x36\x71\x3d\xde\xb0\x94\x1b\x12\x95\xa8\xa7\xa0\xd4\x8e\x55\x0c\x55\xf1\x45\x49\xd7\x1f\xa5\x2e\x29\x5d\xf5\x45\x65\x1c\xe7\x47\xb0\xce\x17\x85\x8e\xdd\x45\x35\xd0\x43\x95\xab\xbf\x24\x12\xd3\x7b\x14\xee\xca\xa0\xba\x99\x3e\x30\xa2\x63\x9a\xe8\xb4\x8f\x55\x90\xf5\xf5\xdb\x41\x85\x19\x44\xb0\x34\x38\xd7\xe2\x6e\x10\xcd\x64\x3e\x3a\xbf\x57\x46\x27\x59\x59\x20\x99\xae\x01\xe7\xc1\x1a\x75\x22\x88\xc6\x8d\x20\x1a\xb7\x79\xa2\xa3\x42\xf8\xfe\xa2\x8c\x1e\x6e\x9c\xfb\x56\x7e\xcd\xc8\xcb\x01\x6c\x61\xb4\x4c\xce\xa0\xb8\x41\xbc\x56\x30\x56\x27\x64\x19\x4b\xb7\x82\xc5\xf9\x7f\xfe\xef\x4c\xd6\x55\x18\x3d\x08\x36\x6a\x78\x51\xb0\x51\x7f\x0c\x97\x3b\x76\x12\x25\xb1\xc0\x99\xb6\xac\xf8\x0c\xd7\x80\x8f\x05\xbf\x11\xcb\xe0\x7e\xb0\x51\x7f\x8c\x83\x8d\x36\xd5\x38\xd8\x38\xe7\x06\xc1\xc6\x19\x7b\xb3\x4c\xaa\x3f\x4e\x56\xb4\x69\xfb\x7f\x23\xb3\x04\x37\x75\x66\x91\x7f\x93\x51\x0c\x86\x5f\x63\x94\xc9\xe6\xee\xbc\xda\xcc\x28\xd3\xcd\x63\x35\x0a\x36\x46\xb4\xcc\x36\x33\xc2\xdd\x66\xe4\xb7\xc1\x46\xfb\xf6\xba\x56\x77\xfd\xfb\x51\xf0\xbf\xd6\x67\x5c\x33\xe7\x1e\x96\xfd\x00\x41\xdd\xb1\xb2\x53\xf7\xab\x9c\xae\x63\xc7\x01\xd7\xa2\xa2\x03\xd6\x94\xfa\xc2\x5b\x10\xe4\xeb\x02\x1e\x1d\x9c\x0e\x61\x18\x92\x0e\x1a\xeb\x53\xba\x4a\x35\x0d\xf8\x58\x18\x25\xec\xb2\x31\x89\xa4\xbe\xca\x50\x13\xc5\x34\x94\xe1\x54\x34\xb3\x10\xed\x2b\xcc\x7e\xb4\x6a\x56\x4c\x95\xb8\x69\x23\x50\x63\xd0\x1e\x8e\xc5\x6d\xba\x6c\x5b\x86\xfd\x79\x93\x17\x79\x79\x93\x2f\xf1\x4a\x45\x33\x67\xad\xb6\xc1\xe5\x68\x2c\xda\x63\x31\xd4\xe6\xd7\xee\x6d\x23\x48\x54\x1c\xa9\xf6\x34\x0a\x2d\x62\xd4\x3e\x2e\x32\x11\x5b\x90\x62\x49\x35\x5d\x56\x27\x25\xef\xba\x6f\xc6\x10\xb2\xfb\x6b\x69\x14\xd3\xb3\x1b\x38\x4b\x95\x99\x5f\xd8\x61\x73\xde\x70\x99\x18\xed\xb5\xca\x45\xce\x0b\xe1\xab\xd2\xfb\x8c\x9b\x9c\xf7\x5c\x05\x57\x4e\x95\xa5\x9c\xa3\xa9\x0a\xc7\x4e\x95\xaf\x9c\xf7\x3c\x2b\xbc\x9f\xd7\x95\x48\xe1\x54\x1d\x0c\xce\x9b\x64\x9c\xc1\x3d\xcc\xf1\x25\xa3\x24\xd6\x4e\xd5\xf3\xe0\x9c\x88\xa9\x16\x13\x5f\x28\xa7\xea\xce\x77\x3e\x06\x3a\x2a\x5e\xe7\x5e\x7d\xe7\x43\x74\x93\xc2\x57\x39\xda\x79\x26\x02\xfb\xa1\xb4\x51\xa7\xe8\x72\xff\x4b\x64\xd6\x75\xac\xf0\xf5\x3f\xcd\x0a\x68\x10\xfd\x35\x2f\x5c\xd8\x01\x3d\xbe\xc1\xac\x1e\x95\x29\xf2\xad\x3a\xc9\x42\x05\xce\x84\xdf\xda\xf3\x77\x0e\xd4\x43\x65\xbf\x07\x15\x07\xda\x9b\x3e\x36\xf2\xac\xce\xf9\x93\x68\xc0\xc7\x0d\x63\xe2\x34\xe2\x2b\xd3\x8a\xd4\x7a\x1a\x84\xf1\x74\xcc\xef\x1c\xb3\x00\x45\xc1\xf5\xaa\x49\x83\x45\xdb\x83\x90\x8f\xa3\x51\xa3\xfc\x23\xed\xb1\x62\xba\x2f\x97\x0a\x6c\x02\xb2\xf5\x00\xf5\xb9\x5a\x2c\x2d\xc1\x38\x8a\x45\x63\x92\x2d\x71\x66\x54\x6e\x03\xf2\xfc\xa6\xbc\x9a\xdc\x3a\xab\xa7\x96\xc1\x6c\x73\x41\x67\x78\x83\x01\x5c\x07\x80\xd1\x2e\x37\x15\x60\x34\xf9\x1b\x86\x4e\x1e\xca\x82\x12\x94\x53\x15\xc0\xa9\x6e\xef\x35\x8c\x90\xf9\x9e\xc4\x3a\x1c\xde\x65\x6d\xab\xcd\xdb\x19\x79\x62\xc6\xb4\x63\x0a\xe3\x53\x37\x1b\xee\x35\x74\x0e\xa3\x48\xaf\xee\x81\xc9\xb8\xbd\xd3\xa8\xaf\xb0\x71\x12\x04\x22\x8e\xcd\xb2\xbe\xa1\x63\x9e\x72\x19\x58\x63\xb4\xba\x5e\x57\x50\x4e\x55\x38\xc9\x8d\xdb\xdb\x80\x7c\xab\xa0\x38\x11\xba\xf1\x8c\x6b\xf1\xe0\x34\x9c\x88\xd2\xa2\xbd\xbe\xc3\x79\x70\x3d\x50\xd1\xb4\xcc\x65\x19\xc7\x7b\x19\xb8\xe5\xba\x60\x1c\x4e\x1d\x70\x94\x08\x34\xe9\xe0\xa5\x17\x1d\x9a\xb3\xe4\x34\x8a\x43\xbc\x10\x13\x9c\x61\x78\xbb\x81\xbb\xb0\xa2\xcc\xbe\xfb\x0b\x7a\x0a\x52\x4a\x5e\xe5\xcd\x2b\xfb\xe5\x66\x1d\xee\xcd\x66\xad\xe2\xdd\x66\xbd\xe0\xc3\xf2\x24\x57\xd1\x2c\x5e\x9e\xdf\xaf\x36\xe3\x39\x0b\xca\xb1\x28\xdf\x35\x1e\x12\x3a\x26\xe7\x25\x6b\xd9\x01\xdc\xe3\x70\xc4\x20\xd4\x8e\x19\x3a\x74\xa0\xff\x1d\x5f\x81\x2a\xb1\xc5\x73\x83\xc5\xf4\x63\x11\x4a\xea\x9f\xb8\xfe\x71\x5f\x79\x7f\x13\xeb\x8c\xcc\xb6\x0d\x69\xd7\x76\x2f\xa5\x54\xc7\xb1\xb0\x37\x2d\x38\xd5\xf1\x7a\x5d\x6a\x2b\x06\x36\xa8\x22\xb0\x41\x95\x3d\x8d\xdf\x35\x6c\x19\xa3\xb3\xd9\x54\x7d\x87\x39\x9e\x79\x9e\xcf\x55\xbf\x78\xf7\x1f\x8e\xe7\x6c\xe1\x1f\x86\xdd\x65\x23\xc0\x5c\xff\x5b\xa5\xc2\x8f\x9b\x2b\x04\xc5\x3e\x0b\x72\xcd\x6b\x4e\x5c\x1b\x53\x91\xd5\xd5\x59\xaa\xbd\x1a\x5c\x51\x8a\xe7\x9c\x91\x1f\x37\x70\x8d\x89\x94\xb1\xa9\x65\xcf\x71\x90\xba\x59\xab\x39\x57\x1a\xff\xe7\x4c\xab\x22\xf9\x8b\xeb\xff\xb0\x1b\x6a\x6e\x60\x03\x3f\xb8\xcb\xf7\xd0\xdd\xc0\xdd\xe0\xa0\xa2\xe2\xfd\x7f\x76\x99\xba\xdb\xae\x7e\xc7\x9b\x03\x9c\x4d\x96\x12\x2e\x67\x56\xd4\xaa\x95\xf6\xd0\x5f\x2c\x61\xfa\x57\x56\x0f\xf1\x5f\x10\xd1\xa5\xbd\x86\xcd\xd6\xd6\xcf\x55\x26\x4b\xae\x5c\xa6\xc1\xcd\x35\xd5\x72\x2a\xe4\x20\x94\xa3\x25\x6d\x4d\xdc\x4e\x71\x6f\xb8\x84\xfe\x59\x55\x32\x3e\x5f\xc1\x25\xc5\x38\x7c\xdf\xae\xbf\x33\x9d\xfa\x81\x4f\x84\xd7\xb0\xab\x1f\x6e\x46\xf8\xd1\x52\x87\xfc\x15\x8e\xa3\xc1\x40\x89\x38\xae\xa0\xe1\xaf\x96\x0c\xd7\x97\x41\xc5\xcf\x15\x59\x3f\xd7\x89\xdd\x4a\x8e\x7b\x65\x9f\x61\xda\x8c\x37\xdb\xf6\x09\x97\xe9\x71\x12\x6b\xa1\x1a\x27\x98\x2c\xd7\xd6\x54\x0a\x22\xc0\xc4\x25\xe5\x6d\x15\xc7\xb1\xf3\x0c\x77\xad\x56\x19\x4b\xc3\x48\x4d\x52\xbb\xbf\xa2\xab\x16\x6d\x0c\xa2\x71\x3b\x9e\x54\x9c\x94\xb6\xbf\x9c\xa5\x2e\x4a\x41\xbb\x9d\x3a\x63\x9b\x1e\x20\x55\xd8\xff\x5c\xc5\xb6\xdd\xbf\x52\x75\xe6\x75\x25\x92\xd9\x30\x50\x9f\x0f\x46\xc2\x81\xad\x4e\xa5\xc7\xd6\x87\x5d\xd8\x02\x99\xfa\xe4\xac\x8c\xc1\x48\x61\xb2\xbd\xbc\xd5\x91\x17\x29\x50\xea\xe9\x40\x9f\xe3\x82\x18\x2a\xe5\x20\xdd\x58\xce\xa2\x77\x13\x63\xa0\x5e\x0d\xe1\x75\x92\x46\xec\xe5\x0d\xff\x15\xe3\x4d\x09\x3e\x58\x32\xdd\x62\xa1\xcd\x7a\xba\x3c\x91\x06\x61\xcc\xfd\x31\xce\x24\xa2\xcb\x42\xa0\xca\x4e\x62\x0d\x3b\x89\x7f\x25\x3b\x7d\x12\x42\x15\x83\x7a\xb5\x66\x50\xb1\x8b\x9e\x05\x20\x33\x7e\xaa\x6e\xb6\x2d\x79\x1a\xd2\xe9\x33\xbb\x29\xa6\x4f\x79\xda\xfc\xd7\xc9\xfe\x32\xd5\xe1\x2f\xcf\x83\x0f\xb1\x11\x2b\x7f\xe4\xdd\x6c\xe4\x80\xcb\x8f\x69\x1a\x4e\xbe\x0d\xeb\xa6\xfc\x57\xa1\x62\x54\x66\xa4\x8d\x7e\x32\x2b\xf2\xbf\xa8\x01\x4f\x14\x97\xc1\xd5\x2f\x36\x40\xb9\xfc\xc3\xaa\x85\xe2\x3f\x59\x75\x12\x8e\x07\xc6\x5a\xf8\xf5\xda\x3f\xfe\x8b\x6b\xff\x12\x0b\xf5\xeb\xb5\x7f\xfa\xd7\xd5\xfe\x32\x4a\xc7\xf4\xd7\x6b\x7f\xfc\xaf\xab\xfd\x58\xdc\x84\x7f\xab\x72\xff\xc5\xbf\xae\xf2\xbf\xdb\x70\xff\xb2\xec\xfe\x40\x6b\x9c\x7f\x71\x7d\x05\xe5\x19\x5e\x59\x20\x23\x39\x0c\x47\x19\xfa\x0f\x39\x31\xd3\xf6\x5e\xb1\x01\xcc\x83\x6b\x43\xb9\x1c\x38\xe0\xfc\xdb\xf0\xe1\xf0\xe1\xf0\x71\xfe\x71\x18\x49\xdd\x1e\xf2\x49\x38\x36\xca\xe3\x24\x92\x51\x3c\xe5\x81\x28\x1a\xf8\xae\xa8\x4d\x96\x88\xbb\x58\x3e\xb0\xf1\xb9\xec\xba\xb4\xc7\x95\x98\x74\x83\xb3\x2c\xc0\x87\xe7\x01\x3e\x79\x40\x0d\xfa\x1d\xde\x70\xc0\x33\xab\xc1\x37\x58\xad\xf4\xca\xa8\x3d\x4a\xb4\x16\x2a\x2e\xc8\xfa\x88\x5f\xaf\x6f\x88\x33\x0c\xc5\x78\x10\x0b\x5d\xee\xf7\x17\xa1\x8a\x75\x63\xc0\xef\x1a\xd1\x10\x43\xf2\x66\x42\x5c\xe7\xa3\x70\x8b\x1e\xab\xf7\x83\xe5\xb2\x77\xe4\xe8\x06\x9c\xf7\x91\x1c\x18\x5d\x7a\x2b\x71\x83\x5b\xe0\x9a\x82\x7d\x7f\x92\xd8\xf7\x5d\x7b\x4f\x1d\x7e\xb2\x18\xe5\x4d\x85\x4f\xd0\x6b\xb9\xd2\xdb\xeb\x7c\x88\xb4\xf0\x1a\xa7\x57\x61\xdc\x30\x6b\x55\x28\x47\x0d\xf3\xc8\x6f\x6c\xc2\xc3\x71\x14\xf0\x71\x23\xd6\x91\xe2\x23\x61\x88\xbf\x8b\x12\xd5\xf0\x8d\xe9\x6b\xb5\xd8\xdc\x59\x52\x8b\x55\x9a\x91\x70\x00\x2f\x02\xb0\xd6\xe6\x69\xfd\x2a\xba\x95\x9b\x8e\xef\xad\x19\xf2\xc6\x1a\x21\xcf\x30\xae\xcf\x7f\xbb\x1c\x8f\xb5\xeb\xd9\xf4\x51\xaa\x9c\xcd\xe8\x72\x1b\x04\x68\xe0\xb0\xb5\x95\xe4\x37\xbf\x57\x15\x06\x3e\xa8\x6b\x07\x1f\xb9\x4d\x21\xb0\x20\xd2\x0d\xba\xf5\x0b\xe3\x67\x64\x74\x63\x1a\xb0\x0f\xdc\xe5\xf5\x5b\x29\xb5\xb5\x2e\x83\x0e\x75\xf9\xb6\x3d\xaa\xfc\x15\xf0\xc6\xb4\x3b\x1b\x31\xff\x76\x0d\xf7\x4c\x7c\x33\x17\xaa\x7c\x93\xbe\xdf\x71\x28\x58\x16\x1a\x6b\xa1\xda\x3e\x57\xed\x3c\x76\xb3\xcc\x4c\xe3\xd4\x84\x30\x43\x1d\x0c\xd2\x03\x95\x1c\x3e\x0b\x9c\xd3\x37\x70\x1f\x5c\xe2\x69\x2a\xab\x58\xc0\x1d\xb9\xd9\x86\xd3\x6d\xcc\xcc\x05\xb7\x64\x7b\x1b\xae\xb7\xc1\xde\x97\x7b\x41\x69\x6d\x4b\x02\x31\xbe\x10\x70\x4b\x06\xdb\x70\xa4\x31\x9f\x90\x74\x03\x63\xf4\x07\xdb\xb4\x1e\xf0\x5a\x81\xbe\xd6\x84\x63\x34\xd6\x00\x1c\xa7\x02\xff\x70\xfd\x10\xdc\xdd\x94\xd3\x91\x54\xb5\x88\x57\xb9\xfc\x90\xfc\xc6\x37\x8a\x0f\xfe\xd3\xd6\xd1\x68\x34\x16\x46\x7f\x6a\x4f\x06\xd9\xcb\x31\x3a\x72\xf3\xb8\x90\x89\xdf\xde\x6f\x4c\x75\x7b\xb7\x31\xf5\xdb\xbb\xf5\xe8\x13\x3f\xd2\x3a\x9a\x38\xe0\x74\xa7\xb7\x8d\x38\x1a\x87\x83\x86\x1a\xf9\x9c\x74\xa0\x61\xff\x73\xbb\x3b\xfb\xb4\x18\xa6\xb3\x92\x58\xad\x79\x1e\xcb\x5e\x94\x94\x14\x5f\x71\x39\xc8\xa2\x20\x2a\x46\xca\x58\x28\x3d\xe1\x92\x8f\x8a\x01\xbc\xaa\x97\x96\xfc\xa6\x50\xb8\x5e\x6e\x13\x49\xe1\xc5\x36\x5d\xa5\x36\x17\xf9\xf4\x76\xbc\xea\x28\xa6\xca\x62\xad\xaf\x97\x16\x90\x50\x8e\x43\x59\x72\xda\x2e\xb7\x68\xcd\x86\x63\x2d\xbe\x43\x8a\x59\x45\xa8\x88\x59\xa3\x1c\x43\x62\x34\x45\xab\x30\x56\x74\xc6\x2f\x35\x8f\x5c\x7d\xbb\xf9\x49\xed\x7b\xfd\x60\xdb\x8f\xda\xf7\x7a\xc4\xe1\xa7\x32\x37\xfd\x21\xc9\x50\x55\x9d\x34\x6f\x83\x4a\x1a\xa7\xca\x64\x4d\x9f\xbe\x6c\x03\x86\x1c\x06\xaf\x69\xcb\x19\x87\xfe\x03\x3f\x8a\x74\xac\x15\x9f\xb6\xf7\xdc\x8e\xdb\x69\xf3\xf1\xf4\x8a\xbb\x07\xed\x41\x18\xeb\x07\x41\x1c\x17\x00\xee\x24\x94\x6e\x60\x4c\x97\x2f\x81\x19\xcc\x2f\xdb\x20\x2d\x0e\x5c\xe3\xf8\x4c\xc4\xd1\x44\xb4\xf7\xdc\x87\x6e\x07\x4b\x96\x5f\x17\x85\x7f\xd4\x0a\x8b\xf1\xa4\x3d\xe0\x5a\x4c\xc3\xe0\x5a\x28\x2c\x58\x7d\x65\x8b\x3d\x09\xea\xd6\x84\x35\x1c\xde\x10\xe5\x06\x78\x06\xf4\xce\xfc\x91\xb4\x97\x67\x17\xbe\x57\xf9\x93\x5e\xca\x38\xcc\x4b\xd2\x37\x7f\xe9\xaf\x7a\x19\x94\x5e\x2e\xf5\xed\xfb\xc0\xd4\x7f\x56\xd7\x3d\xd2\x29\x65\xa6\x6a\x2e\x1b\x3f\x07\xe8\x78\x29\x44\xd4\x8e\x87\xd7\x39\x34\x54\xce\xd6\xf6\xb7\x5e\x54\x3e\xcb\xfc\x73\x38\x24\x3b\xe8\x7e\x33\x24\x65\x65\x6b\x65\x8a\x44\x38\xdb\x36\x93\xbd\x91\xf4\x4b\x08\xfc\x1c\x01\x1e\x15\x5e\x8f\xb5\x32\xfd\x16\x75\xe4\x41\x29\x5d\x4d\xfe\xd2\xc7\x2b\x63\x72\x05\xc6\xa6\xea\xff\x3d\x80\x3f\x02\x90\x11\xa8\x08\x74\x04\x22\x82\x24\x02\x1e\x41\x10\xb1\xaf\x92\x38\xa7\x3c\xbe\x76\x28\x44\xd1\xba\x94\x5c\x41\x44\xf2\xac\x5c\x69\xf2\xae\xfa\x1d\x54\xc8\xd6\x9f\x71\xc9\x0a\x8e\xa1\x72\x33\x1e\x5e\x0f\x43\x3e\x28\xbc\xe5\x2e\x3f\xf9\xa5\xc8\x3d\xbf\x2d\x2e\x92\x11\xa5\x3b\xd4\x38\x13\xf0\x5a\xad\xba\xb0\x2a\x9a\xc6\x9a\x6b\xe1\x80\xa6\xf0\x1f\xaf\x95\x2b\xf9\x4d\x38\xe2\x3a\x52\x6e\x12\x0b\x75\x34\x12\x52\x17\x97\x27\x9d\xaa\x70\x80\x6e\xbd\x66\x73\x25\xb6\x2b\x1e\x5f\x65\x81\x57\x9a\xae\x3e\xbe\xd6\x53\x6e\xa0\xd5\xf8\xad\xb8\x9b\xcf\x95\x3b\x11\x9a\xa7\x8f\xf1\x55\x38\xd4\xf8\xdc\x3d\x34\xeb\x73\xa2\x75\x24\xe7\x73\xe9\x6a\xae\x46\x42\xe3\x91\xef\x68\x26\xc7\x11\x1f\xcc\xe7\x44\xb9\x53\x85\xd7\x3b\x3f\xb3\xbc\x40\x28\x2a\x27\x57\x4a\x0c\x41\x31\xd3\x35\x20\xd9\x73\x41\x34\x1e\x19\x22\x09\x91\xcd\xa6\x72\xfd\x3b\xcb\x2e\x77\xf8\x23\xb0\x3f\x02\xfc\x91\xb8\xdc\xfe\x4c\x5c\xde\xcf\x37\x06\xbc\x74\x27\x42\x2f\xec\xd1\x17\x08\x9e\x79\x2b\x23\xfc\xf0\xb2\x56\x09\x58\xb1\xa6\x0b\x18\xf8\x9e\xbd\x8c\xf5\xb1\x87\x57\xb8\x06\x7b\xe6\xdf\x3d\x83\x22\x8c\xd2\xe4\xf9\x43\x7c\xd8\x5d\x80\x1f\xb1\x81\x84\x38\x62\x81\x84\x31\xbe\xec\x2c\xe0\x06\x1f\xda\x3b\x0b\xd8\x8e\xd8\x4d\x04\x93\x88\x6d\x47\x70\xb5\x8e\xa5\xee\xf9\x73\x6f\x12\x01\x7f\x81\x81\xf5\xaf\xbd\x71\x04\xfc\x8d\xf9\x1b\xfc\xf0\x14\xf0\x6d\xef\x23\x26\x94\xf3\xb9\x97\xa6\x71\xe3\x97\x9e\xe3\x40\x70\xe3\x9d\x01\xdf\xc5\x23\xde\xaf\x3c\x09\xc1\x1b\x83\xc5\x1f\x7b\x67\xe0\x4f\x30\x9f\xda\x73\x54\x55\xf0\xa3\x7f\xe4\xdd\xa7\xc5\xf0\x27\x42\x3d\x31\x7f\x9e\x63\x62\xb8\x37\x58\xe0\x1d\x16\xf0\xbf\x7a\x1d\xbc\xe1\x20\x6b\xcf\x68\x3d\xe5\xcf\x90\x66\xa4\x36\x27\x94\x77\xbc\x69\x04\xc1\xad\x21\x7e\xdf\xfb\x8a\x59\x5b\x6d\xad\x1f\xbc\x71\x84\x37\x1d\x44\xec\xde\x3f\x35\x3f\xe0\x2e\xfa\x85\xdc\xaf\x1d\x68\xa7\x39\x5c\x6f\x23\x96\x48\xb8\x8e\xd8\x3d\xbf\xc2\xae\xe0\x48\x38\xe6\x97\x3b\x36\x7f\x4e\xcc\x9f\x53\xf3\xe7\x8b\xf9\xf3\x0a\x53\xce\x1d\x61\x4b\x0e\x16\x70\x82\x0f\x3b\x0b\x38\xcd\x06\xf0\x79\xb4\xfe\x76\x86\x83\xf2\xed\x0c\xdf\xb2\xb1\xff\x8e\x0f\x8f\x16\xf0\x34\xc3\x7a\x19\x6d\xb8\x86\x91\x48\xa2\x51\x50\xbc\x89\xd8\xca\x1c\x87\xcb\x97\xaf\x4a\x7a\xaf\xd5\xdd\xfd\x6b\x95\xdf\x35\xcb\x54\x71\xc5\x53\xf9\x0a\x5a\x25\xcc\xa4\x22\x78\xfe\x89\xd2\x05\xbc\x8b\xd8\x33\x09\x1f\x22\xf6\x53\xc2\xab\x88\x7d\x88\xcc\x78\x9c\x45\xec\x95\x82\xd7\xeb\x89\xbc\xe7\x6f\x3c\x0d\x7e\x68\x1a\xfb\xd3\xb6\xf6\xe3\xda\x61\x51\xae\xdf\xc7\x6c\x87\x91\xcd\xc0\x88\x49\x89\x8e\xd7\x83\xdb\x44\x89\x32\x4f\x92\xf8\x31\x82\x33\x3b\x96\xcf\x24\x8b\x56\x66\x19\x86\x00\x22\x08\x0b\xea\xde\x7a\x1a\xf8\x99\x17\x01\xef\x7a\x09\xf0\x87\x9e\x4a\x89\x7d\xe2\x09\xf0\x3f\x7b\x1c\xfc\x13\x2f\x04\xff\xcc\xc3\x44\xe7\xaf\xd4\xa6\x44\xe7\xbe\x30\x6d\x95\xa6\xe4\x47\x83\xe8\xd8\x28\x36\x14\xbe\x46\xab\xd3\x2e\x3f\x04\x1f\xd3\x2e\xff\x8c\x98\x2f\x48\x48\x21\xdc\x94\x30\xf2\x67\x04\x33\x12\xdb\x84\x6f\x36\x15\xe7\xb3\x88\x0d\x25\xbc\x8c\x36\xdf\x3a\x32\x94\x6c\x46\x9e\x45\x1b\x0e\x8b\x3b\x89\x9c\xaa\x28\x10\x71\x2c\x06\x4e\xb6\xb6\xc6\x82\xa4\xbe\xdb\x6c\xb3\xa1\xf4\x25\x35\xba\x9c\x38\x99\x4e\xd5\x52\xb9\x9d\x25\x15\xf6\x65\x44\x9c\x2f\xf2\x5a\x46\x33\xd9\xd0\x77\x53\xe1\x35\x9c\x96\xa4\x0b\x33\x7b\xb0\x4f\xef\x48\x08\x36\x9d\xcb\x93\x3b\x07\xbe\x46\xc4\xbc\xc7\x97\x79\x16\x98\xfa\x87\x2c\x7f\xcc\xd2\x7b\xbb\x70\x0d\x25\xc4\x82\xbc\x52\xe8\x11\x86\x17\x91\xad\xc2\x66\x35\x38\x8a\xcc\xb7\x15\x9d\xe6\x47\x38\x60\x14\x3e\x47\xbf\x78\xaf\xca\xfb\x0d\x9c\x5f\x4b\x7b\x6f\xc0\xbf\x44\xd5\xeb\x26\x65\x9e\xe5\x79\x7d\x16\x3a\x9e\xde\xff\x97\x9e\xa8\xa1\xe5\x24\x80\xe9\x79\xab\xf4\x42\x5b\x8c\xf8\x46\x05\x01\x24\x4b\x88\xf9\x50\x2a\x8b\x66\x47\x76\x8f\x43\xc9\x0f\xfd\x39\x02\x3d\x9f\x0b\x1b\x84\x5e\xf9\x86\x89\xb6\xb2\x6f\x46\x11\xa2\x78\xf3\x5b\xc4\xbe\x44\xf0\xe3\x57\x7b\xe8\x53\xb4\x69\xc6\xd8\x0c\x5e\xa1\x99\x31\x37\x36\x77\x17\xce\x98\xb7\xd9\xf2\xf0\x7b\xb4\x3e\x7d\xe9\x8f\x08\xde\x46\x70\x4b\x3e\x45\xa5\x44\x64\xa8\xb0\xa1\x4c\xfc\x23\x62\xe4\xf7\x00\x05\x6b\x67\x65\x1a\x45\x9b\xcb\xd0\x98\xbe\xa6\xe9\xfd\x2c\x25\x62\xc7\x08\x9e\x5a\xda\xb1\xdf\x2d\x4a\x19\xb2\x9f\x0a\x54\xf8\x17\x29\xe5\xed\x90\x62\xa2\x33\xf3\x35\x31\xca\x29\xe6\x4e\xe4\xd0\xee\xe6\xb9\x96\xb1\xbe\x53\x92\x60\x5a\x8e\xc3\x4e\x9a\xcf\x4c\x40\xe0\x25\x98\xcf\x2c\xc1\x7c\x66\xca\xf4\x89\x06\xee\x25\x2e\x5f\xd0\x5e\xc2\x88\x60\x88\x68\x87\xf6\x49\x9a\x76\xbe\xd5\x05\xcd\x74\xab\x0b\x5d\xea\xa5\xef\xb8\xcd\x43\xdf\xea\x52\x48\x70\xd4\x7e\xaa\x55\x2b\xc4\x8a\x5e\xb9\x21\x2a\xb4\x1a\x6e\x39\xbd\x9b\x99\xab\x1a\x5b\x2f\xc2\xff\x66\x16\xf6\xd1\x2d\x13\x54\x98\xd0\x1e\x65\x48\xc0\x66\x6b\x37\x20\x48\x1e\xc7\x94\x42\x02\x1b\x98\x84\xab\x53\x4a\x8b\x10\xb6\xf1\x06\x14\xe0\x21\x7b\x02\x41\xc8\xc2\x04\xa2\x95\xc0\x1d\x3c\x99\x6b\x43\xc0\x9a\xcd\xad\x07\xe7\x7f\xc6\xb7\x7e\x74\xf1\xc0\x9e\xe1\x92\x78\x6d\x24\x6b\x49\xca\x98\xc4\x04\x61\x36\xd1\x74\x18\xb2\x55\x99\x32\x1f\x1f\xda\x6c\x95\xab\xf2\x5c\x72\xdd\x98\x44\xb1\x6e\x3c\xde\x98\xe6\x32\xdd\xeb\x8f\x42\xe2\x74\x5c\x23\x2f\xd7\x65\xd9\x1c\x8e\x23\xae\x6b\x39\x36\x79\x48\xba\x62\xf7\x37\x7b\x4f\x67\x39\x5d\x26\x0c\x43\xc6\xcd\x8a\xfc\x17\x69\xf8\x1b\xc3\x90\xc8\xd6\x41\xe7\x37\xf5\xdb\x41\xe7\xb7\xae\xd8\x35\xcf\x44\xb7\x39\xc5\x1f\x06\xb9\x68\xe1\x85\x7a\x71\x65\xd9\xe2\xc5\xad\x64\x01\x93\x10\x31\xb5\x9e\x2f\x82\xbf\x27\xda\x6c\x66\x41\xb3\xb2\x2b\x37\x58\x96\x6b\xc9\x2a\xb9\x96\x58\xb9\x66\x13\x7f\xa2\xeb\xaf\x2e\xdd\x12\x98\x11\x0e\x56\xfe\xd9\x3b\xd7\x61\x1c\xae\xbf\x61\x29\xb6\xfc\x64\xd5\x8c\x41\xc8\xc6\x21\xdc\x6c\x06\xff\x91\x83\x6f\x87\x4b\xb9\xb3\x53\x81\xbc\xbe\x8f\x44\xda\x47\x6b\xfb\x47\xae\x9c\x2d\x1a\xc5\x3f\x4e\x5c\x0a\x93\x90\x6d\x87\x70\x15\xfe\xe2\xad\x62\xd3\x90\x7d\x55\x30\x0a\x59\x9c\xc0\x2c\x64\x9f\xe1\x2e\x64\x27\xf0\x55\x2d\xf3\x79\xbe\x9c\x58\xaf\xaf\x75\xd5\xdb\x2b\x0a\xf2\x2b\x35\x06\x09\xe1\xa5\x8b\x04\x55\xd1\xb4\xdd\xee\xfe\xee\x81\x38\xf8\x8d\x88\x76\xf7\xf1\xc3\x8e\xb1\xd5\xd2\x6c\x09\x24\x39\xdc\x9d\xcf\xb7\x6e\x12\x22\x68\x9f\xb7\xbb\x1e\xa7\x2d\xb2\x6d\x7e\xb5\xb7\x13\x82\xc0\x45\x40\x4f\x60\x18\x55\xb5\x34\x5d\xa4\x6a\x4d\x52\xcf\x96\xb1\xdb\x3d\xe4\x7d\xa4\xc3\x53\x99\x56\x53\xba\xac\xe2\xf1\x21\x9f\xcf\x77\x1e\x33\xc6\x78\xb3\x99\x56\x9a\x41\xef\x1c\x3c\x7c\xb4\x27\xf6\xeb\xfe\xd6\x0a\xc6\xfd\xce\xe3\x87\x07\x39\x4c\x91\x73\xa3\x53\x82\x79\xf8\xf0\xe1\x81\x38\xa8\x3b\xd4\x2b\x68\xba\x9d\xdd\x83\x47\x39\xcc\xc1\x4a\x34\xdd\xdd\xce\xde\x41\x41\xcf\xc3\xd5\x88\xf6\x0f\x76\x4b\x44\x3f\x5a\x0d\xf4\x68\xb7\x7b\xf0\x28\x07\x7a\xbc\xb2\xba\x9d\xce\xe3\xc7\xfb\x3b\x39\x50\x91\xee\xa3\x82\x6a\x67\x77\xff\xd1\xc3\x12\x54\x77\x35\xae\x83\x9d\x83\xfd\xa2\x9b\xba\x3b\xab\x71\x3d\x7a\xb4\x6f\x3b\xb3\xa6\x42\x96\x05\x1e\x06\x14\xa3\xc0\xfb\xa6\x49\x62\x33\x26\x2e\x16\x30\x23\x37\x61\xe9\x4f\x10\x92\x01\x79\x93\xe5\x91\x1c\x26\x64\x8f\xc2\x38\x21\x4e\xdb\xa1\xa5\x97\x3b\xe5\x97\xf8\x9b\x52\xb8\xdd\x30\x55\x76\xca\x53\xe5\x3a\xfc\xf5\xcb\xe6\x32\x9d\x42\xa5\xb7\x0c\x63\x4a\x3f\x33\x67\x48\x07\xb4\xcb\x33\x5d\x6d\xab\x74\x2b\x86\x60\x78\x55\x16\x11\x8c\x53\x37\xbf\xed\x43\xa4\xf7\xcd\xcc\xc8\xad\x59\xaa\x85\x99\xe8\xda\x5e\x33\x73\x14\xb2\x49\x02\x27\x1b\x0c\x09\xf9\x1b\x31\x42\xbd\x85\x16\xc4\xe9\x8a\xb5\xab\x96\xec\xb3\xd2\xa5\xe5\x3f\x36\x37\xa7\x6f\xf3\x04\x99\x2e\x3c\x75\x96\xbb\xd5\x5b\xd5\xd7\x5e\xa9\xaf\xa1\x52\x8f\xc5\xc9\xb5\x85\x73\x0d\xc2\x30\xa4\xe6\x5d\xc7\x6e\x66\x66\xd0\x93\x70\x4d\xf6\x7c\x53\xee\x9b\x25\xa4\xce\x0c\x27\xe1\x5f\x95\xef\xda\xf2\x2d\x5b\x7e\x25\x4c\x3b\x85\x31\xfc\x72\xf1\x17\x6d\x2b\xbe\x07\x21\x19\x12\xdf\xa8\x83\x9d\xec\xff\xd4\x68\xa8\xf6\x28\xf6\x57\x45\xe1\x79\xb8\xc1\x84\x36\x4a\x72\x45\x3f\xfe\x16\xfe\xad\xeb\xe6\xf2\xdb\x0e\x4b\xb7\xb9\x61\x04\x95\x3d\x3c\x8e\xac\x14\x69\xbc\xb7\xa3\x7c\x6b\x5b\x36\x03\xeb\xa0\xdf\xc2\x3a\xa8\xa1\xe9\xfb\x8a\x39\xc3\x24\x31\xd4\x77\x21\xf0\xce\x60\xe0\x75\xc1\xf7\x3a\xa6\x11\x98\x8f\x61\x51\x51\x68\x26\x9a\x20\x66\xb3\xc4\x9f\x51\x4c\x0a\x63\x56\xb0\x05\x85\xa7\xab\x10\xcf\xc8\x77\xd4\xae\x97\x71\xbc\x11\x70\x95\x00\x2a\x3e\x16\x09\x37\x48\x3e\x2f\x1b\xc1\x76\x11\xc2\xa4\x38\x65\x24\xc6\x56\x2d\x12\x67\xeb\xd4\x56\xf5\x62\x61\x51\xa1\xc9\x7a\xb9\xce\x04\xc8\xa5\x44\xbb\x5b\xbf\xf2\x0c\x84\xbd\xbd\xe8\x4d\xb8\xfe\xf6\x1d\xcc\x66\x99\xb8\xdb\xf3\xb9\x31\x1a\xf2\x37\xc2\xbc\x11\x2e\x4f\xb3\x60\xa6\x09\x43\x6d\xba\xd0\x72\xfa\xc8\x02\x59\x7a\x55\x8f\xc0\x64\xa1\x62\x29\xcb\xa4\x40\x15\x3a\xcf\x32\x99\xa5\xf1\xe4\xee\x00\x78\x29\xbf\xa4\xc1\x16\x40\x92\xa6\xb7\x8c\x98\xb1\x55\x42\x96\x60\x1e\xd2\x04\xef\x78\x4d\x5c\xd1\xab\x53\x59\x23\x29\x82\x30\x4f\xa3\x89\xd4\x71\x9a\x11\x18\xd4\xc8\x32\xdf\xb3\x04\xa1\x29\x85\x79\x0b\x72\xa2\x0c\x3e\x8e\x44\x51\x78\x17\xb2\xef\xf0\x21\x5c\x7d\xc5\x4e\xfd\x76\xda\xb4\x12\x03\x70\x13\xc1\x4d\x44\xf3\xcb\x3f\x79\x2e\x8a\x35\x26\xe7\xd4\x98\x9c\x53\xbb\xa2\x97\xe7\xe1\x7a\x67\x9a\x92\xd0\xfa\x94\xba\x21\x6f\xc2\xd4\xb1\x74\x47\x3e\xd8\x11\x08\x28\x44\xf5\xa8\x37\xac\x3b\x4d\x7a\x6a\xbe\xd6\x16\xb7\x12\x9a\xa0\x40\x14\x51\xd4\xde\x5e\xad\x6a\x9f\x66\x39\x98\xbd\x2b\x08\x87\x20\x3b\xf1\x5b\xdc\x3e\x5a\x4d\x6d\x9a\x65\x17\x35\x0d\xd4\x2e\x5e\x50\x74\x16\xae\x71\x1f\xed\xa4\xde\xa9\x93\xd5\x76\xd5\x50\xc0\x28\x81\xb3\xd0\xde\xc3\xf2\x7a\x0d\x96\xc7\x10\x20\x92\x8f\xeb\x6a\xd9\x87\x11\x02\x7c\x55\xab\xaa\xf9\x88\xe2\xfa\x75\x48\x8e\x34\xb5\xe7\x7c\xaf\x8d\xd6\x8c\x52\xf3\x38\x34\xb6\xfd\xfe\x02\xbe\x56\xfa\xa7\xe2\x5f\x68\x2c\x4d\x7a\xc9\x66\xc4\x8f\xd0\xbb\x58\x4b\x7e\x1c\x0b\x22\xd2\x6c\x1a\x90\x42\xd9\xea\x35\xbc\x0e\x89\xc0\x8d\x39\x59\x8a\xc7\x47\x49\xf1\xd5\xe6\x89\x46\xf1\x80\xd9\x82\xe0\x38\x34\xbd\xfa\x7d\x83\xd3\xc3\xfa\xf2\xee\xc8\xd7\x30\x73\xe8\x1d\x87\x78\xa5\x54\x7a\xe5\xf2\xcf\x90\xe5\x9e\xac\x24\x76\xe0\x95\xb2\x9e\x2d\x21\x07\xf1\x91\x76\xe0\xb3\xfd\x99\x4c\x8d\x74\x1a\x94\xde\xc4\x9a\x2b\x5d\x06\x19\x86\x72\x24\xd4\x54\x85\x52\xa3\xd7\x0b\x5f\x66\x89\x8f\x63\xf4\x9b\xbd\xc8\xfc\x66\x5c\xca\x48\xa3\xe7\x37\x76\xe0\x04\xfd\x69\xb7\xe4\x3b\x38\x23\x21\x85\xe2\x3a\x52\x5f\x8e\xdf\x39\xf0\x55\xe1\x97\x23\x6d\x0b\x61\x32\x86\x1c\x3e\x16\xe4\x59\x9e\x34\x91\x52\x78\x96\x36\x04\x73\xb7\xd8\xea\x7e\x86\xb4\x4a\x85\x03\x2f\xa2\x35\xb8\x5e\xe3\x6d\x47\xf0\x72\xe5\xca\xc8\x24\xa9\xca\x7e\xed\xd9\x8b\x75\x8d\xed\x63\x7a\xf1\xc5\x06\xa3\xec\x52\xc0\xcb\x10\xd3\x9e\x58\xbb\xec\xf3\xfa\xdb\x20\x8b\x84\xe1\xc4\xda\xd2\x14\xde\xaf\x74\x1e\x08\x19\x44\x03\xf1\xe5\xf8\xf5\xd3\x68\x32\x8d\xa4\xc0\x5c\xfc\x0b\xf8\x62\x50\x5f\x52\x78\xb2\x61\x7d\xc7\x0d\x8c\x8f\xf6\xe0\x3f\xba\x09\x7f\x84\x69\xf8\x2d\xfb\x0f\x07\x76\x30\x23\xe3\xd6\x7f\x38\xb0\x8b\x4f\xcc\x81\x8e\x7d\xc5\x1c\x3c\xf6\x04\x9f\x42\xf6\x09\xde\x86\x2b\x59\xae\xec\x93\x4a\x98\x26\x8a\x92\xec\x96\xb3\x6d\x7a\xcf\xcb\xb7\x9c\xa1\x7e\x2a\xe7\x73\x0e\x89\x59\x78\xed\x0a\x92\xb8\x1c\x02\x14\xfc\x46\xd8\xa3\x6d\x17\x14\x73\x06\xcd\x4d\x2c\x12\x18\x21\x8a\xd3\xc7\xfc\x52\x2c\x70\x53\x17\x94\xd5\x4b\x7f\x0f\xab\x77\x3c\xe9\x4d\x2e\xa8\x5b\xf2\x36\xb4\x97\x93\xe8\xd4\x80\xfd\x23\x5c\xef\x06\xfc\xdd\x48\xc1\x95\x22\x6a\x12\xc2\xb7\x04\x6c\xf8\x00\xba\xef\x86\xe8\x0d\xec\x2e\x40\x0d\xd9\x9a\xeb\xf4\x97\x15\x04\xf4\xe3\xe9\xd4\x21\xc6\x69\x71\xa7\x81\x5a\x75\xd3\x87\xa0\xd4\xc3\x4f\x3b\x99\x47\x31\xf3\xec\x75\x6b\x37\x15\x48\xd7\x6f\x75\x51\xa3\x73\xfd\x97\xad\x6e\x76\x65\x81\x57\x2d\x25\x5d\x7e\xd2\xaa\x17\x55\x59\xb1\xe2\xc2\x10\x0a\x1a\x5b\xf7\x70\x01\x62\xb8\x5e\x39\xcc\xd7\x45\x55\xb9\x7a\x2f\xf3\xb1\x04\xe8\x63\x19\xe0\xf6\x72\x7d\xf1\xc3\x34\x5e\xd9\xf2\x67\x0d\x10\xb1\xe2\xa6\xe0\xe2\x72\x3e\x5d\x2c\x73\x16\x3c\xa9\x68\x8c\x0b\x0a\xc9\x70\xcd\xb0\x6e\xcd\x88\x18\xa2\x7a\xe7\x6e\x2f\x28\xf0\xe1\xfa\xe1\x4f\x86\x99\x77\x25\x18\xb2\x64\xcd\x9e\x4f\x75\x1e\x44\x25\xdf\x6c\xea\x99\x8d\x4a\x9e\xd9\xcc\x0d\x6b\xfa\x9b\x57\x5c\xb0\x8b\x5e\xc0\x08\x67\x24\xf5\xc2\x46\x7f\xe5\x85\x8d\xca\x5e\x58\xa3\xf7\x58\x0f\x7a\x34\x64\xcb\xd6\xc9\x93\x90\x02\x51\x11\xbb\xe7\xdf\x3c\x3d\x84\xe0\xb9\x47\x64\xc4\xee\x83\xe7\xde\x75\x02\xc1\x57\xdc\x7f\xfd\xe4\x5d\x27\x0b\xea\x06\xcf\xcd\x0b\x19\xb9\xc1\x57\xf3\x4e\x46\xae\xff\x69\x01\x6b\x38\x57\x99\xaf\x05\xf7\x62\x6b\x55\xd9\x0f\x5d\xbf\x4d\x28\x72\xf9\x37\x9a\xb9\xdd\x32\x56\xf6\x49\x30\x34\x9f\x82\xe7\x60\xf9\x36\x65\xda\x6e\x9a\x5a\x7a\x80\x6e\x77\xaf\x04\xa6\x0a\xf7\xf1\xff\xcb\xdd\x9b\x68\xb7\x8d\x63\x0d\x83\xaf\xa2\xf0\xd3\xa4\x81\xf2\x95\x22\xd9\x4e\x52\x61\x8a\xbf\x8e\xb3\x3a\x8e\xb3\x78\x89\xe3\xb8\x3a\x9f\x0f\x48\x82\x36\x6d\x8a\x54\x40\x50\xb2\x9c\xe8\x5d\xe6\x59\xe6\xc9\xe6\xe0\x02\x5c\x44\x91\xb2\xab\xba\xbf\x9e\xef\x4c\x9f\xae\x98\x22\x16\x62\xb9\xb8\x1b\xee\xb2\xb1\x5c\x0b\xd4\xc8\x8c\x1e\x57\xd6\x4e\xd5\x8c\xb0\x00\x04\x76\x71\xb2\x72\xb6\xcc\xd0\x8a\x13\xa2\xf3\x1a\xa2\x50\xd7\x1a\x13\xa5\x82\xdd\xb4\x1c\x86\x6a\xbe\x1d\x0c\xf9\xbf\xd0\x19\x17\x80\x7c\xf3\x9c\x7f\x58\xff\xd0\x22\x1f\x9a\xe5\x4d\x38\x19\x52\x98\x27\x64\x48\x29\x64\xaa\xfb\x4a\x66\x8b\x41\x9e\xf4\xe2\x9b\xa7\x05\xbc\x6f\x21\x7c\xf3\xe0\x63\x66\xc8\x5e\xd0\x0a\xad\x62\x41\xc1\x0d\xd6\x2a\x0b\x83\x02\x9c\xd3\x60\xad\x8c\xd1\x99\x11\x57\x2d\xd5\x38\xd3\x12\xad\x1b\x60\x2a\x41\x7c\x37\x23\xdd\x46\xf9\xf6\x75\x46\x90\x48\x22\x27\x8b\x86\x86\xb4\xb5\xee\x71\x46\xde\x49\x92\xe9\x24\x7b\xdf\x75\xc2\xb9\x28\x58\xc7\xd6\xe4\x23\xb9\xeb\xdb\x5c\xf5\x39\x23\x51\x88\x23\x8d\x42\x8c\xf0\x1e\x21\x8e\xa5\x77\x8f\x08\x5b\x87\x98\x7b\xe4\x3b\x0e\xca\x6f\x5b\x27\xc5\xc4\xdd\x63\x6e\xcf\xef\x5e\xcf\xfb\xce\xcc\xac\x2a\xc4\x68\x5b\xab\xff\x2c\x28\x4c\x97\x46\xb8\xaa\x69\xcf\xbb\xff\xd2\x78\x49\xcb\xea\x32\x07\x92\xbc\x43\xf2\x67\xfc\x5d\xb1\x68\x69\x50\xcc\xb8\x2e\x74\x2c\x57\xf4\xab\x15\x57\x4c\x0c\xa3\x50\x4f\x56\xea\x3f\x59\xf9\xab\xec\x63\x4e\xa2\x20\xef\x81\x52\xad\x2c\x07\xde\xbe\x61\xa7\x0b\x10\x66\x93\xba\x81\x73\x2b\x9a\xd2\xb7\x74\x4c\xaa\x22\xeb\x9f\x71\xf1\x24\x4c\x72\x18\xb8\x15\x4e\x8e\x1e\x99\x34\xaa\x14\x22\x15\x56\x4c\xec\xbd\x8c\xe4\x8f\xd6\xc2\x02\xef\xad\x9d\x04\xe0\x7d\xb3\x2d\xb0\xc0\xdb\xb4\xbb\x81\x42\x8d\xd6\x4f\x0b\xbc\xa7\xf6\x40\x21\xcd\x84\xaa\x4a\x32\xe9\x7b\x6f\x55\xbd\xbd\x8c\xa8\xe7\x6f\x54\xd5\x56\x4f\x9b\xaa\x81\x7e\xeb\x7e\xa6\xaa\xd9\x7d\xc2\xab\xaf\x66\x42\xae\x2d\xed\xe6\x62\x81\x1f\x7a\x8a\x40\xef\x06\x90\x16\x9f\xd0\x4b\x8c\x9f\x9e\x92\x69\x5e\xa2\x06\xaa\x5f\xea\xb1\xa6\xc5\x40\x75\x37\x54\x6b\x8e\x28\x8c\x15\x19\x39\x4f\xe0\x65\x48\x6e\x05\x85\xdd\x8c\xc2\x65\xf0\x77\x92\x73\x2a\x4e\x75\x64\x40\x58\x50\xcc\x55\x6e\x12\x74\x4e\x82\x75\x8c\x71\x8c\xe1\x2e\x29\x5c\x04\xe6\xb6\x76\x16\x38\x51\x0c\xf3\xa0\x5d\x79\xba\x5d\x55\x9e\xde\x04\xcd\x42\xa1\x89\x4b\x03\xd7\xc1\xfa\x74\xd5\x3b\x81\xb1\xb8\x39\x0a\x8c\xfd\xcc\x71\xd0\x9a\x07\xfb\x75\x53\x51\xc7\x5c\x20\x2d\xe0\x6c\xed\x4c\xc7\x5a\x8f\x84\x91\x8a\x0b\x39\xe0\x6a\x1d\xbf\x91\x4b\xe4\x4c\x49\xe4\xac\xcf\x0a\x1e\xac\xa7\x3e\xe9\xf5\xbb\x0f\x1f\xea\x07\x66\x98\x32\xfd\xcb\x57\x5c\x79\x18\x10\xd5\xd4\x43\xfd\x4e\x6e\xc0\x68\x46\x73\xab\x28\xd7\xa2\xe9\x87\x58\x54\x65\x7d\xb9\xa4\xd4\xa9\x26\x7f\xe9\x73\xd0\xb7\xd9\x2f\x97\x57\xa4\x25\xf3\x4a\xa1\x3d\x49\x4a\xdf\x63\xed\x7e\x89\x06\xff\x1e\xde\xfc\xf8\x46\x21\xe4\x61\x46\x13\x33\xfe\xac\xa6\x0a\xd2\xeb\xf3\x32\x20\x99\x62\x84\x9e\xaf\xae\x90\xe6\xcd\x30\x97\x4e\x51\x9a\x2c\x8d\x20\x76\x92\xaa\x2e\x6b\x2f\x84\xa4\xcf\x8a\x3c\x33\x2f\x03\x92\xf4\x7d\xbc\xf4\x6a\xff\xee\x02\xce\x83\xa6\x3c\xc8\x75\xae\xd8\xcc\xb7\x7a\xf3\x88\x46\x97\xc0\x90\x43\xf6\x90\x43\x0e\x03\x72\x4c\x14\x45\xfb\x63\x50\xdb\x72\xfd\xb0\xbc\x00\x1a\x3c\x66\xe4\x3c\xc0\x4c\x66\x6a\x11\xf4\x94\x59\xdf\xaf\x4e\xf8\xd7\xaf\x24\x5f\x8e\x50\x2d\x87\x28\x97\x23\x5c\x19\x60\xb0\x9c\x96\x67\x2f\x84\xb0\xcf\x20\xec\xbb\x10\xf6\xbd\xfc\x63\xa1\x5a\x96\x80\x2e\xd6\x8f\xa6\x34\x72\xdd\x53\xef\x5c\x72\x15\xc0\x32\x58\xa3\xad\x59\xf3\xf2\xa9\xd1\xfd\x8d\xe5\xbb\xc0\xe5\x53\x02\x7d\x43\xb6\xe6\xbb\x60\x32\x46\x75\x8d\xbf\x58\x10\x2f\x27\xe3\xf9\x38\x46\xd3\xc4\xc6\xd5\x90\x45\xf2\x1e\xa6\x60\xc0\xab\xa6\xeb\xde\x0b\x8b\xb9\x99\x75\xd0\x53\xdc\x0f\x1a\x35\xce\xe7\x9a\x37\x7b\x5e\x99\x2e\x46\x28\xa0\x85\x7e\x7d\x59\xdb\x56\xcf\xc1\xb4\xa0\xf0\x31\x68\x54\x66\x08\x62\x04\x1e\x49\x6b\xd1\x26\xf7\xf5\x5b\x5b\x27\x23\x2c\xd5\x1b\xbb\xad\xb8\xd1\xb5\x31\x18\xab\x65\x90\xe4\x69\xe0\x30\x09\xef\xee\x60\x26\x4f\x03\xf2\xd3\x63\x4a\xec\x11\x36\x61\x4e\x06\xbb\x01\xa9\xab\xcd\x66\x01\xa0\x53\x49\xc9\xad\x9b\xad\x19\xcd\x4c\xb6\xb4\xb1\x2c\x14\x62\x8a\x2f\xf7\x6e\x6d\x01\xde\x07\x3b\x06\xef\xb1\xbd\x23\xc1\x67\xb6\x04\xdf\xb7\x1f\x0c\x17\x46\x41\xbd\xa0\xf0\xa9\x15\xf1\x4e\xc9\xbb\x00\xac\xb7\xaf\x8f\x2d\x45\x8e\xe0\x22\xd0\x7c\xf1\xa1\x21\x7b\xb3\x80\xa0\xfa\xcc\xe2\x42\x24\xc2\x82\x1d\x45\x13\x15\x11\x3c\x09\xd6\xdc\x7e\x11\x61\x4c\x26\x6f\x03\xe7\x2c\x86\x57\xc1\x5a\x5b\xec\xdb\x00\x66\xe4\xc4\xfc\x73\xc5\x21\xa6\x30\x46\x46\x64\x9f\xaf\x14\xcc\x64\x91\x98\xf9\xed\x1a\x79\xf5\x55\x80\xfc\xee\x07\x01\x02\x76\x70\x28\xa4\x89\x2e\x99\x95\xf5\x32\xbd\xb2\x71\xd6\xe8\xcd\x5c\xdc\xf1\x14\xae\xcb\xc7\xe1\x98\x27\x99\xec\xf0\x1b\x8f\x73\x9f\xfb\xf5\x10\x01\x1f\xb9\x9c\x25\xe2\xba\xa3\x17\xed\x79\xc5\x33\xab\x26\x2d\x4d\x02\x38\xc3\x2b\x98\xa3\xbe\x77\x49\x37\xac\x8e\xb5\xa1\x7f\xec\xc3\x61\x40\x84\x02\x83\xda\x85\xb7\xf5\x25\xe6\xb9\x85\x8b\xe0\xe9\x24\x89\x53\xde\x09\x44\x32\xee\xb0\x49\x88\xb7\x28\x7d\x56\x77\xa8\xfe\xc0\xa2\x20\x11\x63\xee\x77\x32\x11\x99\x3a\xe8\xd7\xa5\x49\xec\x9b\xe6\x83\x58\x06\x60\x89\x4b\xed\xa2\xce\xde\x96\x5a\x1b\x87\x99\x76\x41\xc8\xe7\xf2\x56\x01\xca\x27\xc5\xfd\x9e\x24\xe4\x55\xa8\xb7\xe8\xe0\xfe\x3d\xaf\xef\xf0\xd6\x74\xf8\xc1\x80\x65\xc3\x66\xe6\xf5\xe3\x0d\xeb\xd1\x8a\xf6\x55\x9b\xd6\x92\x75\x8c\x0e\xa5\xf0\x65\x8d\xd4\xb8\xab\xef\x15\xf1\x70\xbc\xf8\x5b\x0c\xe0\x9c\x7c\x0c\x74\x76\x76\x9c\xc2\x41\x48\x12\x8c\x8f\x63\x84\xe1\x80\x68\x01\x80\xc2\xb5\xa4\xb4\x9a\x0a\x95\xc2\x8f\xd5\x81\x55\xaf\xbf\x45\x71\xfd\xfd\x60\x58\x5a\x78\xa1\xe6\x5d\xf3\x51\x79\xbe\x47\x73\xa5\x8d\xea\xcf\xcf\x41\x7b\x42\xf8\x1f\x41\xb3\x29\x1f\x0a\xcd\x7a\x48\xef\x03\x67\x1e\xc3\xd7\xc0\xf9\x10\x13\x6b\xc2\x45\x1a\xa6\xf2\xad\x82\x8d\xd7\x37\x13\x16\xfb\x3b\x51\x64\xc1\xfb\x80\xc2\xb7\x35\xa7\x74\xbf\x10\xc3\x63\xb7\xad\xd6\x3e\x11\xf0\xd3\x9b\xda\x35\x26\xaa\x16\x3b\xe6\x90\xfc\xa9\x01\x09\x6d\x4f\xbf\xaf\xc4\xeb\xce\x13\x41\x8e\x39\x30\x8e\x19\x35\x67\xe4\xa5\x04\x25\xc6\xc4\x94\xe2\x51\x60\x5a\x7d\x29\xdc\x3b\xb4\xd4\x71\x7e\xd9\x29\xd7\x8f\xd9\xbd\xb6\x8b\xd8\xfe\xc2\x85\x71\x00\x71\x7f\xd7\xe8\x48\xf9\x6a\xd3\x62\xdb\x6e\x91\x90\xb3\x4b\xa4\xe4\x47\x48\xc9\x8f\x91\x92\x1f\x42\xe2\x88\xfe\x2e\x84\xaa\x58\xe7\x62\xb9\x57\x36\xc8\xf5\x99\x20\x45\xff\xcb\x9d\xb9\x20\xb3\xb5\xb9\x20\xd9\xfa\x5c\x90\x5e\x5e\x6c\xf2\x59\xc2\x3c\x23\x49\x43\x76\x48\xb9\x94\x1d\x32\xc4\x1f\x5e\x96\xca\x64\x8c\x60\x85\x41\x2c\xf8\xe8\x5a\x12\x9d\x01\x18\x73\x1d\x7c\xaf\x25\x90\xe4\x74\xb4\x4b\x62\x58\x4a\x22\xc9\xa9\xb6\x70\xcf\x5c\x25\xbe\x6c\x2f\x80\xb9\xce\xa1\x20\x56\x90\x78\x59\x6a\x51\xf0\x56\xf7\xa2\xfd\x72\x7f\x8f\xe8\xbd\xbd\xb2\xe3\x3e\x1b\x59\x96\x2d\xfa\xee\x15\xe0\x56\x7f\x0e\x0c\xc3\x2e\xfa\xee\x35\x1d\xa9\x7f\xed\x5d\x85\xda\xaf\xf3\x90\x37\x0b\xaa\xd6\x03\x89\x53\x57\x92\xcc\xa5\xc0\xdc\x66\x87\xd6\x52\xc9\x50\x1a\x11\x34\x8e\xe0\x93\x5a\xb7\xca\x20\x2e\x03\x98\x87\x44\xd1\x48\x35\x88\xbf\xfe\xc1\xad\xc6\x89\xaa\x7e\x86\xb0\x9b\xd4\x6d\xba\x4c\x25\xb6\xbf\x5c\xa9\x26\x9b\xef\x11\x61\x4a\x50\x2d\xeb\x1a\xe7\x8b\xd0\x6d\x64\xd2\x74\x8f\xcc\xc6\x9c\x8c\xde\x94\xf6\xdd\xd1\x05\x11\x50\x3f\xe0\xd4\x5c\x18\x99\x24\x83\x16\xe6\x6b\x51\xc0\x61\xd1\xd2\xe2\xe1\x9c\x48\xf8\x98\x68\xb5\xcf\x69\x02\xb2\xef\xed\xc2\x8c\x70\x57\xbb\x7e\x15\x0b\x93\x98\x85\x41\xd0\xeb\xb9\xf3\x1e\xba\x9a\x1b\xd3\x93\x05\x85\xc0\x5d\x87\x7d\xe3\x3f\x9c\x41\xc9\x9b\x2e\xa3\xe3\x8e\x50\x88\xa8\x37\xd4\x5e\xcf\x6a\xfa\xae\xbb\xde\x94\xa9\xda\x9b\xac\xf7\x26\xcd\x5d\xba\xe8\xb3\x6a\xbf\x18\x7c\x34\x51\xac\xa6\xc4\x25\x4e\x5b\x11\xd3\x3b\x49\xe6\xc4\xc5\xf9\xc3\xa9\x56\x36\xba\xcd\xd7\xfa\x83\x3f\x44\x6e\x78\x78\x8e\x37\x49\x8d\xbe\x90\x6a\x7c\xbc\xef\x56\x47\x58\xbc\xea\xbb\x05\xa2\xe6\x15\x09\xdb\x78\x05\xe6\x56\x84\xaa\x28\x67\xae\xf2\x2a\x06\xc8\xf4\x65\x1a\x2f\x41\xff\x90\xfc\x99\xf5\xf1\xde\xac\xcf\xbe\x17\x00\x8b\x91\x60\xdc\xfc\x8b\xb9\x45\x86\x0b\x9e\xc3\x96\x9a\xb2\xbe\xbe\x3f\xf3\x74\xf3\x45\xdd\x61\xb2\xda\xcf\xc3\x87\xc5\x63\xde\x69\x82\x9d\x86\x4e\x62\x92\xb7\xba\x28\x8c\xeb\xcf\x30\x60\xd5\x8f\xe1\x66\x24\x68\x4c\x9d\x48\x14\x14\xf1\x21\xcb\x1f\x3c\x18\xf2\xad\x3f\xe2\xd1\x8c\xa4\x2e\x88\xde\x36\x30\x25\x79\x44\x2e\xc4\x1b\x43\xf3\x1b\xf3\xef\xe7\x4b\x95\x8b\x52\x85\x0b\xe5\x21\xf9\x93\x9b\x59\x14\x4a\x40\x0a\xbe\xdb\xce\xbd\x44\xae\xb6\xc9\x40\x45\x69\xd3\x96\x17\x46\x1a\xab\x34\x53\x27\x4f\x96\x7d\x57\xdb\x59\xb9\xc0\x37\x14\x6f\x1d\xb8\xc0\x7b\x08\x83\xfa\x94\x74\x5b\x3f\xaf\x33\xd6\xc4\x68\x69\xa4\x6a\x8e\x5d\xe7\x3d\x5c\xb6\x93\x40\x23\xca\xe6\x23\xf9\x2a\x74\x26\xe7\xc6\xb8\x08\xa6\xd2\x83\x0b\xa2\x53\x99\x3f\x7c\x78\x41\xb8\xe1\x52\x50\xb7\xb6\x66\x51\xf6\x24\xe0\xad\xb1\x59\x97\x0b\xb7\x49\xe4\xd6\x4c\x0f\x2d\x14\x8f\x7a\x90\x63\xf4\x89\xe3\xda\x35\xaa\xeb\x92\x53\x94\x57\x26\x2e\xcc\xc8\x47\x09\x43\x90\x14\xde\x9a\x7c\xdd\x99\x83\x96\xe6\x20\x1c\x9d\x68\x2e\x03\x49\x1f\x6d\xfe\x1a\x50\x3c\xbe\x33\x72\x98\xc0\x8c\x4c\x5d\x10\x5a\xc9\xdb\xdc\x5f\x86\xfd\x69\xcd\x7d\xec\x7c\x15\xea\xeb\x99\x13\x3f\xca\x14\xcd\x79\x24\xc1\xa4\x12\xca\x33\x49\x5f\xba\x84\x1b\xbe\x92\x4b\x88\x39\xe9\x3f\xd6\xaa\x64\xc0\xdc\x86\x37\x12\x39\xd9\xd2\xcc\x62\x34\x7c\xb4\xf5\x1b\xc9\x36\xe4\x06\x89\x7b\x82\x3e\x8a\xa9\x3d\x58\x50\x98\xad\x43\x56\x39\x72\xc8\x85\xf5\x07\xbc\xcf\xfa\xee\xaf\x5f\x75\x84\x90\x1f\x63\x06\xcb\xf7\xdc\x68\x7b\xa4\x9e\x73\xaf\x8d\x4c\x71\xaa\xb1\xe3\x81\x70\x38\x48\x67\x97\x48\x85\xf5\x99\xa2\xf1\x3c\x4a\xb9\xc6\x4a\x5f\x51\xb2\x2c\x3a\x37\x37\xa4\x20\x15\x4f\xbb\xa0\x30\x77\x9b\xf4\x8f\x27\x24\xa6\xfd\xab\x24\x8c\x91\x3c\xc0\x4d\x1b\x4c\x58\xb9\x72\x5c\xfd\x15\x8a\xbc\xeb\xdd\x1f\xc5\xf6\xdc\x25\x73\x32\x73\xf5\x2e\xe8\xbd\x35\x18\xf4\xba\x05\x83\x2e\x77\x46\x0b\x4d\x76\x03\x4c\xe5\xd3\xd9\xe8\x6f\x3e\xfe\x6d\xcc\xc9\x8c\xdc\x18\x1a\xf5\x1b\x19\xf6\x50\x13\xb1\x73\xcf\x31\x0f\xf2\x21\x0f\xed\x39\xb9\xd6\x98\x7e\x46\x2e\xdc\xc2\xdb\xf9\xc8\x75\x5e\xc1\xb1\xdb\x78\xc5\x94\x47\x1c\x2b\xf8\x9e\xa7\x65\xa8\x30\x5e\xa5\xa4\xbc\x42\x49\x35\xc1\xbe\xb4\xa5\x62\x01\xee\x4b\x55\x6b\xd1\x44\xe6\x24\xd4\x43\xdd\x27\x1c\x7e\xb2\x73\xd5\x99\x5a\x7e\xde\x67\xe7\xe0\x4d\xed\x5d\xc2\xfb\x1e\xc6\x6d\x41\x13\x32\x25\x24\xb9\x91\x7d\xba\x58\xe6\x93\xb0\xec\xf9\xba\x2e\xb3\xa2\xc7\x9c\x55\xca\xa8\x9a\xcc\xb4\xd6\x5f\x25\x69\x1d\x36\x77\xc7\x7a\x7a\x25\x0f\xb4\x5d\xab\xc1\xb6\x54\x0d\xed\xb7\x5b\xad\xf7\xb8\xde\xd3\xeb\x7a\x4f\x5b\xf5\x9e\xf6\xeb\x35\x0a\x23\x75\xe6\xe4\x93\x51\x53\x65\x98\x45\x74\x9f\x30\xf8\xe9\x46\xb6\x87\x01\x46\xce\xe9\xe8\xd4\x9e\x91\x2e\xc7\xc8\x6d\xfa\x05\xeb\xbb\x91\x8d\x88\x7b\x38\xd0\x09\x89\x8e\x5c\xd8\x71\x75\x75\x28\xf1\x7c\xa3\x24\xf1\x19\xf5\x96\x6a\x85\x16\xe0\x66\x14\x52\xf5\x19\x6f\x4f\x5f\x4d\x55\x67\xbb\x12\x5b\x8e\x23\xc7\x97\x2b\xa0\x5e\xbb\xc6\x6e\xe2\xac\x0d\x90\xd1\x2f\x10\xbc\x2f\xfa\xd6\xe2\xca\x5d\xe7\xd0\xe6\xbd\xb4\x05\x78\xef\x55\xfd\xcf\xb6\x04\x6f\xcb\xe6\xaa\xd1\x4b\xd7\xf9\x22\xe0\xdc\x75\x1e\xf5\xff\xfb\x11\xec\xb9\xce\x0b\x41\x86\x8f\x06\x14\xf6\xef\x09\xef\x95\x18\x7b\x5b\x68\xe8\xc7\xfa\xdd\x11\xb7\xf5\xce\xbd\xb0\x11\xc1\x1e\x64\x20\x31\x14\x42\x75\x8b\xea\x00\xa3\x3d\xb5\x71\xdd\x13\x09\x6a\x6a\x16\x4a\xc4\xde\x17\xdb\xb2\x16\x90\xef\x06\xef\xbb\x2f\xd4\x3a\x16\xce\xdb\x88\x75\xcd\x01\x7a\x6d\x0e\x50\x2e\x25\x15\x07\xe8\xde\xa0\x55\x1e\x0b\xf6\x7c\x65\x7c\xd9\xdd\xc3\xcb\x81\xa5\x3d\x35\xb8\x9b\x2c\x14\x28\x65\x94\x9a\xb9\x50\xda\x08\xb9\xf9\x10\xd1\x3f\x7d\xcd\x31\x72\xf7\x56\x8f\x47\xd3\xf8\x8d\xd3\xbb\xe9\xae\x19\x27\xb9\xb7\x36\x22\xc5\xcc\x88\x0a\x19\x5d\x60\x30\xa6\x16\x48\x5d\x50\xf8\xb8\x5e\xa2\xcf\x53\x72\xe6\x96\x4e\xbb\x6e\x8b\xba\x37\x0f\xc1\xe4\x32\x14\xdc\xd9\x1e\x4a\xee\xac\x8b\xa2\xbb\xbb\x03\x81\xfa\xf5\x0e\x5c\x27\xdb\xb0\xfe\xeb\x51\xae\x5a\x4b\x1d\xee\x12\xb7\xc8\xb1\xb7\xaa\x76\xc4\xc9\x2b\x64\xfb\xce\xc8\x5b\xc5\x22\x0d\x70\xa3\x23\xbc\x35\xf2\x1b\x52\x77\x46\xb5\xf8\x50\xb1\x13\xa1\x95\x39\x22\x0f\x6f\xcf\x7e\x65\xf2\x8c\x62\x94\x47\x64\x48\x5a\x37\x3c\x5c\x80\x2b\xa9\x49\x47\x8a\x26\x9c\x6d\x79\x72\x4a\x4c\xfc\x2e\x81\x0b\xad\x62\xd5\xb0\x96\x69\x27\x65\x6b\x81\x8c\x9a\xab\xa0\xec\x45\x70\xc7\x47\xb1\xd4\x95\x70\x19\x90\x56\x44\xa5\x78\x0c\x44\x55\xc8\x26\x55\x9c\x97\xce\x89\x87\x74\x5b\xd4\x09\xcf\x39\x89\x12\x60\xab\xd1\x33\x43\x7c\xbb\x02\x29\x71\x46\x22\x35\x0b\x0c\x8b\x45\x9f\xaf\x6c\x8b\xaf\x46\xb0\x67\x47\xe0\x32\xdb\xef\xbb\xcb\x18\x42\x2d\xcc\xd4\x99\x91\xd8\x05\x09\x8c\x42\xd7\x99\x11\xa9\x9e\x93\x95\x9e\x96\xc3\x49\xc8\x3e\xbb\x1c\x05\x76\x88\x51\x25\xf0\x47\x98\xd8\x1e\xb0\xae\xdd\x55\x1f\x9a\x2a\xc8\x45\xda\x8c\x65\x33\xb2\x6f\x36\xf0\x1b\x07\x91\xa9\xd3\x71\x10\xa0\x6c\x48\xed\xb2\xec\x6b\x5e\xf6\xc6\x94\x41\x59\x96\x65\x58\xf6\x21\x20\xbc\x4a\xad\x2b\x87\x59\xe8\x23\x27\xd4\x91\x4b\xc9\x3e\x91\xf0\x13\x13\xd7\xa2\x71\x6e\x19\xf1\xec\xe9\xda\x16\x47\x0d\x2d\x7e\x5f\xdb\xe2\xb8\xa1\xc5\xb0\x7e\x3a\xdc\x93\xfa\xe9\xd8\xc6\xa5\x1f\x3b\x33\xe2\xa1\x1d\x14\x24\x6a\xf1\xc7\x78\x56\xc6\x7d\x17\x2e\x9d\x71\xdf\x83\x89\x53\xae\x80\xd4\x2b\x70\x49\x61\xec\xa4\x64\x46\x3e\xba\xd0\xed\xbb\xd7\xb8\x4e\x13\xc7\x1f\x55\x58\x21\x1c\xdf\x98\xc2\xe4\x3b\xa5\xf6\xa4\xbe\x91\xb8\x45\x27\xc8\x4c\x4f\x0a\xb4\x3d\x71\x6e\xc8\xb1\x0b\x2e\xda\x3b\x32\x05\x0a\x97\xce\xa4\x9a\x46\x5c\xcf\x83\xd9\x53\x67\x82\x33\x29\x07\xc6\xf3\x81\x15\xd8\x71\xea\xdc\x90\xfd\xb2\xb3\x50\x75\x36\x5d\xed\x6c\xc7\x9e\xd6\xba\xca\x6a\x5d\x3d\xab\x63\x99\x37\xf5\x75\x1c\x6a\x34\x73\x51\x55\xad\x96\x10\x8b\x46\x65\x17\x20\xfa\xec\x35\x1d\xcd\xc8\xb7\xe2\x87\x3d\x23\x5f\x8a\x1f\xe0\xfd\xd0\x38\xfb\x6b\x40\x1e\x0c\x2b\xd8\xf8\x12\x91\xd7\x85\xb3\xe5\x38\x0e\xb9\x70\xce\x49\xa0\x86\xa6\x08\xf0\xc3\x87\x17\x7d\x77\x84\x28\xea\xa3\x12\x5c\xbe\x0a\x72\x81\x04\x98\x52\x7b\x9c\xac\x0e\xe4\x42\x7d\xe3\xb2\x38\x14\x5f\x03\x72\xa9\xe6\x9d\x24\xc0\x32\xb8\xe2\xe4\xd2\x28\x76\x16\x14\x4e\x5d\x67\x1e\xc3\x3b\xb7\xaa\xc4\xc6\x78\x84\xaf\xd8\xfc\x53\xf0\x95\xf3\x6b\x0b\x4e\x5d\x0a\x9f\xda\x84\xd5\x18\x78\x7b\xa6\xe4\x3c\x38\xe1\xb2\x15\x4b\x1e\x9a\xb0\xd5\x96\x65\x60\x32\x21\xf3\x51\x51\x35\xef\xa9\x36\x59\xef\xc6\xe6\xc5\x3c\xf5\x0c\xa5\x9a\xe1\x1b\x4e\xb4\x6f\x01\x53\xe5\x94\xc2\x3b\x97\x14\xe6\x65\x87\x6b\x39\x2b\x93\xd8\xaa\xea\x52\x83\xc1\x35\x5c\x63\x04\xf2\x45\xac\x35\xf8\x4e\xb5\xd1\xff\x82\xc2\xad\xeb\xcc\xc8\x17\xad\xb8\x33\xba\xe7\x77\xaf\xac\xef\x14\x3d\x7b\x5e\xb9\xce\x75\x0c\x6f\x5b\xc9\xed\x7b\x49\xe2\x47\x28\x94\xbf\x71\xef\xef\xfa\x27\x36\xe2\xba\xb3\x89\xb6\x1d\xe0\x7d\xf7\x33\xba\xff\x97\x35\xb9\xf6\xb5\x02\xe1\x88\xdc\xab\xef\xa0\x75\x93\xab\xb4\xec\x8d\x46\x21\x33\xf2\xd6\x85\x18\x33\x96\x3f\xe1\xdb\x26\x54\xc8\x87\xf6\xbb\x03\x46\x66\xe4\xc0\x48\x61\x7d\xf6\x75\x41\xe1\x8b\xdb\x7e\x31\x32\x0b\x61\x73\x5b\x7f\xa3\x68\x06\x4f\x06\xb8\x7f\x2f\xd6\xb7\x1b\xf2\x2d\x3d\x2e\xbc\x37\x5a\x5f\xf7\xc9\xa0\xec\x5e\x55\xff\xdc\xaa\x0a\xaf\x8d\x7f\xf2\xff\x97\x4c\xf9\x14\xde\xbb\xed\xf7\xd8\x83\x3f\xe2\xd1\x9c\xbc\x77\x21\xfe\x3f\xff\x67\x08\xbb\x44\xa8\x6d\x18\x3e\x8c\x47\xbb\x44\x82\xa0\xb6\xa4\xb6\x12\x7f\xbe\xae\xd1\x31\xbd\xd7\x42\x28\xaa\xa5\xe1\xdb\x9a\x6f\xed\x92\x19\xf9\xea\x42\xdc\x1b\x73\x22\x29\x1c\xa1\xf6\x48\x83\x55\x9c\xb6\xf7\xff\x4d\xf5\x6f\x0d\x30\xd7\x86\xde\x44\x91\xde\xbd\xe7\x05\xec\x0e\xf9\x16\x36\x92\xe9\xfd\x20\xd7\xdd\x52\x10\x28\xee\xe9\xe2\xce\x53\x67\x46\x5e\x08\x18\x60\x9e\xa7\xd4\x91\x0c\x98\x7a\x75\x12\xc0\xa9\x0b\x59\x4a\xc1\x5b\x33\xb5\x73\x09\x44\x61\xd8\xd6\xeb\xb8\x49\x96\x5e\x12\x7d\x85\x2a\x16\x94\xc2\x9f\xdf\x73\xaf\x5f\xb5\x2b\x49\x7a\xcf\xd8\x29\x61\xda\xbe\x2b\xda\x3a\xe2\xf3\xa7\x23\x63\x1e\xa1\x8d\xa1\x21\x58\xed\x3b\xae\xdf\x6b\x17\x29\x4b\x74\x9a\x92\xaf\x68\x7e\x7a\x4e\x2c\x73\xe7\x92\x5a\x30\x23\x5e\x0a\xdf\x32\x20\xc2\x11\xb4\xef\x5e\xeb\x0b\xb0\xd2\xbf\x88\xa5\x44\x60\xc2\x4d\xf5\x3a\xf7\x4b\xc2\x97\xec\x54\xbf\xd4\xa9\x45\x30\x3a\xcf\xa9\xab\xde\x9f\x98\xf7\xc9\x78\xcc\x63\x99\xbf\x3d\x36\xf7\x7b\xbe\xa5\x73\x8b\xbf\x72\x75\xbe\xf1\x53\xbc\xac\xf2\x4d\x3a\x1f\xf4\x4f\x4d\xc1\x62\x93\x49\x14\xea\xf0\x54\x8f\xae\xd2\x04\x53\x45\xbe\xae\x69\x0c\xdf\x06\x64\x4e\xc2\x14\x57\xe4\x56\x6b\x75\xdd\xd6\xf5\x66\xc7\x8a\x93\x38\x06\x86\x9c\xd9\x09\x4c\x6d\x01\xa9\x1d\xf7\x53\x60\xa7\x36\xa6\xa7\x77\x7d\x1b\xf3\xba\xb8\x07\x36\x66\xad\xdf\x53\x92\xf0\x82\x42\xda\x0a\x1e\x41\x48\x10\x82\x37\x98\xf6\x8d\xa3\x10\xa5\x4e\xa3\xf0\x20\x45\x38\x26\x74\x01\x7e\x6a\xdc\x7d\x66\x16\x3c\x19\x6c\xff\xce\x1f\xe3\xa2\xf8\x16\x60\x38\x04\xfc\x71\x69\xc1\xd6\x13\xf3\x3c\xb6\x34\x66\x57\x5b\x62\xe1\x41\xf9\x4e\x61\xba\xfe\x70\x3d\x5d\xf1\x82\xc3\x97\x15\x87\xb6\x5f\xbf\x9e\x2e\xd4\xb0\x9f\xf6\xee\x63\xf7\xfa\x9f\xc8\x99\x67\x96\xaf\x9b\xb6\x50\x3f\xc6\x48\x4c\x47\x43\x7b\x50\x04\x1b\xbe\xcb\x3a\x77\x6b\x58\x1b\xe6\xe3\x67\x1b\xb2\x36\xd2\x67\x83\xfc\x55\x31\xd8\xe1\x66\xf1\xae\x18\xf0\xf0\xf1\x30\x7f\x57\xd0\x86\xe1\xef\xc5\xbb\x82\x3e\x6c\x0e\x37\xf3\x77\x05\x8d\xd8\xdc\xde\xca\xdf\x15\x74\x62\xf3\x69\xf1\xae\x12\x66\x61\xb0\xbd\x21\xeb\x2b\xb3\xb5\xb5\xbd\x81\x76\x12\xe3\xf4\x6e\x2e\xe5\xb2\xb5\x8e\xa7\x56\x6f\x63\x46\xba\x78\x56\xe8\x86\x62\x7d\x27\x69\x2b\x99\xad\x2f\xed\x56\x1d\x02\xf4\x6e\x6c\x3e\xb3\x37\x7f\xaf\xc3\x42\x9d\xe6\x6e\x0d\xea\x44\x77\x58\x0f\x8c\x31\xc8\x97\xb6\x1e\xe7\xa2\x1e\xd3\x62\x50\x8f\x5f\x31\x5c\x5d\xc4\x95\x15\x44\xfa\x7a\x91\xde\x79\x87\x30\x23\x13\xbd\x3a\x90\x39\x09\x33\x86\x98\xc3\xcd\x3f\x9c\xec\xd7\xaf\x63\xf4\x1b\x2b\x2f\x45\x7f\xb2\xaf\xb6\x04\x36\xb1\x05\xb8\x5b\x76\xbc\x30\x4c\x5c\xc8\x48\xb6\x31\xa4\x20\x1d\xd9\x43\x86\x75\x96\xb6\xdf\x46\xcd\xc8\xd8\x7c\x0f\xcf\xa7\x30\x57\x45\xf3\x54\xdb\x16\xb9\xac\x59\x0b\xc1\x26\x0b\x0a\x37\xa6\xd2\x3c\x6d\xa8\x44\x12\xdc\xed\x4d\xfa\x68\xeb\x97\x12\xf9\xae\x5b\xce\x14\x70\x47\x3c\x6f\x3b\xf3\xd2\x09\x90\x34\x7b\x8c\x48\xba\x31\x5c\xf1\x36\xb8\x4c\x41\x57\x20\xd2\xb9\x49\xd5\x43\xc8\xc8\xd6\x6f\xb2\xb7\x49\x1b\x42\x50\x17\xb5\xe7\xaa\x6a\x21\x35\x2e\x03\x06\xef\xcd\xc8\x34\x45\x0c\x5f\x83\x10\x53\x32\x2c\x4a\x9e\xd4\x4a\x36\x8b\x92\xa7\xb5\x92\xad\xa2\xe4\xf7\x5a\xc9\x76\x51\xf2\xac\x56\xf2\xb8\x28\x29\x01\xcb\x14\x3d\x51\x45\x35\x08\x43\xf2\xbd\xb3\x86\x7c\x1f\xa3\x71\xd6\x1f\x83\x51\x6c\x0f\xfe\x38\x46\xa6\x6d\x24\x90\x67\x3b\x5a\xd3\xaa\x7e\x66\xe7\x64\x47\x2d\x41\x09\xa6\x3a\xaa\xc7\x1a\xd6\xe5\x28\x05\xcc\x76\x69\x80\xec\xb3\x9b\x3f\x7d\x28\x99\xed\xd7\xe9\x3a\x37\x1f\x45\x86\x7e\x8b\x37\x9e\xf0\xed\xdf\x04\x86\x81\x92\x1b\x4a\xd4\x3b\x6b\xfd\xe8\x0d\x79\xad\x3e\xfa\xa5\xf8\xd4\x8f\xe2\x49\x14\x03\x79\x51\x7e\xfe\xaa\x0d\xdf\x23\x59\x35\xf4\x8a\xa4\x8a\xfb\x3b\xd6\xed\xd5\x92\x9c\xe9\xc7\x9e\xa4\x8f\x9e\xf0\x6d\x04\xf2\x97\x69\xeb\x75\x72\x8a\x14\x5a\x42\xa6\x78\x23\xd5\x32\x08\x09\x47\x4e\x43\x3d\xf4\xd4\xe4\x32\x8a\xd6\x0b\x57\x69\x61\xf4\x7b\x41\x32\x28\xaf\xf8\xc4\x73\x5e\x56\x96\x15\xbf\x50\x09\xa6\x15\xa7\x74\xc4\xd1\x9d\xe2\x7c\xcd\x9e\xce\xc9\xcb\x14\xaf\xc2\xae\x53\xb4\x0c\x3d\x4e\xb1\x98\xc2\x00\xad\xad\x9b\x5a\xd6\xb3\x42\x15\x87\x22\x27\x20\xdb\x76\xbd\x73\xd3\x2b\x94\x9b\x81\x3f\x71\x33\xcc\x93\x30\x55\x06\x85\x02\x6b\xeb\xaf\x77\x33\xa8\x34\xdf\xbc\x6f\xf3\xc1\x52\xb3\x61\xd9\xec\x3c\x85\xe1\x50\x87\x38\x58\x46\x1f\x58\xb4\x59\x29\x19\x2c\x95\x0c\x2a\x25\xb5\xee\x2a\x25\x5b\x4b\x25\x5b\x95\x92\xed\xa5\x92\xed\x4a\xc9\xe3\xa5\x92\xc7\x95\x92\x27\x4b\x25\x4f\x2a\x25\x4f\x97\x4a\x9e\x56\x4a\x7e\x5f\x2a\xf9\xbd\x52\xf2\x6c\xa9\xe4\x99\x2e\xa9\x07\xe1\xc7\x09\x19\x3f\xc8\x05\x85\xfd\x76\x78\x47\xa6\x3a\x62\x25\xbf\xf7\x93\x5d\xd9\x02\xd8\xb5\x9d\x97\x28\xbc\x7e\xa3\x09\x58\x0c\x4c\xa0\x82\xf7\x56\x3d\xee\x68\x3d\xcb\x47\x14\x92\x76\xd3\xb5\xd1\x1c\x8f\xed\x43\x34\x3f\x60\x27\xea\x21\xa6\x30\xb5\xe7\x64\x3f\x05\xf4\x06\x46\xeb\x3b\x92\xa6\xf0\x74\x93\x3f\x46\x08\xe7\x14\x52\x55\x11\x59\x7f\xcb\x82\x8c\x11\x8c\x23\x45\xa9\xe2\xbf\x0f\x39\xf9\x98\x2e\xb7\xa0\x8a\x1f\xdf\x91\x8a\x1b\xd7\xa5\xaa\x97\x3d\xfb\x01\xd2\xf3\xd3\x56\x0c\x84\x88\xa3\x17\x2b\xe4\xb9\xa0\xf0\x2e\xbd\xc3\xd5\xc7\x98\xa6\x56\xa2\xc7\x7c\x4a\xdb\x15\x30\xbe\x4e\x7c\x71\x82\x8e\x30\x4a\x96\x70\x50\x50\xf0\x1c\x94\x1f\x12\x67\x37\x23\x3e\x23\x59\x4a\x98\x36\x91\x28\x7e\x7b\xe5\x35\x80\x59\xb9\x2c\x5f\x39\x5e\xac\x9c\x89\xf7\x5a\x5f\xa6\x19\x39\x4d\xb5\x47\x46\x75\xad\x3c\xbd\x40\x7a\xb5\x8b\x35\x62\x95\x35\xba\x8e\x1d\xd6\x1a\x17\xb7\xba\x8f\x99\x1a\x09\x57\x5d\x4b\xd5\x25\x03\xf7\x5a\xc9\xa5\x07\x8a\xbb\x39\xb2\x3d\x70\x4f\x6d\x0c\xb7\x7c\xb6\x36\x1e\xee\x85\xcd\xc1\xbd\x54\x5d\x24\xaa\xf5\x99\x09\x09\x2a\x1c\x0c\x2d\x11\xa6\xaf\x7f\x64\x2c\xc2\xa8\x12\x41\x82\xf0\xf1\x60\x90\xc7\x7d\x4d\x0f\xf9\x05\xbf\xb1\x20\x30\xe1\x21\xa6\x2c\xca\x78\x19\xc5\xa2\x1a\xc9\xf5\x4c\xdf\xf9\x9e\x0a\xa7\x1a\x01\xf6\xae\xa0\xb7\x79\x52\xbc\xbf\x14\xf0\x36\xcf\xb0\xf7\xf7\xa3\xdd\xb6\x44\x9e\x3d\x34\x86\xde\x87\xa9\xd3\x1e\xdd\x03\xc3\x81\x9c\x9a\x70\x20\x4a\x66\xce\x57\xa3\x90\xaa\x8b\x17\xa5\xf8\x9d\xbf\xaa\x85\x0f\x59\x09\x16\x52\x4a\xff\x27\x09\xf9\x2c\x70\xa4\xd7\x65\x38\x0f\x38\x69\xa4\x61\x2d\xba\x05\x0b\xc4\xf7\x6a\xca\xcd\xfd\x04\x24\x94\x76\xf3\x87\xa9\xd6\xf8\xde\xa6\x0e\xe1\x89\x13\x84\xf5\x18\xd5\x31\xd9\x89\x09\x4f\xc8\x2b\x26\x79\x3f\x4e\x66\x44\xdf\xdf\x52\x78\x95\x56\x35\xe2\x26\xcc\xfb\x4b\x35\xdb\x44\x68\x8d\xf8\xdb\xf4\xae\xc8\x96\xb9\x8b\x90\x89\x98\x33\x32\xc1\x8b\x46\x26\xf8\xd2\xc8\x38\x71\x8d\x66\x92\x4c\x89\xf1\xb9\xe9\x33\xe0\x68\xe1\xc7\x30\xad\x0c\xfa\xba\x30\xe3\xf3\x92\x99\xbf\xdc\xfc\x95\xe6\xaf\x41\x1e\x2f\x84\x12\xef\x6f\xc8\x99\x3a\xbb\x96\x05\x0f\x86\x06\xd2\x95\xd8\xfe\x26\x75\xd4\x71\xb3\x2c\x75\xde\xd4\xbf\xa7\xb6\xce\xd4\x6e\x10\xdd\xb5\xfd\x42\xa8\x63\x87\x2f\x17\x70\xd0\xa4\xde\x39\x57\x08\x25\xa6\xe0\xa3\x72\x55\x87\xb5\x41\x27\x34\x9d\x02\xa1\xbc\xac\x7c\x8e\xb7\x9f\xe5\x15\x89\xe2\x3c\x15\x56\xc4\x3b\x0b\xa3\x9b\x55\x08\xd0\x7a\xc9\xe2\x7f\xc8\x8e\xcb\x3b\x61\x8c\x89\x8f\x26\x2c\x95\x96\x46\x88\xa8\x4d\x6e\x46\x87\x78\xb1\xec\x03\x1a\xca\x1d\x6b\x5b\x71\x9d\x5c\xc7\x3d\x40\x73\x50\x76\x9a\x7f\x78\x37\x23\x01\x79\x9b\xc2\x5a\x9f\xa4\x7d\xf2\x26\x05\xb5\x38\x42\xad\x0d\x86\xe9\xce\x96\x71\x11\xc7\xcb\xee\x4b\x9c\x7c\x97\x11\xd9\x77\xcf\xf0\x81\xe3\x83\xc2\xb2\xf8\x30\x23\x07\x29\xa8\x47\x10\xea\x37\x42\xde\x97\x56\x22\x70\x8c\xbf\x90\x33\x57\xac\xdb\x8b\x76\xa2\x2a\x5b\x25\xa5\x39\x79\xa1\x58\x8d\xe1\xe6\x6f\x02\x78\xcd\xe4\xc1\x65\x0a\xbd\x33\x67\xb8\xf9\x9b\x1a\xdf\x56\x6f\x48\x37\x94\x78\x96\xf5\xd9\x84\xaa\x1f\x02\x3c\x25\x35\x6a\x9d\xf9\x26\x30\xaa\xc4\x47\xe6\xa0\x6c\xc8\x60\xb8\xa9\x44\xaf\x52\x1e\x60\x46\x1e\x50\xc4\x60\x63\x46\xbe\xa8\x99\xb2\xaf\x5a\x24\x40\x02\x51\xe3\x9c\xf8\xc6\xd3\xdf\x44\x1d\x63\xf1\x0d\x44\xcc\x3f\x9a\xa9\xfb\x4a\x68\xb9\x15\xbe\x53\xeb\xbc\x38\xdd\x28\x84\xa4\x6d\x3b\x76\x86\x8f\x41\x38\x18\x85\xd6\x84\x82\x69\x88\x17\xb2\x95\xd7\x43\x79\xa2\xbd\xde\x66\x5e\x0f\xc5\x8f\x35\x15\x87\x4b\x4c\xa7\x04\xdc\x8a\xad\x9c\xfb\x54\xf3\x51\x00\x71\x66\x1e\x57\xd8\xca\xb2\xcd\x70\x7d\x9b\x81\x1d\x3b\x9b\x6a\x7e\x9b\xeb\x46\x63\x2a\xad\x5b\x02\x5c\x81\x21\x08\xe7\x69\x73\xa5\x32\x86\xca\x9a\x5a\x48\x56\xd7\x48\x60\x3f\x52\x05\x4a\xb1\x4e\xd3\xbf\xa0\xf0\xfe\x8e\xba\x5b\x95\xba\x5f\xdb\x4f\xc0\x9c\xec\xa5\x79\x0c\xb2\x42\xfe\xe1\x20\xe9\x48\xda\xd8\x51\x8c\xcb\x88\xae\x8f\xdf\x1a\x50\x57\xcf\x41\x21\x00\xbf\xf4\xbc\x75\xb0\x71\xd4\xdc\xf2\x47\x63\xcb\xea\xd0\x45\xad\x65\x96\x1b\x81\x34\x28\x7e\xf2\x00\xb5\x7c\xc9\x78\xe3\xa0\xc5\x8f\x45\x27\x28\x58\x54\x7c\x8d\xe3\xd1\xb9\x3a\xc3\x3b\xc0\xd5\x9f\x6b\x4a\xed\x73\x82\x8f\x3b\x14\xf0\xc5\x42\x0b\x94\x93\x00\x34\x86\xc7\x03\xff\xbc\xdd\xa3\x63\x9f\x64\xf0\x93\x4d\x14\x3b\x37\x61\xda\x6b\xb1\x26\xd1\x54\x6a\xe0\x4e\x6c\xaa\x89\xeb\x55\x18\x42\x6f\xa8\x7e\x95\xef\xa5\x26\xa1\x35\x88\xd7\x5d\x88\xd2\x7c\xa1\x26\x00\xe5\xe5\x3b\x72\x41\xab\xde\x82\xbc\xc9\x22\xb9\xe2\xff\x7b\x81\x31\xbf\x0b\xbb\xe9\xe7\x25\xa2\x20\x42\x09\xf2\x58\x8e\xd9\x59\x18\x51\x2f\xf1\x01\x07\x3b\xc4\x71\xc7\x8e\x62\xed\x91\x65\xef\x21\xe3\x2f\x36\xb4\xdf\x26\x6b\x65\xf2\xfb\xdd\x91\xd0\x8e\x17\x1c\x2f\x42\xb5\x36\xc1\x73\x56\xb2\x29\x65\x7d\x26\x6a\xc1\xdf\x70\xeb\x6e\xd5\x96\x5c\x55\x72\x6c\x83\xa2\xad\x95\x82\xc2\xbb\x8b\xe5\x6e\xfa\x45\x9e\xa1\xa2\x1f\x9d\x59\x7c\x47\xe6\x93\x5f\x22\xb8\x79\x31\x72\xe8\x74\x61\x1c\xe5\x5b\x7b\xd0\xf9\xbd\x2b\x86\xef\xfb\x21\xe8\xb5\x13\x7a\x71\x2e\x10\x2e\xe8\x08\x1b\x69\x09\x4b\x20\xe0\x2d\x7d\x86\x50\x48\x30\x20\x97\xe7\x78\xe5\x85\xb1\xde\xd9\x2b\xdb\xd3\x52\xa0\x92\x00\x10\x4c\x95\xd8\x97\x28\xb1\x4f\xbd\x4b\x00\x01\x78\x51\x48\xbf\xda\x29\x5d\xad\x4d\x80\x2e\x45\x2e\xc6\x00\x68\x97\xa8\xfe\x18\x8c\x06\x36\x92\x32\x63\xcb\x9e\x38\x73\x22\x20\x84\xa0\xed\xf6\x2c\x1e\xcd\x48\x1c\xc1\x8c\xa4\xf0\x64\x00\x18\x93\xdb\x9e\x91\x6f\x29\xbe\xd9\xdc\xd6\x6f\x16\x25\x73\xa9\xe7\x71\x6d\x27\x7d\x57\x8d\x3a\xc1\x38\xf9\x45\xae\x29\x1c\x5e\xa0\xbf\x59\x19\xf6\x8a\xd7\x4c\x7e\xfa\xe5\xb2\x57\x61\x6d\xb1\x15\x3b\x8c\x7c\x41\x11\x39\x63\x46\xe2\xd1\xfb\xd4\xfe\x9c\x82\xab\x01\x6e\x65\x5c\x81\x1e\x57\x50\xc4\xe9\x8a\xda\x75\x41\x75\xce\x74\x86\x1f\xc8\x39\x50\xda\xc4\x5d\x9e\x99\x28\x88\x3c\x72\xde\x08\xc8\x22\xe7\x40\x00\x8b\x5a\x2f\xbc\x8e\x6c\xd1\x67\x47\x68\x4c\xdf\x77\x29\x78\xb6\xc0\xb8\x62\x42\x87\x24\x03\xf7\xad\x2d\x74\x5c\x31\xd1\x67\x6a\xb4\x5e\xe4\xbc\x15\x90\x44\xce\x2b\x01\x61\xd4\x74\xe8\xe7\x24\x89\x60\x38\x18\xe2\x06\xff\xfa\x85\x3f\x9f\x3c\xd3\x7a\xb9\x5c\x4a\xc6\xd8\x58\x58\xb2\xbd\x85\xb1\x63\x4d\xbd\xed\xc7\xf8\x6b\x24\x37\x86\xb6\xc4\x6b\x3e\x2f\xd2\xb1\x65\x2b\xda\x34\x41\x47\x3d\x51\xae\x79\xbc\xa0\x10\x44\xed\x1a\x4e\xd5\xed\x13\xfc\xfc\x68\x46\x42\x05\x48\x5e\xa4\xfd\x57\x0c\x28\x85\x51\x0e\x8b\x6e\xb4\xd6\x4c\x92\xa3\xbf\x07\xd7\xb6\x1a\x4d\x31\xea\xd1\x85\xed\x6b\x02\x26\xdc\xec\x73\x51\x45\x75\x6a\xe8\xcc\xc4\xb0\xd2\x69\x1e\x24\xfd\xa3\x68\x10\x57\xe3\x58\x69\x97\x08\x16\x15\x71\x4d\xd3\x68\x7d\xfc\xc8\x6a\xea\x0b\x53\x88\x17\x8d\x51\xab\xe8\xa3\xe3\xf1\x2b\xf1\x25\x71\x66\x24\x88\xc0\xd3\xe9\x31\xc3\x80\x24\xa5\xf5\x49\x3e\xab\x1b\x92\x46\xc0\x10\x10\xfa\xec\xa8\x47\x92\x0d\x86\xd1\xe4\x81\xf5\x3d\x9a\x27\xb3\xe8\xbb\x90\x34\x47\x11\x43\xdc\xab\x6b\x79\x95\x3a\x53\xe2\xaa\xa5\xd7\xa1\x49\xd4\xa8\x9e\x17\x5e\x58\xcd\xeb\xca\xd4\x32\x3d\xcf\xcc\x46\x24\x21\xc1\xb8\x61\xf8\x61\x2d\x85\x3d\xaf\x84\x71\xe1\x18\x2f\xa1\xde\xba\x58\xe4\x0c\xc5\x33\xbd\xcc\x09\x68\xf7\xf2\x56\x73\x81\x0e\x77\x7e\xb2\x0f\x78\xca\x28\xb0\x33\x3b\x06\xb6\xa9\xa4\x1f\x26\x29\xb8\xae\x79\xef\x06\xea\x15\x97\x14\xbc\x37\xb6\x00\x77\xa2\xdf\x2f\xea\x99\x20\x34\x48\xfe\x5e\xc4\x60\xab\x18\xa2\xe2\xb9\x10\x25\x3f\xaf\xcf\xd2\xe6\x40\x27\xb5\xa3\x23\x5c\x31\xde\xf7\xde\x00\xef\xbb\x2e\x86\x63\xca\x22\x6d\x4f\x47\x21\x56\x93\x53\xf5\x51\x45\xba\x5a\x7f\x82\x9c\x2c\x8f\xe0\xf7\x7a\x8b\x67\xbf\x37\x35\x60\x1f\xf2\x06\x9b\x95\x06\x01\x89\xca\x1a\x67\xaa\xdf\x40\x3d\x6d\xc2\x39\x11\x30\xa8\x06\x5b\x69\xad\x89\x7d\x0e\x07\xc5\x02\xa8\x36\xda\x1c\x6a\x41\xe1\x8d\xd0\x96\x18\x67\xa0\x44\xb6\xc8\x59\x0a\x8a\x17\x73\x55\xe1\xef\x44\x78\x8b\x4c\x84\x37\x3f\x55\xcc\xc3\x41\x43\x20\x29\xf3\xcf\xb7\x10\x06\xd0\x90\x1a\xa5\x12\x97\xdc\x0b\x9b\x0c\x7b\x5f\x66\x24\xde\x40\x34\x82\x3d\xf9\x11\x74\x03\x8a\xb1\xca\xaf\xf0\xdb\x79\xe0\x2b\x13\xad\x69\x1a\x15\xd1\x9a\x0e\x04\x85\x77\x29\xe9\x4a\x62\x7d\x15\x49\x7c\xd1\xf1\x33\x81\x46\x0d\x1d\x9d\xac\x1c\x43\x88\x77\xa3\xb5\x16\xdf\x8c\xdb\x93\x04\xdc\x33\x3b\x46\x19\x78\x1c\x99\x08\x48\x97\x77\x36\x23\x18\x3b\x15\x05\x61\x75\x62\x74\x2e\x5d\x7b\x1c\x61\x3f\x93\x5a\x73\xd9\xe8\x72\x6c\x78\x68\x46\x98\x83\xfb\xc9\xd5\xb3\xec\xb3\x53\x14\xb7\xb3\x55\x8e\x6b\x4e\x64\x04\xa7\x29\x8a\x02\x35\xce\x4b\xf6\xd3\xbe\x7b\xf6\x3c\x76\x32\x54\x44\x2c\x05\xd8\xd5\x65\x68\xec\x49\x2a\x74\x55\xc2\xcf\xd4\x9e\x91\x6e\x04\x19\xc8\x7e\x8a\xaa\x4e\xfc\xa9\xa8\xa4\x7b\x50\xe1\x93\x4d\x66\x1a\xb4\x28\xc7\x21\xba\x07\x38\x44\x1c\x30\xfb\xff\x62\xa8\xec\xb4\x1c\x2a\x3b\xad\xf0\xe3\x6d\x43\xf5\x9c\x69\xa4\x87\x4a\x32\x3d\xb8\x34\x05\x0f\x4d\x9e\xd4\x57\x71\xcd\xed\x8f\x29\x2a\xa1\x9a\xbe\xcb\x96\xbf\x9b\x2d\x7f\x77\xcb\xae\x37\xb9\x8c\x60\x1a\x55\xda\x5c\x46\x70\x90\x96\xc3\xc1\xd6\x7a\xc1\x2f\x23\xf0\x6b\x2b\xbe\xbd\xd4\x1d\x3b\xd1\xdf\x8c\x35\xfb\x72\x52\x61\x23\x57\xaa\x5d\x46\xd0\xad\xd5\x7a\xb2\x5c\xeb\x78\xa9\xb3\xe3\xa2\xda\xd3\xd5\x6a\x45\x67\x65\xad\xdf\x6d\xed\x2a\xbb\xb2\xdf\xe7\x44\xf6\xa7\x4a\x6c\xc3\x3f\xd7\xad\xea\xb3\x3d\x5c\x03\x9c\x3f\xae\x4e\x29\x25\xa0\x9c\xb0\xc4\xe6\xef\x91\x7c\x75\xb4\x06\x5e\x68\xef\x33\xbd\x94\xfa\xb7\x29\x89\x8b\x92\x69\x04\x0d\x2a\x7e\x01\x46\x03\xbb\x0a\x55\x9e\x93\xf4\x3d\xb5\x47\x1c\x3d\x7f\xdd\x03\x5b\x38\x49\x9f\x69\x55\x7f\x71\x8b\x94\x38\xc4\xab\xc2\x93\x86\x1a\x35\x61\x25\x2a\x79\xea\xf4\x7a\xe6\x4a\x22\x3f\xc0\xcb\x1f\x2a\xee\x21\x3c\x5c\x21\xef\x86\x6a\x1b\xa8\x15\xad\x37\xd6\xd6\x1f\x47\xeb\x8a\x68\x9d\x63\x53\xd5\x85\x44\xab\xc5\x66\xe4\x43\x0a\xe8\x8a\x22\xfa\xec\x71\x11\xa2\xb8\x66\x43\x3d\xb0\x6f\x10\x61\x75\x29\xb0\xc7\xf6\x1c\x9f\x1f\x53\x70\x3f\xda\x71\x46\xac\x97\x49\x16\xf9\x9d\x38\x91\x9d\x34\x73\xc7\xa1\x44\xdd\xa5\xc2\xa9\x90\x27\x36\xee\x84\x29\x96\xcf\xb9\xec\x60\x88\xff\xbe\x95\xbb\x05\x65\xd5\x58\xc8\xb9\x71\xfa\x47\x3b\x4c\x2a\x76\xcc\xb9\x85\xfa\xe7\x0c\xde\x20\xcf\x16\xa4\x3a\x1c\x22\xbc\xc2\x13\x78\x62\xcc\xb9\x7f\xa0\x39\x37\xbe\xa8\xb8\x29\x3c\x33\x87\x7c\xeb\x81\xa3\x76\x45\xa1\x90\x7e\x77\xb4\x9b\xd8\xa5\xb9\xbe\xdc\xa8\x26\x68\xb6\x36\xbc\xca\xa9\x2e\xc7\xe4\x29\x39\xb8\x38\x25\xac\x6a\x06\xac\xbd\x13\x12\x33\xce\x39\x39\x74\x8d\xf3\x89\x7b\xad\x58\xa6\x63\x8a\x03\xbf\x4d\x1b\x1c\x21\x1a\x32\x6e\x22\x29\x2d\x73\x6e\x62\xb6\xfa\xc7\xf6\x0d\xd9\x4d\x4d\x14\x0f\x0f\xa3\xba\x0a\x04\x0b\x6f\xd7\xc6\x39\xe8\x54\x9c\x8d\x8e\x86\x02\xe6\xe4\x44\x2d\x19\xce\x5e\x8f\xf1\x3d\xae\xe5\x8a\x9b\xc5\xd6\x03\x23\x68\x8f\x54\xb3\xdd\x44\x49\xb5\x0d\x23\x44\xb6\x80\x9b\xdc\xff\x8a\x27\xd4\xd6\x8a\x2b\x63\x9e\x91\x4f\x29\xf2\xe9\xb5\x91\x8a\xbe\xfb\x71\x01\xcb\x16\xea\x27\x2e\xad\x18\xac\x68\xce\xb9\x01\x3c\xbd\x55\xf0\xdc\xd3\x60\xc8\x62\x04\x32\x3f\x4c\x27\x11\x9b\x77\x58\x10\xe8\xa8\x48\x98\x48\x3c\x5d\x0b\x8c\xd0\x02\xe2\x05\x90\x7a\xab\x1e\x0e\x7b\x1a\x48\x4b\xf0\xfc\x92\x83\x27\xba\xd7\x4c\x51\x0f\x7e\x4d\x57\x43\x69\x54\x86\xbd\xc6\x87\x54\xd5\x78\xb5\xea\xd7\xb5\xd2\x87\xda\x13\xb5\xd0\x13\x8d\xa4\x8b\x93\x19\x25\x0d\xae\x1a\x4a\x0a\x11\x65\xc5\xfe\x74\xc5\xd3\x48\x75\xe5\xe2\x9a\x3f\x86\x64\xc9\x77\x6f\x38\xb4\xb3\xd2\x65\x46\x2f\x55\x82\xd1\xc9\x57\x7c\x5c\xf0\xbe\x46\xc1\xc2\xd2\xfa\xbc\xd0\xeb\x93\x34\xb9\xdc\xe5\xee\x0b\xc5\x7c\xd1\x66\x2b\x5a\x1f\xa4\xec\xd5\xeb\xfd\xd7\xc7\xaf\x97\xe3\x94\xcd\xa3\x8a\x9b\x81\xbe\xbb\x33\x3e\x06\x37\xd1\x5f\xbb\x49\xeb\xbb\x7e\xcb\x65\xda\x2c\x02\x01\xf3\x48\x5f\x69\x5c\xff\x95\x6e\x1b\xc2\x5a\xad\xdc\xd2\x9d\x24\x04\x2f\xea\xd0\xcb\xbb\x75\x05\x2e\x74\x90\x30\xf7\x50\x7b\x57\x1c\x45\x8d\x06\xc8\x47\x4c\xe7\x5c\xc8\xdd\x64\xaf\xec\xaf\x82\xc4\x14\xd8\xdc\x8e\xc1\x3d\xd1\x17\xc3\xc7\x51\xab\xf9\xe1\x6a\x7a\x72\x2f\xcb\x2f\xea\x6b\x10\x19\x25\x35\x35\x69\x98\xd4\xb7\x39\xce\xb4\xfa\x64\x41\xe1\x75\xe4\x1c\x92\x3f\x87\xb0\x09\x83\xef\x14\xce\xda\x34\x02\x0d\xb9\xfb\x6b\xc0\x36\xb7\x67\xe4\x38\x6a\xd6\x16\xef\x71\x38\x8a\xd4\x74\x5f\x47\x74\x01\x71\xcd\x45\x77\xe5\x3c\x76\x6d\xe3\x7f\xa7\x61\xdb\x7d\x8f\x58\x6f\xae\x8f\xf9\x9c\x5c\x23\x1b\x07\x3b\xab\x53\xcf\x49\xc4\x7b\x45\xdc\x0d\x77\xde\x77\x7d\xba\xea\x7a\xab\x59\x4d\x6f\x99\x74\xe4\x8d\x2b\x5f\xd3\x94\x6f\x4e\x6e\x22\xb4\x12\xe8\x4a\x72\xac\xa4\x19\x6f\x54\xd2\x2c\x5e\xa5\x59\x16\xb5\x77\x93\x92\xe4\x6d\x17\x87\x7d\xe9\xb4\x86\xc8\xa9\x30\x64\x5c\x3c\xed\xdd\x76\xcd\x20\xe9\x7b\x14\xd5\x13\xdc\xad\x75\x0a\xe8\xe8\x16\xe6\x8e\x6e\x9e\xc3\x56\x1c\xdd\x12\x0a\xde\x77\x4a\xed\x06\x24\x10\x2e\x30\xd6\x66\xf3\x51\xaf\x3a\xe5\xa1\x7b\x77\xb4\xc6\xe0\xaa\x7d\xf7\x57\x50\xe8\xf0\x4e\x14\xba\xbd\xba\x6b\xe8\x65\xbd\x8a\x63\xab\xb4\xb0\x82\x6d\xdd\x0f\x36\x9a\x9e\xe8\x36\x76\x95\x1c\xa8\x32\x2f\x23\xdc\x10\xc5\x1c\xfb\x1d\x33\x4d\x14\xa4\x22\x0a\x3c\x27\x0a\x28\x8a\x57\x95\xfb\x59\x83\x1f\x9d\x1a\xdd\x10\xc1\xef\x24\x05\x09\x19\xbc\x66\x15\xf4\xb9\xae\x45\xb9\x47\xcb\xbc\x4d\xa6\x3d\xdd\xde\xae\x4d\xa9\xcc\x0e\xed\x18\xd8\x17\x5b\x82\xfb\xcd\xe6\xe0\x76\x35\xa6\x78\x65\x6c\x3d\x12\x11\x5e\x84\x31\x8b\xd6\x25\xf5\x15\xc6\xb4\xe2\x85\x68\x4f\xc1\xa1\xed\x53\x52\xf5\x99\x23\x93\x93\xbb\x55\x85\xba\x6b\x0b\x30\x99\x82\xe1\x8d\x19\x07\xf3\x7d\xc1\xd3\xb4\xdd\x3e\x45\xab\x20\xd6\x5b\xa4\x08\xce\xfc\x79\x93\x3d\x4a\xca\xa5\x8c\x6a\x66\x27\xb9\x45\x8a\x1f\xa6\xcc\x8d\xfe\xa5\x04\xcc\x67\xda\x1c\x67\xc2\xb5\xf5\x87\x20\x27\x09\x79\xa3\x64\x94\x3c\xcd\x4b\x6e\x7a\x72\x20\x74\x4e\x18\x3d\xb9\x32\x17\x4c\xca\xc9\x0b\xa1\x13\x2d\x8b\x3b\x8c\x2f\x7e\xb2\x8f\xb6\x04\xf6\xc9\xce\x80\x7d\xb6\x39\xb0\x67\x36\x03\x17\xf5\x67\xe7\x7a\x49\x0f\xcc\x92\x5e\x24\x27\x5c\xa4\x61\x12\x97\x8b\xea\x66\x61\xe4\xbf\x42\xeb\x9e\xa5\x57\x5f\x52\x2e\x2a\xaf\x04\x8b\xbd\xcb\x6a\xc2\x9b\x69\xb8\xdc\xcf\xb4\xd2\x71\xca\x71\xae\xda\xc6\xe5\x65\x94\x5b\xdf\xc8\x50\x4d\xf1\x20\x37\xaf\x89\x83\xf0\xc2\x82\x57\x62\xa9\xfd\xbb\x38\x48\x70\x51\x74\xa5\x28\x4b\x31\x8a\xdc\x99\xea\xf3\xad\xc9\x3c\x7d\x1e\xdd\xc3\x1f\x27\xe7\x0e\xb4\xd7\xfa\xa7\x00\x62\x78\x19\x2d\xd3\x65\xa1\xe8\xb2\xb6\x06\xdf\x8b\xd6\x5d\x81\x69\x01\xe0\x3c\x82\x82\xc1\x3e\x63\xf0\x45\x31\xd8\x39\x82\x70\x8f\xec\x9f\x2e\x3a\xbe\x2c\x0c\xda\xa3\xb0\x1f\xb5\x87\xfd\x7b\xa6\x83\x1e\x3d\x59\xbd\xaa\x7c\x62\xb0\xc5\x94\xec\xba\x70\xa4\x0e\xb9\xfb\xd8\xb0\xf6\x1c\x24\xd5\x71\xa8\xea\x58\xe1\x31\x32\x65\xde\xcc\xf6\xc0\x3b\xb5\x5f\x71\xe2\xd1\x8a\x38\x33\xd4\xe4\xc9\x83\xc4\x99\x92\xb3\x08\x8e\x11\x75\x0c\x4c\xaf\x0a\x33\x68\xb2\x51\xf7\x37\x35\xdd\x7d\x56\xdd\x81\x37\xd0\xd7\x40\x1a\xe9\x1d\x70\x60\xab\x36\xa9\x79\xc3\x53\xfb\xa5\x66\x0e\x0b\x09\xe0\x8b\xf6\x51\xcd\x5d\x54\x6b\x0a\x04\x74\x65\x76\xe6\xe4\x2a\x02\x13\xaa\x3c\x59\xa8\x21\x0e\xf5\xd0\xc2\xd5\xa1\x9d\xda\xef\x39\x51\xe4\x69\x68\x87\xe5\xa8\x3e\x54\x47\x35\xb0\xc3\x06\x04\xea\x9d\xda\x3f\x38\x09\x69\x3e\x3c\xdc\xcd\xd7\x98\xfd\xf6\x5a\xcb\x71\x57\xaa\x78\x59\xbc\x0c\x9a\x3b\x7a\xc1\x49\x40\x97\xe7\xf9\x86\x93\xb7\xea\x6d\xa3\x57\x7c\xde\xee\x6c\x99\x79\xdf\x6e\xf6\x82\x8f\x4b\x36\x6c\xb8\x24\xee\xed\x25\xa4\x5a\xd6\xe2\xa8\x2f\x2b\xc1\x26\x56\x8d\x8f\xcb\xc1\x5c\x25\x8d\xf4\x73\x46\xf6\x8c\x24\x51\x10\xce\x40\xc3\xa4\xe6\x38\xdc\xc7\xea\x33\xb3\x1c\x26\x83\x26\x98\xc4\xeb\xb9\x02\x0a\x35\x19\x74\x35\x08\xea\x4e\xbc\x81\xee\xc4\x80\xa0\xbb\xba\xcf\x03\xdb\x6d\x06\xba\xc7\xb6\xab\x8e\x75\x3e\x1c\xef\xac\xa5\x83\x33\xd3\x01\x5b\xe2\xd4\x52\x0d\x6c\xa6\xad\x01\xb3\x74\xb5\xf5\xd0\x4e\x9b\xa1\x6b\xd3\x4e\x9d\x1b\x72\x51\x74\xd1\xcd\xe7\xd0\xd0\x49\xd7\x74\x52\x0c\x61\x05\x24\xdc\x15\x46\xe7\xf7\x7a\x95\xf9\x4a\x95\xba\x07\xbf\x17\xd7\xab\x6c\xd6\x79\x58\xef\xba\x52\xa5\x45\x4a\xfb\xb1\xcc\xba\x7d\x8c\xd6\x67\x65\x9c\xd9\x1c\x6e\x6d\x09\x99\x4e\xb5\x95\xc1\x8e\xa6\x38\xbb\x51\xb3\x7f\x9e\xfb\xf0\x21\xb1\x2c\xcd\x7b\x69\x6d\xa0\x9b\xe7\x49\xe8\x33\xd8\x8d\x50\x3d\x42\xed\xd3\x05\x9c\xb6\xa2\xe4\x6b\x99\xdf\x1c\x8e\x74\x10\x5d\x3b\x4f\xb4\x60\x42\x1c\xbf\x5b\xfe\xb8\x14\xf3\x4a\x53\x9f\x37\x24\x15\xa3\x0b\x8f\x19\xb6\xa1\xc8\xe0\xb4\x58\xc0\xa7\x36\x14\xae\xe3\xc9\x3a\x96\x49\x79\x27\xd5\xbc\xa4\x8e\x25\xf8\x40\xe6\x81\x04\x63\x47\x3d\x32\x90\xce\xbb\x08\xaf\x98\xf3\xbb\xb9\x4a\x02\x45\xf1\x5c\xa2\xff\x7a\xac\xea\xc4\x4b\x97\x6f\xda\xf8\x42\xc7\x11\x86\xd3\x48\x47\x54\xa9\xe6\x26\xa0\x70\xd8\xba\x46\x2d\x91\xdf\x1f\xc4\xa5\x03\xbd\xc9\x51\xb5\x9c\x7d\x40\xf4\xb3\x3c\xa8\x23\x2d\xd7\x0c\xaf\x36\x9e\xe7\x61\xce\x78\x9f\x3d\x7c\xb8\x1c\xf8\xad\xa8\x13\x3b\x72\xb1\x20\x31\x99\x92\x8f\x11\x9c\xae\x38\x48\xbe\xd4\x34\xba\x9c\xa8\xde\xf1\x87\x0f\x75\x60\xb3\x3e\x1b\xc5\x7d\xd7\x8e\xe9\x42\xc9\x92\x19\x05\xb5\x0e\x04\xb3\x71\x1f\xd3\x7e\x77\xd4\x4d\x6c\x0c\x3c\xf0\x29\x82\x6e\x62\x82\xfa\x3e\xb4\x34\xaa\x54\xbb\xff\x04\x98\xd4\xb2\xf5\x49\x74\x2f\xa3\xec\x4b\xc5\x38\x31\x05\xbb\xb7\x36\x87\x43\x3b\x81\x23\x9b\xc1\xb1\xed\xc1\x17\x3b\x83\x5d\x0d\xcb\xb7\xd1\x5f\x48\xb4\x26\x49\x11\x07\x98\x07\x46\xd7\x8c\xdc\xf5\x1a\x75\xc7\xc7\x08\x44\x7f\x07\x44\x3f\x03\xd1\xbf\x05\xd1\x9f\x41\x7e\x9d\x84\x79\x0f\xa3\xa5\x54\xf0\x45\x22\xf8\xf6\x04\xe7\x71\x7f\x07\x77\x34\x43\x3b\xfa\x5b\x34\xa3\x9f\x3d\xaf\x8a\xce\xaf\x70\xdd\xcf\x28\x78\x7a\xab\x4a\xa6\x52\x0f\xb7\x39\x77\xe4\x8c\xdc\x46\xe8\x50\x73\x9e\xc0\x69\x06\x07\x21\xc1\xc7\x2b\x06\xf3\x90\x58\x01\x8b\x52\x6e\x69\xd5\x3a\xbc\x8d\xd6\x04\xd1\x68\xcc\x5f\x5f\x7c\xe3\x30\x51\x64\x05\x4f\xe5\xda\x0b\xe5\x19\x79\xab\x46\x43\xa4\x23\x1a\x6f\x31\x6f\x2b\xf1\x40\x71\x92\x6a\x59\xd4\xa2\x08\x88\xfb\x33\x20\x78\x7b\x7a\x46\x09\x1a\xf8\xd0\xef\x68\x68\x92\xfb\x93\xbf\xa9\xcc\xdf\x5b\x93\xc9\xae\x71\xa5\xb5\xbf\xc2\x99\xc1\x0c\x1a\x11\x60\xea\xbe\x92\x38\x5c\x90\x18\x3c\x3a\xca\x47\x56\x64\x8a\x29\xb6\xe1\xbb\x42\x82\x45\xbc\xcf\x05\x1c\xac\xd9\x8f\xc6\xfc\x2c\xae\x41\xaf\x79\xae\x45\x14\x59\x17\x4a\xca\x9b\x91\x2b\x38\x51\xdf\x7c\x21\xee\xf3\xcf\x1b\x41\xf2\xb0\xed\x14\x0e\x8a\xc8\xce\x14\x7f\xe8\x00\xce\x78\xe1\x72\x1b\xc1\x4a\x08\xe7\x1c\x52\xe6\x98\x6e\x94\xea\x36\x45\x20\x68\xaa\xe0\xac\x12\xac\xda\xfc\x2e\x23\x53\x9b\x17\x3a\x10\xb5\xf9\x61\x1c\x09\x8c\xfc\xa7\x06\xa7\x44\xb9\x30\xbe\x50\xc3\xab\xe5\x34\x4c\xfe\xd5\x9d\xd3\x27\x4d\x23\x68\x4c\xf4\xea\x24\xc4\x33\x28\xbf\xc0\xe1\xa7\x1a\x87\xd7\xa1\xcd\x44\x7f\x15\x14\x62\xbd\xa7\x44\x22\x94\x95\x9b\xaa\xc4\xc4\x99\x92\x73\x8e\x8e\x0f\xdf\x7d\x7c\x6b\xc1\xb5\x44\xd9\x1d\x01\xfb\x4d\xb9\x32\x6a\x66\xf8\xee\x0c\xdf\x72\x3f\xd4\xf7\xd9\x27\x62\x39\x4b\x6b\x5c\x5a\x91\xc6\x90\x39\x72\xed\x29\x13\x80\xde\x44\x59\x7e\xce\xc2\x35\x0e\xfd\xf9\x15\x9a\xa0\xe0\x5e\x2b\x14\x9c\x80\x70\xc9\x38\xa0\x30\x09\xc8\x29\x35\x19\x25\xc3\x96\x81\x1b\x18\x8a\xf9\xcc\x42\x5d\x87\x80\xb0\x0a\x47\xea\x39\x77\xb6\xd0\x20\x82\x10\xda\x30\xe8\x94\x9c\x28\x70\xdf\x91\xf0\x60\xa8\xfe\xad\xfc\x1f\x33\x41\x99\x0f\x55\x3e\x5e\x05\x57\xbd\xda\xab\x03\x3c\xc3\xd3\x8e\x2f\xb5\xd0\x48\xe1\x4d\xe4\x90\x2c\x71\x50\x19\x76\x05\x9f\x39\x1c\xa8\x79\x5c\xc1\xcb\x04\x4d\x27\xd4\xe3\x55\x02\x07\xe6\xf1\x07\x87\x50\x3f\xbd\xe7\x70\xa6\x9f\x5e\x70\x78\x6b\x8a\x5f\x71\x78\x65\x1e\x75\x50\xc4\x86\x99\x69\x3e\x66\x41\xbf\xd3\x26\xbb\x09\x44\x89\x4d\xec\x14\x9a\xc6\x64\x28\x6d\x1e\x44\xce\x0f\x01\x1f\x22\x13\x78\xf1\x8b\x36\x5e\xd8\x5a\xc0\x0b\xfd\xb4\xb9\x80\x1f\xfa\xe9\xc9\x02\x3e\x47\xf7\xc9\x41\x75\xd5\x62\xa3\x3c\x06\xee\xbc\x64\x3a\x28\xed\x8c\x7c\x8e\xb4\x8d\x92\x9b\xe8\xd4\xbb\xd6\x44\x24\x7e\x86\x8d\x2c\x08\x12\x0c\xcd\xa6\xa4\xd6\x91\xa2\xe8\xb6\xa2\xfe\x5e\x53\xab\x8b\x5a\x36\x81\xbc\x65\xe2\xe4\x71\x91\x1c\x47\xb7\xcb\x7f\x57\x5b\x07\xb5\x30\x4e\x3b\xba\xf5\x68\x68\x0f\x20\x6c\x88\xd9\xc4\x2b\x96\x17\x35\xef\xe8\x95\x84\x1a\x9d\xeb\xc4\xc4\x68\xd2\x9f\x5f\xfa\xb0\x5f\xf3\x96\x31\x1f\x86\xcc\xb9\xe5\x24\x9f\xf3\xa5\x94\x13\xfb\xd1\xa3\x28\xf1\x58\x74\x99\xa4\xd2\x7e\x36\x78\xb6\xf5\xc8\xaa\x6a\x23\x22\x38\xd7\x6e\xde\x63\xe7\xa7\xbe\x85\x3b\xc5\x3b\x35\x59\x6a\xaa\xa3\x04\xdc\x13\x7b\x58\x81\x9f\xee\x2a\x7a\x9b\xae\xbe\xf2\x57\x5f\x45\xab\xaf\xd2\xd5\x57\xee\xea\xab\x60\xf5\x55\xb8\xfa\xaa\x01\xed\x36\xd0\x50\xb6\xfa\x2a\x5b\x7d\xd5\x90\x46\xb6\x81\xff\x12\x6b\x58\x32\x25\x8a\xfa\xe0\x3e\xb1\x43\x70\x9f\xd9\x01\x78\xae\xed\x81\x77\x6d\x73\xf0\x62\x3b\x03\xef\x87\x2d\xc1\x9b\xd9\x29\x78\x73\x9b\xe1\x3d\x26\x78\xef\xec\x04\xbc\x53\x3b\x02\xef\xcc\x8e\xc1\xeb\xda\x53\xf0\x06\xf6\x18\xbc\xa1\xdd\x05\xf7\xc8\x76\x17\xf5\xff\x2d\x5f\xa4\xe6\x3b\xf7\x60\x08\xee\x07\xbc\xad\x23\x33\x72\x91\x60\xf8\x3f\xf5\x78\xa9\x1e\x3d\x4a\x09\xa7\x24\xa4\x64\x96\x50\xcd\xf0\x92\x8c\x12\x46\x49\x98\x94\xff\xc5\x94\x78\x94\x48\x4a\x7e\x7a\x37\x76\xb2\xd0\xec\xed\x0f\xe1\xdc\xc6\x0a\x44\xde\xb7\x9e\xe4\x52\x84\x10\x1b\xc4\xb2\xad\x8d\xb3\x22\x8d\x10\x7c\x5d\x67\x2f\x6b\x44\x2b\x69\xef\x12\x09\xbb\xa4\x14\xab\xbe\x45\xed\x9c\x58\xa2\xa8\xcf\xa9\x6b\xa2\x12\xc5\xbe\xf3\x2d\x22\x96\x17\xb1\x34\xfd\xc8\xc6\xdc\xa2\x20\xfc\xdc\x29\xcb\xbd\x56\xe2\x9d\xf4\x9d\x6f\x31\xb1\xfc\x70\x6a\x51\xe0\xfa\x47\x3a\x61\xb1\x45\x21\xf3\x9d\xaf\x31\x30\xdf\x99\x11\xe9\xc3\x29\x20\x1a\xe6\xe6\x29\xf3\x89\xb5\x9f\x30\x3f\x8c\x2f\xfa\xfd\xbe\x45\xbf\xeb\x70\x36\x9e\xef\x08\x01\x89\xdf\x12\x15\x26\xf9\x32\x99\x70\xf1\x92\xa5\x9c\xd0\x05\x84\xfe\x5f\xb8\x13\xd3\x17\x62\xb9\xf6\x60\xf9\x12\x81\xf9\x75\x5c\xf1\x89\x15\xb7\x60\x81\x9e\x94\x9b\x49\x99\xa8\x69\xb9\xfe\x3d\x03\x29\xa5\xba\x61\x68\x51\x88\x7c\x87\x09\xf0\xfd\xf6\x85\x8f\x7c\x88\xc1\xf4\x20\xd0\xde\x6c\xea\x3b\x9e\x80\xae\xdf\xb0\xc5\xb1\x13\x8f\xac\x80\xf5\xc6\x61\x9c\xa5\x96\xad\x1e\x27\x51\x96\x5a\x25\x22\x0a\x7c\xb5\xc8\x27\x88\x8b\x62\x9f\x58\xae\x8c\x3b\xae\x8c\x7b\x49\x26\xa3\x30\xe6\xbd\x30\x0e\x92\x8e\x9b\x08\x9f\x8b\xde\xa0\x33\x16\xbd\x61\x67\xec\xf6\x86\x48\xe7\xa7\x3e\x58\x63\x26\x2e\xc2\xb8\x17\xf1\x40\x5a\x60\xf5\xb6\x04\x1f\xab\x3d\xd2\x7b\x98\x62\xe7\xaa\xdb\x80\xa1\xb2\x1c\x3f\x31\x16\xbd\x4d\xac\x73\xaa\xb6\x5e\xf1\x5d\x89\x31\xf4\x1b\x6b\x30\x92\xa1\x8c\x14\x08\x5d\xea\x75\xc9\x22\x8b\xc2\x44\x3f\x33\x8b\xc2\x85\xaf\xad\x00\x5b\x97\xe8\x98\xe7\x61\xea\x5a\xab\xfc\x08\x4c\x15\x72\x48\xfe\xcc\xf1\xb5\x05\xf8\x94\xaa\xc7\xef\x68\x54\xe4\xaf\x4d\xcc\x13\x57\x33\x41\x98\xd0\x1f\xda\x83\x19\x8c\x3d\x89\x73\xe1\x93\x0c\xb3\x85\x8c\xf4\x31\x63\xfd\xee\x88\xa0\x37\x47\x91\xd2\x2d\x76\x4c\xe2\x80\x99\x24\x18\xb3\x33\x91\x30\x96\x44\x6e\x58\x1d\x75\x52\x28\xc5\x54\xc8\x8d\x75\xb0\x86\x68\xaa\x21\x28\xe6\x0d\xa9\x7e\xb5\xf6\xb5\xb1\x24\xf9\x40\x74\x66\xaa\x0c\x3f\x56\xe9\x49\x7f\x60\xc3\xf4\xb6\xf4\x5e\xbf\xc3\x90\xec\x8d\x27\xf0\x90\xe4\x91\x99\xfa\xe9\x24\x0a\x25\x79\xf4\xcf\x74\xe3\xd1\x85\x92\x13\x6f\xcc\x1e\x33\x71\xc1\xa5\x45\xe1\x5a\x6f\xac\xf4\x2d\x0a\x3b\xe6\xf9\xd2\xa2\x70\x64\x9e\x15\xc3\x78\xec\xb7\x5f\x9c\xc7\xe8\xb0\xd1\x67\x43\x4a\x47\x15\x70\xde\x91\xf7\x81\xe7\x5c\xb6\x68\x04\xd8\xfc\xdc\x74\x6a\x00\x6b\xe1\x9d\x85\x02\x59\x3b\xff\xe0\x9d\x5f\xb2\x28\x9c\x30\x52\x8c\xb4\xed\x7b\xea\x70\xb6\x7f\x6e\x41\xe1\xb5\x5e\x95\x48\xe1\x8a\xb3\xa5\x55\xe1\x50\x48\x3a\xed\x99\x17\x44\x35\xf3\x82\x12\x07\x46\xe7\x79\xde\x5d\xcc\xbc\x66\x9f\x63\xe4\x0d\x23\x9b\x56\x72\xad\xa0\x16\x46\xc0\x39\x39\x05\xcd\xfe\x53\xb8\x5a\x7b\x38\xea\xa9\x20\xe3\xc2\x8f\xc9\x7f\x8e\x97\x37\xbe\xf6\x27\xe8\x73\x9a\xa7\xac\x7a\x69\x76\x9c\xb9\x78\xfa\xcf\x7d\x47\x32\xd8\xf3\xdb\x1c\xe7\x20\x76\x76\x09\xe1\xce\x8c\x9c\xf9\x26\xe6\xa9\x84\xcf\x92\x54\x12\xc9\xd0\x6a\x00\xf4\x56\x5c\xf0\xb9\xc0\x05\x31\xc5\x28\xe8\x2e\xe6\xc3\x08\x95\x6c\x82\x2e\xcb\x6e\x85\x71\x7b\xed\xeb\x9d\x53\xb8\x6f\x92\xa4\xa1\x66\x7b\x51\x92\x08\x3d\x4b\xc3\x1c\x8b\xc2\x8b\xb8\x17\x4a\x3e\x4e\x7b\xe8\x22\xde\x89\xc2\x54\xf6\x74\xa8\x7c\xf5\xba\x04\xc0\x89\x42\xaa\x6e\x6f\xbb\x04\x41\x59\x80\xc4\xac\x37\x1c\x60\xe9\x66\xc7\xef\x05\x11\xbf\xe9\xac\x74\x9c\x37\xfb\xa1\x64\x4d\x18\xfc\xf1\x02\x2d\x10\xdf\xab\x93\xe0\xf9\x4d\x12\x84\xc8\xc8\xcf\xae\xfd\x0c\x73\xa2\xa1\x08\x75\xec\xeb\x48\x29\xb6\x82\x34\x8b\x02\xc1\xf0\x9a\x4f\x69\xbf\x3b\xd2\x6f\xec\x37\x4c\x5b\xfd\x7f\xc1\x6f\x9c\x66\x6a\x6d\x8e\xfa\x2e\xaf\x54\x41\x6a\xdd\x72\x0c\x7c\x16\x5f\x70\x51\x39\x08\x6d\xb0\xcf\xe7\xbc\x97\x46\x2c\xbd\x6c\x38\x00\x85\x7e\x40\x91\xfe\x62\x08\xf1\xbf\x7b\x08\x2e\x8f\xa2\x96\x31\x7c\xc8\x8a\xef\x2f\xeb\x38\x8b\x5b\x97\x91\x16\x3c\x1d\x6b\xe3\x43\x48\x3e\x64\xab\xc6\xf6\xa5\x5f\x73\x88\xca\xef\x81\xc9\xe0\xe5\x2a\x3e\x4d\x83\x5b\x25\x75\xe0\xbd\xf1\xca\x2d\xc3\xe8\xaf\xcd\x33\x8a\xc2\xf8\x7a\x65\x2e\xfb\x61\x7c\xad\x11\x0a\xc1\x24\x5b\x70\x41\x04\xfa\xb9\xe5\x58\xf4\x65\xd1\x0b\x1e\xc6\x4e\x01\x89\x43\xec\x06\x67\xf6\x96\xe9\x73\xc2\xde\xd3\x12\x7a\x0c\x03\xa7\x23\xe9\xa3\xef\x88\x46\x5b\xfb\xfe\x9a\x34\xbf\x45\xfe\x9d\x51\xbb\x7f\x82\xb6\x0e\x2e\x97\x47\x56\x97\x47\x9f\xac\x2a\x73\x92\x2f\xc7\x32\x4c\x48\x7e\x23\x7b\x46\xb7\x64\xd8\x97\x2c\xe5\xa2\x97\xf2\x88\x7b\x8a\x7d\x09\xe3\x50\x86\x2c\x2a\x4a\x7b\xe3\xe4\xb6\x77\x47\x95\x19\x77\xaf\x43\x79\x47\x2d\xb3\x5d\x5e\x12\x29\x99\xd1\xfa\xaf\xc7\xae\x37\xf0\x0b\xba\x93\xf9\x44\x6c\xfc\xc3\xb1\xfe\xb1\x11\x6f\xfc\xc3\xfa\x07\x6e\xc9\x5d\x94\x45\x13\x94\x43\x46\xce\x89\xd6\x39\xc3\xd8\x27\xd6\x1b\x04\xc1\x8e\x3b\xef\xc8\xcb\x30\xed\x44\xcc\xe5\x51\xe5\x2b\xd6\x46\xce\x3f\x2f\x80\x53\xbb\x61\x89\xd4\x67\x52\xee\x25\xb1\xcf\xc4\x7c\x75\x45\x55\x1f\x1f\x13\xd9\xc1\x05\x37\xe7\xe1\xbb\x42\xe0\xde\xaf\x5f\x18\x21\x1a\x63\xe0\x30\x67\x3d\xfa\x19\x0e\x72\xfc\x33\x27\x5d\x85\x7f\x18\x5a\x24\x49\xe7\xab\x20\x18\x31\x0a\xef\x4c\x46\x67\x92\x48\xc5\x9a\xe0\xf1\xb2\xec\xa5\x9f\xa9\x05\xd2\xa9\x8d\x7f\x1c\xe9\xd1\x0e\x8a\x65\x9f\x5d\x86\x92\xf7\xd2\x09\xf3\xb8\x05\x56\x9c\xcc\x04\x9b\x54\xa6\x22\xf5\xf0\x97\xa0\xea\xb4\x8e\x85\xc7\x6e\x6f\xcb\x40\x7d\x22\x81\xc1\x2e\x49\x74\x14\x1d\x31\x9a\x91\xcb\xa2\x5a\x89\xe1\xcd\x10\xf2\x73\x32\x23\x7b\x3e\x60\x72\xd3\xac\x38\x27\xfa\x50\x7c\xf4\xdb\x6f\x08\x30\xf7\xad\x3a\x27\xd3\x04\xa6\xda\x72\xd3\xaf\x9a\xf8\xe8\xe3\xa3\x7d\xa3\x62\x93\x8b\x2b\xae\x5e\xd0\x54\xa7\x30\x89\x7a\x8f\xcd\x80\x76\x65\x1b\x1d\x74\xc9\xbe\x8f\xa7\x12\x93\x14\xba\x78\xbf\x13\xe2\x25\xcb\x1e\x66\xe5\x5f\xa0\x9e\xa3\x62\xb1\xef\xde\x22\x97\xcb\xb0\x82\x83\x48\x8c\xa9\x26\xcf\x97\x3b\x9c\x91\x8f\x3e\x86\xa6\x52\x44\x16\x14\xd6\xcb\x0a\x95\xe8\x27\xa6\xc0\x49\xef\xa8\x86\xa9\xb4\x13\x24\x59\xec\xa3\x41\xb9\x27\xee\x10\x3f\xdf\x07\x46\xfc\x3c\x55\x12\x10\xb1\xbc\x4b\xee\x5d\xe3\xe1\x7e\x67\x24\xaa\x78\x92\x29\x1e\xf3\x93\xe1\x9a\xf4\x71\x80\x43\xbf\xb4\x2a\x35\x7c\x28\x14\x8d\xbf\x53\x54\x45\x9d\x18\x36\x75\x3e\x51\xbc\xc8\xad\xdf\x2e\x3f\xe7\x3c\x81\x5a\xe9\x98\x4d\x91\x3c\x97\x18\xe8\x53\x09\x48\x52\x81\xa7\x82\x51\xad\x34\xef\x79\x49\x2c\x45\x12\x15\x3f\xd5\x00\xdc\xe4\xa6\x6c\xfb\x4e\x33\xb3\xbe\x99\x19\x96\x21\x83\xb1\xdc\x41\x2f\x9f\xe6\xa9\x5f\xe6\x7d\xa4\x14\x3e\x33\x7d\x5b\x23\x41\x64\xd4\xa0\xff\xea\x79\x59\xe9\xc5\x0f\x3d\x54\x6a\xdd\x5d\xd7\xe7\xa9\x27\xc2\x09\x32\x3f\xe5\x79\x8a\x0d\x72\xd1\xe0\xfd\xca\x5f\xef\x7f\xd9\xbe\x6a\x26\xc7\x51\xf5\xfb\xaa\x0a\xd2\xb2\x0a\xc7\xce\x4b\xfe\xdb\x60\x59\xe6\x5d\x2b\x28\x8a\x7d\x0b\x2c\x29\x58\x9c\x4e\x98\x40\x2d\xb3\xc1\x07\x41\x12\x6b\xec\x7c\xc9\x45\x58\xbe\xf6\x32\x91\x22\x5e\x9e\x24\x61\xac\x55\xd4\xba\xc0\x20\x5c\xc4\x1d\x31\x37\x8b\x9f\x0f\x45\x63\x60\xbc\xb6\xc2\xc1\xe8\x59\xbf\xf5\xef\x19\x97\xf8\x8d\x86\xd9\xc2\xf4\x8c\xc2\x81\xef\xfc\x83\xc7\x53\xa7\xaa\x50\xfd\x07\x7c\xd0\x80\x18\xaa\x1a\x5f\x7c\xe7\x77\x78\xe1\x3b\xc3\x2d\xf8\x81\x42\xb0\xd4\xac\xed\xb5\x84\xae\x44\x77\x77\xf8\x7c\x0f\xd5\xc1\xb0\x50\x1d\xbc\x6f\x3a\x09\x3a\x4a\x94\xb1\xb3\xfe\xaa\x6a\xa4\x09\x58\xd7\x7c\xfe\x32\xf1\xb9\x05\x18\x29\x1e\x4f\xa7\x71\x33\xf4\x0b\x9f\xc0\x6e\x50\xf5\x0b\x4c\x82\xd2\x73\xef\x9b\x5f\x78\xee\x79\x42\xa7\x98\x8e\xa7\x5a\x07\x34\x66\x91\x3a\x94\x62\x8a\xf3\xd4\x1f\xa7\x20\xa7\xad\xd1\xc2\xbc\x73\x2d\x39\x5f\xeb\xb8\x38\x57\x98\x44\x95\xed\x83\xe7\x7c\x53\xd2\x36\x24\xce\x09\xd3\x07\x21\x33\x91\x90\x5d\x1f\x83\x62\x79\x0a\x6d\x87\xce\x0f\x9f\x70\x0a\x81\x73\x41\x3c\x5c\x32\x93\xe5\xe4\x1b\x03\x94\x45\x4c\x56\x19\xcb\xb2\xbd\x7e\x77\x64\x5d\xb2\xd4\x30\x90\x96\x8d\x3f\xd2\xcc\xf3\x78\x5a\xd5\xa1\x94\x98\x56\x24\xb3\x4e\x9c\xf4\x2e\x32\x29\xb9\x48\x5b\xf8\xf5\x5d\xcd\x1a\x32\x4f\x7d\xaf\x46\x6d\xbc\x24\xea\x58\x1b\xa2\xd0\xae\x84\x71\x6f\x16\xfa\xf2\xd2\x02\x39\xb2\xb6\x06\x83\xc9\x8d\x65\x5b\x9b\xf8\xb7\x41\x62\x68\xfc\xbc\x3a\xb3\x3c\x96\xbd\x54\x0a\x2e\xbd\xcb\xa6\x76\xea\xab\x88\x44\x7a\xe6\x7a\x6f\x19\x03\x7d\xf0\x9b\xd3\x8a\xe2\x71\x08\x12\x51\xe0\x05\xdc\x46\x4c\xba\xe5\x91\x9a\x03\xaf\x3a\xd3\x2f\xfc\x8a\xab\x73\xe3\xf6\xe4\xe9\xd3\xbe\xf8\xd4\x64\x59\x7b\xe0\x38\x59\xde\xe8\x3d\x53\xf5\x9e\xc7\xce\x39\x61\x10\x56\x5c\x07\x8d\x65\x49\x77\x94\xb9\xf6\x8c\xbc\xf5\xe1\x01\xf2\xd6\x7d\x56\x50\x9a\xcc\x5d\x50\xc8\x3c\xd2\x92\xf7\xf8\x8b\x4f\x47\xaa\xf7\x21\xb5\xb1\xa6\xf4\xc8\x57\xd6\x80\x06\x2b\x8b\xd4\x73\x65\x5c\x2e\xd4\x2a\xb3\x36\x11\xe1\x98\x89\xb9\xa5\x4e\x3a\x09\x28\x24\x0d\x5c\x98\x62\xf4\xe4\xa8\xbe\x13\x5e\x12\xf5\x58\x26\x93\x4e\xed\x6b\x8a\x78\x6c\x36\x6d\x5f\xe3\xd6\x4d\xee\x62\x1f\x95\xdc\xe0\x19\xec\x75\x87\x34\xd4\x4b\x56\x64\x08\xe3\x7e\x53\x99\x49\xc9\xdb\xc0\x8c\xc4\xd3\xa2\x2f\x05\x1f\x8a\xf3\x5e\x62\xbf\xcb\xc5\x78\x89\x94\xa5\x63\x80\x0a\x3a\xbc\x7f\xd1\xb7\x9a\xf9\x5f\x24\x00\xc8\xa1\x8e\x0d\x6c\xbb\x2c\xe5\x88\xa1\x11\x17\x7f\x65\xe4\xc0\xa7\x65\xdf\x07\x7e\x39\x3a\x93\x1e\x83\x4f\xef\xa9\x93\xcd\xa6\x0d\x36\xa7\xb9\xb6\x89\xd2\x51\x11\xdf\xce\x5a\x51\xa6\xaa\x21\xfb\x22\x99\xf8\xc9\x4c\x1f\x7e\xad\xfa\x44\xa4\xc4\xa7\x18\xac\xa0\x32\x48\x61\x08\x07\x9b\xae\x63\x31\x4a\x36\x22\x78\xd2\xf1\x43\xb7\x33\x76\x37\x3b\x63\xd1\xa8\x19\xf0\xb8\x26\x62\x6b\xd9\x88\x53\xf5\x65\xc5\x22\xc8\x06\x30\x9f\x54\x00\x4d\xed\x11\x4e\xa0\x20\xec\xde\xf4\x9e\x24\x2e\x99\x3a\xbf\x43\x38\x75\xb6\x07\x10\x4c\x15\xd1\x72\xa7\xce\xd6\xef\x90\x4e\xef\x99\xee\x3c\xb7\x58\x2a\xf2\x9d\x5f\xe8\x54\xa3\x05\x16\x39\xcd\x88\xa4\xd5\xac\xe7\xd1\x74\x25\xeb\x79\x4e\x35\xd8\x39\xde\xfb\xbb\x11\x6a\x68\xdd\x31\x32\xaf\xde\x54\x1b\xc5\xee\xa3\xcb\xc4\x24\x00\x4d\x1b\x74\x3c\xcf\x36\x32\x9a\x4e\x73\x7d\xd1\x3b\x89\x01\x6f\x33\x34\x3a\x16\xa3\x44\x61\x1f\xbd\xc3\x52\xdf\x8e\x4f\x02\x38\xcd\xfe\x4a\x8f\x1c\x7b\x6b\x22\x2d\x77\xe0\xe7\x7a\x1e\xc6\x16\xdc\x2c\xdb\x70\x73\x38\x2d\x56\xd5\xf7\x48\x58\x60\x62\x77\xe9\x7d\x52\xbc\x0f\xca\xf7\x4a\x10\x9a\x04\x90\x18\x6c\xce\xa7\x88\xcd\x33\x54\x8f\xe6\xab\x91\x37\x4b\xa6\x15\xc4\x2e\xf3\x1e\x22\xaf\x40\xec\x3f\x7c\xc2\xd0\xd3\xa4\x44\xee\xc6\x8d\x58\x2f\xaf\x37\xd5\xc8\x9d\x55\x90\x7b\xb2\x1e\xb9\x27\x53\x3a\x52\x5f\x18\x52\x3b\x31\xc8\xdd\xf5\x50\xd3\x95\xe2\x77\x15\xb7\x82\xcc\xa1\x97\xa5\x16\xa4\x5c\xed\x29\x85\xa9\x47\x52\x6c\xf4\x6f\x24\x03\x02\xb1\x40\x4c\x9b\x49\xc1\x82\x82\xdf\xce\xf5\x18\xf8\xf5\xa6\x90\x39\x0f\x50\xd6\x96\x10\xf7\xbd\x3d\xaa\x24\xef\xcf\x41\x6e\x8f\xea\x29\x29\x59\x31\x2f\xd9\x1a\xd6\x05\x63\x68\x35\x88\xb8\xe8\xa5\xc4\xa6\x60\xbd\x8e\x51\xef\xa3\xb9\x7e\x2d\x99\xa1\x79\x8f\x00\xcf\xab\xba\xbb\x89\x51\x29\x34\x4b\xf8\xbb\x9c\x50\xb7\x9d\x13\x62\x0d\x9c\x50\x9d\xff\x89\xa6\x28\x0a\x03\x2e\x43\x45\xfb\x0b\x5c\xc9\x10\xf7\xa7\x44\xfb\x4a\x3c\xec\x5c\xf3\x79\x27\x48\x44\x31\xe9\x5c\xdf\x60\xf4\xfd\xff\xa6\xee\xfe\x25\x3a\xe7\x7a\xcb\x4a\xee\xf2\x9b\x95\xb7\x86\xbd\x20\xdc\x21\x99\x13\x53\x85\xf1\x62\x27\x53\xf8\xaf\xba\xca\x8a\xcf\xf0\x92\xf1\x24\xe2\x92\xf7\xc6\x3c\xce\x3a\xd6\x06\x21\x59\x9f\x6d\xfd\xfa\x95\xf5\xdd\xd7\xf4\xe1\x43\x75\xf4\xac\xf4\x32\x99\x29\x5a\xa7\x18\x68\x8f\x24\x78\x6e\x28\x04\xfa\xb1\x72\xa1\x21\x57\x29\xa0\xea\xb5\x54\x87\x64\x53\x85\xe3\xb4\x62\x30\xa7\xcb\x6a\x65\xe5\x82\xc2\x74\xea\xfc\xec\xda\x4f\x16\xd0\xbd\x83\xf8\x36\x12\xd9\x52\x32\xb4\x9b\xca\xd7\x49\x7b\x27\x8c\x8c\x3d\x22\xfa\xde\x97\x15\x7d\x50\x9c\x93\xe9\xca\x2d\xe5\xd4\x64\xcb\xba\x6c\x20\x84\x1a\xe9\xc7\x0a\xed\x97\x09\x9b\x5b\x93\x6b\x5e\xcb\x3b\x52\xb4\xc6\x7d\xef\xcb\xa2\x10\xf2\x3e\x4b\x1d\xec\x40\x2c\xeb\x8a\x57\x25\x69\xc5\x2a\xaa\xad\xc5\x49\x87\x02\x2c\xc9\xdc\x77\xb1\xcf\x6f\x30\x93\xd0\x90\xe6\x6b\x51\xb9\xc1\x10\x3c\x62\x7a\x01\x5b\x84\xdf\xe5\x2d\x56\x4b\x36\x35\xf7\xb9\xa8\xd8\x10\xbd\xed\x35\x4b\x5c\x82\xe8\xa1\x31\x06\xb4\x3b\xd6\x86\x36\x33\x43\xf3\x1f\x51\xc1\x82\x93\x69\xbb\xb5\x92\xbb\xff\xeb\x97\xe8\xbb\xaf\x47\x0a\xb0\xa5\x23\xa8\x42\x8c\x98\x0c\x6c\x0f\xf5\x8e\x9a\x86\xa3\xe9\x65\xf4\x97\x08\xb9\x34\x84\xdc\x2b\xc8\xb6\xbc\x7f\x7b\xa9\xdb\xae\xdb\x0a\x5c\xa1\xce\xea\x79\xc3\x93\x85\xa7\xea\xb2\x3c\x55\x97\xfa\x54\xfd\x0b\xbb\x54\x72\x06\xf5\x04\xb3\x8a\x0d\xe0\x48\xdf\xa6\x53\x24\x86\x17\xde\x0a\x53\x50\xa1\x9e\xe1\x94\x8e\x26\x1e\xf1\xa8\x6d\xd8\x01\xf5\x8b\xe9\x5f\xc1\x94\x8e\xc6\x9e\x96\xb5\x39\xb4\x05\x7a\xd4\x30\x9c\x51\x4a\xed\xd7\xee\xa2\xb0\x01\x28\xc1\xc5\xf8\xf8\x5b\x60\xb9\x51\xe2\x5d\x97\xea\x5b\x83\xef\x87\x83\xc1\xff\x55\x2a\xa5\x5a\x50\x4c\x67\xe9\x57\x4f\x84\x17\x97\xb2\x44\x3b\x5d\x14\x4b\xa5\xc6\x37\xf6\x8c\x5c\x4e\xd1\x7d\xc0\x7d\x41\xcb\x8b\x7b\x60\xe0\x2d\x28\x5c\xac\xa1\xc1\xef\x34\x0f\xc9\xf4\x2d\x7f\x57\x5f\xf3\xef\x68\x17\xe0\x13\x40\xc7\xa6\x37\x3a\x46\xde\x6b\xbc\xb1\xf0\x7e\xac\x57\x2e\x7b\x4c\xf8\x9d\x2a\xf9\xad\x17\xf6\x2e\x39\xf3\xab\xcc\xfc\x65\x15\xc0\x3a\x0a\xc8\x24\x73\xd3\x4e\xa5\x2e\xbe\xc8\x1b\xdc\x90\x57\x3e\x0c\xc0\xd3\x28\x64\x9f\x61\x52\x48\x73\x12\xdf\x18\x43\x49\x45\x26\xb0\xde\xb0\xb1\x9e\xe8\xb3\xcb\x91\x85\x26\xbe\x1d\xa2\x39\x02\x6a\xd9\xfa\x45\x2e\xee\x79\xfe\x52\xd6\xc9\x19\x99\x4c\xb5\x1e\x99\x51\x0a\x73\x72\xeb\x43\x2e\x30\xfa\x16\x88\xfe\x17\x38\x65\xf9\xfb\xf2\x72\x0f\x44\xff\x08\x3e\x16\x05\xfa\xc6\x0d\x44\xff\x18\x76\x59\x4e\xce\x56\xd6\xc7\x40\x8c\x9e\xad\x37\x2a\x87\xc2\xf3\xa1\xf8\x53\x54\x6a\xb3\x4b\xdc\xf8\xbc\x58\xe6\xc5\x72\x0a\x3f\xbd\x73\xfb\xc1\x00\x41\xb4\xfa\x99\xd3\x36\x9e\x2e\x17\xa4\xcb\x8b\x92\x15\x03\x99\x2d\x4d\x55\xcc\x7d\xc7\x26\x30\xfb\x41\xbc\x30\x64\x32\x1e\xad\xb3\x34\xd8\xaa\x4a\xd9\x2f\x93\x28\x62\x93\x94\x77\x58\x14\x19\x05\xb9\x45\xbf\xdb\x6b\x2c\x07\x96\x9a\x6b\xf3\xca\xe5\xc6\xf9\x04\x43\x1f\xe6\x64\xd7\x87\x04\x42\xc5\x3c\x49\x83\x7b\x67\x5a\x2b\x77\x39\xb4\x28\xcc\xa7\x4b\x16\x59\xb3\x69\x69\x91\x15\x27\x32\xd7\xd4\x9b\x1e\x6f\x74\x43\x44\x32\xa9\xb6\xec\xd0\x1a\xbd\x4b\x39\x8e\xde\x24\x8a\xcc\xee\xdc\x53\xc4\xbd\x4b\x53\x2e\x98\x1f\x26\xff\x92\x9a\x5c\x20\x16\x8c\x11\xfd\xc9\xff\xa4\x6a\x7c\x41\xe1\x68\x6a\x4c\x76\x8f\xa7\x26\xec\xe4\x6b\x7c\x18\x0e\x16\x70\x86\x4f\xbf\x2f\xe0\x0a\x1f\xb6\x17\xf0\x72\xda\xea\x0c\x5c\x11\x9a\x07\x7f\x38\x18\x85\x5c\x47\x20\x57\xf2\x8b\x59\xd6\x77\x92\x64\x1a\xc5\x79\x4e\x0c\x89\x23\x20\x74\x24\x04\x0e\x07\xd7\x31\x17\x5a\x19\x85\xd4\x31\x81\x86\x05\xe6\x2e\x7e\x1e\x3b\x1e\x08\x27\x01\xe9\x84\xc0\x9d\x00\x32\xc7\x05\xe6\xa4\x4a\xc2\x3e\x9f\xae\xf5\x0f\xeb\x04\xe4\xe5\x14\x3d\x46\xbe\x49\xcc\x2b\x84\x6e\xee\xa7\x30\x27\x5f\x53\x0c\x5b\xa8\x83\x2c\xee\x4d\xdb\x0c\xf2\x4c\x4e\xb5\x5a\x72\xcc\xe1\xf6\xf6\x80\xd2\x95\xf4\x59\xb5\x28\x01\xdb\xf5\xc4\x64\xb5\xd0\x10\x4f\x6a\x3e\x8f\x83\x7a\x3a\xb2\xba\x71\xdf\x26\x66\x04\x69\xa3\x07\x13\x8c\x99\xce\x9d\x29\x39\x9f\xc2\x70\x08\x18\x73\x57\x02\xc9\x9c\x1d\x45\x13\xf7\xa6\x26\x62\x70\x11\x4d\xf8\x69\x4f\xfb\xb1\x8d\x32\x7b\x88\x3a\xe6\xa7\x76\xd6\x1b\xd2\x3c\xb0\x30\x64\x4e\x19\x69\x38\xa6\x10\x3b\x24\xae\x76\xa5\xd5\x0c\x45\x68\x62\xd3\xd7\x53\xc7\x71\xe2\xd1\xc0\x8e\xb1\x4f\x7c\x32\x7d\x66\x14\x96\x86\x16\x57\x55\x0b\x72\x79\xd8\x19\x48\x8a\xb6\x9f\xbb\x24\xdf\xa3\x8f\xad\x5c\x18\x46\x1d\xf9\xe3\xe9\x48\xd8\x33\xf2\x71\xaa\x44\x18\x17\xd3\xe0\xc1\x8c\x7c\x4a\x40\xe8\x53\xe9\xeb\x77\x46\xef\xb6\x8b\xf0\xbc\xb5\x80\xd3\xe9\x9d\x96\xa8\xbf\x7e\x19\x9f\x39\xe3\xc9\xb2\x14\xbd\x75\x41\xe1\xdd\x52\x17\x12\x93\x04\x19\x4b\x81\x0b\x72\xe4\xa9\x4d\x39\xf2\xd4\x21\x18\x59\x78\x0d\x3e\x4e\x62\x79\xa9\x84\x17\xc8\xda\xef\x46\x8a\xa8\xc0\x71\x11\xa8\x56\xd0\xb5\xc1\x92\x1f\xc4\xfd\xee\xc3\x87\x43\xb4\x52\xcf\xd0\xa0\x83\xd3\x91\xb0\x2d\x6b\xa1\x99\x48\x1c\xf0\x15\x58\x1d\xae\xb0\x24\x2a\x98\xf0\x95\x00\xab\x33\x4e\xb2\x94\x27\xe8\x12\x83\x7a\x22\x2c\xb8\x05\xab\x63\x64\x63\x88\x9b\x83\xac\xb1\x5b\xec\xb4\x2d\xc0\x9a\x65\x15\xf7\xb3\x2e\x5a\x7b\x9d\x13\x33\x36\x1c\x1d\xa8\x1f\x02\xc3\xaf\x63\xa0\x69\xf6\xeb\xd7\x26\x06\xcb\x75\xcb\xf6\xe6\xa1\xe3\x72\x39\xe3\x3c\xb6\x16\x84\xe6\x7c\xf5\x39\xc1\xdc\x0b\x8a\x3e\x9f\x4e\xa1\x35\xff\x5a\x08\xe8\x8c\x5e\x0e\xb6\x51\x9d\xe5\x33\xc9\x3b\x2e\xf3\xae\xad\x0d\xc2\xfa\x4c\xfd\xe3\x6e\xc4\xb4\x51\x92\x54\x55\x03\x91\xc4\xd2\xda\x48\x36\x48\xb8\x41\xbc\x0d\x13\x0d\xce\xf7\xc1\x2a\xd7\x12\x52\xf4\x3a\xcf\x13\x23\x2b\x02\xbc\x3b\x2d\x71\xf0\x99\x02\xa5\x0f\x18\xef\x9c\xd3\x8a\xb8\xf1\x69\x2d\x59\x5a\x62\xdb\x4e\xf3\x3b\xfd\x77\xd3\x3c\x57\x98\xe9\xe4\x70\xda\xea\x39\xba\x8f\x62\x02\x06\xcd\x52\x3f\x3f\x4e\x41\xc2\x29\x6d\xbb\x3e\xba\xca\x52\x19\x06\xf3\xe2\xda\xa6\xae\xcd\xad\xd8\x87\x71\x7e\x5d\x61\x0f\x71\x64\xc7\x1e\x1c\x9a\x88\xda\xde\xcd\xe8\x4f\xeb\x28\x53\x52\xc3\x07\x94\x1d\x8e\x33\x25\x26\x7c\x55\x4c\x95\x75\x7c\x99\x59\x60\xbd\x11\xa1\x05\xd6\x11\x93\xd6\x77\xfb\xcf\x7b\xd4\x42\x57\x0c\x63\x1a\x5b\xdb\x20\x1c\x2f\x0b\x63\x73\x7b\x5a\x6e\x4c\x26\x71\x5f\xae\xa6\xb4\x62\x12\xf1\xa9\xbe\x7c\x27\x88\x1f\x06\x0b\xb8\x9d\x9a\x20\x9c\xaf\x34\x3f\xe1\xaa\xfe\xde\xea\xe7\x89\x45\xe1\x4d\xfb\x66\xfd\xec\xda\x4f\xaa\xd9\xad\x31\x10\xc6\xda\xea\x8f\xeb\xd5\x3f\x98\x3b\x49\x29\x92\xf8\xc2\xa2\x6b\xf2\x61\xaf\xc4\x21\x31\x29\xd5\xe2\x7e\x77\xf4\x36\xb1\x53\x4e\xb5\x07\x9e\xc2\x8e\xbc\x48\x42\xd8\x6e\xd2\x90\xa7\x4d\xaa\x64\x4c\x22\x96\x57\xc4\xe2\xf3\x92\x78\xca\x85\xec\xa4\x52\x84\x7a\x64\x53\x7d\x73\xfb\xde\xf0\xb3\x73\x0e\x9e\xa0\x14\x5e\x4c\xdb\x7c\x57\xeb\x80\x26\xc3\x31\x9f\x84\xde\x75\x15\xb8\x3e\x14\xda\xad\x34\x73\xaf\xb8\x27\xab\xd6\x32\x23\xeb\x75\xec\x5b\xb6\x75\x94\xeb\xef\x96\xa1\xe0\x32\xc9\x44\x93\x26\x34\x9b\xf4\xb4\x49\xbc\xb9\xab\x28\x20\x5a\x9d\xcf\x39\x79\xa3\x8e\xc3\x00\xd6\x18\xc5\xb2\xf8\x22\xe2\x3d\xa3\xf6\x3e\x35\xdf\x7d\x67\xee\xfd\x15\xa0\xb9\x51\x26\x2c\xbd\xd0\x33\x72\x80\xfd\xa9\x05\xa2\xc8\xe4\x55\xf0\x68\x18\x10\x99\x63\x53\xd1\x67\xd7\xd5\xd8\xa3\xd6\x00\x2d\x8c\xf2\x54\x0a\xda\x71\x02\xab\xed\xdc\x59\x8d\x50\x0a\x67\x1e\xd9\xd4\x5c\xe7\x34\xe4\xb3\xfa\x54\x73\xae\xb1\x72\x41\xa4\x24\xd5\x7b\xac\x4b\xef\xce\x85\x51\x3d\x95\x4b\xb3\x22\x24\x25\xd1\xea\x17\x4a\x6d\x8c\xbd\xba\x8f\x4a\x12\x91\xfc\xef\xee\xe4\xf0\xdf\xbc\x93\xc3\xbf\xbf\x93\x3f\xee\xb7\x93\x3f\xd6\xee\xe4\xdf\xdf\xbb\xe1\xbf\xbc\x77\xea\x84\xb6\x40\x93\xde\x3e\x12\xb7\xa3\x27\xed\xc0\xd9\xa6\x93\x51\xe8\xc6\xb2\xec\x19\x99\x27\xf0\x3b\x48\x64\x7b\x16\x06\x49\xc9\x91\xe1\xb8\xae\xd5\x3f\x57\xa8\xf5\x56\x4f\x3b\xea\x9f\xdb\x82\x72\x22\xab\x11\x2f\x28\xfc\x98\x36\x85\xb4\x37\xee\x48\xe5\x85\x7f\x83\xa1\xe1\xb8\xe3\x5e\xf4\x02\xe6\x73\x7f\xd5\xf0\x70\x13\x2d\x9f\x5b\x0c\x35\x25\xbf\x91\xeb\xac\x34\x97\xcb\x1b\x4d\x34\x75\x95\xe5\x6b\xd8\xe7\xf1\x72\x2c\xec\xe0\x6f\x0e\xf9\xa4\x6a\x92\x5b\xce\xbb\xf1\x9e\x40\x94\x8c\xc8\xe7\x69\x6b\x42\xd9\x36\x63\x62\x1d\x05\xc9\xd1\x51\x90\x30\x9a\xa8\x8b\xd6\x9d\xbb\x84\xc8\x3b\x2c\xe3\x73\x13\x3f\x34\x72\x97\x7d\x77\x95\x4f\x5b\x6f\xe5\xfe\xf7\x6c\xd8\x2b\x16\xeb\xc2\x58\xac\x0b\x63\xb1\x7e\xec\x23\x53\x50\x58\xa2\xa3\xcb\x42\xcd\x12\x5d\xc9\x00\xda\x62\x79\xd9\xef\xe3\xfe\x16\xcb\xa2\xdd\x62\xf9\xc7\x14\xdd\x46\x78\xbe\x1f\xef\xa7\xed\xc7\xab\x62\x5d\xc9\x06\xfa\x73\xe5\x97\x3e\xa3\x6e\x41\xdb\x26\x7e\x9d\xde\xc7\xf7\x6c\x25\xc9\xcb\xca\x22\x9a\x85\x93\x7d\x77\xf4\xe7\x8c\xbc\x9d\xe6\x5c\xe9\x87\x8a\x56\x66\x27\x0f\x92\xaa\x2f\x99\xec\x0e\x3a\x01\x7e\x15\x98\xe0\xa4\x40\x30\xef\xa7\xe8\xee\x81\x6a\xa4\xe6\x7e\x3e\x26\x65\xbc\xd5\xca\xf5\x97\x39\xf7\xcb\x42\xb8\x5e\xc7\x7a\x1e\xeb\xd2\x4f\xae\x75\x56\xda\xea\x13\xff\xed\xcd\x98\x88\x91\xaf\x59\xb6\xcd\x55\x2c\xd9\xb7\x69\x7b\x2c\xc1\x06\xef\xbd\xea\x70\x06\x65\x70\x23\xcf\x87\x97\x1e\xcc\xc8\x57\x3d\xf7\x7a\x06\x1f\xe3\xc5\x57\x97\xff\x99\xaf\x46\x10\x77\x1d\x6b\x2c\x7b\x8f\x2d\x10\xdd\x15\xf3\x82\xd5\x89\xed\x92\xb8\x0b\xc6\xfb\x65\x64\x75\x96\x2e\x61\x2d\x5a\x33\x0c\xbd\x9e\x36\x9b\x56\x55\x18\xb2\x62\x57\x3e\x98\xe4\x82\x1d\x4d\xb3\x71\xc3\x71\x73\xca\xcd\xca\x0d\xbf\xd3\x8a\x75\x8e\x56\xcf\xbe\xc8\x2a\xba\xce\x21\xa2\x7a\x58\x26\xa8\x5a\x14\x2c\x10\xb6\x59\xc8\x82\xc6\x36\x6d\x61\xd5\xbe\xa0\x17\x70\xee\xa3\x40\x57\xd3\x7a\x2d\x88\x39\x4e\xb2\x6b\x58\x7b\xde\x75\xd6\xaa\x55\xcd\x2d\x35\xe2\xd1\x13\xb7\xc2\xad\x7c\x16\x9a\x1e\xee\x94\x30\x09\x59\xf7\x3e\x87\x54\xe1\xa7\x8e\xb5\x11\x77\x4d\x6f\xbc\x5b\x73\xe3\x40\x96\x00\xbd\xba\xb9\x65\x5b\x5f\x30\x73\x64\xa3\x65\xcf\x38\xea\x6d\x76\x56\x6f\xf7\x4f\x18\x91\xdd\x95\x99\xc7\xcb\x8c\xc3\x52\x5b\x03\x14\x5a\x4f\xbc\x74\x41\x86\xea\xd3\x82\x2a\x30\x5c\xb6\x67\x0b\xf0\xba\x46\x87\x92\x74\xef\x48\x51\xc2\xfa\x8c\xe7\x91\xe6\xbc\x4a\x94\xf0\x26\x39\x5c\xdb\x0f\x69\xfe\x22\x89\xb2\xb1\x4e\xa0\x60\x4c\xd9\x2b\x46\x03\x1d\x6b\x43\x56\x81\x77\x15\x6d\x88\x12\xc5\xe0\xad\xa9\x98\x2a\xa1\xfe\x0c\x95\xac\xfa\xc2\x29\x5b\x35\x4b\xe9\x2c\xc1\x50\xb1\xf5\x39\x4b\xb4\x72\x90\xef\x3b\xf2\xff\x99\xd1\x56\x06\x96\xa3\x0a\xed\xbd\xe2\x35\x1f\x90\xbb\x57\xd7\xf8\x26\xfd\x27\x16\x37\x07\xb8\xd5\x8b\xb4\xbb\xce\x71\x92\x43\xe3\x82\x42\xd8\xbd\x43\x5b\x52\x11\x31\x2b\x07\x2e\x20\x49\x17\xde\xf9\x60\xa4\x47\x50\x82\x49\x2f\xba\xe8\x6d\xa3\xb9\xe3\x13\x13\x39\x66\xdf\x83\x1b\x8f\xc2\x8d\x47\xbc\x2e\x85\x98\x42\xd1\xec\x95\x49\xef\x51\xb6\xdc\x5a\x6a\x79\xbe\xd4\x52\x56\x5a\xbe\x46\x73\xf0\xc6\xcf\xed\x2d\x35\x12\x0d\x8b\xa2\x37\xca\x34\x1e\x9a\xc6\x2b\x3b\xa5\x8e\xed\xff\xf3\x7f\x5b\x2b\x8e\x3b\x4b\x7b\x51\x47\x73\x06\x77\x74\xf4\x65\x79\x6f\xc9\x1a\xe1\xc6\x23\xac\xdb\x2e\x3c\x78\x2c\xe2\x8a\xeb\x5c\x12\x1d\xbe\xd3\xbb\x9c\x26\x42\x01\x8f\xfe\x9b\x24\xf1\x2f\x35\xae\x1d\xac\xd1\xa5\x8f\xc2\xbe\xe4\xa9\x24\xb1\x13\xd3\x91\xe5\x33\xc9\x7a\xd6\x46\x6c\xc7\xf0\xe8\xbf\xff\x99\xfe\x46\xae\xd8\x94\xe9\x0b\x0d\xfb\x97\x2a\xb4\x15\x13\xfb\xcf\x47\x97\x72\x1c\x15\x4d\x85\x23\xd0\xe4\x08\x43\x76\x07\x0a\xb9\x7b\x02\x74\x57\x17\x82\x8d\xc7\xe7\xdc\x0f\x31\x58\x46\x1e\x31\x0a\xdc\x6e\x9b\xd7\x70\xee\x2e\x2c\xfe\x19\xff\xfa\xa7\xf8\xf5\xcf\x58\x7b\x0d\xa7\x5d\xed\x1b\xca\x6f\x24\x13\x9c\x59\x14\xa2\xee\xda\xbc\x53\x98\xd5\x7f\x0b\x86\x8f\xe1\xab\x20\x6e\x57\x67\x31\xc5\xeb\xfd\xec\x7f\x06\x39\x8a\xf5\xe7\x37\x2e\xcf\x6f\xda\x35\x07\x38\xcb\x0f\xb0\xc4\x03\xcc\xef\x8d\x1d\xe1\xa3\x47\x98\x5a\xea\x7f\x03\x9a\xfc\x1f\x19\x77\xd3\x10\xff\xdd\x08\xf3\x3f\xb0\xe0\x05\x89\x5e\x9a\xcc\xdf\x46\x9d\x7e\xb7\xd1\x23\x46\xc7\x7f\xe5\x7d\xf6\x18\x30\x5f\x5a\x17\x3c\xf5\x67\x00\xe8\x14\xf9\x11\x42\xf5\x6b\x0f\xb3\xa8\xb1\x57\x18\xc2\xaa\x3b\x3a\x27\xd6\x47\x3e\xcb\x93\x20\x28\x74\xf6\x1a\x1d\x7d\x30\x42\xad\xf5\xda\x0f\x65\x59\xf6\x96\x13\x13\x30\xaf\x1a\x90\xac\xe5\x66\x37\x17\xb0\xe6\x24\xec\x42\xd6\x77\x0f\x20\xeb\xb3\x53\xc8\xfa\xa9\x9a\xb7\xe8\x82\x07\xac\x82\x5c\x8b\x38\x38\x71\xd7\xe8\x21\x0b\x94\x7a\x3c\xc5\xf4\x9c\x27\x14\xa6\x24\xea\x82\xf5\x32\xcf\xaf\x9d\x57\x9d\x15\x55\x8f\x74\xd5\xe3\xa5\xa5\x2d\x48\xc7\x9c\x7c\x9b\x02\x87\x44\x07\x5d\xca\xba\x28\x25\xaa\x31\x5e\x29\xa2\xa7\xd1\xde\xb4\xeb\x70\x01\xdd\xae\x93\x09\x18\x37\x22\x97\x58\x90\x40\xa0\x9a\xc3\x44\x94\xb8\xec\xde\xd3\x8c\x79\xd2\x5a\xd1\x63\x28\x46\xee\x08\xde\x99\x27\x59\x27\xcd\xcc\xc3\x8c\xc5\xb2\x23\x93\x8e\x4e\x8f\xbe\xc4\x92\x8f\x2c\x0a\x6c\xdb\x5e\x6f\x2a\x7a\xc2\xc8\x01\x27\x33\x72\xa9\xe7\x5a\xb5\xf0\x7b\x99\xc4\x41\x28\xc6\x9a\xd6\xb8\x3f\xec\x03\x4e\x8e\x13\x0a\xde\x13\xdb\x7a\xad\xbf\x96\xef\x3b\x26\x90\x59\xc3\x1c\x37\xe9\x25\x8c\xb9\x61\xca\xa3\xc0\x68\x9b\x4a\xc3\x7f\x73\xac\x36\xd0\x1c\xfc\xdc\x37\x31\xf4\xd0\x66\xa0\xf5\x2b\xe8\x60\xb0\x41\xac\x87\x26\xde\x97\x76\x8e\xd6\x82\xf1\x5c\xa3\xf4\xcb\xc7\x16\x85\x9b\x35\xe3\xfc\xdf\xe9\x71\xbf\x1a\x62\xca\x64\x70\x58\xa5\x27\x17\x5d\x64\x42\x52\x0b\x44\x9f\x9d\xd6\x45\x4f\x5d\x8e\x5c\x11\xd6\x70\x0f\x56\xc4\x50\xd3\x85\xc9\xb5\xaf\x7b\xc1\x08\x55\xa8\x22\x71\x7d\xf8\x8b\xee\xe2\xcb\x21\xe4\x65\x05\xba\x4e\x8c\xc6\x93\x52\x38\xf5\x88\xa0\x8d\x91\xd6\x97\xe6\xb9\x5e\x0f\xb0\x4e\xcc\x5b\xf1\xca\x37\x60\xbf\x8b\x4e\x29\x95\x41\xe9\x89\x5b\x4b\x44\xe4\xdf\xd9\xff\x2b\x1e\x71\xad\xf0\x56\xab\x2a\x56\xd4\xb0\xa5\x5e\xe7\x93\xa7\x36\xe8\x9a\x52\x38\xf4\x48\x3c\xc2\xbb\xe9\x49\x17\x04\x3c\x18\x52\x6a\xef\xc8\x42\x2d\x2a\x17\x14\xae\xbb\x0d\xc1\xfa\xcc\x1a\xca\x9a\xea\x87\x57\xe2\x09\x62\x48\x0b\x13\x51\xb4\xcd\xa0\x8e\xcd\x17\xda\xc2\x74\xad\xe9\xa8\x7b\xb2\x30\x26\xa3\x78\xe1\x49\x29\xba\xd8\x8f\xbb\xab\x3e\xcb\xe5\x14\x1b\x3a\x3a\x57\x5b\xae\x80\xec\xa6\x9b\x47\x0a\x50\x2f\x28\x9a\xf1\x2e\x30\x68\x8c\x71\xe4\xcd\xa1\x2a\x37\x0d\x5a\xd5\xb2\xc8\x56\x2d\xcb\x4e\xb7\x9a\x43\xe4\x68\x8d\x94\x81\xb6\x6a\x32\x0f\x4b\x7a\xe2\xc1\x01\xaf\xeb\x32\x44\x71\x39\x50\x09\xd2\x98\xf9\xe4\x1d\x23\xb7\x1e\x6a\xc3\x96\x4c\x78\x5c\xe6\x5f\xf0\x0e\xfe\xdb\x9b\x84\x51\x94\xcc\xcc\x0f\x33\x52\x83\x06\x10\x4f\xca\x64\xb2\xe4\x88\xa5\x2f\x96\x63\xc3\x82\x2f\x5a\x3e\xf7\x1d\xef\x16\x16\x14\x8e\x57\x55\x48\x61\x40\x74\x72\x8a\x8a\xb2\xbc\xc5\xcc\xaf\x40\x5c\xe6\x1e\xf5\x48\x01\xdf\x40\x2d\xde\xaa\xf2\xfa\x5e\x5d\x34\xc6\xa7\xc0\x5e\xe3\xbe\x77\x05\x0a\x86\x8a\x7b\x81\xd7\xff\x9b\xe9\xe0\x07\xbc\xfa\xc7\x0b\xdd\xbe\xeb\x2f\x5a\x29\xe2\x59\xd7\x18\x56\x5d\x69\xf2\xe3\x5a\x14\x5e\xde\x4b\x85\x54\xe1\x43\x45\x32\x6b\xf2\xf0\x56\xd2\xe1\x26\xca\x88\x58\x77\x29\xfa\xc2\x8c\x5c\x75\x9b\x78\xd3\xa5\x9b\xba\xde\x70\x70\xb7\x43\x97\x28\x64\xbd\xf3\x66\x7e\x52\xb4\x86\x5f\xf8\x50\x44\xe5\x37\xd1\x5f\xbe\xea\x7b\x78\x7a\x07\x53\x58\x7a\xfb\x41\x2d\xe0\x42\x61\xb8\x7a\x8a\x4c\xf5\x7f\x9a\x5c\x7c\xe0\xe4\xac\xfb\x3f\x45\x2b\x56\x3a\x5f\x26\x14\xb2\xdc\xc4\x97\x5d\xb0\xde\xbd\xb2\x4c\x34\x33\xbf\x78\xa7\xa9\x7a\x87\x49\x2c\x3a\xc7\xd2\x03\x5a\x14\x2b\xa6\x60\xa9\x90\x9d\x96\x85\x5a\x05\xe9\x2f\x37\xae\x94\x6b\x5d\xa5\xdf\x71\xe7\xe6\xbb\xec\xa4\x2c\xcb\x59\x6d\x5d\x70\x5c\x1d\x90\xe4\xf8\x5a\xe1\x25\xb3\x33\x45\x69\xae\x60\xb6\x60\xd9\xd8\xe5\x3c\x81\x77\x9e\xb9\x1d\xa1\x20\x75\xca\x1b\x10\x8a\x08\x72\x4d\x04\x5f\x77\x41\xc2\x83\x41\x41\x04\x17\x14\xf6\x0c\x7b\xb7\x69\x51\xd8\xd7\xcf\x5e\xe2\x2b\x10\xfa\xa8\x7f\x4d\xd4\x3e\xc1\xae\xa9\x66\xec\x58\xe0\x54\xff\x8e\xd9\xd4\xa2\xf0\xae\xeb\xfc\xbc\xb1\xcb\xbc\x06\xe0\x26\xb6\xd1\x79\x5b\x0b\xf8\xa4\x4b\xf5\x5b\x6b\x01\x87\x79\xed\x22\x3e\x30\x96\x1c\xe5\xbf\x16\x70\x52\xd4\x28\x92\x22\x61\x8d\xfc\xd7\x02\x6e\x8b\x1a\x26\x5d\x0b\x96\xeb\xe7\x05\xbc\xea\xb6\xc7\x21\x6b\x04\xfd\x6e\x1d\xec\xdf\x75\x6b\x20\xff\xa9\x9b\x13\x49\xc3\x0e\x18\x13\xc5\x65\xcb\xc4\x93\x6e\x2d\x9d\xe7\x6d\xb7\x96\x6d\xe2\x53\xb7\x0e\xef\x87\xdd\xc5\x42\x5f\x43\x8d\xac\x4e\xe9\xad\xba\xa0\xf0\xf6\x4e\x6e\x7b\x29\x2a\xc3\xc6\x8c\xbc\x32\x08\x78\xd5\xb9\xb8\x12\x0d\xe1\x96\x11\xd1\xbf\xc1\x40\x34\xc6\x5b\xa6\xe6\x3b\xa3\x01\xe3\x0d\x12\xfa\x77\x5d\x38\xe9\xc2\x6d\x17\x0e\xbb\xa0\x56\x3c\x0f\xbc\x37\x11\xc9\x98\xcb\x4b\x9e\xa5\xfd\x30\x79\xe4\x27\x5e\xaa\x37\x3f\x8c\x2f\xf4\xc3\x98\xc5\xec\x82\x8b\x47\x7a\x6b\x76\x79\x34\xb1\x16\xdf\x29\x1c\xac\xc7\xe1\x4b\x96\xf7\x46\x96\x60\xbe\x8f\x4e\x6d\xd6\x36\xba\x93\xe5\xbe\x2b\x26\x46\x8f\x58\xbd\xa5\x85\x0f\x1e\x89\xfb\xde\x69\x1d\x6f\x1b\xc3\xa7\xce\xa4\x22\x56\x1c\x78\x55\x9b\xdf\x0f\x5d\x27\x14\xc4\x12\x18\x7e\xe4\x4b\xb7\x3d\xf1\xfa\x67\x0f\x2c\x5c\x4e\xd5\x07\x46\x76\x82\x0f\x5d\x62\xa5\x72\x1e\xf1\xf4\x92\x73\x59\x58\x57\x45\x09\xf3\xd1\xb2\x4a\x10\x0f\x63\x3a\x17\x06\x71\x5c\x88\x44\x98\xa2\x38\x23\xd6\x1b\x16\x46\xdc\x57\x74\x58\xb5\xe9\xbc\x3c\x3a\xea\x04\x22\x19\xeb\xf4\x45\xd4\xf8\x37\xea\x18\xa3\x87\x31\xf9\xe9\xbd\xb2\xaf\xc0\x3b\xb0\xcf\x19\x78\x87\x76\x23\x63\xd9\x1d\x29\x32\xa2\x89\x2d\x5b\xd8\xea\xc7\x36\x30\x7b\x4e\xbe\x46\x60\xfd\x97\x05\x24\xd6\x59\xd3\xd8\x13\xd0\xef\x46\x96\xe2\x27\x8e\xd1\xe1\xef\x7d\xa4\xd8\x8a\x0c\x76\x15\x69\x98\x8f\xca\x90\x8b\x76\x19\x87\x31\xee\xbb\x9e\xe2\x2f\xfb\x2c\xc3\xf8\xf4\xe0\x6d\xdb\x5d\x49\x7e\x08\x0a\xde\x33\x7b\x3f\x02\xdf\x6d\x18\x99\xe2\x43\x0e\xc9\x9f\xef\xf5\xd2\x23\x07\xb0\x53\x01\x19\x6b\xb1\x58\xd0\xe7\x2c\x71\x7e\x7e\x60\x61\x6c\xff\x0c\xe3\x50\xda\x3f\x04\x39\x0c\x29\x19\xa8\x8f\xc4\xfd\xd7\xd1\x78\x94\xf7\xdb\x31\xe6\x53\x41\x22\x08\xf2\xe8\x9d\x30\xee\x48\x8a\x7f\xc4\x08\x43\x3c\x59\x8e\xc3\x47\x13\xf2\x84\xda\x31\x11\x7f\xf2\xef\x20\xff\xe4\xdf\xa9\xad\x1e\x1d\xf5\xb8\x20\xd8\x25\xb0\x84\xda\xf8\xe4\xb0\x64\x41\x14\x1b\x44\x9f\xff\xbf\x01\x00\x00\xff\xff\x01\x30\xcf\xe3\xfa\xaf\x01\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xdc\xbd\x0b\x7b\xdb\xb8\xae\x28\xfa\x57\x1c\xed\x6c\x2f\x72\x0c\xab\x76\x5e\x6d\xe5\x70\xf9\xa6\xef\xf7\x23\x49\x3b\x99\x66\x72\x72\x28\x99\x76\xd4\xd8\x94\x4b\x51\x71\xd2\xd8\xfb\x6f\xdc\x1f\x74\xff\xd8\xfd\x08\xea\xed\xc7\x74\xf6\x5e\xfb\x9c\x73\xef\x5a\xf3\xa5\xb2\x04\x82\x20\x09\x82\x00\x08\x82\x5b\xc3\x44\x06\x3a\x8c\x24\x91\xf4\xde\x49\x62\xd1\x88\xb5\x0a\x03\xed\xf4\xb2\x0f\x0d\x45\x24\x28\xd0\xf4\x5e\x09\x9d\x28\xd9\xd0\x2e\x67\x12\xb4\x3b\x64\x0a\xf4\x22\x07\x1b\x93\x02\x44\x91\x1d\xd0\x90\xa3\x56\xf9\x87\x72\x6d\x19\x3a\xa2\x40\xd2\xc5\x82\x16\xa8\x06\x44\x94\x50\xed\x82\x28\x50\xe9\x65\x54\x1b\xb1\x0b\xa2\xc1\xe2\x2f\x57\xa0\x49\x52\xaa\x60\x0f\x92\xa2\x02\xb1\x8c\xed\xef\xd6\x99\x10\x01\x79\xad\xe5\x6a\x03\xc2\x4b\xd5\xee\x03\x2f\xaa\x4d\x96\x11\xfe\x0b\x28\xe1\x24\x81\x32\x2d\x65\x62\x04\x09\x4a\xc4\x1c\x40\x50\x10\xc3\x97\x71\xfe\xf7\xd0\x17\x10\x0e\x35\x0a\xcb\x24\x26\x24\x2a\x91\xf8\x10\xa2\x82\xc4\x60\x19\xed\xff\x32\xaa\x23\x12\xc0\x32\xdd\x65\xc2\x39\x09\x4b\x84\x3f\x82\xb0\x20\x3c\x5a\xc6\xfc\xbf\xb3\x2d\x21\x89\x60\x65\x6b\xca\xcd\x89\xc8\xb0\xd4\x9c\xc7\x30\x2c\x9a\x13\x2e\x23\xff\x3f\xac\x85\x43\x12\xc2\xba\x36\x96\x1b\x39\xab\x89\xb9\x1d\xc6\x98\x74\x79\x5f\xba\x43\x62\xde\x7b\xa6\x1e\xa2\x4b\x25\xee\x6c\x09\x28\x88\xdc\xad\x96\x01\x91\x97\x22\xa2\x54\xf0\x36\x2b\x08\x45\x93\xf7\xea\x45\x21\x29\x17\x26\x49\xa9\xfc\x4d\x51\x1e\x8a\x7e\xdc\x5f\xc6\x00\xbc\x86\x83\xf0\x12\x9a\x61\x19\x0d\x14\x63\x74\xb0\x0a\x11\x04\xcb\xa8\x48\x50\xc2\xe6\x57\xb1\x41\xc1\x06\x0f\x57\xe3\x83\x68\x25\x46\x12\x95\x90\xc6\x75\xa4\x50\x30\xdc\xa3\x75\x68\x21\x5c\x87\x98\x84\x74\x71\xc3\x55\x23\x64\x03\x52\xb0\x8a\x1d\xf6\x61\xa4\x88\xf9\x26\xd8\x91\x52\xfc\x8e\x48\x0a\x09\xeb\xf4\x92\x43\xd9\x4b\x5a\x2d\x2a\xce\x93\x0b\xa6\x89\x6a\x25\xb4\x97\xad\x2d\x0b\x0a\xdb\x6c\x5c\xc1\x54\xe0\xd1\x05\x1e\xc1\x3a\x3d\x71\x28\x9b\x4d\xe5\xfa\x3d\xd1\x6a\x51\x7d\x2e\x2e\x98\x72\x39\x28\x66\x5e\xe5\x0b\xeb\x58\xc8\x91\xbe\x62\x02\x2e\xcd\xb2\x45\x17\x14\x26\x8c\xd4\x2b\xc8\x26\xe2\xb9\xbc\x58\x50\xd8\xd4\x90\x0c\x21\x24\x29\x2d\x82\x02\x67\x9d\x1e\x3f\x14\x3d\xde\x6a\xd1\xe4\x9c\x5f\x30\x7d\xce\x2f\x32\x0a\x92\x73\x79\xc1\x14\x24\x0b\x0a\xeb\x9b\xa5\x32\xac\x59\x4f\xe9\x56\x37\xeb\x2b\x5d\xf4\x95\x3a\x4f\x72\xbc\xe2\x5c\x5f\x30\x09\xe2\xd7\xe9\x35\xc8\x04\x22\x53\xcc\xcc\x4c\x7d\x9e\x5c\x80\xca\xbb\x5e\xfd\x22\xa6\x76\xb7\xd7\x39\x64\xa2\x27\xda\xed\x1c\x91\xa8\x21\xa2\xbd\xbf\xd3\xd6\x15\x2d\x95\xc4\xb4\xb5\xc2\x16\xff\xe5\x51\x41\x69\xd4\xe2\x60\x46\x27\xc7\x9c\xac\xc4\x9c\x73\x4f\x3c\x0e\x03\x81\x2d\xf8\x0b\x0a\x54\x41\x81\x6c\x0b\xe0\x19\x1d\x2d\x92\xe4\xd4\x1d\x26\xfd\xec\xd1\x4b\x28\x85\x80\x75\x7a\xc1\xa1\xe8\x05\xad\x16\xe5\xe7\x81\x19\xdf\xe0\xa2\x67\x70\xda\x2f\x49\xf6\xa5\x25\x0c\x4f\x05\xf9\xd8\xf3\x15\xcc\x54\x1a\xc5\x35\x9f\x82\x48\xc6\xd1\x58\xb8\xe3\x68\x44\x64\xcb\xf1\x1a\x4e\xeb\x8a\x50\x0a\x6a\x41\x0b\xcd\xf4\x8a\x64\xf0\xce\x61\x28\xb5\x50\x92\x8f\xe3\x7f\x3a\x85\xf8\x98\x9a\x75\x40\x5f\xa9\x68\xd6\x78\xae\x54\xa4\x88\x73\xa5\xf5\x34\xf6\x1e\x3c\x18\x85\xfa\x2a\xf1\xdd\x20\x9a\x3c\x10\xe3\xc9\x83\x20\x52\xe2\x81\x3f\x8e\xfc\x07\x5d\xb7\xe3\x76\x1e\x5c\x85\x52\xc7\x0f\x9c\x96\x6c\x39\xee\x64\xe0\x94\x24\xd2\xa8\xc6\x22\x20\xd8\xf9\x05\x24\xec\x1a\xbb\xb9\x03\x82\xf6\x92\x66\x93\x68\x26\xdc\x69\x34\x25\x94\xf6\xcc\x37\xed\x72\xd0\xae\x8f\xdf\x4b\xc3\x99\x63\xbd\x2e\x96\x92\x70\x48\xba\x9d\xce\xa1\xa6\x19\x3b\xb9\xd3\x24\xbe\x22\x97\x58\x2f\x85\xad\x4e\x2f\x1c\x12\xc9\x18\x53\x29\x84\x7d\xe3\x44\xfe\x77\x11\x68\x67\x8b\xe9\xbb\xa9\x88\x86\x0d\x39\x9f\xcb\x64\x3c\x36\x42\x32\x7f\xca\x8a\x38\x59\xc5\x0e\xcb\xc1\x9b\xcd\x29\xd9\xa7\xb0\xd5\xed\x65\x6d\x4b\x1a\xa1\x6c\x48\x77\xfb\xb0\xd3\x6c\x12\xc9\x7c\x6d\x64\x99\x32\xff\x1a\x42\x24\x0d\x87\x64\xeb\x9a\x48\x9c\x99\xe6\x8f\x6e\x75\x4d\xf3\x52\xaa\xba\xbd\x8c\x3c\x14\xb9\x47\x6c\x4c\x46\x14\x4e\xd8\xea\x01\xdf\x1a\xa5\x8c\x5b\x8c\xee\x69\xc6\xb8\x2b\x5b\x97\x75\x0f\xf6\x44\xbf\xe3\xc9\x43\xd5\x6f\x77\xbd\xae\xe9\x8b\x2d\xe9\x6e\xa7\xdf\x89\x66\xa7\x44\x1a\x49\xeb\x72\x4a\xe7\xf3\xf4\xb7\x0f\xca\xf5\x29\xed\x6b\xcf\xfc\x0a\x40\xb9\x01\xc5\x76\xf7\xa4\xeb\xa3\x9c\x6e\x36\xb7\xaa\x65\x7b\x92\x61\x39\x23\xb1\xf3\x21\xd4\xf3\xb9\xc1\xd6\xef\x7a\xca\xf5\x4d\xfd\x1d\xbb\xc0\x3c\x5f\xd3\x4c\xdb\x28\x7a\xd8\x59\x50\xf8\xb6\x56\xb4\xa7\x40\xdd\xf5\xd3\xa3\x73\x78\x9a\x4d\xf4\xb5\x10\x2c\x03\xa1\xf0\x7d\x99\x9c\xf4\x6b\x2e\x07\x0f\x3b\xfd\x1b\xed\xa9\xfe\x40\x7b\x63\xbd\xa0\xf0\x94\x75\x8a\xa1\xb8\x2c\xa3\xbe\xe7\x9e\x04\xdf\x53\x8b\x82\x7d\xdf\x54\x65\x51\x06\x01\x81\xa7\x4b\x50\xef\x2c\x96\x6c\xda\xdc\x2f\xb0\xc7\x35\x72\x19\xb5\x4b\xc4\xb9\xbe\x28\x5e\x2a\xfb\x52\x99\x97\xb9\x6c\x35\xa5\x3f\xb0\x31\x79\x55\xe2\x94\x57\x16\xb1\xe1\x13\x63\xbd\xca\x51\x89\xad\x73\x3e\x69\xa9\x94\x35\xfc\xec\x95\xea\x59\x21\xff\xda\x0e\x72\x3a\xc2\xbd\x92\xa4\x36\xdc\x60\xdf\x52\xc1\x84\xeb\x17\xa0\xd9\xf8\x23\x3d\x67\xec\x7e\xdb\xeb\x2c\x0a\x82\x5e\x57\xfa\x6b\xdb\xeb\x42\xde\x67\x06\xfe\x23\x1b\x93\xd7\x25\xfa\x8f\x8d\x98\xca\xaa\x55\xec\x0c\x34\x93\xa9\xec\xed\xe9\x76\xbb\x47\x95\xa9\xf8\x5c\x57\x17\xae\xbc\xf8\xd7\x6a\xf1\xf3\x8b\x12\xd9\xca\x4a\x0f\xe9\xf2\x52\x49\x03\xf7\x73\xa3\x0a\x74\x7e\xd1\xc3\x39\xa0\x8d\x76\x62\x38\x1e\x34\xd3\xa6\x17\x2c\x3a\x5c\x9d\x50\xa4\xf1\x42\x9c\x1d\x1b\x1d\x97\xc2\x33\x46\x74\x0d\xb3\x11\x6b\xb9\x50\x29\xe3\x6e\x36\x45\xb5\x02\xc0\x6e\xa6\x89\xad\xe6\xae\xa8\x06\x44\xb5\xaa\xc4\x54\x15\x2c\xd5\x63\x14\xea\xac\x26\xbe\x54\x53\xb3\x99\xac\xaa\x0e\x12\x96\xb8\x3e\xe5\xb6\xd2\xdb\x6a\xa5\x90\x54\x2b\xe6\xa6\x62\xb1\xa2\x62\xa3\x89\x67\x55\x07\xab\xab\x6e\x36\xf9\xfa\xfa\x81\x33\xee\xfa\x34\xb0\x54\xdc\x2c\x53\x01\xbc\x4a\x49\x50\x9b\xfd\x1a\x0a\xa3\xe7\x98\x18\xa6\x70\xe3\x48\xe9\x75\x22\x06\xa5\x39\x8a\xf2\x05\xfe\x07\x2f\x2b\xf2\xe8\x17\xb1\xb1\x99\x81\x2c\xf3\x25\x63\x6c\xac\xfb\x1d\xcf\x3c\xdc\x68\x94\xc9\x58\xc1\x3a\x41\x25\x5b\x46\x07\x83\x17\x6b\xa5\xa1\x6c\x6f\xd0\x13\xe4\x6f\x58\xfa\xfd\xfa\xd2\x0f\x36\x95\x7e\xa0\xe6\x1d\xfc\xfc\x9e\xeb\x2b\x77\x1a\xcd\xd6\xeb\x2a\xff\x2e\x57\xe1\xf9\x77\x26\xb3\x96\x77\xcc\x52\xdb\x9f\x92\x6e\x97\x7a\x9d\x43\xd5\x6c\xca\xc3\xce\x7c\xae\xcc\xea\xd9\x39\x94\x7d\xd5\x92\x5e\xaa\x6d\x62\x65\x5c\x73\xb9\x43\x51\x04\x7d\x66\xf8\x26\x10\xe1\x18\xbe\xd8\xe7\xe1\x38\x8a\x14\x3c\xb1\x3f\x54\x94\xc8\x01\xfc\xb0\x3f\xc6\xd1\xa8\xb7\xae\x39\xcd\xe6\xa6\xc6\xce\xe7\x9b\xbe\x6e\x31\x66\x94\x2b\x43\xcf\x27\xb6\x69\xac\x7a\x7f\xeb\xe3\xaf\xe9\xd2\x76\x55\xe0\x4c\xb9\xc1\x15\x57\x4f\xa3\x81\x38\xd2\x24\xa1\x3d\x7e\xb8\xbf\xbf\xf3\xf8\x60\x3e\xdf\x3f\xd8\xed\x3e\x3e\xe4\x7d\x52\xd6\xb8\xc1\xa8\xe0\x5e\xf9\x55\x4b\x9d\x27\xad\x2e\x7e\x61\x3b\x74\x91\xab\x50\xdf\xa3\x50\x12\xc7\xa1\x1b\x0d\x9b\xf3\x0b\xa8\xe8\xc6\xd6\x06\xc9\x49\x33\x2a\x4e\xb0\x44\x61\xd2\x6a\x41\x50\xa5\x32\x98\xcf\x09\x6f\xd9\x02\x86\x42\x90\x84\x53\x23\x0a\x70\x66\xf3\x9c\x2c\x5d\x22\xab\xf7\xb7\xec\xa2\x8c\x26\x6d\x69\xd2\xbf\x4c\x93\xce\x69\xb2\xd6\x90\x59\xcb\x16\x85\x36\x8e\xa3\xff\x96\xfd\x0a\x2d\xc6\xa4\x4a\xe9\x48\x18\x1a\x55\xbc\x4a\x87\xa0\x3d\x5b\x47\xc2\xf8\x3f\xd9\xfe\xc1\xee\x4e\xa7\xd9\xdc\x7f\xb8\xbb\xb7\xfb\x4f\xc6\xfb\xfa\xbc\xdd\x16\x17\xad\xc4\x4b\xaa\x14\xc0\xef\xeb\x78\x4f\xb9\xf1\x74\x1c\x1a\xa9\xb5\xa0\xf0\xc7\x7a\x28\xec\x53\x04\x92\x92\xfd\xa2\xb5\xf4\x0b\x5c\x6b\x17\xe2\xfb\xd4\x80\x32\x6b\x71\x52\xe5\x05\x4d\x51\x31\x27\x82\x25\xf5\xe6\x26\x7d\x75\xde\x6e\xeb\x8b\x96\xf0\x0a\xfd\xb8\xb3\xc8\x14\xe5\xb4\xdf\x95\x64\xff\x32\x32\xb6\x7e\x9d\x8e\xee\x22\x27\x88\x82\x96\xeb\xf4\xf3\xad\xff\x50\x6e\x28\x07\xe2\xf6\xe3\xd0\xf6\xae\x58\x07\x6a\x04\x61\x0d\x36\x59\x0b\x9b\xe9\x39\x87\x79\x0b\x8d\xf6\x3d\xe6\xb1\x7e\x9d\x23\x60\xf9\xb7\x76\x06\xbe\xa0\xc0\x97\x71\xda\xae\xca\x55\xa7\x70\x48\xf4\x61\x37\xd3\xf6\xce\x4a\x8a\x5d\x07\x50\x0d\x69\x77\x0f\x89\x28\xd3\x8a\xd6\x59\xa6\x7d\x08\x0a\xa2\xc5\x74\x55\xe7\xc0\x91\x0a\xd6\x35\xc7\xa8\x7a\x1d\x18\x64\xba\xde\x3a\x51\x69\xc0\xba\x20\x0a\xb0\xc2\xd3\xba\x04\xb7\x0b\x43\x4f\xc2\x28\x53\x1d\x87\x9b\xaa\xde\x43\xa5\xfb\xca\x93\x8b\x94\x50\x7f\x6d\xbf\xe3\xcf\x73\x75\x61\x46\x27\xde\x30\x4f\x52\x38\xd0\x08\x39\x96\xab\x95\xbb\x3a\x30\x88\x8b\xf5\xfa\xd9\x32\x30\x24\x17\x9b\xb4\xaa\x55\x05\x80\x63\x91\x64\x65\x91\x92\x2f\xb3\x56\x08\x02\x2c\xc6\xd7\x14\x2b\x39\x2d\x97\x0a\x42\x84\x45\xa3\xb5\x45\x4b\xae\xc9\x15\x85\x21\xbc\x58\xb5\xfa\x68\x75\x97\x15\xba\x31\xaf\xde\x9c\x7c\xfc\xe0\x4e\xb9\x8a\x05\x6a\x66\x01\xd7\xc1\x55\xc9\x99\x3d\xd1\x64\x46\xae\x34\x38\xa7\x57\x61\xdc\x08\xe3\x86\x8c\x74\xe3\x86\x8f\xc3\x41\xc3\x94\xdc\x6a\x38\x2d\xe9\x4e\x44\x1c\xf3\x91\x00\x83\xc0\x28\x47\x03\xc3\x05\x37\xb2\xc4\x66\x37\x69\xed\xf1\x2c\x44\xfc\xee\x36\xbd\x0f\x78\x2c\x1a\xbb\x5e\xea\x20\xf0\xa3\x68\x2c\x78\xc9\x3f\xa0\xfa\x33\xa3\x2c\x7a\x57\x92\x38\xbc\xf1\xe4\xe3\xc7\x77\x8e\xd1\xfa\xb0\xd4\x4e\x56\x4a\x26\x13\x5f\xa8\xc2\x4a\x57\x7d\x04\x97\x8d\xd7\x1f\x4e\x0d\xb8\x47\xd4\x21\x6b\xef\x74\xf7\x1e\xee\x3d\xda\x3d\xd8\x7b\x38\x9f\x17\xcf\x87\x4c\xcd\xe7\xa4\x33\x57\xd4\x68\x22\xb4\xd9\x24\x5b\x61\xfc\x22\x94\xa1\x36\x5d\x31\x9f\xab\x7f\xef\xd2\x3a\x3a\x24\xc9\xd2\xb0\x57\xa3\x61\x0d\xe1\x2f\xde\x7d\x3c\x3a\x2d\x28\x3f\xc8\x4a\xd5\xed\xc6\xac\x94\x6a\x84\x32\xd6\x5c\x06\xe6\xe5\x09\x02\xe1\x97\x96\xe3\x64\x28\x4f\x4e\x8f\x5f\x7f\x78\x59\xe0\x7c\xec\x65\xb2\x2d\x75\xba\x98\x02\xd2\x0d\x2c\xbc\x79\x59\xc0\xee\x67\xb0\xa5\x96\x3c\xcc\xde\xa1\x96\xe4\x86\xb1\xd5\x96\x14\xed\x6f\x4b\xeb\xba\x80\xe3\xac\xee\x77\xaf\x4f\x4a\xad\x79\xf4\xd7\x25\x27\x32\x2d\x2a\x1b\x47\xc7\xc7\x47\x7f\x14\x85\xbb\x1d\x2f\x93\x9f\x83\x95\x0e\x25\x55\xb8\x91\xe6\xf3\xad\xcc\x44\xcf\xc4\x6b\x8a\xf4\xe3\x93\x37\xcf\x9f\x9e\x36\x66\xa1\xbe\x6a\xf0\xc6\x30\x14\xe3\x41\x43\xf2\x89\x18\x34\xfe\xa7\xd3\xd2\x2d\xe7\x7f\x62\x85\x56\x0a\xdf\xa4\x44\x9d\xeb\xc2\xc5\x19\x0a\x22\x68\x5f\x78\xc8\xe8\x53\x6d\x66\x10\x5a\x3d\x96\xc4\xae\x67\xc8\x13\xb8\xc2\xd5\xdb\x58\x23\xa4\x68\x5d\x38\x24\x2a\x5f\x65\x74\x05\xac\xf1\xee\xe3\x87\x97\xcf\x8f\x1b\x1c\x71\x35\x3e\x08\x31\x68\xe0\x62\xd0\x40\x62\x1b\x7e\xa2\x1b\x91\x1c\xdf\x35\x62\x21\x1a\x4e\x2b\x43\xd3\x72\x1a\x42\x6a\x15\x8a\x18\x2b\xf8\x85\x96\x8c\xea\x2d\xd9\xf1\xfe\xb2\x8b\xff\xa2\x81\xb6\xa7\xf3\xee\x4c\x80\x33\xbb\xc4\x25\x76\x60\xb0\xd9\x57\x3c\xfe\x38\x93\x9f\x54\x34\x15\x4a\xdf\x91\x84\xd2\xfb\x12\xb5\xc9\x85\x55\x16\x90\x54\x5a\x16\x31\x53\x0d\x49\x4a\x2f\x67\xaf\xc9\x25\xb1\xbf\xa0\x50\x5e\x67\x9a\xbc\xd6\xa4\x68\xd0\xae\x57\x18\xbf\xd2\x1d\x42\xc4\xa4\x3b\x82\x90\x75\x7a\xe1\x61\x94\xaf\xc8\xad\x56\x4a\x40\x74\x1e\x5e\xa4\x83\x53\xad\x5e\xf4\x02\x16\x10\x53\x59\xa9\xa6\x20\xab\x65\xcf\x2b\xc8\xaf\xf5\x34\xbe\xbe\xc2\x92\x46\x34\x88\xb4\xc4\x7e\x4e\xd7\x90\x9d\x81\x6f\xa8\xea\xf9\xae\xdf\xf3\x99\xef\xfa\x29\x31\xbe\xf5\xe9\x84\x43\x52\x23\x65\xc8\x5e\x1b\x84\x30\xcc\x89\x99\x68\x72\x87\x2d\x1f\xd2\xbc\xe9\x5e\x4d\x38\x5b\x17\x51\xfa\xb5\x53\x9a\xe1\xd2\xb4\xaa\xf0\xdb\x6c\x6f\x76\xcd\xaf\xdc\x1c\xb8\xb7\x3d\x6c\x05\x38\xee\x0d\xa4\x3d\x18\x54\x07\x70\xa4\xcd\xb2\x83\x03\x88\xfb\x09\x81\xcb\x4b\xfd\x69\xac\x84\x92\x4f\x7b\x52\xde\x42\x9d\x91\x48\x40\x4e\xc6\x8a\x0d\x55\xbb\xf1\x54\x94\xbe\xaa\x6a\x16\xf9\x12\xf5\xfc\x76\x2a\x02\x1d\xca\x91\x59\x94\x70\x31\x2a\xfc\xf2\x32\xf7\xd8\x2d\x7b\xb2\xa5\xbb\x6d\x56\x80\xdc\x85\xbb\xd5\xed\x2d\xad\x53\x1d\xaf\xda\xf5\xd2\xe5\x06\x8f\xcb\x7b\xe9\x32\x96\xae\x4b\xe9\xd2\x90\xca\xfa\x8a\xc8\xdd\xea\xd4\xc5\xb5\x1b\x20\x8e\x20\x13\xc3\xa9\x4c\xcd\x26\x6c\x0a\x36\x95\xb9\xff\x38\x17\x9c\x39\x86\x01\x62\x18\x34\x9b\xcb\x50\x25\x5a\x05\x42\x89\x55\x50\xbb\x05\xd4\x10\xa1\x86\xcd\xe6\xc8\x40\x8d\x40\xb9\xa3\x62\x1a\xe4\x50\x57\x08\x75\xb5\x0a\x57\xbe\xb8\x94\x10\x94\xd8\x6f\xb4\x5e\x6b\xde\x2a\x54\xee\x62\x10\x4a\xea\x73\x4f\x1c\x6a\xdc\xc8\x34\xcc\x67\x2a\xc6\x4d\xb5\x73\x71\xb1\xce\xfb\x3f\x5b\xab\x88\xa2\xc2\x63\x57\xdf\x70\x78\x47\x14\x18\x01\x08\x92\xb6\x1c\xa7\xac\x18\xdf\x95\x39\x50\x22\xce\xdb\x4d\xe6\x9d\xdd\xc8\xd4\xa9\x1e\x7c\x2d\x99\x41\x5b\xa0\x3b\x2a\xa1\xbb\xdf\xf6\x3a\xc0\x8d\xd2\x9c\x7f\x3e\xa9\x7e\xee\xd6\x3e\x9f\x56\x3f\xef\x80\xef\x49\x08\x3c\x53\x85\xd5\xd2\x9f\x6f\xd0\xd2\x77\x11\x7a\x80\x8a\x3f\x7c\xdb\x00\xb8\x57\x02\xc4\x56\x7c\x97\x65\x9f\xfc\x53\x24\x42\xa2\xeb\x19\x84\xf7\x5d\xb6\x5a\xa9\xa9\x80\x3d\x78\xe5\x9d\x5f\x2c\x32\x09\x79\x66\x60\x41\x16\x2d\xb8\x2c\xcf\xf8\x53\x49\xca\xd3\x5c\x92\x23\x49\x9e\x1a\x00\x4a\xcb\xf3\xfc\x4d\x4a\xa0\x74\xaf\xac\x81\xa4\x28\x20\x62\x6c\xf2\xbb\x4a\x4b\xca\x63\x51\x43\xff\xc6\x7e\x05\x5b\x0d\x56\x61\x9b\xf7\x41\xb2\xad\x2e\xbc\x92\xc6\x32\xcb\x2b\xc5\x0a\x8c\x9c\x78\x25\x53\x4f\x36\x85\xad\x0f\xa9\xbf\xdb\x94\xe8\xf4\x24\x7b\x25\xdd\xf8\x2a\x1c\x6a\x42\x7b\x74\xab\x1c\x15\x82\x3b\x3a\xca\x1d\xa6\x16\xb3\x34\xf3\xc9\xdd\x36\x2c\xde\xb1\xfb\x62\x5d\xf3\x4f\x0e\x37\x32\xb6\xe7\x08\xc5\x8f\xec\x51\xe5\x8e\x98\xf9\x19\xa2\x88\x35\x93\xc7\x36\xc8\x20\xc4\x0f\x3e\x31\xe8\xcc\x72\x93\x41\x2e\xc4\x38\x16\x86\x5a\x0c\x1e\xc9\xf7\x19\xdc\xa1\x1b\x60\xd5\x7e\xa5\x27\x0c\x1e\x69\xba\x10\x5d\x10\xe1\x90\xec\x5b\x6a\x52\xf2\x94\x7b\x55\x9d\x83\x69\xc5\x43\xac\xf8\x2a\x6b\x32\xc5\x4a\x1b\x86\x06\xc3\x5d\xe8\x84\xec\x78\x5d\x63\x0a\x1a\x50\x08\x3d\xe5\x8e\x16\x90\x95\x1d\x2c\x16\x0b\x22\x69\x0f\x7b\x7b\xb1\xd8\x60\xcd\xbd\x36\x03\x25\x40\xba\xc1\x33\xf3\xe7\xb1\xf9\xb3\x57\x2c\x08\xcb\x31\x37\xf4\x7e\xb1\xa8\xec\xe0\xbd\xae\x19\x72\x76\xed\x9a\x91\x81\x04\x09\xaa\xaf\xdc\xe1\x98\x8f\x62\xef\x26\x0a\x07\x8d\x0e\xed\xe1\x2a\x36\x9f\x4f\x49\xea\x16\x8d\xd8\xfd\x02\x42\x46\x02\xa6\x09\x2e\x65\x66\x25\x66\x9c\xf8\x10\x9a\x45\x71\x85\xed\x0f\x02\xa5\x94\x30\x1a\xd0\x47\x99\x79\xa7\x3e\x1a\xf1\xd4\x4b\x5c\xde\x6c\x12\xa2\x99\x9e\xcf\xef\x17\xf4\x5c\x5c\xb0\xc4\xe5\x04\xcd\x24\x30\x10\x2b\x10\x0a\x76\x3f\x42\x8b\xda\x92\xb8\x80\x84\x49\x37\x00\x6e\x74\x64\x30\x7a\x8e\x40\x3d\x67\x98\x6f\x4f\xb9\x57\xec\xa9\x24\x33\xf2\x5c\xe6\x1d\xd5\x28\x87\x2c\xe1\x17\x09\xf7\xdb\xde\x3e\xf8\x5e\x99\x19\xec\xde\x8d\x74\x79\xc5\x9d\xec\x6e\xf7\xef\x08\x07\x81\xc2\xcd\x0b\x9a\xcd\xa8\x7f\x8b\x31\x7d\xca\x0d\x41\xb9\xdf\xcd\xdb\x3b\x7c\x11\xf4\x95\x6b\x86\xda\xbc\x32\xc3\x00\xd2\xf5\x29\x5d\x90\xb2\x7f\x4d\x2f\x48\x04\x7e\x69\x80\x7c\xdb\x54\x33\x26\x02\xa4\xe9\xd6\x21\x09\x8d\xae\x00\x8a\xc2\x4b\x49\x22\x08\x5c\x1f\x12\x12\xd2\x1c\x47\xf5\x2d\xf0\xfe\xfd\x34\x52\x3a\xf6\xf8\xc2\xbb\x4f\x77\xb7\x24\xbb\x5f\xe0\x00\x1e\xff\xaa\x4c\x50\xee\x88\xd4\x45\xc2\x9a\xf5\x62\x46\xde\x49\x90\xee\x15\xa4\x62\x5b\x55\x59\xee\xeb\xe6\x68\x30\x14\xe6\xd7\x9e\x82\xb1\x11\xe8\x85\x6c\xfb\x59\x97\xe8\x13\xf3\xdd\xb4\xe1\xd9\x46\x51\x2e\x3d\x09\x51\xcd\x87\xf3\x32\x5f\x8c\x90\x85\x20\xc9\x76\x3a\x91\x2d\x5f\x48\xb2\xd5\x01\x05\x09\x2e\x74\x14\xcc\xef\x2e\xe8\xfc\xb7\xa4\x6f\xd2\xf5\xf4\x7e\xdb\x73\x86\xb7\x0e\x70\x2f\x39\x17\x17\xf3\xf9\x7d\xe8\x9d\xc1\x77\xef\xac\x12\xb5\xf6\xa2\x34\x6f\x53\x2d\x49\xe5\x5a\x52\xd7\xb3\x13\x40\xb9\xd7\xc0\x19\xe1\x2c\x81\x88\x09\x98\x11\xd9\xff\x28\xcf\xf9\x85\x2b\x3c\xfb\xef\xb0\xa2\xe7\x15\x5b\x89\x51\x4f\xe1\x76\xd5\x0f\x6a\x44\xe7\xd4\xc8\x8d\x7c\x09\x36\x3a\x62\xb1\x1d\x65\x26\x08\xd1\xe7\xc9\x85\xa9\x86\x43\xc2\x48\x82\xce\x66\x5a\xa2\x1b\x64\x3f\x71\x43\xf6\x9a\x70\x48\xdc\x90\x7a\x89\xfb\x3d\xfd\xf1\x9d\x42\x42\x73\x67\x42\x61\x48\x28\x77\xd2\x0b\x5c\xdf\x98\x04\xae\x4f\xb1\xad\x86\x39\x4d\x6b\xd3\x8a\x7b\x15\xb7\x05\x92\x91\xf6\x89\x1b\x81\x86\xfb\xa9\xa7\x5c\x09\x3f\x3c\xb1\xb0\xcb\x14\x87\xa8\xe8\xbc\xf7\xd8\xdc\x8f\xf2\x5c\x5e\x34\x9b\x53\xb2\x5b\xea\xd7\xcf\x55\xae\x43\x48\x40\x48\x76\x2f\xbc\x2f\x12\x94\xa7\x80\x7b\x4f\xe4\x02\xbe\xe6\x6b\xe0\x97\xb5\x5a\x4e\x25\x6c\xe5\x49\x3e\xe1\x35\x04\xec\xfc\x02\x22\x86\x98\x5d\x65\xa4\x9d\x66\x1d\xa8\x4d\x0f\x3b\x18\xb1\xd0\xa7\xe1\x44\x44\x49\x49\x66\x67\xab\x35\xa5\x0b\xd0\xf9\x60\x94\x3e\x07\x63\xc1\x55\x56\x4c\xa1\x3f\x28\x83\xb2\x75\xfa\x2c\xb4\xed\x72\x83\x35\x7e\xff\x9e\xca\x36\x2d\x69\xa1\x02\x06\x90\xb0\x88\x28\xb4\x09\xad\x79\x92\xe9\x8f\x1c\xc3\xa2\xf8\x05\x29\x02\xe5\xc2\x05\x85\xfb\x38\xf1\xe3\x40\x85\xbe\xa8\x88\xbd\x20\x5b\xd5\x17\x90\xc8\xd5\x20\x44\x9a\x25\x20\x48\x1d\xf6\x94\x96\x5c\xcb\xf4\xb0\x33\x9f\x07\xb8\x31\x80\xbe\xfc\x2e\x5d\xd8\x59\xfb\x43\xf6\xd6\x48\x9e\x55\x06\x0d\xee\x85\xd2\x4c\xcd\xfa\x24\x99\x93\xc8\x81\x18\x86\x52\x0c\x0a\xdb\x7c\x10\x05\xc9\x44\x48\xdd\xcf\x1e\xbc\xfb\xd2\x8e\xff\xdb\x5c\x39\xe2\xd3\xa9\x90\x83\xa7\x57\xe1\x78\x60\x3a\x7c\xd5\x02\x2b\x98\x70\x65\x34\x10\xc5\xb2\x31\xe5\x4a\x48\xfd\x21\x1a\x08\x57\x89\xe9\x98\x07\xc2\x22\xd8\x56\x44\x96\x97\xdc\x05\x05\x41\xe1\xbe\x22\x6f\x7e\x5f\xa9\xcb\x9a\x96\xfc\x51\xe1\xc7\xb2\x5b\xf4\x2f\x36\xc1\x3a\xa5\x31\xbf\xcf\x64\x08\xef\x89\x16\x4b\x5c\x7f\x3e\xef\x40\xba\x97\x95\x14\x5b\x6c\xad\x62\x97\x0a\x85\x6c\xe0\x05\x30\xf0\x06\x0a\xe3\x1f\x3d\x0d\x43\x8f\x83\xef\x09\xd4\x10\x48\xba\xe2\x83\x54\xff\x1d\x04\xfe\x1a\x89\x3b\xbf\x44\xa2\xdd\x99\x51\x9b\xb4\xf4\xef\x9e\xc4\x25\xc5\xf7\xba\x2d\xa2\xb0\x72\x5a\x19\x20\xad\x6a\x65\xf6\xcd\xf2\x03\x13\x4f\xc1\x75\xa6\x59\x2c\xd6\x08\x0e\xad\xc8\xb9\x04\x75\xb1\x42\xef\xb2\x7a\x63\xca\xb4\x42\x6d\x30\x86\x2c\x0e\xd0\xab\xb0\x64\x61\xcf\x0b\x74\xa7\x2b\xb6\x41\x21\xcc\xf1\x80\x58\x85\xa9\x08\x87\x46\x5c\x5c\x31\xb2\x71\x03\xa0\x84\x0e\x92\x55\x08\xcb\x61\xd2\x8b\x5f\xd8\x20\xa8\x20\x04\xbe\x0a\x65\x35\x72\x7a\xf1\x4b\x5b\x08\x35\xb4\x10\xac\x42\x5c\x8f\xa5\x5e\xfc\xe2\x36\xc3\x12\x72\x88\x56\xa1\x5f\x0e\xae\x5e\xfc\xf2\x66\xc4\x8a\x2a\x20\x5c\x55\xc9\xaa\x60\xeb\xc5\xfa\xc8\x0d\xa3\x9f\xf0\x8e\x53\xd2\x81\x28\x04\x1b\x66\x8a\xc3\xbb\x65\x60\x88\x36\xc2\xee\x54\x60\xc3\x8d\xb0\xbb\x65\xd8\xde\xba\x79\x80\xa0\x7b\x06\x54\x41\xe4\xdd\x0f\xb1\x84\x5e\x54\xa6\xea\x50\x15\xb2\xd4\x31\x6b\xd1\x54\x3b\xc6\xa0\x72\xa6\x8e\x27\xd7\xcc\x51\xd3\x09\x68\xae\x6d\xf7\x67\x84\x2b\x30\x0a\x07\xd1\x4c\x82\x64\x63\x81\xfb\x8b\x11\x35\x02\x47\xb8\xdb\x46\x34\xf7\xef\x88\x2f\x40\x1e\xee\xf6\x63\xe5\x8d\x15\xc4\xc2\xa8\xbe\xc2\xe5\xd4\x9b\x91\xa1\x48\xfd\xc4\x0b\x4a\xbd\x34\x3e\x0d\x44\xb6\x9b\xa7\x20\x5e\xd7\x0f\x8d\x4b\x22\xed\x72\x6c\x44\xa2\x19\xb3\xb5\x3d\x16\xbc\xf3\x0c\x68\xf0\x8e\x02\x7f\xe2\x29\x97\x3f\x01\x7e\x63\xfe\xbd\xa9\x74\x05\xca\xc5\x92\x2e\x78\xbf\x28\x85\x95\xe5\x4e\x23\x0e\x82\x69\x77\x1b\x12\xa6\x5d\x89\x21\x00\x51\xcf\x0c\xde\x16\x63\xa2\x4f\x34\x53\xa8\xba\x12\xf3\x0f\x33\xab\x97\x19\x2c\xc6\x98\x68\x36\x9d\x60\xcc\xe3\xd8\xfc\x48\xfa\x37\x8a\x68\x7b\x5a\x01\x55\x48\x4e\x3d\xfb\xf5\x03\x9f\x88\x1c\x42\x59\x08\x85\x10\x8b\xe5\x30\xb8\x1b\x55\xd1\xbb\x99\x3c\x57\x17\x3d\xf3\x87\x89\xbe\x68\x39\x0d\xa7\xa5\xbd\xd2\x79\xb5\x6d\x55\x75\x7f\x6d\x67\x16\x78\xbe\x45\x60\x20\xdc\x6b\x8c\xf0\xbc\x66\xd2\x9d\x60\xfc\x31\xcd\xbc\x07\x39\xd8\x27\xe9\x06\x4a\x70\x2d\x4e\xc5\x2d\x2e\xe1\x36\xda\x2e\x1c\x92\x3d\x04\x2b\x79\x77\xa5\x7b\x8d\x26\xe4\xf7\x9e\xf9\x24\xdc\xed\x1e\x5d\xda\x03\x48\xfa\x09\x3b\x4f\x40\xb8\xdf\x2f\xbc\x6c\x27\xda\x28\xc8\x46\x69\xb8\xee\xd9\xb8\x8f\xfb\xef\x5e\x02\x53\x4f\x65\x0e\x1e\x12\xb0\x6d\x45\x04\x18\x1b\x59\x8c\x27\x97\xe2\x46\x48\x7d\x69\x54\x8c\x4b\x25\x86\x8c\x43\xb0\x08\x87\x64\xb7\x4c\xf5\x44\x11\x63\xc0\x5e\x11\xe9\x8e\x28\x28\x90\xee\x80\x42\xd0\xcb\x1d\xf8\xfd\xbc\x59\xcf\xc7\xc2\xa8\x3b\x1f\x4e\x88\x74\x87\x80\x1b\x59\xf5\x6f\xb8\xbd\xd5\xfb\x21\x9b\x4d\x87\x9b\xf9\xe2\x06\xcd\x66\xe0\xf2\xc1\xe0\xb9\x21\xe4\x5d\x18\x6b\x21\x85\x22\x4e\x30\x0e\x83\x6b\x07\x7e\x48\x12\x50\x0a\x86\x84\xb4\xe6\xdc\xb9\x18\xa1\x51\xbd\x62\xdb\xe0\xad\x24\x01\x6c\x2b\xd2\x35\x8d\xe8\x47\xe7\xe1\x85\x67\xfe\xe0\x46\x40\xae\x68\x06\x25\x9f\xb6\x5a\x72\xae\x1b\xf3\x4b\x97\x43\x56\x7a\x46\x24\x99\x81\xe8\xaf\xf4\x25\x30\xe9\xc6\xfa\x6e\x2c\x56\x46\xa4\x2e\x88\x84\x84\x7a\xe9\xe4\xaf\x62\x28\xdb\x7e\xd2\x0c\xc8\x8b\x18\xb9\x08\x9f\xcc\x34\x28\xcc\x41\x5d\x84\xf2\x88\x0b\x08\x98\x31\xf5\x0c\xeb\x70\x74\x03\x05\xf6\xaf\xfb\xc3\xdd\x66\x8c\x71\x34\xec\xdc\x1f\x8c\xf7\x82\x48\xea\x50\x26\x62\x21\x5d\x25\x26\xd1\x8d\xa8\x76\xb4\x30\x2b\x50\x50\x38\x34\x42\x30\x53\xb9\x74\xee\x27\xb3\x29\x86\xee\x0f\xd0\xec\x06\x45\x07\xc8\x6c\x0b\x44\xd3\x52\xaf\x41\x62\xc4\x98\xa2\xa0\x98\x76\x39\x70\x96\xf4\x93\xc3\xdd\xbe\x72\xb9\x67\x84\x88\xa7\x40\xb3\xae\x99\xa2\xca\xf5\xbd\x5d\xc6\x92\x66\x13\x65\x4a\xc0\x88\x6e\x36\x4d\x17\x46\xd3\x4f\x2a\x9a\xf2\x11\xb7\xcb\x0d\x90\x9d\x25\xf0\x1b\x6a\x40\xa7\x0a\x19\xf7\x99\x18\xf2\x64\xac\x09\x85\x90\xf6\x04\x0b\xdc\xef\x3d\x1b\xdc\xbb\x1c\xb5\x2e\x28\x67\x82\x70\xda\x43\x1f\x58\xc1\x44\xb9\x35\x12\xb5\xdb\x3d\x03\x73\x1e\x5d\x18\x30\x63\x47\x4c\x17\x01\xe1\xe8\x25\xc9\xd6\x6e\xf7\x07\x93\x30\x5c\x10\x05\x9c\x82\x5c\xe6\x5b\x01\x01\xf8\xaa\xd9\xbc\x9f\xf2\x38\x0e\x6f\x84\x37\x36\x75\x1e\xee\x18\xed\xc1\x08\xb6\xc0\xba\xe0\xd6\x8f\x85\x05\xcb\x54\x3d\x64\x11\xe4\x9d\xdd\x55\xdc\x97\xab\xba\x96\xe3\x4a\xb1\x3e\x3d\xd1\x97\x6e\x2c\xf4\x91\xd6\x2a\xf4\x13\x2d\x88\x3d\x62\x96\xd6\x5b\x7a\x4d\x17\x39\x7f\xee\xfd\xbd\x3a\x20\x61\xc2\x1d\xa2\xb4\x89\x96\xea\xfb\x70\x42\x12\x58\x5d\xa7\xfd\x54\xd4\x7b\xc3\xc7\x89\xc8\x45\xfd\x95\x08\xae\xc5\x20\xfd\x89\xce\x36\xc6\x12\x33\x27\xd0\x0d\x47\x17\x0b\xad\xee\xee\x67\xa1\x1c\x44\xb3\x15\x62\x43\x3b\x76\x57\xe0\x23\x8a\x4a\xd7\x9a\x66\xf9\xa6\xe6\xfd\x02\x9c\x74\x60\x1c\xb8\x1f\x09\xed\x95\x54\x1b\x5f\xb1\xad\x8e\x51\x4d\x8a\x50\x8a\xd2\xce\x55\x65\x09\x38\xcf\xa3\xcc\x47\xa9\xec\x80\x0e\x2d\x9f\x70\x9e\xaa\xb2\x09\x77\xbf\xed\x29\x50\x9e\x86\xd8\x13\xa0\x53\x3d\x1e\x92\x4c\xa1\xcf\x1d\x25\x45\x30\x51\x69\xeb\x45\x55\xce\x7b\x60\xec\x65\x26\x98\xa4\x51\x13\x8c\x36\x61\x26\x63\xb2\xc5\x98\x15\x05\xdd\x2d\xec\xb1\x1d\x7c\x51\xf6\x76\x4c\xcd\xda\xd9\x01\x81\x1b\xa2\x6c\xb5\x1f\xc7\xc8\xd4\x5f\x3c\xcc\x64\x96\xd7\xfc\x48\x5a\x6a\xc9\x49\xd7\x18\x4a\xd2\x1d\x80\xf0\x04\x0c\x3d\xb3\x0e\xf8\x9e\x74\xfd\xc5\xc2\x08\x06\xce\xba\x8b\xd4\xf7\xc4\x53\xcf\xd3\x7e\x65\x37\x78\x0c\x91\xa9\x1c\x42\x16\xe4\xfb\x8a\x2c\x64\x8c\xe5\x12\x7e\xd8\x6c\x86\x66\xa6\x0e\x59\x70\x1e\x1a\xe6\x30\xb2\xdd\x74\xc0\xb0\xdc\x56\xa2\x70\x21\xbe\xa6\x3d\xf3\xa0\xcc\x8a\x6c\x15\xa3\xda\xd8\xb9\xd7\xa0\xdc\x6b\xf0\xcd\xf8\x61\xb9\xce\xa1\x9f\x47\x97\x61\x7f\x75\x41\x80\x4f\xf3\xd0\x91\x8c\xd8\xd8\xac\xcd\x30\x66\xca\xfd\x0e\x03\xb6\xd5\x85\x1b\x53\x1d\x2e\xd6\x37\x66\xb1\x1e\xb0\xad\x0e\x2c\xad\xd8\x71\x3f\x66\xe7\x31\xdc\x98\x15\x3b\x4e\xc3\xb7\xcd\x8a\x7d\xc3\x6e\xdc\xeb\x7c\x65\xdb\x66\x2a\x45\xb5\xbd\x1e\xd5\xb8\x3f\x66\xe7\x63\xd8\x36\xa8\xc6\x16\xd5\xb6\x41\xb5\xcd\xb6\xdd\xeb\xac\x89\x83\x66\x33\x4e\x9b\xb3\xc5\xd8\x38\x7d\xec\xd7\xb9\xc1\x23\x64\xb0\x6e\xda\xb3\x4e\x4f\x1f\x16\x67\x0c\xec\x4e\x9e\x3c\xd7\x17\x86\x13\xcf\xf5\xc5\x8a\x6d\x3c\x12\xc3\x98\x7a\x31\x63\x6c\x4c\xe7\x73\xac\x67\x07\x04\x8c\x6d\x17\x9b\x7e\xbf\x81\x6d\xc3\xd2\xad\xee\xd2\xde\x37\x0e\x82\x74\x39\xee\x2b\xf2\x74\x0c\x76\xd1\x8d\xcd\x97\xb6\xd1\x11\xdd\x2c\x9f\x21\x70\x5b\x0f\x33\x5a\x82\xb8\xce\x20\x76\x3d\xdc\x3f\xbe\xc2\x7a\xae\xd6\x4e\x13\x9f\xdd\x19\x2e\x19\x80\x32\xaa\x87\x9f\xd2\xb3\x87\x3c\xd1\xf3\x99\x72\xc3\x62\xc3\xb5\xdc\x82\x0c\x72\xdf\x72\x4f\xd9\x81\x5c\xa2\x26\x49\x97\xf4\x5e\xbe\xa1\x6c\xd6\xb6\x74\x37\xb7\x4f\x08\x2f\xd7\x4e\x4b\x95\x73\x63\x8c\x66\x72\x81\x7a\x25\x8a\x4b\x67\x8e\x55\x4d\xc1\xc8\x2c\xb5\x22\xf4\x43\x52\xa3\xd6\x6c\xe1\xd2\x6a\xd4\x93\xec\x69\x37\x7f\xda\xc3\xa7\xbe\x0d\x14\xe9\x93\x88\xc9\xf3\xe4\x82\x32\xc6\x88\x0d\x73\xa6\xcd\x66\x2a\xbf\xd3\x12\x99\xfc\xb6\x32\x28\xd5\x79\x74\xb3\x49\x48\xc0\x22\x6a\x94\x13\x12\x31\x4e\xdd\x6d\xdc\x86\x0e\x5c\x0e\x51\x7a\xdc\x8a\x08\x26\xec\x7e\x8b\xd5\xeb\x2b\xbf\x75\x3f\x55\xc0\x74\xdf\x71\x32\x55\x4a\x9b\x0a\x76\xed\x5b\x2b\x4b\xd1\x56\x33\x62\x69\x08\x51\x26\x5e\xbd\xe5\x93\x3e\xe7\xc9\x85\x41\x63\x56\x0a\x2f\xed\xe4\xec\x68\x9a\xa9\x11\x12\xd3\xd9\x75\x82\xb0\xdb\xc2\x34\x62\x06\x7b\xaf\x42\x74\x68\x04\x62\x58\x3e\xdb\x59\x1c\xe2\x2e\xc9\xf0\x4c\x72\x0b\x94\xdc\x02\x24\x4b\x32\x41\xa7\x18\xcf\xa6\x99\x3a\x94\x7d\x1c\xd4\x03\x10\x70\x7f\xe3\x29\x08\x3d\x3c\xdc\xe0\xc9\x43\x95\xf2\xc1\x43\xfb\x49\x82\xf0\xf8\xa2\x50\x8b\x03\x26\x0f\x55\x1f\x2d\x57\xd6\xe9\x45\x87\x41\x2f\xca\x82\x41\x42\x96\x9c\x47\x17\xbd\x91\x22\x21\xf0\xf3\xe8\x02\x34\xb4\x5a\x36\x76\x35\x44\x67\x54\x89\x4b\xaf\xd5\xea\x03\x39\xc0\xd9\xfd\x22\xf3\x45\x5b\x05\xdc\x34\x63\x98\x0b\x68\xf0\x59\x98\x3d\xc6\xac\x03\x63\xd6\x81\x01\x13\xbd\xf8\x70\xd8\x6c\x8e\x0f\xfd\x74\x83\xf5\x06\xb6\x19\xb9\x61\xd1\x79\x7c\x41\x5d\x0e\x13\x46\x9e\xb3\xf0\x7c\x8c\x3f\xae\xd8\x8d\xeb\xc3\x94\x3d\x77\x7d\x23\xd8\xb7\xb7\x18\x9b\xd8\x52\x23\x98\xc1\x1d\xdc\xc2\x35\x1c\xc1\x89\x29\xdc\xea\x5e\xc0\xa9\x29\xd8\xea\xe2\x22\x70\xd2\x6c\x92\x19\x3b\x71\x7d\xb8\x63\x13\xc3\xa6\x23\x76\x62\xf8\x0b\x4e\x9b\x4d\x72\xcd\x4e\x5d\x1f\x8e\x98\xd1\x90\xc9\x2d\x3b\xc5\x0f\x47\xcd\xe6\x1d\x1d\x29\x72\x05\xd7\x90\x40\xab\x35\xa0\x70\xa2\x30\xd9\xc4\x36\x4c\x61\x6c\x54\xb2\x41\x8b\x5d\x59\x4f\xe1\x69\xf6\x65\x66\x21\x07\x2d\x36\xb3\x5f\xe2\x16\xdb\x81\x71\x8b\xed\x58\xfd\x32\x1c\x92\x23\x3a\x68\xb5\x32\x5c\x93\x0c\x57\x5e\xd3\xa0\x8c\x37\x6e\xb1\x6e\xb5\xf4\x1d\xcd\xeb\xba\xca\xeb\x4a\xa1\x47\x8a\xcc\x60\x9a\x51\xbb\x4c\x43\xb7\x97\x6d\x2e\x6f\x9d\xcc\xe7\xa3\x2d\xc6\x6e\xa9\xaf\x04\xbf\xee\xd5\x71\xd6\xa9\xab\xd5\x71\xbd\xbe\x8e\x9d\x85\xd5\x64\xb1\x3d\x65\x5a\xf2\x16\xb5\x60\xdc\x6a\x2d\x70\x5b\x20\x3e\x1c\xf6\xb2\xf6\x94\x06\xdd\x8e\xf3\x72\x41\x7b\xbc\xb2\xe0\x95\xe7\xf0\x8d\x7d\x9b\xcf\xcf\x2f\x7a\x29\xbd\x25\x5e\x79\xee\xfa\x90\x2a\x54\xdf\x28\xd6\x48\x3a\x87\xd9\x94\x9a\xcf\x3b\x87\x41\xfe\xfc\x2d\x93\xa0\x8f\xcc\xcc\x99\x79\x09\xdc\x7a\x01\xdc\x79\xdf\xd2\x0d\x9f\x23\xc5\x9c\x4b\x31\x9e\xfc\x7e\xf0\xe4\x5d\x29\xa9\xcd\x89\x5a\xb5\x35\x8d\xe7\x0f\x4d\x0f\x07\xd9\xda\x91\x1e\x0a\xbb\x57\x5e\x02\x47\x5e\xc0\xee\x03\xaf\x03\x3f\x3d\x01\xe6\x45\x9c\x7b\x6f\x53\x3d\xc3\x94\x67\x01\x9a\x51\xc6\x4e\x0d\xdc\x80\xde\xd7\x30\x2c\x28\x04\x6e\xc0\x76\xd2\x1d\xee\x8a\xe2\x12\xb8\x3f\x41\x40\x04\x81\xab\x0c\x94\x62\x89\x45\x1b\xb8\xb1\x1b\xb3\xfb\x99\x17\x59\x0c\x8b\x8c\xfa\xd6\x91\xca\x5c\x99\x45\x70\xca\xf2\x4a\x94\xb7\x8b\xe7\xc1\x05\xdc\x92\x96\x11\x12\x54\x09\x11\xc0\xdd\x9f\x10\x40\x92\x2e\xee\x53\x45\x14\x3c\x86\xc4\x74\x70\x00\x47\x46\x34\x2d\x4e\xab\x34\xd8\x30\x84\x7b\xc5\x72\xd8\xcc\x83\x8e\x9d\x72\x1f\x78\xdd\x52\xbf\xa9\xf2\xda\xf9\xbc\x24\x95\xb6\x4a\xdb\xe6\x35\x8f\xa9\x15\x76\x46\x49\xed\xd9\x70\xbe\xd0\x55\x96\xa9\xcc\xda\xca\x53\xb6\xf2\x21\x66\xa1\x55\x9e\xcd\x10\xc4\xfd\xe7\x86\x1e\xed\x5e\x43\xe8\xc6\x10\x51\xef\x11\xbe\x25\xa1\xab\x99\x82\xd0\x4d\x58\x04\x9d\x43\x62\xe4\x5b\xec\xce\x68\xae\x26\xda\xea\x7d\xe8\xa4\xd5\x53\xef\xf1\x72\x41\x62\xea\x8a\xcd\xb2\x12\xbb\x47\x6e\xcc\x94\x45\xb5\x19\x11\xf5\xca\x38\x28\x6c\x11\xd3\xaa\x56\x0b\x37\x4b\x09\x36\x8b\xfe\x33\x67\xc0\x04\xb9\x78\xcc\xb4\x6d\xd3\x1e\xea\x5f\xb9\xf0\x1e\x30\x9d\x2a\x95\x03\xab\x54\x0e\x0a\x35\xd1\x54\x3c\xb0\x1d\xd8\xea\x42\x00\x6a\x85\x6b\xc8\xce\x91\x1b\xa6\x5d\xd1\xcb\x94\xd4\xe0\x2a\x1c\x0f\x3e\x44\x03\x11\xe7\xcb\xcf\x84\x75\x7a\x93\xc3\x9b\x6c\x21\x9b\x64\x6b\xcf\x95\xb1\xfc\xd9\xb8\x7f\x73\x3e\xb9\xf0\xcc\x1f\x94\xf0\xad\x16\x6f\x11\x3b\xf1\x71\x2a\xf0\x43\x36\x6c\x36\x87\x87\x6c\xda\x6c\x92\x84\x49\xb2\x7d\x3e\xb9\x80\xab\x74\x6c\xa7\x90\xf7\x41\xad\x07\xf2\x2e\xe8\x71\x36\x5d\xe4\xfd\x91\xd9\x66\xd0\x01\xe5\xfa\x50\x4e\xac\xf2\x4d\x2d\x6d\x5a\xa0\xab\x2e\x53\x91\xa5\x47\x4a\xcc\x06\xdf\xcd\xb3\x2e\x07\x26\x7e\x57\xab\x14\x65\x55\x56\x94\xeb\xb6\xb2\x06\x51\x8b\x1c\x59\xda\x87\xcf\xf5\xe0\x95\x4e\x22\x26\x4b\xdb\x7f\xa0\xd9\x36\x32\x2c\xed\xe9\x15\xe3\x35\x9f\x93\x55\xaf\xad\x97\xa9\x3e\xb6\x3d\xd1\x6c\xea\x2d\xc6\x64\xb3\x59\xdb\x56\xd4\x20\x4b\x47\x98\x71\xb7\x3c\x06\xe5\x26\xb5\x58\xfa\xd4\x89\xe6\x26\xe6\x3b\x85\xfa\x66\xbb\xcc\x90\x3e\xe3\x9a\x93\x0e\xc8\x5c\xe7\x29\x41\xe7\x6a\xbd\xed\x5a\x37\xae\x2b\xf3\xab\x48\xef\xaf\x7a\xe9\x7e\x67\xca\x8d\xbd\x55\x9f\xd8\xfd\x77\xcf\x34\x61\xea\x29\x37\x59\x64\x55\x1f\x78\xe5\xf3\x53\x71\x9a\x86\x45\xbb\x21\x86\x2e\x66\x1e\x0c\xdb\x23\xb2\xc4\xf6\xe7\xda\xbd\x29\x54\x3e\x99\x85\x83\x16\x0a\x13\x41\x7c\x14\xd5\xbd\x4a\x41\xc1\x4c\xd1\x9e\xc8\xd7\xaa\xb4\xa6\x50\xc6\x42\xe9\x27\x62\x18\x29\x41\xb6\x15\x49\x30\x5e\xd2\x4d\x28\xf0\x7a\x3d\x8f\x8d\x09\xb3\x95\xd6\x40\x0b\x27\x42\x79\x83\xb8\x44\xb6\xe9\x67\x2b\xc0\xb5\x7b\x54\x36\x56\x1a\x9d\x2d\xb3\x00\x29\xf4\xab\xad\x2d\x1c\xb8\x31\xb3\xb3\xc0\x9d\xe5\x43\xf6\x68\x15\xbb\x66\x5e\x12\xdb\x91\xd5\x2f\xe1\xb0\xec\x6e\xd0\x2c\x77\x0f\x3f\x4b\xb7\xca\x5f\x28\x3e\x42\x3f\x71\x9e\x0b\xa7\xdc\x3f\x99\xfa\x7c\x2e\x2e\xdc\xa3\xde\x5b\x69\x2c\x4b\xc6\x58\xe2\x06\xfd\xc4\x8d\x3d\xd3\x5f\xee\x4f\xec\xae\x52\x24\xd3\x82\x68\xf7\xce\x1e\xda\xcf\x1b\x50\x64\xae\x60\xda\xbd\x4d\x03\x13\x92\x72\x60\x42\xba\xce\x27\xe7\xdc\x68\xba\x81\x7b\x04\x11\xdb\x41\x47\x44\xd0\x8f\x6c\x5d\x51\x5a\x57\xaf\x36\x6c\x11\x54\x86\x3a\x70\xd5\x05\x5d\x88\x66\x13\x77\xfe\x45\x29\x30\xc6\xe6\x55\xa8\x1e\xef\x50\x6e\x4c\x24\xed\x0d\xac\x67\xd3\x9b\x92\x6e\x87\x2e\x16\x24\xc1\x74\x21\x0c\xa7\x28\x91\x4c\xe4\xed\x2b\x85\x6a\x3e\x55\x69\x04\xa4\x4d\x2e\x65\x58\xfe\xf4\x6e\x2a\x32\xd6\xf8\x5d\x12\xe9\x6a\x71\xab\x9f\x46\x52\x0b\x69\x8f\xff\x75\xb7\xd6\x80\x3a\x4e\xd1\x49\x59\xa2\x01\x9e\xb9\xf0\x62\xa8\x1f\xef\x2c\x9d\xee\x54\xec\x35\x99\x91\x50\x41\xe2\x4a\x3e\x11\x90\xb8\x68\x21\xe2\x8e\x48\x71\xe2\x5e\xba\x9a\x8f\x3e\xf0\x89\x70\x75\xf4\x2e\x9a\x09\xf5\x94\xc7\x82\x50\x08\xd8\x19\x5a\x16\x45\x07\x82\x28\xbc\x3f\x58\x57\xc0\x5e\x93\xa7\x8a\x44\xe7\xe2\x82\x42\x90\xf7\xe7\x1d\xf9\x03\x8f\xa9\x42\x50\x89\xa5\x50\x20\x41\x97\x36\x69\x31\xd4\x10\xf3\x78\x3c\x33\x7f\x1e\x9b\x3f\xa5\x60\x45\x3c\xcd\x9e\x45\xd8\x0f\x7c\x48\x58\x80\xdd\x03\x9c\x3d\x55\xa5\x48\x95\x77\x95\x78\x8b\xdc\x4d\x2e\x70\xa2\xb1\x2b\xa3\xa8\x2a\x33\x62\xdf\x14\x31\x6b\x97\x59\x3d\x8c\xc9\xb7\x28\x36\xe2\x2f\x2b\x5b\xe8\x96\x4c\x51\x25\x53\xac\x25\x53\x80\x2c\x85\x33\xdc\xa2\x6b\xfc\xd6\x1e\x01\x40\xb2\x03\x33\xb5\x74\xa8\xc7\x02\x22\xf3\xe8\x47\x83\x3b\x08\x4d\x13\xa2\xf5\x4d\xf8\x21\x59\x62\xc3\x18\x18\xc7\x33\xff\xec\x0f\x49\x1c\x53\xd4\xa1\xe4\x8c\x12\xe5\x06\x3c\x6d\x5d\x68\xd6\x9d\xc8\xb4\x2e\x82\x10\x0c\x5b\x43\xc8\x34\xfc\x90\xac\x03\x01\x3a\x55\x82\x83\x66\x93\x64\x44\x30\x3c\x0e\x7d\x40\x6d\xf3\xe1\x8d\x5a\x19\x38\xa3\xc4\x8f\x44\xc4\xfa\x48\x86\x13\xdc\x01\x78\xa1\xf8\x44\xf4\x57\xbe\xad\xc4\xfd\x94\xe2\x9d\x24\x74\xc5\xee\x83\x83\x0e\x2d\x45\xdc\xbc\x53\xc4\x7a\x62\x89\x4e\x4f\xc0\x94\xa3\xa3\x39\xa1\xf7\x09\x6a\x27\x49\xbf\xe3\x91\x37\x8a\x70\x0a\xb8\xd3\xda\xcd\x27\x59\xed\x24\x1e\x93\xa0\xfa\x04\x61\x50\xfc\xa0\xb2\xd2\x35\xea\x5a\xc7\xfe\xb4\x48\x12\xb6\x53\x8e\xa2\xff\xa0\x8a\x0d\xf4\xe7\xc2\x74\xcd\x38\x0a\xb0\x45\xee\x95\x59\x84\x5d\x3e\x9f\x4f\x49\x97\x2e\xd6\xc6\x33\x46\x11\x7c\x13\x95\x90\x2f\x7a\xaf\x9a\xcd\xab\x30\xd6\x91\xba\x73\x47\x11\x51\x14\x24\xb1\x69\x1a\xb0\xa5\xaf\xd6\xee\x02\xaf\xc6\x96\xa1\x32\x86\xc8\x89\xe6\x5a\xa0\xcf\xdc\x81\x12\x5e\x38\x53\x6b\x53\x28\x6c\x46\x9a\xea\x00\xeb\xf0\xde\xd7\xdd\xf9\x65\xef\xfc\x02\x56\xec\x98\x78\xd5\x80\x62\x78\xbd\x9a\xad\xec\x6e\x41\xdf\xfe\xe3\x9d\xa9\xf2\xbe\x7f\x35\xd0\xe4\x52\x92\x5a\x40\x5d\x39\xb7\x29\xbd\x7f\x2a\x49\x82\x01\x60\x45\x82\xd3\xe5\x1d\x20\x55\xdd\x01\xc2\xd3\xd2\x25\x42\xf5\x9a\xbd\x1f\x1b\x72\xb7\x2a\x86\x22\x3d\xc3\x53\x3e\xc5\xa4\x68\xff\x5a\xe3\x2e\xbe\x77\xa4\xcb\x7b\xf1\x1f\x53\x5e\x5f\x11\x3d\xab\xe8\xfd\x1b\x55\x1e\x17\x1b\xe8\x9e\x05\xa9\xb9\x23\xa1\xd3\x4d\xda\x27\x77\xaf\x07\x66\xae\x28\x22\xfb\x47\x92\x18\x99\x46\xbd\x13\x49\x06\xb8\xe1\x67\x27\x31\x46\xed\xaa\x6a\xd4\x6e\x11\x28\xf7\xb1\x2e\x5a\xb2\xd5\xea\x5c\x5d\x10\x0a\x4f\x37\xc5\xed\x6a\xb6\x1c\x70\xf2\x5a\xb9\x71\xa0\xa2\xf1\x18\x21\xe1\xe9\xa2\x1e\xf8\x58\x6d\x19\x86\x3a\x6a\x42\x4b\x67\x06\xf4\x86\x78\x8f\xf5\xe4\xa6\xb5\xbe\x13\x43\x63\x86\x65\x3f\x4f\xa3\x29\xd3\x69\x23\x0c\xee\xaf\x8a\xfd\x55\x82\x99\x5c\xe3\x0d\x98\x6a\xf1\xc3\xc2\xeb\x17\xb1\x4e\x2f\x68\x36\xa3\x43\x6e\x17\xd1\xd0\x68\x33\xc5\x21\x7d\x63\xde\x33\x79\x1e\xb5\x5a\xb8\x11\x76\xae\x5a\xad\x8b\x66\x93\x74\x3b\x8c\x85\x7d\xa2\x5b\x2d\x10\xac\x4b\x3d\x22\x5a\x2d\xc0\x34\x0e\x8c\x91\x83\xdd\xbd\x47\x8f\x9a\x21\xed\xd7\xca\x79\xdd\x62\xff\xfb\x0d\x09\xfa\xca\x6b\x77\xd3\x28\x2c\xf8\xb9\x21\x2a\x4c\x1d\xe6\x66\x51\xb5\x0a\x5d\xa5\x94\xf6\x25\xd1\x6e\x9c\xf8\xb1\x36\x86\xc9\x0e\xa5\x7d\xd5\xda\xf1\xda\x5d\x4f\x12\x7d\xae\x2e\x68\xdf\xf9\x53\xa2\xbb\xf6\x5c\x5d\xf4\xdb\x3b\x9e\x6a\x75\xcd\xd7\x76\x77\x41\xe1\xd9\xa6\xb0\xb4\x6a\x3d\x46\xbb\x59\x50\x78\xa9\x56\x66\x41\xe8\xc9\xc2\x0a\x93\x99\x22\xa7\xab\xa9\x0f\xec\xfe\xb5\x3e\xdc\x7b\x34\x9f\xef\x3f\x2c\x32\xa8\xc9\x42\xab\xa2\xf0\x42\x6d\x4c\x6f\xd1\xe9\x15\xfd\xd2\x53\x85\x72\x5a\x23\xb6\xbd\xf7\x08\xb7\xe7\x0e\x3b\xf3\xb9\x3c\x64\x49\xea\x89\x13\x4c\xfe\x26\x5a\xc9\x22\x8f\xc9\x51\x76\x1c\xde\xab\x0d\xa9\x1d\x3a\x2b\xdb\x26\x56\xb5\x6d\xef\xd1\x3f\xc5\x7c\x2e\xfe\xb9\xff\x90\x86\x43\x72\xb0\x6f\x7f\x3d\xec\xa0\x7e\x28\x0e\x1f\x3f\x9c\xcf\xbb\x9d\x9d\x43\x91\x92\xa3\x59\xf7\xe0\x37\xdd\x12\xed\x47\x0f\xad\x5f\x2f\x7f\xb1\xbf\xdf\xab\xbe\xd8\x7b\x54\x10\x2d\x31\x1c\xb0\xf7\x57\xcc\x9f\x94\xf2\x26\x20\x43\xf3\xc3\x4e\x3f\x9b\x01\x1e\x6f\xc9\xc2\xef\x1d\xa4\xce\x99\xa8\x36\x0d\x5a\x2d\xda\x33\x4c\x1f\xf5\x89\x60\x5d\xd0\x36\x9d\xcb\x12\xd3\x47\xb4\xd9\x34\xb0\x8b\x9c\xcd\x79\xca\xe1\x36\x7d\x4e\xa5\x77\xcb\x11\x81\x35\x41\x69\xe3\x3a\x24\x93\x62\xd6\x38\x7b\xff\xee\x95\xd6\xd3\x63\xab\x86\x98\x91\x83\xd3\x21\xd1\x8c\x53\x63\x2d\x2f\xef\x41\x4f\x55\x34\x52\x22\x8e\x9d\x8a\x44\xc9\xda\xf8\x34\x9a\x4c\x13\xcd\xfd\xb1\x68\x36\x9f\x9a\xf9\xc2\xc9\x7d\x10\x78\x46\x19\xe0\x03\x31\x80\x60\xe0\x49\x57\x47\x9a\x8f\xed\x6a\xb0\x22\xc8\xc0\x11\x4a\x45\xca\xa9\xc4\xe5\x91\x13\x49\x8e\x86\x6b\x4b\x68\xab\x1e\x2d\x97\x39\x59\x5f\xc6\x10\x54\x2b\xb0\xca\xcc\x5b\x71\x74\x62\xc0\x71\xd7\x3f\x9e\x46\x32\x16\x5f\x8e\xdf\x81\x7f\xe2\xdd\x07\x57\x9e\x74\x63\xcd\x75\x12\x43\xf0\x2e\x7f\x3e\x15\xb7\x7a\x01\xc1\xcf\x15\x47\x5c\xb6\x23\x9b\xa0\xa4\xc8\xc2\x56\x4c\x05\x99\xe6\x78\x71\xfe\x54\x7f\x4a\x87\xc2\xea\x74\x33\xc0\x21\xb0\x46\x89\x31\xe1\x32\x26\x74\xbc\x86\x43\x7b\x9d\xc3\x08\xf5\xb6\x20\x95\x58\xa1\x1c\x91\x0e\x44\x46\x83\x2e\xbf\xda\x69\x45\x14\x14\xbb\x23\x1f\x86\xe5\xe4\xdf\xc5\x1a\x71\xad\xc9\xa9\xb1\x6a\xfb\xbc\xe5\x00\x66\x55\xe0\x1e\xa7\x0b\x3c\xc6\x9a\x87\x9e\x11\x69\x96\xd7\xa3\xf1\xf8\x38\xed\x95\x57\x82\x0f\x84\x8a\x09\xa5\x10\x94\x7b\xcb\x1e\xb9\xc2\xbd\x49\xdb\x3f\x87\x3b\x9d\xce\x7c\xbe\xdb\xe9\x1c\xb2\xec\x15\xcd\xc5\xa2\x51\xcd\x59\x51\xd8\xf4\x25\x9c\x48\x72\x3b\x34\xeb\x74\x4f\x31\x45\x74\x4d\x6b\x38\xb2\xb1\x7f\x1e\x59\x5b\x78\x46\xee\x86\x36\xa1\x98\x59\x3e\x89\x84\xc4\x0d\x70\xf3\x75\x41\x7b\x5a\xdd\xdd\x4b\x37\x9a\x0a\x49\x12\x37\x78\x0f\x89\x3b\xe0\xb0\xd5\x59\xce\x3e\x81\xbc\x75\x3d\x24\x06\xc0\xa0\xd9\x5a\x9f\xad\x26\xf8\xd9\xd3\xae\xdf\xb3\x59\xe3\x30\x88\x24\x9d\x69\xb6\x8b\xcc\x0c\xb1\xd9\xcd\x5c\xdf\x58\xda\x39\xb9\x77\x53\x14\x7c\xca\xf5\x41\xba\xb3\x50\x5f\x3d\x55\x62\x20\xa4\x0e\xf9\x38\x36\x36\xd0\xc0\xcc\x52\xe5\x06\xfb\xd4\x58\xcc\x6e\x3a\x03\x4c\x91\x7d\x97\xdb\x86\x65\xe9\x05\x12\x37\xe0\x45\x14\x46\x2c\xe4\x80\x3c\x1f\x12\x41\xfb\x64\x05\x3d\x4e\x6a\x3e\xb7\x0d\x05\x8e\x3d\xec\x2e\x5c\x9f\x7a\xf8\x54\x56\x42\x5c\xee\x47\x4a\x13\xba\xa8\x6b\x3b\xd5\x50\xd3\x0e\xf8\x9e\x76\x7d\xe0\x95\x29\x20\x99\x11\x0d\x85\xf3\x6d\x46\xbe\x0d\xf3\xfc\xf4\x48\xf7\x17\xb5\x26\xad\x8d\x33\x72\x7a\xd2\x0d\x3e\x36\x9b\x44\xb7\x98\x33\x71\xcc\xfc\x0e\x44\xfa\x33\x74\xec\x38\x16\xec\x7b\x2c\x46\xcf\x6f\xa7\x48\xd5\xf2\x48\x1e\x69\xa3\x59\x3f\x59\xaf\xf3\xcb\x64\x3c\x46\x83\x6f\x92\x96\xdc\x9c\x52\x16\xd2\x5d\xc4\x8e\x99\x99\x36\xd4\x24\x4b\xe1\x03\x11\x6b\x77\x7b\xbc\xd5\x3a\x94\xcd\x26\x86\xc3\x8a\x5b\x11\x90\x80\xd2\x66\x33\xda\x2a\x43\xf6\x0a\x84\x61\x1e\xc1\xd5\xee\xc2\x30\x0d\x57\x09\xcd\xf4\x0e\x33\x3f\x3f\x13\xe7\xe1\x45\x6f\x78\xde\x6e\x87\x17\xcc\x37\x8a\xb3\x8f\x6a\x73\x92\xa5\xf1\xfb\xee\x83\x38\xef\x5c\x80\xb0\x22\x02\x38\x1c\xe3\xa9\x7d\x1b\x8c\x92\x55\x9a\xcf\xe6\xe2\x15\xd3\x90\x26\x18\xd4\xe5\x65\xc5\x66\xcb\x4a\x3d\x48\x9d\x3c\xdf\x5d\x66\x00\xd5\x74\xcd\x70\x48\x82\x56\xeb\x9f\x2c\xc9\xb5\x90\x92\xe3\x85\xab\x11\x6a\xe7\x59\x18\x47\x7b\x17\xb2\x74\xd1\xca\x34\x52\xe5\x29\x9e\x72\xc8\x73\x75\xd1\xd3\xe7\xed\x36\x86\xb3\x5e\x6b\x22\xb0\xb1\x79\x9e\x7f\x6c\xae\x84\x02\x7c\xa9\x8a\x9d\x0b\x08\xe0\x38\x57\xf5\x29\xfc\xd8\xac\x09\xe9\x6c\x4c\xcb\x63\x59\x19\xd9\x9e\xcc\x65\x72\x90\x0d\xab\xa0\xe9\xfe\x99\xd5\x40\xf2\x00\x56\x7b\x78\x87\x43\x2a\xaf\x29\xad\x22\xce\xbd\xfb\x35\x78\x4a\x61\xe5\xc0\x7c\x5a\x6b\x01\xcb\xe6\xa6\x14\x75\x1b\x33\xe0\xfd\x8f\x0d\x25\xd5\xe1\xa1\x5c\xd0\xde\xd9\xda\x7a\xd5\x3f\xff\x29\x37\x64\x3a\xfe\x27\x7e\xee\x55\x12\x2c\x8a\x75\xc7\x21\xf3\xf3\x5e\xaf\xa5\x16\xea\x86\x8f\xcb\x56\xd0\x53\x49\xc4\xc6\xd3\x5e\x79\x21\x45\x6b\xe7\x71\xdf\x96\xa2\xdb\x1b\x33\xf2\x5d\x83\xf3\xa7\x6c\x34\x1a\x0d\x07\x66\xe4\x29\xfe\x72\x40\x96\xf7\x43\x7e\x2f\x97\xb8\x23\x97\x7a\x6d\x03\x5b\x46\xdd\xef\x18\x49\x96\x17\xfe\xa3\x5c\xf8\xf1\xc3\x43\x46\x24\x3b\xc3\xa3\x56\xcd\xa6\x3c\x64\xdd\x9d\x9d\x02\x56\xea\x02\x36\x07\x3b\x64\x8f\x3b\xcd\xe6\xc1\xfe\x21\x2b\xf9\x43\xd5\x6a\xc8\xfd\x87\xcd\xe6\xde\xa3\x0a\xa4\x2e\x41\x5a\x62\xe6\x73\xac\x67\x3e\x47\x24\xa5\xbb\x30\x74\x25\xbb\x40\x71\x01\x45\xe5\xbd\xcb\x4b\x37\x3c\xac\x29\x11\x94\xde\x3b\x0e\xda\x34\xa8\xf8\x6a\xf6\x11\x42\xcd\x26\x30\xd4\x8c\x54\x3c\x15\xa5\xc3\xc6\xca\x0d\x30\xbf\xf0\x00\x92\x75\x6c\x76\x47\x42\x0d\xd2\xdd\xee\x6b\x2f\xc1\xd8\x69\x6e\x46\xb8\xfc\x31\x01\xfc\xc7\x22\xb6\xe6\xc7\x9a\x73\x7d\x36\xaa\xb6\xbd\x83\x3b\x64\xdb\xd5\xac\xb8\x46\xf3\x32\x64\x48\xe0\xec\x0e\xdd\xeb\x3e\x68\x37\x80\x3b\x32\x44\xcc\xa0\x5d\x81\x39\x91\x13\x50\x8c\x83\x66\x02\xcf\x7f\xf8\xab\x34\xc7\x06\x16\x5a\x6b\x07\xce\x48\xa4\xc1\x66\x18\x46\xc3\x03\xce\x0c\x17\x41\xbc\x12\x95\x64\x12\x7e\x01\x9d\x2c\x63\x1a\x6b\xd6\x85\x81\x66\x3b\x70\xa3\x59\x07\xb6\xf5\x5a\xd9\xb1\xa0\x30\x59\xa9\xfb\xe6\x39\x20\xe0\x4a\x6f\x3a\x0f\x9c\xa7\xf9\xa5\x30\xdd\x00\xd8\x29\x03\x8e\x36\x00\x76\xcb\x80\xb3\x35\xa4\xa5\x27\xfe\xe0\x6e\xcd\xf7\x9d\xf4\xfb\xad\x66\x2f\xe1\xfa\x2f\x90\x1c\x69\x66\xea\x5d\xc0\x89\x66\x4a\xc2\xa9\x66\x1f\xe0\xb9\x66\x33\x09\xdf\x56\x0f\x48\xcb\x71\x16\xf0\x5d\xaf\xf7\x48\xfe\x01\x12\xbe\xda\x3c\xb3\xf0\x74\x2d\xdc\x31\x99\x91\xdf\xc1\xe6\x89\xa1\x70\xa9\xd9\x46\xa6\xdd\xd2\xf5\x34\xce\x02\xf3\xe9\x5a\x86\xc5\x3c\xff\x59\x4a\xe7\x32\x83\xc2\x1b\xcd\x7e\xc2\xbb\xbf\x40\xde\xcd\x52\x67\xe7\x2a\x79\x5a\x83\x84\x84\xa9\x76\x17\x6b\x88\x34\x96\xeb\x49\x26\x40\xb1\x04\x34\xe3\xa6\x82\x0f\x7a\xfd\xcc\x7d\x67\x67\xce\x99\x69\xe0\xab\x0d\x70\x6f\x0c\xdc\x8c\x7c\xd0\xd0\x81\xdf\x15\x51\xb4\xdd\xa5\x36\xd7\xf7\x59\x75\x08\xb2\xe0\xde\x92\x49\xdd\x29\x65\xf4\xae\x24\x00\x55\x7d\xe5\x75\x3b\x3b\x7b\xbf\x11\xd5\xc6\x0f\xb4\x55\x29\xd8\xa5\x6d\x4c\x16\xd9\x3a\xd8\xdf\xdf\x3d\x58\xc0\xeb\x35\x33\xf9\x52\x43\xa4\xd3\x89\xf5\xf1\xef\x90\x83\xae\xcd\x3a\x4d\x97\x44\x1a\x15\x4d\xa6\xeb\x7d\x97\x52\xcf\xbe\x6a\xc9\xf3\x6e\xf1\x7e\x87\x52\x54\x77\xe0\x78\x5d\xb7\x39\x7f\xca\x3f\x25\x71\x5a\xdf\x34\x91\xad\x2e\x6d\x11\x87\x36\x9c\xd6\x5b\x45\xbe\xea\x34\x91\x09\x7c\x5d\xd9\xa2\x19\xf9\x69\xba\xfb\x8c\x2e\xe0\xe7\x32\x72\xe9\xa5\x7c\xb1\x22\x03\x51\xf9\x08\x94\x44\xde\x5b\xf2\xc2\x7e\xcc\xf2\x71\x76\x6d\x32\x87\x22\xac\x36\x4f\xf7\x00\xb2\x74\x05\x08\xf9\x43\x11\xb3\x00\x70\xbb\x52\x29\xb3\x52\xce\xc8\x89\x06\xad\x4d\x87\x13\xa3\x35\x19\x5d\x1b\xd9\x2f\xe9\x3b\xae\xd3\xd2\x9e\x73\xfe\x0f\xcc\x56\xf6\x8f\x0b\xc7\x72\x3c\x37\x0c\x99\x1f\x11\x69\xe4\x1b\xf1\x59\xb4\x81\x0f\x01\x73\xce\x6d\x5f\xb9\x9c\xb6\x9c\x0b\xa7\x8c\x37\xd8\x84\x65\xc7\xcb\x4e\xe9\x70\xd3\xae\xc8\xf5\x71\xca\x44\xae\x9f\x9d\x0a\x0b\x19\x51\xae\xdf\x77\x4e\xaf\x44\xe3\x4d\x1c\x49\xf7\x99\x08\xa2\x81\x70\x23\x29\x3e\x0e\x1b\x5c\x37\xbe\xc7\x91\x74\x5a\x56\xfd\x70\xe0\x35\x36\xd3\x73\x96\x40\x1d\xda\x72\x1a\x43\x1e\x8e\x31\x27\x5b\x43\x5f\x89\xc6\x30\x1a\x8f\xa3\x99\xcd\x28\xf5\x4d\x93\xdf\x15\x89\xa8\x81\x9a\xf1\xbb\xd8\x73\x7a\x35\xc5\xc6\x28\x33\xd8\xa0\x10\x66\xe4\x95\x86\x63\x8d\xd1\x37\x0b\xc9\x38\x13\x2c\xc2\xdb\x57\x12\xa6\x4a\x4d\x4c\xb5\x50\xe7\x98\xcb\x46\x28\x75\xd4\xe0\x2b\x5a\x80\xa9\xed\x64\xd4\x98\x46\x71\x1c\xfa\xe1\x38\xd4\xa1\x88\x9d\x96\x6d\xf4\xfa\xf6\x6d\x39\xc5\xf6\x6f\x80\x03\x1f\x61\xb6\xf9\x74\xe0\x43\x86\xe5\x3f\xa9\xc8\x1f\x8b\x89\xad\xc4\x34\x19\x37\x59\xd7\x61\x6d\x39\x9e\x69\x26\x6a\x70\xde\x72\xd9\x51\x78\x23\xa4\xc5\x80\x70\x0e\x6d\x91\xb7\x8a\xcc\xc8\x73\x0d\x7b\x80\x5d\x97\xbe\x0e\x8c\xe8\x7a\xa6\x37\x1c\xfe\x2d\x2f\x5a\x10\x78\x1a\x06\x78\x50\x1a\x5e\xe2\x81\xec\x17\x9a\x7d\x86\xf7\x6b\x45\xda\x0f\xa2\xe8\x83\x1f\xd6\x88\xfc\xac\xd9\x0b\x4d\x66\xe4\xbd\x86\x1d\xd8\xdd\xa1\x14\xbe\x68\x76\x4b\x9e\x19\x61\xf7\x59\xc3\x4b\xf3\x1f\x85\x27\x9a\x85\xf0\x63\xfd\x42\x8d\x47\x9f\x21\x5c\xab\x8c\xdb\xba\x3e\x69\x76\x04\x6f\x35\xfb\x02\xbf\xaf\x5e\xbb\xb2\x6c\xb2\xf0\xc7\xda\xaa\xb2\x9b\x16\xfa\x98\xbd\x1b\xa4\x60\x2f\x40\x09\xb6\x0d\x5a\xac\x76\x54\xf7\x32\x83\x7d\x46\x94\x80\xdd\x1d\x90\xd6\x8f\xe5\x83\xb6\xf3\x2b\xed\x4a\xed\xf2\x45\x96\x01\x4f\x14\xab\xd9\x6b\x14\x19\x76\x55\x41\x23\x5d\xfc\x55\x3d\x2f\x34\x51\x0f\x76\x77\x72\x39\x93\xfb\xbd\x0b\x02\x5c\xde\x93\x6c\x46\xb4\x40\x49\x97\x61\x4e\x96\x31\x63\xd2\x40\x91\x61\xde\xdd\xf9\x4d\xb9\x02\x04\x7b\x9b\x8e\xd8\xee\x0e\xe8\x76\x97\x52\x90\x4c\xf6\x0d\x0f\xba\x23\xea\x29\x77\x04\x06\xbb\x30\xd8\x4d\xe9\x5e\x7e\x7e\xfb\x99\x86\xdf\x0d\xd4\x90\xb6\x34\xcc\xc8\x1f\x18\x3a\xff\xdb\x67\x4d\x11\xb2\xc8\xaa\x57\x86\x4c\xb9\x00\x3f\x53\xe0\x82\x3d\x87\x40\x6c\xd8\x89\x49\x17\x6d\x75\xd8\x29\xda\x9d\x08\xd8\xea\xc2\xfd\xc8\x13\x20\x3c\xfd\x60\x77\x67\xde\x81\xa1\x97\xa4\x2e\x16\xce\x52\xcd\xea\x8e\x3c\xc1\x36\xa1\x03\xa6\x67\x54\x4b\xc5\x54\xdb\x34\x92\x69\x10\x76\xb4\x38\x08\x0a\x09\x4b\xf0\xc4\xf2\xca\x0e\xeb\x1c\xca\xfc\x14\xe9\xbf\xef\xee\x80\x60\x88\x57\x83\x6c\xeb\xd2\xfe\xde\x0d\x09\x84\xa9\xa9\xad\x4d\x0d\x12\xce\xa0\x08\xf7\xf8\xa2\x0d\x37\x8b\x15\x3c\xba\x25\xdd\xed\x05\x0c\x05\xf3\x25\xf8\x82\xc5\x12\x62\xb1\x59\x81\x1b\x57\xbf\xaf\x58\xb8\x32\xce\xae\x05\x68\x75\x6b\x81\x59\x3b\xb9\xbc\xca\x6e\x37\x5b\x2c\x60\x20\x18\xd7\x70\x23\xd8\xe6\xb3\xf8\xf7\xfc\xc0\xe3\xe0\x07\x9e\x02\x9e\x78\x02\xfc\xc4\xd3\xe0\xdf\x79\x12\x82\x53\x0f\xfb\x72\x5b\x30\x2d\x61\x22\x36\xcf\xcb\x2b\xc1\xa4\x84\xa9\x58\x2b\x08\x0e\xbb\x7d\xe5\xdd\x91\x2b\xc3\x7b\x13\x7b\x4c\xd1\xb0\xcd\x48\x30\x2e\x61\xb6\xb1\x9c\xe3\xd8\x82\x1d\x48\x6f\x52\xb9\x13\x6b\x8e\x4f\x75\x30\x4e\xa6\xa2\xd6\x80\x60\x7b\xbb\x78\x58\x61\x6f\x9f\x31\xdd\xef\x7a\x1d\x48\x98\xe8\x25\x45\x68\x53\xab\x55\xc4\xdf\xd6\x12\xb4\x63\x50\x64\xba\x4d\x95\x9f\xe6\x3a\xd2\x3d\xc5\xba\x9d\xdf\x54\x8b\x97\xb6\x63\x12\xc6\x44\xff\x48\x7b\xd7\x9a\xd8\x9a\xda\xca\x53\x74\x01\xb7\xeb\xe6\x44\x38\x24\x81\xa9\x64\x3e\x9f\x91\x6d\x01\xce\xff\xe5\x40\x42\x4b\x75\x58\x8a\x66\x64\x24\xc0\xf1\xcc\x37\xa4\x26\x5d\xc7\x39\xae\xe3\x55\xe0\x80\x71\x3c\xf7\x79\x27\xc8\x8c\x4c\x05\x04\xad\x2e\x66\xeb\x49\xc5\x0d\x2f\x4c\xc7\x23\xdd\xe3\x2c\xf7\xb9\x5e\x6b\x32\x24\x37\x02\x75\xd9\x99\xb0\xd1\xc4\x3c\x3b\xdd\xb2\x58\x02\x4a\xe0\x48\xe7\x5f\x29\x5c\x8b\x95\xab\x91\x6d\x9d\xa8\x37\x28\x49\x1b\xf4\xc0\x01\xeb\x81\x4a\x4c\x83\x12\x96\x14\xf9\xb4\x6e\xc8\xad\xa5\x65\x6a\x38\x55\x50\xc4\x88\x94\x25\x65\x82\x52\x30\x83\x29\x4b\x66\x01\x47\x62\x85\xc1\x60\x29\xd1\x75\x4a\x44\x4a\x49\xdf\x01\xab\xfa\x09\x9b\x66\x54\x14\x94\xdc\x92\x6b\x53\xc5\xb5\xb6\xfd\x29\x5a\x5d\xd0\xd4\xd0\x83\xd4\x08\x74\xd8\x56\x41\x6d\xcf\x18\x52\x4e\x56\x8a\xa0\x40\x97\xf2\xc3\xa6\x84\xe8\x94\x90\x7f\xcb\x92\xe0\x1a\x93\xe9\x5e\x33\x5d\x10\x72\x47\x8e\xca\x84\xe8\x56\x17\x93\xa1\x21\x19\xba\xbc\xd5\x91\x02\x1e\xa5\x97\xd2\x9d\x0a\x26\x24\x3c\x17\xab\xf5\xe9\x53\x01\x78\xcd\x96\xf7\xe0\x81\x03\x92\xf6\x67\xe4\xc4\x4c\x32\xac\xe2\x21\x48\x4a\xbd\x02\x26\xae\x00\x75\x2d\xd0\x23\x04\x32\xea\xfe\xb7\xe5\x19\xd9\xeb\xd1\xce\x02\xbe\x0b\x76\x24\x41\x4a\xf6\x5d\x98\xc9\xf8\x74\x2d\xb3\x88\x22\x41\x8c\x40\x2e\x16\xf6\xf8\x09\xcf\xde\x5b\xee\x8e\x18\xb7\xef\x23\x3b\x5a\x11\xc2\x46\x25\x58\x0b\x51\x4a\x9a\x92\xc0\x0c\x43\xce\x66\x18\xd1\x85\x97\x29\xb8\x1c\xf6\x3b\x9d\x43\xdd\x47\x33\xc9\x90\xf1\x5a\x1b\x15\xd5\xbb\x25\x4f\x85\xf5\x9a\xb4\xba\xa8\x84\x16\x5d\xbb\x8c\x4a\xad\xf9\xaa\xea\xaf\xab\x17\x27\x5c\x8a\xf5\x5b\xed\x79\xfd\x1d\xcb\x45\x6f\x2a\x5c\x54\xbe\xea\xe5\x8e\x5c\x0a\x58\x1f\x07\xa4\xc1\x5e\x02\x96\x3b\x57\x28\xbc\x13\xec\xb9\x84\x0f\x62\x5d\xd0\xc8\x8c\xbc\x13\xab\x76\xd8\xbe\x0b\xa2\x30\xea\xc6\xa2\x79\x55\x21\x5f\x63\xf0\xd9\x6a\x14\xea\x57\x50\xcf\xd2\x7b\x7f\xe9\xc2\x4c\x61\x5b\xc5\x99\x60\xc7\x12\x5e\xaf\x5d\x14\x2e\x25\x41\x8c\x67\xc2\xb6\x91\xda\x5b\x06\x36\x78\x9a\x3e\xac\xac\xbe\xb3\x00\xa2\xd8\x8c\xbc\x11\xf0\x3a\x45\x05\xd8\xaf\xaf\x04\x89\x34\x85\xef\x82\x9c\x51\x48\xad\x52\xb1\xa1\x02\x64\xee\x05\x85\x63\xb9\xde\xbb\xf2\x41\xa4\xcb\x57\xef\xa3\x74\x4f\x79\x7c\xcd\xee\x7d\x4f\x4a\x08\x3c\x2e\x8d\x92\x2e\x41\x78\xc7\x12\x86\xf9\xb9\xe4\x22\xa8\x48\x94\xf4\x07\xfe\xce\xdb\xea\x82\xff\xdd\x73\x1c\xf0\xaf\x2b\xd9\x4e\x8f\x2b\x70\xc2\x9b\x46\xe0\x7f\xab\x40\x7c\xad\x40\x9c\x7a\xc7\x82\x38\x0e\x05\xfe\x35\x7b\xba\xf1\xee\xf9\x77\xef\x48\x03\xbf\x36\x7f\x83\x5b\x4f\x02\x9f\xe2\x0b\x85\x7f\x7f\xe2\xdf\x23\x9c\xf4\x71\x5e\xfe\x2c\x7b\xf2\x07\xe6\xbb\xff\x39\xfb\xfd\xc6\xdb\xea\x96\xb3\xf7\x95\xea\x27\x33\x72\x1b\xa1\xf8\x46\xa9\x72\x17\x41\x17\x24\xf5\x24\x6d\x39\x0f\xf8\x34\x7c\x70\xb3\x53\xba\x1f\xf0\x99\xd8\x98\x06\xf6\x65\xf5\xf3\x7e\xed\xf3\x0b\xb1\xca\xcd\x56\x64\x97\xab\x7e\xde\xad\x7d\xfe\x2c\x36\xe6\x98\xfd\x52\xfd\xbc\x57\xfb\xfc\x64\x73\xdd\x3f\x36\xd7\xfd\x69\x33\xf2\xb7\x9b\xdb\xfd\xfb\x66\xca\xff\xd8\xdc\xa9\x32\xd9\x48\xb9\x4a\x36\x96\xd6\xc9\x46\xca\x45\xb2\x91\xf2\x24\xd9\xd8\x2d\xbc\x46\x5a\xbd\x65\xc1\xe6\xe2\x51\x52\xde\x2b\x47\x23\xc3\xb6\x0e\x56\xae\x93\xef\x23\x63\xa4\xcc\xc8\xef\x51\xea\xf6\xb4\x4e\xa1\x02\x5f\x98\x6c\xbe\xd9\xf8\x8e\x7c\x46\x14\x76\xff\xb8\x48\xef\x91\x54\x12\x8e\x3e\x89\xea\xfb\x92\x23\x32\x41\xb1\xa4\x69\xe6\xb3\xbb\x13\xa5\x3d\x69\xe5\x6e\xf7\xa3\x84\xfc\xe3\xb5\xb4\x17\x4b\x84\x52\x8b\x91\x50\x5e\xc3\xf9\x47\x4b\xb6\xfe\xe1\xfc\x83\x7a\x41\x88\xf1\x06\xd9\xf2\x13\x25\x24\xcd\xf6\x2d\x06\xd6\x35\xa3\x69\x8b\x38\x8d\x41\x38\x0a\x75\x0c\x98\x46\x7f\x14\x69\xfb\x09\xeb\x36\xb2\x0f\x92\x90\xe8\x90\x28\xdc\x91\x2c\x52\x92\x26\x65\xe3\xa7\x74\x13\x70\x42\x64\x71\xd0\x96\xe3\xc9\x0b\x1f\x02\xb6\x85\xca\x6e\x6f\x45\x2f\xd9\xa6\xdd\x90\x69\x08\x09\x48\x0c\x28\xf0\x5f\x82\x74\xf9\x09\x6e\x9b\xe0\x5e\x26\xc7\x1b\x9f\xec\xad\x8e\x41\x7e\x00\x8e\x68\x68\x77\x8d\xf4\xa8\x0c\x11\xa7\xd4\xc3\x2e\x0f\xa0\x03\xf7\xfc\x04\x1d\x21\x45\x6a\x04\xdf\x58\x38\x2f\x3d\x61\x46\xdc\xe5\x8b\xf2\x88\x8c\xcb\x8c\x31\x0a\xc9\x8c\x5c\x85\x36\x0b\xec\x23\xe4\x8f\x72\xfb\x07\x65\x58\xd3\xb1\xd9\x30\x0c\xf8\x9d\x67\x7b\xb0\xb2\x43\x77\x53\xee\x2f\x32\x23\xb3\x10\xf6\x40\xd2\xf9\x7c\x0b\x9f\xbb\x9d\x0e\x48\xf4\x22\x9a\x0f\xf8\xa3\x54\x78\xbb\x54\x98\x10\xd9\x66\x5d\xfa\x60\x6f\xde\xa1\x6d\x22\x1f\x74\x3b\x9d\x79\x87\xb6\x88\x7c\xb0\x87\x4f\xa5\xd4\x3a\x7f\xc9\x97\xd7\xa6\x79\x6f\x23\x8c\x7e\x2d\xb2\x6d\x24\x15\x98\xe7\x61\x65\x40\xfc\x9b\x72\x7e\xf8\xa4\x32\x53\x9e\x86\x70\x1a\x56\xb6\x16\x47\xc9\x2f\xee\x4b\xde\x91\x57\x21\x26\xe4\xb7\x57\x06\x18\xc3\x33\xaa\x60\x9a\x95\x31\xc9\xbe\xa3\x55\x22\x1c\xcf\x19\xf2\x71\x2c\x4a\x2b\xc5\x5d\x05\xcc\xdd\x9e\xcf\x1d\x67\x2b\xbd\x7f\xda\xac\x5a\xc5\xb1\xf0\x32\xe0\x7b\x33\xd6\x97\x11\x7c\x0e\xe1\x54\x13\xd9\x72\x98\x53\x61\xf6\xeb\x64\xed\x0e\xa5\x73\xe9\xd8\x14\xd5\xb5\xad\xca\xa3\x0a\x21\xac\x60\xa5\xc7\x96\x95\xaa\x13\x83\xc9\x4a\xf8\xca\xbf\x60\x56\xcc\xe7\x9d\x43\x76\x47\x64\xb8\x4a\xa8\xe9\x0a\xed\x0b\xc0\xbb\x10\xfe\xcb\x13\xa9\x97\x47\x7d\x95\x32\xb4\x57\x39\xe4\x93\xe9\x04\xa7\x7c\x4f\xef\x69\xb2\x71\x91\x7a\xbe\x79\x99\xf9\x56\x9e\x18\xd2\xdd\xee\x9f\x26\xde\xf3\x84\xda\x1b\x1c\x8a\xd3\x82\x9b\xeb\x78\xba\xb9\x8e\xcb\x6a\x13\xd4\x10\x24\xc8\x61\x39\xe1\x7a\x15\x20\x1b\x68\x8b\xa7\x04\xf7\xae\x0c\x17\x27\xe4\x4d\x52\x15\x11\x1f\xca\xf3\xf5\x28\x24\xc7\xe4\x7c\x46\x06\x21\x04\x21\xf9\x9e\x90\x0e\xa5\xf0\x2e\x21\x27\x09\xee\x93\x00\x7e\xc9\x3e\x3f\xc5\x97\x70\x99\x90\xe5\xc1\x76\xfe\xfc\xd3\x8e\xf2\x3a\x80\xad\xce\x22\xc3\xf7\x0b\xa8\xec\x39\xc5\xfc\x1a\x60\x7a\x51\x6e\xc1\xab\xda\xec\x4b\x1d\x22\xd5\xd1\x38\xab\x02\x61\x48\x90\x4c\x63\xe9\x8b\x94\xe4\x35\xa0\xe2\xcb\xc7\xa4\xbc\x87\xe5\x7f\x2b\x42\xc7\x82\x57\x2d\x63\x20\x0f\xc1\x71\x60\x46\xde\x87\x90\x68\x38\x4b\x8c\x14\x1f\x02\x4e\xef\xd7\x09\x7c\x32\x75\x7d\xa4\x14\x7e\x84\x66\x71\xc3\x65\xb2\xa5\xcc\x3f\x25\x45\xba\x5a\xc3\x4f\xf4\x2a\x7d\xc1\xdd\xa3\x13\xcc\x14\x76\x8a\x93\xf7\x18\x33\x8b\xbf\xc2\xfd\x01\xce\x41\x2e\x6f\x2b\x4d\x86\x39\x3d\x01\x4d\xe3\x0a\xb7\x8b\x7b\xce\x64\x39\x8d\x38\x9a\x21\x48\xe5\xc7\xc4\xfe\x7b\xad\xe1\x4b\x48\x9c\x61\x38\xd6\x42\x19\x79\x94\x6e\x2d\x45\x6c\x46\x5e\x84\xab\x75\x95\xdb\x24\x13\xa2\x74\x01\xaf\x88\x84\x63\x72\x7e\x49\x9c\x38\x1c\x0b\x19\x88\x81\x83\x3e\x84\xc4\x52\xb5\x85\xee\x0c\x33\xd6\xc4\x09\xe5\x55\xe8\x87\x7a\x19\x42\x64\x10\x93\x64\xc5\xd7\x24\xfb\xca\x03\x8d\x69\x9d\xca\x9f\x3b\x46\x80\xd8\xcf\x4a\x04\x22\xbc\x11\xca\x81\xbb\x94\xbd\x88\x33\x52\x51\x32\x75\x20\x32\x1c\x94\xeb\x05\x9d\x43\xdc\x2c\xea\x3b\xfd\x6c\x0f\xa5\x69\x40\x3c\xa7\x24\xe2\xbf\x26\xa9\x7e\xd4\xb6\xc7\xe7\xb6\xe7\xf3\xf4\x69\x50\x7a\x16\x45\x4f\xcb\x5e\x01\x2c\x2c\x90\x7d\xe0\xc5\x28\x0f\x70\x90\x05\x64\xdb\xd3\x1a\xd3\xc7\x6b\x4c\x1f\xaf\x5d\x51\x38\xa7\x2e\x43\x63\xa8\xa0\x3c\x0e\x00\x7f\xda\xe3\xcd\x18\x13\x82\xc9\x62\x04\xcd\xde\x67\x49\x46\xf3\x94\xd6\x58\x51\x98\x56\x14\x62\x45\xa1\x1b\x80\x66\x84\xb3\xd0\x1d\x50\x53\x9e\x71\x57\x40\xc0\xc2\x5a\xa5\x1d\xe0\xae\x0f\x3c\xab\x74\x89\x86\xc8\xf5\x21\x72\x03\x88\xdc\x01\x44\x86\x06\x4d\x33\x48\x43\x86\x42\x32\x0a\x4b\xec\xbf\xd2\x87\x83\xac\x0f\x07\xcb\x7d\x68\xba\x40\x60\x03\x13\xbc\x32\x97\x33\xe1\x06\x10\x30\x61\xc8\x62\x62\xa9\x27\x43\x5c\x05\x87\x6c\x45\x6f\x6a\x5c\xdd\x8a\xde\xcc\x12\x0c\xd8\xde\x2c\x17\x14\x8c\xe0\x75\x58\x14\xab\x25\x66\x5e\x09\x8a\x95\x4b\xac\x5c\x62\xe5\x72\xa9\x47\xb3\x60\x99\x94\x16\xa2\xcc\x80\xd3\x95\x83\xd9\x85\x10\x86\x20\x96\x68\x29\xf5\xe9\xb3\x25\x5d\xe7\xcb\x10\x26\x55\x2d\xe6\x65\x15\x66\xe2\xe7\x9b\xf4\x85\xb5\x5a\xd3\xa9\x7c\xb8\x0f\x84\x31\xfa\x83\x8f\xc6\x9a\xae\xc0\xbe\xaf\xc2\x7e\x43\x2d\x21\x32\x0d\xc1\x7f\x8d\xda\x31\x1d\xc2\xa5\x0f\x2f\x12\xe2\x9c\xb7\xcf\xff\xfc\xf3\xe2\x7e\x41\xe8\x6f\xad\xbe\x0b\x7f\xfe\xf9\xe7\x9f\xff\x63\x7b\xfe\x6f\x7f\xfe\x19\x5f\x38\x94\xc2\x1d\x79\xe3\xa3\xdf\xf5\x32\x5a\x7d\x18\x27\x78\xbb\x30\xda\x91\x59\x04\xa8\x75\x8b\xd4\x0d\xa1\xcf\x75\xc9\xee\xdc\x67\xd3\x18\x30\x76\xed\x8d\x30\xd2\x4d\x52\xda\x72\x16\x4e\x65\x52\x7f\xd9\x6c\xb2\x3d\xa9\xad\xe0\xf5\x25\xfc\x47\xcd\x22\xac\xaf\xe1\x9f\xaa\xdf\x1f\xd7\x0d\xe9\xea\xe7\x47\x75\x43\xfa\xd7\xb5\xd8\x5b\x59\xd5\x62\xef\xab\x03\xf6\x47\x19\xd3\xef\x09\xb1\xe2\x59\xf2\x89\x70\xe0\xcc\x27\x66\xd4\xac\x74\xb4\x69\x9d\xd2\x77\xdf\x52\x21\x1d\x1f\x8b\x91\xb8\x75\xe0\xad\x59\x48\xfc\xab\xec\xed\xf3\x1f\x09\x1f\x9b\xee\x9d\x0e\xe1\x99\x6f\x97\xbe\xb7\x43\x43\xc3\x88\xd6\x16\x68\xc9\x57\x87\xc3\x29\x5e\x2c\x79\x33\xf2\xd2\x30\x42\x77\x6f\xaf\x43\x5b\x0f\xbb\x8f\xf7\x0e\x1e\x19\x09\xa5\x0e\x3b\x7d\xd5\xee\xee\x1d\x74\x1e\x1f\x78\x8a\x3e\xc0\xa7\x87\xf3\x8e\x99\xa5\xf6\xf5\xc3\xdf\xb4\x99\x7e\xa2\x4d\x04\x7e\x45\xb3\x44\x3c\xd8\x3d\xd8\xdf\xb1\xc6\x8a\x7d\xfd\xf8\x60\xde\xa1\xd4\xbc\x9e\x67\xd1\xb9\xf7\xfc\x77\x8f\x48\x26\xda\x64\xf7\x60\xff\xb7\xa4\x45\x92\xd4\xbc\x49\x52\xf3\x86\xd2\x36\x21\xdd\xfd\xdd\xdf\x88\x62\x64\xff\x37\xd9\xda\xa1\x0f\xba\xfb\xbb\xa6\x86\x1d\xfa\x60\xdf\xfc\xdb\x05\x3e\xf5\x04\x53\x2d\xa2\x0e\xbb\x9d\xfe\xae\xd7\x7e\x4c\xc1\xdf\xf5\x92\xd6\x5e\xa7\xf3\x9b\x6e\x91\x9d\x43\xd1\xef\x78\xdd\xb2\xa9\xa3\x79\x65\xfe\xc8\x18\xf6\x60\x46\x74\x0c\x22\x46\x2e\x25\x4e\xdb\x30\xb0\x8c\x61\x07\x56\x6d\xd6\xd5\xb7\xea\xba\xb5\xad\xba\x9d\xda\x56\xdd\x6e\x2d\x33\xc3\x5e\x2d\x8f\xc3\x7e\xed\x38\xfa\x41\xf5\xf6\xc3\xc6\xc3\xda\xcd\x83\x8f\x6a\x89\x00\x1e\xd7\xae\xca\xea\x76\xea\x57\x5f\x75\xbb\xf5\xdd\xc2\xee\xce\x62\x41\x66\xe4\x93\x9f\x36\xba\xda\xea\x19\xf9\xec\x17\xbd\x71\x5a\x7a\xff\xa5\xf4\xde\x2b\xbd\xff\xb1\xe6\xbd\x2a\xf5\xaa\x9b\xbe\xdf\x85\x19\x79\x92\x57\x8c\xff\x6b\x39\xdf\x4a\x62\x41\xf0\x8a\x2a\x76\x65\x73\x98\x5a\x71\xef\x8f\xa8\x59\x86\x8a\x7d\x92\xfb\xe0\x95\x87\x72\xef\xa3\xb7\xa5\x9a\x4d\xbc\xdc\x7c\x3e\xd7\x7d\x7c\xde\xf1\x76\xbd\x2e\x3a\x44\x5d\xff\x5b\xd9\xd5\x54\x99\x11\x87\x9d\x54\x65\x1d\xc7\x64\xe5\x44\xaf\x07\x13\x49\x34\xc3\x54\x29\x36\xa8\x71\x49\xd4\x03\x31\xef\xf4\x65\x8b\x7c\xd3\xf6\x99\xb6\x88\x6e\x39\x0d\x87\x52\x0f\x77\xd9\x42\xbb\x7d\xb0\xc0\x09\xec\x00\x0f\x8d\x21\x00\x83\x98\xe2\x49\x8f\xc2\xcf\x55\xa2\x6d\x2b\x77\x19\x34\x9b\x5b\x65\x9f\x41\xe6\x41\xb0\x4e\x83\x92\x13\xac\xdc\x30\x33\xad\xac\xdf\xc0\xa8\xc8\x93\x18\x24\xec\xd1\x76\xfa\xd4\xed\x74\x68\x2b\x7b\xdb\xe9\x94\x29\x88\xf8\xff\x1f\xd9\xbd\xf0\xdc\x95\x9b\x87\x71\x0f\x5d\xc3\x89\xf7\xd5\x66\x75\x6a\xcd\xea\xd6\x9a\xb5\x53\x6b\xd6\x6e\xad\x59\x7b\xb5\x66\xed\xd7\x9a\x75\x50\x6b\xd6\xc3\x5a\xb3\x1e\xd5\x5b\xf5\xb8\x7e\x55\x5d\xb7\xb3\xd4\xcc\xb2\xdf\x7d\x58\x9a\x45\x44\xb0\x19\x99\xe1\xb0\xa3\xcc\xc6\xdb\x9a\xa4\x99\x51\xf8\xda\xe8\x6c\x28\xb0\xf1\xbd\xce\xc1\x8d\xaa\xd4\xdd\x3b\xe8\xe2\x6b\x51\x81\xcd\x95\x77\x23\x67\x55\xab\xdb\xe9\xfc\x26\x5b\x7b\xbf\xe9\x96\x70\x79\x8b\x08\xd7\xef\x77\xbd\xb2\x5b\xca\x2f\x53\xa3\x98\x21\x8e\x29\x26\x29\xdc\x73\xed\xc9\x76\xc0\x89\x42\xc1\xad\xca\x01\xd3\xa3\xd8\xe8\x85\xbb\xa8\x1e\x72\x5d\xc2\x16\x97\xd9\xfc\xd1\xc1\x9e\x40\x46\x7f\xd8\x7d\xdc\x3d\x28\xdf\x13\x33\xe6\x95\x25\xfc\x4d\x0c\xdd\x5d\x2b\x77\x4a\x2e\x3d\x5e\x8f\x09\xef\x4f\x34\x71\x4e\xae\xa2\x64\x3c\xc0\x1b\x7c\x7d\xd1\x10\x93\xa9\xbe\x73\xa8\x37\x23\xaf\x63\xd8\xd6\xc4\xf9\x5d\x45\x72\xd4\x78\x7d\xf2\xf1\xd1\x41\xa7\xdb\x18\x46\x6a\xc2\xb5\x43\x61\x5a\x33\xee\x6f\xca\x04\xbc\x23\xd7\x11\xdc\x1f\x1b\x41\xb3\xd5\xa1\x70\x92\x3d\x9c\x66\x0f\x5f\xb2\x87\x57\xe6\xe1\xb3\x31\xa9\xde\x08\x10\x1c\xe5\x64\xd9\xa7\xb0\x5d\x46\x1b\xa0\xdc\x92\x94\x6e\xa2\xbb\xea\xa6\x9a\x54\x04\x6c\xf0\x0a\xcd\xa0\x8f\x56\xb8\x7d\xab\x86\x4a\xa6\xd3\x44\xd7\xa5\xc0\x25\xd9\xea\xc2\x56\xa7\x9e\x1e\xd4\xbe\xee\xd6\xd3\x08\x5d\x92\xad\x0e\x42\xd7\x18\xd6\xbe\x37\xab\x33\xa1\x98\x97\x31\x97\xea\xfe\xc8\xf4\x41\xe2\xfa\x14\xfc\x2b\x4f\x82\x1f\x79\xca\x08\x72\x51\xf6\x59\x56\xd7\x89\x2c\xb7\x56\xea\xfb\xf3\xbf\x63\x87\x7c\x1a\x0b\x43\x4a\x10\x4d\xa6\x63\xa1\x45\x83\x0f\x06\xa1\x1c\x61\x08\x1e\x9e\x9e\x32\x56\xb6\xa7\x5c\xbf\x3f\xd3\xb6\xbf\x27\x78\x3f\xa8\x67\xca\xbe\xb7\x00\x71\x83\x2b\x81\x99\x32\x42\x25\x06\x65\x3f\xd6\xb4\xca\x60\xbf\x9b\x45\x4f\xc4\x70\x4b\x7e\xc4\xd0\xed\x1a\x2b\x2c\x06\xe4\xbb\x9d\x6c\xb9\x2b\x79\x49\x97\x99\xb3\x5b\x67\xce\x19\xdf\xb8\x1d\x73\x57\xed\x00\x6b\xce\xf2\xaf\x76\x20\x3f\xa3\xd7\x82\x9f\xa1\x41\x14\xa3\x41\x74\xd3\x2b\xb6\x01\x67\xe4\x6a\x0c\xdb\x46\x69\xe5\xa7\xb8\x1b\x98\xbd\x30\x26\xa4\x17\x40\x6c\x5f\xdc\x8c\x81\xe3\x66\x1f\xfe\x7a\x1f\x9b\xa9\xfd\x8d\x42\x82\xdb\x7e\x0a\xfc\xcf\xf6\xc3\x00\x23\xb1\x6a\x3b\x7f\xb7\xe5\x16\x1a\x2b\x92\x48\x86\x63\x46\xdd\xed\xfe\x64\xec\x99\xd6\x55\x9c\x44\xd7\x7c\xe3\xfe\xd1\xd1\xe6\xde\x38\x29\x57\x77\x35\x24\x47\xe3\xea\x64\x3c\xdd\x5c\xfc\x39\xdf\xec\x74\xdc\xfc\xf9\x7b\x45\xa3\xa8\x26\xd8\x29\x39\x1d\xab\x52\x10\x95\xf7\x33\xab\xbb\xcf\xc8\xfb\xb1\x8d\xb1\xc8\x6d\xb7\x3f\xff\xec\x5b\x0f\x90\xcb\x0f\x28\xa5\xae\xdf\xbf\xc4\x54\xf0\xca\xf5\xad\x03\x2d\x0b\x38\x55\xae\x8f\x31\x19\xd4\xbb\x24\xce\x03\x07\x8e\xf2\xf3\x47\x58\xc9\xf1\x18\x5e\x8c\xe1\x1d\x91\x70\xcf\x0f\x70\x2f\x37\xf1\x0c\x9e\xe0\xd4\x30\xfe\x82\xe2\x78\x7c\x8b\xcc\xbb\x92\x03\xb4\x44\x2a\x92\xdd\x5b\xca\x9c\x96\xad\x7d\x99\x6d\x66\xca\x57\x57\xc1\xd4\xac\x2a\x3e\xec\x78\x15\x73\xac\xf8\xb0\xeb\x95\x2f\xe9\x2f\x7f\xe9\x14\x5f\x0e\x2a\x1f\xf2\xa5\xf5\xc9\xb8\xb6\x96\x7e\x19\xd7\x16\xdb\x1f\xe3\xba\xe4\xf9\x3c\x2e\x0d\xde\x1b\xbe\x71\x63\xf2\x1d\xdf\x6c\x87\x7e\xa8\x7e\x7f\x58\xfb\xfc\x8a\x6f\xb4\x33\xcf\xaa\x9f\x0f\x6a\x9f\x5f\x97\xc6\xe1\xa3\x2e\xed\x04\x76\xd3\x6b\x4d\xa4\x67\xcc\x23\x54\x49\xa9\x6b\x0c\xc1\x4f\x21\x44\x98\xd0\x99\x56\xef\xf5\xfd\x58\xb5\x7b\xf4\x00\x8e\xc9\xb9\x1c\x10\x87\x8f\x85\xd2\x0d\xfc\xdb\x9e\x71\x25\x43\x39\x72\xe8\x05\x35\x9f\x93\x01\x41\x02\xaa\x06\xe5\x71\x19\x93\x4a\x88\x36\x4b\x95\x3f\xc0\xb0\x4e\x54\xc7\x39\x7c\xf4\x3a\xa9\xde\xbd\xa8\x48\xbd\xaf\x55\x22\x06\x03\xc8\xee\x9d\x88\x45\x75\xba\xfe\xac\x42\xfe\x31\x06\xe7\x4a\x89\xa1\x03\x0f\xfe\xc7\x77\x7e\xc3\xed\xfd\x2f\xde\x83\xd0\xd5\x22\xd6\x84\x48\x26\x69\x7e\xda\xf3\xc1\x9f\xf1\x83\x11\x38\x0e\xa5\x98\x74\xb8\xec\xaf\xa9\x62\x7d\x23\xea\xfb\xaf\x25\x67\x6d\x62\x7b\xb1\xee\xb2\x9d\x62\xc7\x21\x79\x70\x3b\x20\xce\xa5\x3f\xe6\xf2\xba\xd4\x63\x12\x7b\x0b\x5e\x9b\x09\x3a\x1b\xc0\x1d\x26\x73\x3b\xab\x74\xc3\xcb\x8a\xe4\x36\xba\x98\x2c\x07\x30\x9d\x0c\xe0\x0c\x70\x27\xe0\x28\x1f\x25\x2d\x6e\x75\x5b\x46\x33\xc5\xa7\xa5\xba\x54\xcb\xf1\xcc\x4f\x0a\x33\x72\x9d\xc3\xce\xda\xdd\x4e\x07\xa1\x9e\x2d\x8f\xde\x0b\xbe\x29\x22\x6c\x3e\x5f\x19\x00\x36\xcd\x71\xfb\x5a\x36\x7c\x2d\xdb\x51\xa2\xc7\xa1\x14\xed\x50\x0e\xa3\x86\x1f\xa9\x81\x50\xed\x8e\x43\x01\x3b\xc6\xd2\x37\x23\x71\x5e\x6c\xc8\x1b\x43\xde\xc6\x12\xc1\x15\x57\xba\x31\x51\xed\x1d\x24\xf1\x8c\x42\x32\x20\xce\x49\x94\xa8\x40\x60\x5b\x3c\xf3\xbb\xbc\xce\xbe\xdf\xdc\x5d\xba\x4c\x5c\x1b\x7d\xcc\x88\xbe\x31\xf1\xd3\x3a\x90\x18\xb1\xd4\x86\x78\x92\x51\xae\xc2\xd1\x95\x6e\x77\x1a\xd8\xcb\xd6\xed\x6d\xba\xf4\x66\x00\x4e\x12\x0b\xd5\x8e\xc5\x58\x04\xda\x01\x27\x94\xa1\x0e\xf9\x38\xff\xda\x9e\x44\x3f\xdb\x7f\x01\x32\x13\xfe\x75\xa8\xff\x02\x2a\x25\x24\x88\xc6\x91\x72\xc0\xf9\xb7\x20\x08\x2a\xe3\xfc\x0f\x96\x6f\xf1\xdb\xe1\x1e\xae\x6c\xce\xa8\x3d\xe4\x03\x31\xa8\x0c\x51\x2c\x82\x48\x0e\xb8\xba\x73\x28\x7c\xe5\xe4\x98\x93\x4b\x8c\x02\xa3\x14\x26\x03\xe2\xbc\xc0\xcd\x86\x86\x7f\xd7\xd0\x57\x61\xdc\x18\x73\x5f\x8c\x4b\x55\x3b\x2d\x1c\x94\x0a\x0f\x7d\x2e\x6b\xcd\xff\xf6\x20\xdd\x6a\x88\x1f\x48\x31\xeb\xdb\xbd\x0b\xe6\xb4\x3e\x87\xe4\x73\x4d\x21\xfe\x52\x1a\xc8\xb3\x84\x48\xd7\x3f\x71\xfd\x8f\x95\xe8\x86\xbf\xc9\x6b\x9f\x39\x59\x9a\xc6\xb9\x52\xf5\xc4\x6e\x2f\x77\xd2\xbd\x11\x5f\x9b\x1a\x71\x0f\x68\x1d\x83\xfa\x62\x3c\x6e\xc7\x63\x1e\x5f\xb5\xa3\x65\x16\xb5\xcd\xb4\x3c\x6a\xcf\x02\xc1\x26\x72\x07\x5c\x8e\x4c\xc7\x56\x08\x2e\x77\x97\xd3\x52\xbf\x40\xc9\x3a\x3a\x06\x48\x48\xa9\x77\x9f\x54\x67\xf6\xf7\x41\xed\xcc\xef\x8f\xea\x77\x51\x5a\x01\xc2\x91\x34\xac\x39\x6c\x07\x42\x1a\x66\xc8\xab\xb4\x3c\x70\x69\x44\xa1\xff\xb9\xc6\x05\x9f\x56\x08\xf3\x2b\xd3\x66\x07\xf0\xb6\x2c\x09\xc7\x83\x32\xfc\xdb\xcd\x1a\xd8\xef\x7c\xa3\x3b\xf8\x8f\xd5\x56\x8b\x2c\x6f\x08\xa6\x76\xc3\x96\x9e\xcf\xf1\xe4\x2c\x5a\x0f\x3b\x36\x71\x3d\xde\xb0\x94\x1b\x12\x95\xa8\xa7\xa0\xd4\x8e\x55\x0c\x55\xf1\x45\x49\xd7\x1f\xa5\x2e\x29\x5d\xf5\x45\x65\x1c\xe7\x47\xb0\xce\x17\x85\x8e\xdd\x45\x35\xd0\x43\x95\xab\xbf\x24\x12\xd3\x7b\x14\xee\xca\xa0\xba\x99\x3e\x30\xa2\x63\x9a\xe8\xb4\x8f\x55\x90\xf5\xf5\xdb\x41\x85\x19\x44\xb0\x34\x38\xd7\xe2\x6e\x10\xcd\x64\x3e\x3a\xbf\x57\x46\x27\x59\x59\x20\x99\xae\x01\xe7\xc1\x1a\x75\x22\x88\xc6\x8d\x20\x1a\xb7\x79\xa2\xa3\x42\xf8\xfe\xa2\x8c\x1e\x6e\x9c\xfb\x56\x7e\xcd\xc8\xcb\x01\x6c\x61\xb4\x4c\xce\xa0\xb8\x41\xbc\x56\x30\x56\x27\x64\x19\x4b\xb7\x82\xc5\xf9\x7f\xfe\xef\x4c\xd6\x55\x18\x3d\x08\x36\x6a\x78\x51\xb0\x51\x7f\x0c\x97\x3b\x76\x12\x25\xb1\xc0\x99\xb6\xac\xf8\x0c\xd7\x80\x8f\x05\xbf\x11\xcb\xe0\x7e\xb0\x51\x7f\x8c\x83\x8d\x36\xd5\x38\xd8\x38\xe7\x06\xc1\xc6\x19\x7b\xb3\x4c\xaa\x3f\x4e\x56\xb4\x69\xfb\x7f\x23\xb3\x04\x37\x75\x66\x91\x7f\x93\x51\x0c\x86\x5f\x63\x94\xc9\xe6\xee\xbc\xda\xcc\x28\xd3\xcd\x63\x35\x0a\x36\x46\xb4\xcc\x36\x33\xc2\xdd\x66\xe4\xb7\xc1\x46\xfb\xf6\xba\x56\x77\xfd\xfb\x51\xf0\xbf\xd6\x67\x5c\x33\xe7\x1e\x96\xfd\x00\x41\xdd\xb1\xb2\x53\xf7\xab\x9c\xae\x63\xc7\x01\xd7\xa2\xa2\x03\xd6\x94\xfa\xc2\x5b\x10\xe4\xeb\x02\x1e\x1d\x9c\x0e\x61\x18\x92\x0e\x1a\xeb\x53\xba\x4a\x35\x0d\xf8\x58\x18\x25\xec\xb2\x31\x89\xa4\xbe\xca\x50\x13\xc5\x34\x94\xe1\x54\x34\xb3\x10\xed\x2b\xcc\x7e\xb4\x6a\x56\x4c\x95\xb8\x69\x23\x50\x63\xd0\x1e\x8e\xc5\x6d\xba\x6c\x5b\x86\xfd\x79\x93\x17\x79\x79\x93\x2f\xf1\x4a\x45\x33\x67\xad\xb6\xc1\xe5\x68\x2c\xda\x63\x31\xd4\xe6\xd7\xee\x6d\x23\x48\x54\x1c\xa9\xf6\x34\x0a\x2d\x62\xd4\x3e\x2e\x32\x11\x5b\x90\x62\x49\x35\x5d\x56\x27\x25\xef\xba\x6f\xc6\x10\xb2\xfb\x6b\x69\x14\xd3\xb3\x1b\x38\x4b\x95\x99\x5f\xd8\x61\x73\xde\x70\x99\x18\xed\xb5\xca\x45\xce\x0b\xe1\xab\xd2\xfb\x8c\x9b\x9c\xf7\x5c\x05\x57\x4e\x95\xa5\x9c\xa3\xa9\x0a\xc7\x4e\x95\xaf\x9c\xf7\x3c\x2b\xbc\x9f\xd7\x95\x48\xe1\x54\x1d\x0c\xce\x9b\x64\x9c\xc1\x3d\xcc\xf1\x25\xa3\x24\xd6\x4e\xd5\xf3\xe0\x9c\x88\xa9\x16\x13\x5f\x28\xa7\xea\xce\x77\x3e\x06\x3a\x2a\x5e\xe7\x5e\x7d\xe7\x43\x74\x93\xc2\x57\x39\xda\x79\x26\x02\xfb\xa1\xb4\x51\xa7\xe8\x72\xff\x4b\x64\xd6\x75\xac\xf0\xf5\x3f\xcd\x0a\x68\x10\xfd\x35\x2f\x5c\xd8\x01\x3d\xbe\xc1\xac\x1e\x95\x29\xf2\xad\x3a\xc9\x42\x05\xce\x84\xdf\xda\xf3\x77\x0e\xd4\x43\x65\xbf\x07\x15\x07\xda\x9b\x3e\x36\xf2\xac\xce\xf9\x93\x68\xc0\xc7\x0d\x63\xe2\x34\xe2\x2b\xd3\x8a\xd4\x7a\x1a\x84\xf1\x74\xcc\xef\x1c\xb3\x00\x45\xc1\xf5\xaa\x49\x83\x45\xdb\x83\x90\x8f\xa3\x51\xa3\xfc\x23\xed\xb1\x62\xba\x2f\x97\x0a\x6c\x02\xb2\xf5\x00\xf5\xb9\x5a\x2c\x2d\xc1\x38\x8a\x45\x63\x92\x2d\x71\x66\x54\x6e\x03\xf2\xfc\xa6\xbc\x9a\xdc\x3a\xab\xa7\x96\xc1\x6c\x73\x41\x67\x78\x83\x01\x5c\x07\x80\xd1\x2e\x37\x15\x60\x34\xf9\x1b\x86\x4e\x1e\xca\x82\x12\x94\x53\x15\xc0\xa9\x6e\xef\x35\x8c\x90\xf9\x9e\xc4\x3a\x1c\xde\x65\x6d\xab\xcd\xdb\x19\x79\x62\xc6\xb4\x63\x0a\xe3\x53\x37\x1b\xee\x35\x74\x0e\xa3\x48\xaf\xee\x81\xc9\xb8\xbd\xd3\xa8\xaf\xb0\x71\x12\x04\x22\x8e\xcd\xb2\xbe\xa1\x63\x9e\x72\x19\x58\x63\xb4\xba\x5e\x57\x50\x4e\x55\x38\xc9\x8d\xdb\xdb\x80\x7c\xab\xa0\x38\x11\xba\xf1\x8c\x6b\xf1\xe0\x34\x9c\x88\xd2\xa2\xbd\xbe\xc3\x79\x70\x3d\x50\xd1\xb4\xcc\x65\x19\xc7\x7b\x19\xb8\xe5\xba\x60\x1c\x4e\x1d\x70\x94\x08\x34\xe9\xe0\xa5\x17\x1d\x9a\xb3\xe4\x34\x8a\x43\xbc\x10\x13\x9c\x61\x78\xbb\x81\xbb\xb0\xa2\xcc\xbe\xfb\x0b\x7a\x0a\x52\x4a\x5e\xe5\xcd\x2b\xfb\xe5\x66\x1d\xee\xcd\x66\xad\xe2\xdd\x66\xbd\xe0\xc3\xf2\x24\x57\xd1\x2c\x5e\x9e\xdf\xaf\x36\xe3\x39\x0b\xca\xb1\x28\xdf\x35\x1e\x12\x3a\x26\xe7\x25\x6b\xd9\x01\xdc\xe3\x70\xc4\x20\xd4\x8e\x19\x3a\x74\xa0\xff\x1d\x5f\x81\x2a\xb1\xc5\x73\x83\xc5\xf4\x63\x11\x4a\xea\x9f\xb8\xfe\x71\x5f\x79\x7f\x13\xeb\x8c\xcc\xb6\x0d\x69\xd7\x76\x2f\xa5\x54\xc7\xb1\xb0\x37\x2d\x38\xd5\xf1\x7a\x5d\x6a\x2b\x06\x36\xa8\x22\xb0\x41\x95\x3d\x8d\xdf\x35\x6c\x19\xa3\xb3\xd9\x54\x7d\x87\x39\x9e\x79\x9e\xcf\x55\xbf\x78\xf7\x1f\x8e\xe7\x6c\xe1\x1f\x86\xdd\x65\x23\xc0\x5c\xff\x5b\xa5\xc2\x8f\x9b\x2b\x04\xc5\xde\x0b\x72\xcd\x6b\x4e\x5c\x1b\x53\x91\xd5\xd5\x59\xaa\xbd\x1a\x5c\x51\x8a\xe7\x9c\x91\x1f\x37\x70\x8d\x89\x94\xb1\xa9\x65\xcf\x71\x90\xba\x59\xab\x39\x57\x1a\xff\xe7\x4c\xab\x22\xf9\x8b\xeb\xff\xb0\x1b\x6a\x6e\x60\x03\x3f\xb8\xcb\xf7\xd0\xdd\xc0\xdd\xe0\xa0\xa2\xe2\xfd\x7f\x76\x99\xba\xdb\xae\x7e\xc7\x9b\x03\x9c\x4d\x96\x12\x2e\x67\x56\xd4\xaa\x95\xf6\xd0\x5f\x2c\x61\xfa\x57\x56\x0f\xf1\x5f\x10\xd1\xa5\xbd\x86\xcd\xd6\xd6\xcf\x55\x26\x4b\xae\x5c\xa6\xc1\xcd\x35\xd5\x72\x2a\xe4\x20\x94\xa3\x25\x6d\x4d\xdc\x4e\x71\x6f\xb8\x84\xfe\x59\x55\x32\x3e\x5f\xc1\x25\xc5\x38\x7c\xdf\xae\xbf\x33\x9d\xfa\x81\x4f\x84\xd7\xb0\xab\x1f\x6e\x46\xf8\xd1\x52\x87\xfc\x15\x8e\xa3\xc1\x40\x89\x38\xae\xa0\xe1\xaf\x96\x0c\xd7\x97\x41\xc5\xcf\x15\x59\x3f\xd7\x89\xdd\x4a\x8e\x7b\x65\x9f\x61\xda\x8c\x37\xdb\xf6\x09\x97\xe9\x71\x12\x6b\xa1\x1a\x27\x98\x2c\xd7\xd6\x54\x0a\x22\xc0\xc4\x25\xe5\x6d\x15\xc7\xb1\xf3\x0c\x77\xad\x56\x19\x4b\xc3\x48\x4d\x52\xbb\xbf\xa2\xab\x16\x6d\x0c\xa2\x71\x3b\x9e\x54\x9c\x94\xb6\xbf\x9c\xa5\x2e\x4a\x41\xbb\x9d\x3a\x63\x9b\x1e\x20\x55\xd8\xff\x5c\xc5\xb6\xdd\xbf\x52\x75\xe6\x75\x25\x92\xd9\x30\x50\x9f\x0f\x46\xc2\x81\xad\x4e\xa5\xc7\xd6\x87\x5d\xd8\x02\x99\xfa\xe4\xac\x8c\xc1\x48\x61\xb2\xbd\xbc\xd5\x91\x17\x29\x50\xea\xe9\x40\x9f\xe3\x82\x18\x2a\xe5\x20\xdd\x58\xce\xa2\x77\x13\x63\xa0\x5e\x0d\xe1\x75\x92\x46\xec\xe5\x0d\xff\x15\xe3\x4d\x09\x3e\x58\x32\xdd\x62\xa1\xcd\x7a\xba\x3c\x91\x06\x61\xcc\xfd\x31\xce\x24\xa2\xcb\x42\xa0\xca\x4e\x62\x0d\x3b\x89\x7f\x25\x3b\x7d\x12\x42\x15\x83\x7a\xb5\x66\x50\xb1\x8b\x9e\x05\x20\x33\x7e\xaa\x6e\xb6\x2d\x79\x1a\xd2\xe9\x33\xbb\x29\xa6\x4f\x79\xda\xfc\xd7\xc9\xfe\x32\xd5\xe1\x2f\xcf\x83\x0f\xb1\x11\x2b\x7f\xe4\xdd\x6c\xe4\x80\xcb\x8f\x69\x1a\x4e\xbe\x0d\xeb\xa6\xfc\x57\xa1\x62\x54\x66\xa4\x8d\x7e\x32\x2b\xf2\xbf\xa8\x01\x4f\x14\x97\xc1\xd5\x2f\x36\x40\xb9\xfc\xc3\xaa\x85\xe2\x3f\x59\x75\x12\x8e\x07\xc6\x5a\xf8\xf5\xda\x3f\xfe\x8b\x6b\xff\x12\x0b\xf5\xeb\xb5\x7f\xfa\xd7\xd5\xfe\x32\x4a\xc7\xf4\xd7\x6b\x7f\xfc\xaf\xab\xfd\x58\xdc\x84\x7f\xab\x72\xff\xc5\xbf\xae\xf2\xbf\xdb\x70\xff\xb2\xec\xfe\x40\x6b\x9c\x7f\x71\x7d\x05\xe5\x19\x5e\x59\x20\x23\x39\x0c\x47\x19\xfa\x0f\x39\x31\xd3\xf6\x5e\xb1\x01\xcc\x83\x6b\x43\xb9\x1c\x38\xe0\xfc\xdb\xf0\xe1\xf0\xe1\xf0\x71\xfe\x71\x18\x49\xdd\x1e\xf2\x49\x38\x36\xca\xe3\x24\x92\x51\x3c\xe5\x81\x28\x1a\xf8\xae\xa8\x4d\x96\x88\xbb\x58\x3e\xb0\xf1\xbe\xec\xba\xb4\xc7\x95\x98\x74\x83\xb3\x2c\xc0\x87\xe7\x01\x3e\x79\x40\x0d\xfa\x1d\xde\x70\xc0\x33\xab\xc1\x37\x58\xad\xf4\xca\xa8\x3d\x4a\xb4\x16\x2a\x2e\xc8\xfa\x88\x5f\xaf\x6f\x88\x33\x0c\xc5\x78\x10\x0b\x5d\xee\xf7\x17\xa1\x8a\x75\x63\xc0\xef\x1a\xd1\x10\x43\xf2\x66\x42\x5c\xe7\xa3\x70\x8b\x1e\xab\xcf\x83\xe5\xb2\x77\xe4\xe8\x06\x9c\xf7\x91\x1c\x18\x5d\x7a\x2b\x71\x83\x5b\xe0\x9a\x82\x7d\x7f\x92\xd8\xf7\x5d\x7b\x4f\x5d\xe5\x13\xd7\x89\xc2\x8f\x3b\xa5\x8f\xb6\x3a\x79\x53\x61\x22\x74\x69\xae\x74\x05\x3b\x1f\x22\x2d\xbc\xc6\xe9\x55\x18\x37\xcc\x42\x16\xca\x51\xc3\x3c\xf2\x1b\x9b\x0d\x71\x1c\x05\x7c\xdc\x88\x75\xa4\xf8\x48\x98\x96\xdd\x45\x89\x6a\xf8\xc6\x2e\xb6\x2a\x6e\xee\x49\xa9\x05\x32\xcd\x48\x38\x80\x17\x01\x58\x53\xf4\xb4\x7e\x4f\xdd\xca\x1d\xc9\xf7\xd6\x46\x79\x63\x2d\x94\x67\x18\xf4\xe7\xbf\x5d\x0e\xd6\xda\xf5\x6c\x6e\x29\x55\x4e\x75\x74\xb9\x0d\x02\x34\x70\xd8\xda\x4a\xf2\x6b\xe1\xab\xda\x04\x1f\xd4\x55\x87\x8f\xdc\xe6\x17\x58\x10\xe9\x06\xdd\xfa\x6d\xf2\x33\x32\xba\x31\x0d\xd8\x07\xee\xf2\xfa\x95\x95\xda\x9a\x9e\x41\x87\xba\x7c\xdb\x9e\x63\xfe\x0a\x78\x9d\xda\x9d\x0d\xa7\x7f\xbb\x86\xb5\x26\xbe\x99\x28\x55\xa6\x4a\xdf\xef\x38\x14\x2c\x7f\x8d\xb5\x50\x6d\x9f\xab\x76\x1e\xd8\x59\xe6\xb4\x71\x6a\x5f\x98\xa1\x0e\x06\xe9\x69\x4b\x0e\xef\x05\x4e\xf8\x1b\xb8\x0f\x2e\xf1\xa8\x95\xd5\x3a\xe0\x8e\xdc\x6c\xc3\xe9\x36\xa6\xed\x82\x5b\xb2\xbd\x0d\xd7\xdb\x60\x2f\xd3\xbd\xa0\xb4\xb6\x5f\x81\x18\x5f\x08\xb8\x25\x83\x6d\x38\xd2\x98\x6c\x48\xba\xc1\xb5\xf9\xb3\x4d\xeb\xd1\xb0\x15\xe8\x6b\x4d\x38\x86\x6a\x0d\xc0\x71\x2a\xf0\x0f\xd7\x0f\xc1\xdd\x4d\x39\x57\x49\x55\xc5\x78\x95\x0b\x17\xc9\x6f\x7c\xa3\x15\xe1\x3f\x6d\x1d\x8d\x46\x63\x61\x94\xab\xf6\x64\x90\xbd\x1c\xa3\x97\x37\x0f\x1a\x99\xf8\xed\xfd\xc6\x54\xb7\x77\x1b\x53\xbf\xbd\x5b\x0f\x4d\xf1\x23\xad\xa3\x89\x03\x4e\x77\x7a\xdb\x88\xa3\x71\x38\x68\xa8\x91\xcf\x49\x07\x1a\xf6\x3f\xb7\xbb\xb3\x4f\x8b\x61\x3a\x2b\xc9\xdc\x9a\x5b\xb2\xec\x62\x49\x49\xf1\x15\x97\x83\x2c\x44\xa2\x62\xc1\x8c\x85\xd2\x13\x2e\xf9\xa8\x18\xc0\xab\x7a\x69\xc9\x6f\x0a\x6d\xec\xe5\x36\x91\x14\x5e\x6c\xd3\x55\x3a\x75\x91\x6c\x6f\xc7\xab\x8e\x62\xaa\x49\xd6\xfa\x7a\x69\x75\x09\xe5\x38\x94\x25\x8f\xee\x72\x8b\xd6\xec\x46\xd6\x82\x3f\xa4\x98\x55\x84\x8a\x98\x35\xca\x01\x26\x46\x8d\xb4\xda\x64\x45\xa1\xfc\x52\x73\xd7\xd5\xf7\xa2\x9f\xd4\xbe\xd7\x4f\xbd\xfd\xa8\x7d\xaf\x87\x23\x7e\x2a\x73\xd3\x1f\x92\x0c\x55\xd5\x83\xf3\x36\xa8\xe4\x78\xaa\x4c\xd6\xf4\xe9\xcb\x36\x60\x3c\x62\xf0\x9a\xb6\x9c\x71\xe8\x3f\xf0\xa3\x48\xc7\x5a\xf1\x69\x7b\xcf\xed\xb8\x9d\x36\x1f\x4f\xaf\xb8\x7b\xd0\x1e\x84\xb1\x7e\x10\xc4\x71\x01\xe0\x4e\x42\xe9\x06\xc6\xae\xf9\x12\x98\xc1\xfc\xb2\x0d\xd2\xe2\xc0\x05\x90\xcf\x44\x1c\x4d\x44\x7b\xcf\x7d\xe8\x76\xb0\x64\xf9\x75\x51\xf8\x47\xad\xb0\x18\x4f\xda\x03\xae\xc5\x34\x0c\xae\x85\xc2\x82\xd5\x57\xb6\xd8\x93\xa0\x6e\x6a\x58\xab\xe2\x0d\x51\x6e\x80\x07\x44\xef\xcc\x1f\x49\x7b\x79\xea\xe1\x7b\x95\x3f\xe9\xa5\x74\xc4\xbc\x24\x7d\xf3\x97\xfe\xaa\x97\x41\xe9\xe5\x52\xdf\x7e\x0e\x4c\xfd\x67\x75\xc5\x24\x9d\x52\x66\xaa\xe6\xb2\xf1\x7d\x80\x5e\x99\x42\x44\xed\x78\x78\xd7\x43\x43\xe5\x6c\x6d\x7f\xeb\x45\xe5\xb3\xcc\x3f\x87\x43\xb2\x83\xbe\x39\x43\x52\x56\xb6\x56\xa6\xc8\x92\xb3\x6d\xd3\xdc\x1b\x49\xbf\x84\xc0\xcf\x11\xe0\x39\xe2\xf5\x58\x2b\xd3\x6f\x51\x47\x1e\x94\x72\xd9\xe4\x2f\x7d\xbc\x4f\x26\xd7\x6e\x6c\x1e\xff\xdf\x03\xf8\x23\x00\x19\x81\x8a\x40\x47\x20\x22\x48\x22\xe0\x11\x04\x11\xfb\x2a\x89\x73\xca\xe3\x6b\x87\x42\x14\xad\xcb\xd7\x15\x44\x24\x4f\xd9\x95\x66\xf6\xaa\x5f\x50\x85\x6c\xfd\x19\x97\xac\xe0\x18\x2a\xd7\xe6\xe1\xdd\x31\xe4\x83\xc2\x2b\xf0\xf2\x63\x61\x8a\xdc\xf3\xdb\xe2\x96\x19\x51\xba\x60\x8d\x33\x01\xaf\xd5\xaa\xdb\xac\xa2\x69\xac\xb9\x16\x0e\x68\x0a\xff\xf1\x5a\xb9\x92\xdf\x84\x23\xae\x23\xe5\x26\xb1\x50\x47\x23\x21\x75\x71\xb3\xd2\xa9\x0a\x07\xe8\xf3\x6b\x36\x57\x62\xbb\xe2\xf1\x55\x16\x95\xa5\xe9\xea\xb3\x6d\x3d\xe5\x06\x5a\x8d\xdf\x8a\xbb\xf9\x5c\xb9\x13\xa1\x79\xfa\x18\x5f\x85\x43\x8d\xcf\xdd\x43\xb3\x3e\x27\x5a\x47\x72\x3e\x97\xae\xe6\x6a\x24\x34\x9e\x07\x8f\x66\x72\x1c\xf1\xc1\x7c\x4e\x94\x3b\x55\x78\xf7\xf3\x33\xcb\x0b\x84\xa2\x72\x72\xa5\xc4\x10\x14\x33\x5d\x03\x92\x3d\x17\x44\xe3\x79\x22\x92\x10\xd9\x6c\x2a\xd7\xbf\xb3\xec\x72\x87\x3f\x02\xfb\x23\xc0\x1f\x89\xcb\xed\xcf\xc4\xe5\xfd\x7c\xd7\xc0\x4b\xb7\x29\xf4\xc2\x9e\x8b\x81\xe0\x99\xb7\x32\xfc\x0f\x6f\x72\x95\x80\x15\x6b\xba\x80\x81\xef\xd9\x9b\x5a\x1f\x7b\x78\xbf\x6b\xb0\x67\xfe\xdd\x33\x28\xc2\x28\xcd\xac\x3f\xc4\x87\xdd\x05\xf8\x11\x1b\x48\x88\x23\x16\x48\x18\xe3\xcb\xce\x02\x6e\xf0\xa1\xbd\xb3\x80\xed\x88\xdd\x44\x30\x89\xd8\x76\x04\x57\xeb\x58\xea\x9e\x3f\xf7\x26\x11\xf0\x17\x18\x75\xff\xda\x1b\x47\xc0\xdf\x98\xbf\xc1\x0f\x4f\x01\xdf\xf6\x3e\x62\xb6\x39\x9f\x7b\x69\x8e\x37\x7e\xe9\x39\x0e\x04\x37\xde\x19\xf0\x5d\x3c\xff\xfd\xca\x93\x10\xbc\x31\x58\xfc\xb1\x77\x06\xfe\x04\x93\xad\x3d\x47\x55\x05\x3f\xfa\x47\xde\x7d\x5a\x0c\x7f\x22\xd4\x13\xf3\xe7\x39\x66\x8d\x7b\x83\x05\xde\x61\x01\xff\xab\xd7\xc1\xeb\x0f\xb2\xf6\x8c\xd6\x53\xfe\x0c\x69\x46\x6a\x73\x42\x79\xc7\x9b\x46\x10\xdc\x1a\xe2\xf7\xbd\xaf\x98\xd2\xd5\xd6\xfa\xc1\x1b\x47\x78\x0d\x42\xc4\xee\xfd\x53\xf3\x03\xee\xa2\x5f\x48\x0c\xdb\x81\x76\x9a\xe0\xf5\x36\x62\x89\x84\xeb\x88\xdd\xf3\x2b\xec\x0a\x8e\x84\x63\xf2\xb9\x63\xf3\xe7\xc4\xfc\x39\x35\x7f\xbe\x98\x3f\xaf\x30\x1f\xdd\x11\xb6\xe4\x60\x01\x27\xf8\xb0\xb3\x80\xd3\x6c\x00\x9f\x47\xeb\xaf\x6e\x38\x28\x5f\xdd\xf0\x2d\x1b\xfb\xef\xf8\xf0\x68\x01\x4f\x33\xac\x97\xd1\x86\x3b\x1a\x89\x24\x1a\x05\xc5\x9b\x88\xad\x4c\x80\xb8\x7c\x33\xab\xa4\xf7\x5a\xdd\xdd\xbf\x56\xf9\x45\xb4\x4c\x15\xf7\x3f\x95\xef\xa7\x55\xc2\x4c\x2a\x82\x87\xa3\x28\x5d\xc0\xbb\x88\x3d\x93\xf0\x21\x62\x3f\x25\xbc\x8a\xd8\x87\xc8\x8c\xc7\x59\xc4\x5e\x29\x78\xbd\x9e\xc8\x7b\xfe\xc6\xd3\xe0\x87\xa6\xb1\x3f\x6d\x6b\x3f\xae\x1d\x16\xe5\xfa\x7d\x4c\x85\x18\xd9\xf4\x8c\x98\xb1\xe8\x78\x3d\xb8\xcd\xa2\x28\xf3\x0c\x8a\x1f\x23\x38\xb3\x63\xf9\x4c\xb2\x68\x65\x0a\x62\x08\x20\x82\xb0\xa0\xee\xad\xa7\x81\x9f\x79\x11\xf0\xae\x97\x00\x7f\xe8\xa9\x94\xd8\x27\x9e\x00\xff\xb3\xc7\xc1\x3f\xf1\x42\xf0\xcf\x3c\xcc\x82\xfe\x4a\x6d\xca\x82\xee\x0b\xd3\x56\x69\x4a\x7e\x34\x88\x8e\x8d\x62\x43\xe1\x6b\xb4\x3a\x27\xf3\x43\xf0\x31\x27\xf3\xcf\x88\xf9\x82\x84\x14\xc2\x4d\xd9\x24\x7f\x46\x30\x23\xb1\xcd\x06\x67\xf3\x74\x3e\x8b\xd8\x50\xc2\xcb\x68\xf3\x95\x24\x43\xc9\x66\xe4\x59\xb4\xe1\x24\xb9\x93\xc8\xa9\x8a\x02\x11\xc7\x62\xe0\x64\x6b\x6b\x2c\x48\xea\xd8\xcd\x76\x22\x4a\x5f\x52\xa3\xcb\x89\x93\xe9\x54\x2d\x95\xdb\x59\x52\x61\x5f\x46\xc4\xf9\x22\xaf\x65\x34\x93\x0d\x7d\x37\x15\x5e\xc3\x69\x49\xba\x30\xb3\x07\xfb\xf4\x8e\x84\x60\x73\xbd\x3c\xb9\x73\xe0\x6b\x44\xcc\x7b\x7c\x99\xa7\x88\xa9\x7f\xc8\x92\xcb\x2c\xbd\xb7\x0b\xd7\x50\x42\x2c\xc8\x2b\x85\xee\x62\x78\x11\xd9\x2a\x6c\xca\x83\xa3\xc8\x7c\x5b\xd1\x69\x7e\x84\x03\x46\xe1\x7d\xf4\x8b\x97\xae\x7c\xde\xc0\xf9\xb5\x9c\xf8\x06\xfc\x4b\x54\xbd\x8b\x52\xe6\x29\xa0\xd7\xa7\xa8\xe3\xe9\xe5\x80\xe9\x71\x1b\x5a\xce\x10\x98\x1e\xc6\x4a\x6f\xbb\xc5\x70\x70\x54\x10\x40\xb2\x84\x98\x0f\xa5\xb2\x68\x76\x64\x97\x3c\x94\x9c\xd4\xef\x23\xd0\xf3\xb9\xb0\x11\xea\x95\x6f\x98\x85\x2b\xfb\x66\x14\x21\x8a\xd7\xc2\x45\xec\x4b\x04\x3f\x7e\xb5\x87\x3e\x45\x9b\x66\x8c\x4d\xef\x15\x9a\x19\x73\x63\x13\x7b\xe1\x8c\x79\x9b\x2d\x0f\xbf\x47\xeb\x73\x9b\xfe\x88\xe0\x6d\x04\xb7\xe4\x53\x54\xca\x52\x86\x0a\x1b\xca\xc4\x3f\x22\x46\x7e\x0f\x50\xb0\x76\x56\xe6\x58\xb4\x89\x0e\x8d\xe9\x6b\x9a\xde\xcf\xf2\x25\x76\x8c\xe0\xa9\xe5\x24\xfb\xdd\xa2\x94\x21\xfb\xa9\x40\x85\x7f\x91\x6f\xde\x0e\x29\x66\x41\x33\x5f\x13\xa3\x9c\x62\x62\x45\x0e\xed\x6e\x9e\x88\x19\xeb\x3b\x25\x09\xe6\xec\x38\xec\xa4\xc9\xce\x04\x04\x5e\x82\xc9\xce\x12\x4c\x76\xa6\x4c\x9f\x68\xe0\x5e\xe2\xf2\x05\xed\x25\x8c\x08\x86\x88\x76\x68\x9f\xa4\x39\xe9\x5b\x5d\xd0\x4c\xb7\xba\xd0\xa5\x5e\xfa\x8e\xdb\x24\xf5\xad\x2e\x85\x04\x47\xed\xa7\x5a\xb5\x42\xac\xe8\x95\x1b\xa2\x42\xab\xe1\x96\x73\xbf\x99\xb9\xaa\xb1\xf5\x22\xfc\x6f\x66\x61\x1f\xdd\x32\x41\x85\x09\xed\x39\x87\x04\x6c\x2a\x77\x03\x82\xe4\x71\xcc\x37\x24\xb0\x81\x49\xb8\x3a\xdf\xb4\x08\x61\x1b\xaf\x47\x01\x1e\xb2\x27\x10\x84\x2c\x4c\x20\x5a\x09\xdc\xc1\x63\xbb\x36\x3e\xac\xd9\xdc\x7a\x70\xfe\x67\x7c\xeb\x47\x17\x0f\xec\x01\x2f\x89\x77\x4a\xb2\x96\xa4\x8c\x49\xcc\x1e\x66\xb3\x50\x87\x21\x5b\x95\x46\xf3\xf1\xa1\x4d\x65\xb9\x2a\x09\x26\xd7\x8d\x49\x14\xeb\xc6\xe3\x8d\x39\x30\xd3\x40\x80\x28\x24\x4e\xc7\x35\xf2\x72\x5d\x0a\xce\xe1\x38\xe2\xba\x96\x80\x93\x87\xa4\x2b\x76\x7f\xb3\x97\x78\x96\x73\x69\xc2\x30\x64\xdc\xac\xc8\x7f\x91\xa3\xbf\x31\x0c\x89\x6c\x1d\x74\x7e\x53\xbf\x1d\x74\x7e\xeb\x8a\x5d\xf3\x4c\x74\x9b\x53\xfc\x61\x90\x8b\x16\xde\xb6\x17\x57\x96\x2d\x5e\x5c\x59\x16\x30\x09\x11\x53\xeb\xf9\x22\xf8\x7b\xa2\xcd\xa6\x1d\x34\x2b\xbb\x72\x83\x65\xb9\x96\xac\x92\x6b\x89\x95\x6b\x36\x2b\x28\xba\xfe\xea\xd2\x2d\x81\x19\xe1\x60\xe5\x9f\xbd\x90\x1d\xc6\xe1\xfa\xeb\x97\x62\xcb\x4f\x56\xcd\x18\x84\x6c\x1c\xc2\xcd\x66\xf0\x1f\x39\xf8\x76\xb8\x94\x58\x3b\x15\xc8\xeb\xfb\x48\xa4\x7d\xb4\xb6\x7f\xe4\xca\xd9\xa2\x51\xfc\xe3\xc4\xa5\x30\x09\xd9\x76\x08\x57\xe1\x2f\x5e\x39\x36\x0d\xd9\x57\x05\xa3\x90\xc5\x09\xcc\x42\xf6\x1e\xee\x42\x76\x02\x5f\xd5\x32\x9f\xe7\xcb\x89\xf5\xfa\x5a\x3f\xbe\xbd\xbf\x20\xbf\x6f\x63\x90\x10\x5e\xba\x65\x50\x15\x4d\xdb\xed\xee\xef\x1e\x88\x83\xdf\x88\x68\x77\x1f\x3f\xec\x18\x5b\x2d\x4d\xa5\x40\x92\xc3\xdd\xf9\x7c\xeb\x26\x21\x82\xf6\x79\xbb\xeb\x71\xda\x22\xdb\xe6\x57\x7b\x3b\x21\x08\x5c\x44\xfb\x04\x86\x51\x55\x4b\xd3\x45\xaa\xd6\x24\xf5\x54\x1a\xbb\xdd\x43\xde\x47\x3a\x3c\x95\x69\x35\xa5\x9b\x2c\x1e\x1f\xf2\xf9\x7c\xe7\x31\x63\x8c\x37\x9b\x69\xa5\x19\xf4\xce\xc1\xc3\x47\x7b\x62\xbf\xee\x6f\xad\x60\xdc\xef\x3c\x7e\x78\x90\xc3\x14\x09\x39\x3a\x25\x98\x87\x0f\x1f\x1e\x88\x83\xba\x43\xbd\x82\xa6\xdb\xd9\x3d\x78\x94\xc3\x1c\xac\x44\xd3\xdd\xed\xec\x1d\x14\xf4\x3c\x5c\x8d\x68\xff\x60\xb7\x44\xf4\xa3\xd5\x40\x8f\x76\xbb\x07\x8f\x72\xa0\xc7\x2b\xab\xdb\xe9\x3c\x7e\xbc\xbf\x93\x03\x15\xb9\x40\x2a\xa8\x76\x76\xf7\x1f\x3d\x2c\x41\x75\x57\xe3\x3a\xd8\x39\xd8\x2f\xba\xa9\xbb\xb3\x1a\xd7\xa3\x47\xfb\xb6\x33\x6b\x2a\x64\x59\xe0\x61\xb4\x31\x0a\xbc\x6f\x9a\x24\x36\x9d\xe2\x62\x01\x33\x72\x13\x96\xfe\x04\x21\x19\x90\x37\x59\x92\xc9\x61\x42\xf6\x28\x8c\x13\xe2\xb4\x1d\x5a\x7a\xb9\x53\x7e\x89\xbf\x29\x85\xdb\x0d\x53\x65\xa7\x3c\x55\xae\xc3\x5f\xbf\x89\x2e\xd3\x29\x54\x7a\x05\x31\xe6\xfb\x33\x73\x86\x74\x40\xbb\x3c\xd3\xd5\xb6\x4a\x57\x66\x08\x86\xf7\x68\x11\xc1\x38\x75\xf3\xab\x40\x44\x7a\x19\xcd\x8c\xdc\x9a\xa5\x5a\x98\x89\xae\xed\x1d\x34\x47\x21\x9b\x24\x70\xb2\xc1\x90\x90\xbf\x11\x23\xd4\x5b\x68\x41\x9c\xae\x58\xbb\x6a\x99\x40\x2b\x5d\x5a\xfe\x63\x13\x77\xfa\x36\x89\x90\xe9\xc2\x53\x67\xb9\x5b\xbd\x55\x7d\xed\x95\xfa\x1a\x2a\xf5\x58\x9c\x5c\x5b\x38\xd7\x20\x0c\x43\x6a\xde\x75\xec\x4e\x67\x06\x3d\x09\xd7\xa4\xd6\x37\xe5\xbe\x59\x42\xea\xcc\x70\x12\xfe\x55\xf9\xae\x2d\xdf\xb2\xe5\x57\xc2\xb4\x53\x18\xc3\x2f\x17\x7f\xd1\xb6\xe2\x7b\x10\x92\x21\xf1\x8d\x3a\xd8\xc9\xfe\x4f\x8d\x86\x6a\xcf\x69\x7f\x55\x14\x9e\x87\x1b\x4c\x68\xa3\x24\x57\xf4\xe3\x6f\xe1\xdf\xba\x8b\x2e\xbf\x0a\xb1\x74\xd5\x1b\x86\x57\xd9\x93\xe5\xc8\x4a\x91\xc6\x4b\x3d\xca\x57\xba\x65\x33\xb0\x0e\xfa\x2d\xac\x83\x1a\x9a\xbe\xaf\x98\x33\x4c\x12\x43\x7d\x17\x02\xef\x0c\x06\x5e\x17\x7c\xaf\x63\x1a\x81\xc9\x1a\x16\x15\x85\x66\xa2\x09\x62\x36\x4b\xfc\x19\xc5\x8c\x31\x66\x05\x5b\x50\x78\xba\x0a\xf1\x8c\x7c\x47\xed\x7a\x19\xc7\x1b\x01\x57\x09\xa0\xe2\x63\x91\x70\x83\xe4\xfd\xb2\x11\x6c\x17\x21\xcc\x98\x53\x46\x62\x6c\xd5\x22\xab\xb6\x4e\x6d\x55\x2f\x16\x16\x15\x9a\xac\x97\xeb\x4c\x80\x5c\x4a\xb4\xbb\xf5\xfb\xd0\x40\xd8\xab\x8d\xde\x84\xeb\xaf\xe6\xc1\x54\x97\x89\xbb\x3d\x9f\x1b\xa3\x21\x7f\x23\xcc\x1b\xe1\xf2\x34\x45\x66\x9a\x4d\xd4\xe6\x12\x2d\xe7\x96\x2c\x90\xa5\xf7\xf8\x08\xcc\x24\x2a\x96\x52\x50\x0a\x54\xa1\xf3\x14\x94\x59\x8e\x4f\xee\x0e\x80\x97\x92\x4f\x1a\x6c\x01\x24\x69\xee\xcb\x88\x19\x5b\x25\x64\x09\x26\x29\x4d\xf0\x02\xd8\xc4\x15\xbd\x3a\x95\x35\x92\x22\x08\xf3\x1c\x9b\x48\x1d\xa7\x19\x81\x41\x8d\x2c\xf3\x3d\xcb\x1e\x9a\x52\x98\xb7\x20\x27\xca\xe0\xe3\x48\x14\x85\x77\x21\xfb\x0e\x1f\xc2\xd5\xf7\xef\xd4\xaf\xae\x4d\x2b\x31\x00\x37\x11\xdc\x44\x34\xbf\x19\x94\xe7\xa2\x58\x63\xe6\x4e\x8d\x99\x3b\xb5\x2b\x7a\x79\x92\xae\x77\xa6\x29\x09\xad\x4f\xa9\x1b\xf2\x26\x4c\x1d\x4b\x77\xe4\x83\x1d\x81\x80\x42\x54\x0f\x89\xc3\xba\xd3\x8c\xa8\xe6\x6b\x6d\x71\x2b\xa1\x09\x0a\x44\x11\x45\xed\xed\xd5\xaa\xf6\x69\x96\x83\xd9\x8b\x84\x70\x08\xb2\xe3\xc0\xc5\xd5\xa4\xd5\xbc\xa7\x59\xea\x51\xd3\x40\xed\xe2\xed\x45\x67\xe1\x1a\xf7\xd1\x4e\xea\x9d\x3a\x59\x6d\x57\x0d\x05\x8c\x12\x38\x0b\xed\x25\x2d\xaf\xd7\x60\x79\x0c\x01\x22\xf9\xb8\xae\x96\x7d\x18\x21\xc0\x57\xb5\xaa\x9a\x8f\x28\xae\x5f\x87\xe4\x48\x53\x7b\x08\xf8\xda\x68\xcd\x28\x35\x8f\x43\x63\xdb\xef\x2f\xe0\x6b\xa5\x7f\x2a\xfe\x85\xc6\xd2\xa4\x97\x6c\x46\xfc\x08\xbd\x8b\xb5\xcc\xc8\xb1\x20\x22\x4d\xb5\x01\x29\x94\xad\x5e\xc3\xeb\x90\x08\xdc\x98\x93\xa5\x60\x7d\x94\x14\x5f\x6d\x12\x69\x14\x0f\x98\x4a\x08\x8e\x43\xd3\xab\xdf\x37\x38\x3d\xac\x2f\xef\x8e\x7c\x0d\x33\x87\xde\x71\x88\xf7\x4d\xa5\xf7\x31\xff\x0c\x59\xee\xc9\x4a\x62\x07\x5e\x29\xeb\xd9\x12\x72\x10\x1f\x69\x07\xde\xdb\x9f\xc9\xd4\x48\xa7\x41\xe9\x4d\xac\xb9\xd2\x65\x90\x61\x28\x47\x42\x4d\x55\x28\x35\x7a\xbd\xf0\x65\x96\x15\x39\x46\xbf\xd9\x8b\xcc\x6f\xc6\xa5\x8c\x34\x7a\x7e\x63\x07\x4e\xd0\x9f\x76\x4b\xbe\x83\x33\x12\x52\x28\xae\x23\xf5\xe5\xf8\x9d\x03\x5f\x15\x7e\x39\xd2\xb6\x10\x66\x6a\xc8\xe1\x63\x41\x9e\xe5\x19\x15\x29\x85\x67\x69\x43\x30\xb1\x8b\xad\xee\x67\x48\xab\x54\x38\xf0\x22\x5a\x83\xeb\x35\x5e\x85\x04\x2f\x57\xae\x8c\x4c\x92\xaa\xec\xd7\x9e\xbd\x75\xd7\xd8\x3e\xa6\x17\x5f\x6c\x30\xca\x2e\x05\xbc\x0c\x31\x27\x8a\xb5\xcb\xde\xaf\xbf\x2a\xb2\xc8\x26\x4e\xac\x2d\x4d\xe1\xf3\x4a\xe7\x81\x90\x41\x34\x10\x5f\x8e\x5f\x3f\x8d\x26\xd3\x48\x0a\x4c\xd4\xbf\x80\x2f\x06\xf5\x25\x85\x27\x1b\xd6\x77\xdc\xc0\xf8\x68\xb3\x02\xa0\x9b\xf0\x47\x98\xc6\xe6\xb2\xff\x70\x60\x07\xd3\x35\x6e\xfd\x87\x03\xbb\xf8\xc4\x1c\xe8\xd8\x57\xcc\xc1\x33\x51\xf0\x29\x64\x9f\xe0\x6d\xb8\x92\xe5\xca\x3e\xa9\x84\x69\xa2\x28\xc9\xae\x40\xdb\xa6\xf7\xbc\x7c\x05\x1a\xea\xa7\x72\x3e\xe7\x90\x98\x85\xd7\xae\x20\x89\xcb\x21\x40\xc1\x6f\x84\x3d\xda\x76\x41\x31\x67\xd0\xdc\xc4\x22\x81\x11\xa2\x38\x7d\xcc\x2f\xc5\x02\x37\x75\x41\x59\xbd\xf4\xf7\xb0\x7a\x01\x94\xde\xe4\x82\xba\x25\x6f\x43\x7b\x73\x89\x4e\x0d\xd8\x3f\xc2\xf5\x6e\xc0\xdf\x8d\x14\x5c\x29\xa2\x26\x21\x7c\x4b\xc0\x86\x0f\xa0\xfb\x6e\x88\xde\xc0\xee\x02\xd4\x90\xad\xb9\x6b\x7f\x59\x41\x40\x3f\x9e\x4e\x1d\x62\x9c\x16\x17\x1e\xa8\x55\xd7\x80\x08\x4a\x3d\xfc\xb4\x93\x79\x14\x33\xcf\x5e\xb7\x76\x8d\x81\x74\xfd\x56\x17\x35\x3a\xd7\x7f\xd9\xea\x66\xf7\x19\x78\xd5\x52\xd2\xe5\x27\xad\x7a\x51\x95\x15\x2b\x6e\x13\xa1\xa0\xb1\x75\x0f\x17\x20\x86\xeb\x95\xc3\x7c\x5d\x54\x95\x7b\xf9\x32\x1f\x4b\x80\x3e\x96\x01\x6e\x2f\xd7\x17\x3f\xcc\xf1\x95\x2d\x7f\xd6\x00\x11\x2b\xae\x11\x2e\x6e\xee\xd3\xc5\x32\x67\xc1\x93\x8a\xc6\xb8\xa0\x90\x0c\xd7\x0c\xeb\xd6\x8c\x88\x21\xaa\x77\xee\xf6\x82\x02\x1f\xae\x1f\xfe\x64\x98\x79\x57\x82\x21\x4b\xd6\xec\xf9\x54\xe7\x41\x54\xf2\xcd\xa6\x9e\xd9\xa8\xe4\x99\xcd\xdc\xb0\xa6\xbf\x79\xc5\x05\xbb\xe8\x05\x8c\x70\x46\x52\x2f\x6c\xf4\x57\x5e\xd8\xa8\xec\x85\x35\x7a\x8f\xf5\xa0\x47\x43\xb6\x6c\x9d\x3c\x09\x29\x10\x15\xb1\x7b\xfe\xcd\xd3\x43\x08\x9e\x7b\x44\x46\xec\x3e\x78\xee\x5d\x27\x10\x7c\xc5\xfd\xd7\x4f\xde\x75\xb2\xa0\x6e\xf0\xdc\xbc\x90\x91\x1b\x7c\x35\xef\x64\xe4\xfa\x9f\x16\xb0\x86\x73\x95\xf9\x5a\x70\x2f\xb6\x56\x95\xfd\xd0\xf5\xab\x86\x22\x97\x7f\xa3\x99\xdb\x2d\x63\x65\x9f\x04\x43\xf3\x29\x78\x0e\x96\x6f\x53\xa6\xed\xfe\xbf\xdc\xbd\x89\x76\xdb\x38\xd6\x30\xf8\x2a\x0a\x3f\x4d\x1a\x28\x5f\x29\x92\xed\x24\x15\xa6\xf8\xeb\x38\xab\xe3\xd8\x59\x6c\xc7\x71\x5c\x9d\xcf\x07\x24\x41\x9b\x36\x45\x2a\x20\x28\x59\x4e\xf4\x2e\xf3\x2c\xf3\x64\x73\x70\x01\x2e\xa2\x48\xd9\x55\xdd\x5f\xcf\x77\xa6\x4f\x57\x4c\x11\x0b\xb1\x5c\xdc\x0d\x77\x31\x71\xa7\x7d\x54\xbb\xdb\x95\x6a\xa2\x54\x1f\x6f\x2c\xd7\x02\x35\x32\xa3\xc7\x95\xb5\x53\x35\x23\x2c\x00\x81\x5d\x9c\xac\x9c\x2d\x33\xb4\xe2\x84\xe8\xa4\x87\x28\xd4\xb5\x06\x4c\xa9\x60\x37\x2d\x87\xa1\x9a\x6f\x07\xf3\x01\x2c\x74\x3a\x06\x20\xdf\x3c\xe7\x1f\xd6\x3f\xb4\xc8\x87\x66\x79\x13\x4e\x86\x14\xe6\x09\x19\x52\x0a\x99\xea\xbe\x92\xf6\x62\x90\x67\xc4\xf8\xe6\x69\x01\xef\x5b\x08\xdf\x3c\xf8\x90\x19\xb2\x17\xb4\x42\xab\x58\x50\x70\x83\xb5\xca\xc2\xa0\x00\xe7\x34\x58\x2b\x63\x74\x66\xc4\x55\x4b\x35\xce\xb4\x44\xeb\x06\x98\x67\x10\xdf\xcd\x48\xb7\x51\xbe\x7d\x9d\x11\x24\x92\xc8\xc9\xa2\xa1\x21\x6d\xad\x7b\x9c\x91\x77\x92\x64\x3a\x03\xdf\x77\x9d\x8d\x2e\x0a\xd6\xb1\x35\xf9\x48\xee\xfa\x36\x57\x7d\xce\x48\x14\xe2\x48\xa3\x10\xc3\xbf\x47\x88\x63\xe9\xdd\x23\xc2\xd6\x21\x26\x26\xf9\x8e\x83\xf2\xdb\xd6\x49\x31\x71\xf7\x98\xdb\xf3\xbb\xd7\xf3\xbe\x33\x33\xab\x0a\x31\xda\xd6\xea\x3f\x0b\x0a\xd3\xa5\x11\xae\x6a\xda\xf3\xee\xbf\x34\x5e\xd2\xb2\xba\xcc\x81\x24\xef\x90\xfc\x19\x7f\x57\x2c\x5a\x1a\x14\x33\xae\x0b\x1d\xcb\x15\xfd\x6a\xc5\x15\x13\xc3\x28\xd4\x93\x95\xfa\x4f\x56\xfe\x2a\xfb\x98\x93\x28\xc8\x7b\xa0\x54\x2b\xcb\x81\xb7\x6f\xd8\xe9\x02\x84\xd9\xa4\x6e\xe0\xdc\x8a\xa6\xdc\x2e\x1d\x93\xc7\xc8\xfa\x67\x5c\x3c\x09\x93\x39\x06\x6e\x85\x93\xa3\x47\x26\x8d\x2a\x85\x48\x85\x15\x13\x7b\x2f\x23\xf9\xa3\xb5\xb0\xc0\x7b\x6b\x27\x01\x78\xdf\x6c\x0b\x2c\xf0\x36\xed\x6e\xa0\x50\xa3\xf5\xd3\x02\xef\xa9\x3d\x50\x48\x33\xa1\xaa\x92\x4c\xfa\xde\x5b\x55\x6f\x2f\x23\xea\xf9\x1b\x55\xb5\xd5\xd3\xa6\x6a\xa0\xdf\xba\x9f\xa8\x6a\x76\x9f\xd8\xeb\xab\x69\x92\x6b\x4b\xbb\xb9\x58\xe0\x87\x9e\x22\xd0\xbb\x01\xa4\xc5\x27\xf4\x12\xe3\xa7\xa7\x64\x9a\x97\xa8\x81\xea\x97\x7a\xac\x69\x31\x50\xdd\x0d\xd5\x9a\x23\x0a\x63\x45\x46\xce\x13\x78\x19\x92\x5b\x41\x61\x37\xa3\x70\x19\xfc\x9d\xcc\x9d\x8a\x53\x1d\x19\x10\x16\x14\x13\x99\x9b\xec\x9d\x93\x60\x1d\x63\x1c\x63\x2c\x4c\x0a\x17\x81\xb9\xad\x9d\x05\x4e\x14\xc3\x3c\x68\x57\x9e\x6e\x57\x95\xa7\x37\x41\xb3\x50\x68\x82\xd6\xc0\x75\xb0\x3e\x97\xf5\x4e\x60\x2c\x6e\x8e\x02\x63\x3f\x73\x1c\xb4\x26\xc9\x7e\xdd\x54\xd4\x31\x17\x48\x0b\x38\x5b\x3b\xd3\xb1\xd6\x23\x61\x18\xe3\x42\x0e\xb8\x5a\xc7\x6f\xe4\x12\x39\x53\x12\x39\xeb\xb3\x82\x07\xeb\xa9\x4f\x7a\xfd\xee\xc3\x87\xfa\x81\x19\xa6\x4c\xff\xf2\x15\x57\x1e\x06\x44\x35\xf5\x50\xbf\x93\x1b\x30\x9a\xd1\xdc\x2a\xca\xb5\x68\xfa\x21\x16\x55\x59\x5f\x2e\x29\x75\xaa\x99\x61\xfa\x1c\xf4\x6d\xf6\xcb\xe5\x15\x69\x49\xcb\x52\x68\x4f\x92\xd2\x31\x59\xfb\x66\xa2\xc1\xbf\x87\x37\x3f\xbe\x51\x08\x79\x98\xee\xc4\x8c\x3f\xab\xa9\x82\xf4\xfa\xbc\x0c\x48\xa6\x18\xa1\xe7\xab\x2b\xa4\x79\x33\x4c\xb4\x53\x94\x26\x4b\x23\x88\x9d\xa4\xaa\xcb\xda\x0b\x21\xe9\xb3\x22\x09\xcd\xcb\x80\x24\x7d\x1f\x2f\xbd\xda\xbf\xbb\x80\xf3\xa0\x29\x49\x72\x9d\x2b\x36\xf3\xad\xde\x3c\xa2\xd1\x25\x30\xe4\x90\x3d\xe4\x90\xc3\x80\x1c\x13\x45\xd1\xfe\x18\xd4\xb6\x5c\x3f\x2c\x2f\x80\x06\x8f\x19\x39\x0f\x30\xcd\x99\x5a\x04\x3d\x65\xd6\xf7\xab\x13\xfe\xf5\x2b\xc9\x97\x23\x54\xcb\x21\xca\xe5\x08\x57\x06\x18\x2c\xe7\xec\xd9\x0b\x21\xec\x33\x08\xfb\x2e\x84\x7d\x2f\xff\x58\xa8\x96\x25\xa0\x8b\xf5\xa3\x29\x8d\x5c\xf7\xd4\x3b\x97\x5c\x05\xb0\x0c\xd6\x68\x6b\xd6\xbc\x7c\x6a\x74\x7f\x63\xf9\x2e\x70\xf9\x94\x40\xdf\x90\xca\xf9\x2e\x98\x8c\x51\x5d\xe3\x2f\x16\xc4\xcb\xc9\x78\x3e\x8e\xd1\x34\xb1\x71\x35\x64\x91\xd9\x87\x29\x18\xf0\xaa\xb9\xbc\xf7\xc2\x62\x6e\x66\x1d\xf4\x14\xf7\x83\x46\x8d\xf3\xb9\xe6\xcd\x9e\x57\xa6\x8b\xe1\x0b\x68\xa1\x5f\x5f\xd6\xb6\xd5\x13\x34\x2d\x28\x7c\x08\x1a\x95\x19\x82\x18\x81\x47\xd2\x5a\x28\xca\x7d\xfd\xd6\xd6\x99\x0a\x4b\xf5\xc6\x6e\x2b\x6e\x74\x6d\x8c\xd4\x6a\x19\x24\x79\x1a\x38\x4c\xc2\xbb\x3b\x98\xc9\xd3\x80\xfc\xf4\x98\x12\x7b\x84\x4d\x98\x93\xc1\x6e\x40\xea\x6a\xb3\x59\x00\xe8\x54\x52\x72\xeb\x66\x6b\x46\x33\x93\x4a\x6d\x2c\x0b\x85\x98\xe2\xcb\xbd\x5b\x5b\x80\x77\x60\xc7\xe0\x3d\xb6\x77\x24\xf8\xcc\x96\xe0\xfb\xf6\x83\xe1\xc2\x28\xa8\x17\x14\x3e\xb6\x22\xde\x29\x79\x17\x80\xf5\xf6\xf5\xb1\xa5\xc8\x11\x5c\x04\x9a\x2f\x3e\x34\x64\x6f\x16\x10\x54\x9f\x59\x5c\x88\x44\x58\xb0\xa3\x68\xa2\x22\x82\x27\xc1\x9a\xdb\x2f\x22\x8c\xc9\xe4\x6d\xe0\x9c\xc5\xf0\x2a\x58\x6b\x8b\x7d\x1b\xc0\x8c\x9c\x98\x7f\xae\x38\xc4\x14\xc6\xc8\x88\xec\xf3\x95\x82\x99\x2c\xb2\x36\xbf\x5d\x23\xaf\xbe\x0a\x90\xdf\xfd\x2c\x40\xc0\x0e\x0e\x85\x34\xd1\x25\xb3\xb2\x5e\xa6\x57\x36\xce\x1a\x5d\x9d\x8b\x3b\x9e\xc2\xaf\xf9\x38\x1c\xf3\x24\x93\x1d\x7e\xe3\x71\xee\x73\xbf\x1e\x3f\xe0\x03\x97\xb3\x44\x5c\x77\xf4\xa2\x3d\xaf\x78\x66\xd5\xa4\xa5\x49\x00\x67\x78\x05\x73\xd4\xf7\x2e\xe9\x86\xd5\xb1\x36\xf4\x8f\x7d\x38\x0c\x88\x50\x60\x50\xbb\xf0\xb6\xbe\xc4\x3c\xb7\x70\x11\x3c\x9d\x24\x71\xca\x3b\x81\x48\xc6\x1d\x36\x09\xf1\x16\xa5\xcf\xea\xde\xd6\x07\x2c\x0a\x12\x31\xe6\x7e\x27\x13\x91\xa9\x83\x7e\x5d\x9a\xc4\xbe\x69\x3e\x88\x65\x74\x96\xb8\xd4\x2e\xea\xd4\x6e\xa9\xb5\x71\x98\x69\x17\x84\x7c\x2e\x6f\x15\xa0\x7c\x54\xdc\xef\x49\x42\x5e\x85\x7a\x8b\x0e\xee\xdf\xf3\xfa\x0e\x6f\x4d\x87\x9f\x0d\x58\x36\x6c\x66\x5e\x3f\xde\xb0\x1e\xad\x68\x5f\xb5\x69\x2d\x59\xc7\xe8\x50\x0a\x5f\xd6\x48\x8d\xbb\xfa\x5e\x11\x0f\xc7\x8b\xbf\xc5\x00\xce\xc9\x87\x40\xa7\x6e\xc7\x29\x1c\x84\x24\xc1\xe0\x39\x46\x18\x0e\x88\x16\x00\x28\x5c\x4b\x4a\xab\x79\x52\x29\xfc\x58\x1d\x58\xf5\xfa\x5b\x14\xd7\xdf\x0f\x86\xa5\x85\x17\x6a\xde\x35\x1f\x95\x27\x83\x34\x57\xda\xa8\xfe\xfc\x14\xb4\x67\x8b\xff\x11\x34\x9b\xf2\xa1\xd0\xac\x87\xf4\x3e\x70\xe6\x31\x7c\x0d\x9c\xcf\x31\xb1\x26\x5c\xa4\x61\x2a\xdf\x2a\xd8\x78\x7d\x33\x61\xb1\xbf\x13\x45\x16\xbc\x0f\x28\x7c\x5b\x73\x4a\xf7\x0b\x31\x3c\x76\xdb\x6a\xed\x13\x01\x3f\xbd\xa9\x5d\x63\xa2\x6a\x81\x65\x0e\xc9\x9f\x1a\x90\xd0\xf6\xf4\xfb\x4a\x30\xef\x3c\x4b\xe4\x98\x03\xe3\x98\x6e\x73\x46\x5e\x4a\x50\x62\x4c\x4c\x29\x1e\x05\xa6\xd5\x97\xc2\xbd\x43\x4b\x1d\xe7\x97\x9d\x72\xfd\x98\xdd\x6b\xbb\x08\xfc\x2f\x5c\x18\x07\x10\xf7\x77\x8d\x8e\x94\xaf\x36\x2d\xb6\xed\x16\x09\x39\xbb\x44\x4a\x7e\x84\x94\xfc\x18\x29\xf9\x21\x24\x8e\xe8\xef\x42\xa8\x8a\x75\xa2\x96\x7b\xa5\x8a\x5c\x9f\x26\x52\xf4\xbf\xdc\x99\x28\x32\x5b\x9b\x28\x92\xad\x4f\x14\xe9\xe5\xc5\x26\xd9\x25\xcc\x33\x92\x34\xa4\x8e\x94\x4b\xa9\x23\x43\xfc\xe1\x65\xa9\x4c\xc6\x08\x56\x18\xe1\x82\x8f\xae\x25\xd1\xe9\x81\x31\x11\xc2\xf7\x5a\x76\x49\x4e\x47\xbb\x24\x86\xa5\x0c\x93\x9c\x6a\x0b\xf7\xcc\x55\xe2\xcb\xf6\x02\x98\xeb\x1c\x0a\x62\x05\x89\x97\xa5\x16\x05\x6f\x75\x2f\xda\x2f\xf7\xf7\x88\xde\xdb\x2b\x3b\xee\xb3\x91\x65\xd9\xa2\xef\x5e\x01\x6e\xf5\xa7\xc0\x30\xec\xa2\xef\x5e\xd3\x91\xfa\xd7\xde\x55\xa8\xfd\x3a\x8f\x87\xb3\xa0\x6a\x3d\x90\x38\x75\x25\xc9\x5c\x0a\xcc\x6d\x76\x68\x2d\x95\x0c\xa5\x11\x41\xe3\x08\x3e\xaa\x75\xab\x0c\xe2\x32\x80\x79\x48\x14\x8d\x54\x83\xf8\xeb\x1f\xdc\x6a\x9c\xa8\xea\x67\x08\xbb\x49\xdd\xa6\xcb\x54\x62\xfb\xcb\x95\x6a\xb2\xf9\x1e\x11\xa6\x04\xd5\xb2\xae\x71\xbe\x08\xdd\x46\x26\x4d\xf7\xc8\x6c\x4c\xd8\xe8\x4d\x69\xdf\x1d\x5d\x10\x01\xf5\x03\x4e\xcd\x85\x91\xc9\x40\x68\x61\x32\x17\x05\x1c\x16\x2d\x2d\x1e\xce\x89\x84\x0f\x89\x56\xfb\x9c\x26\x20\xfb\xde\x2e\xcc\x08\x77\xb5\xeb\x57\xb1\x30\x89\x59\x18\x04\xbd\x9e\x3b\xef\xa1\x1f\xba\x31\x3d\x59\x50\x08\xdc\x75\xd8\x37\xfe\xc3\x19\x94\xbc\xe9\x32\x3a\xee\x08\x85\x88\x7a\x43\xed\xf5\xac\xa6\xef\xba\xeb\x4d\x99\xaa\xbd\xc9\x7a\x6f\xd2\xdc\xa5\x8b\x3e\xab\xf6\x8b\x91\x49\x13\xc5\x6a\x4a\x5c\xe2\xb4\x15\x31\xbd\x93\x64\x4e\x5c\x9c\x3f\x9c\x6a\x65\xa3\xdb\x7c\xad\x3f\xf8\x43\xe4\x86\x87\xe7\x78\x93\xd4\xe8\x0b\xa9\xc6\xc7\xfb\x6e\x75\x84\xc5\xab\xbe\x5b\x20\x6a\x5e\x91\xb0\x8d\x57\x60\x6e\x45\xa8\x8a\x72\xe6\x2a\xaf\x62\x80\x4c\x5f\xa6\xf1\x12\xf4\x0f\xc9\x9f\x59\x1f\xef\xcd\xfa\xec\x7b\x01\xb0\x18\x26\xc6\xcd\xbf\x98\x5b\x64\xb8\xe0\x39\x6c\xa9\x29\xeb\xeb\xfb\x33\x4f\x37\x5f\xd4\x1d\x26\xab\xfd\x3c\x7c\x58\x3c\xe6\x9d\x26\xd8\x69\xe8\x24\x26\xb3\xab\x8b\xc2\xb8\xfe\x0c\x03\x56\xfd\x18\x6e\x46\x82\xc6\xd4\x89\x44\x41\x11\x1f\xb2\xfc\xc1\x83\x21\xdf\xfa\x23\x1e\xcd\x48\xea\x82\xe8\x6d\x03\x53\x92\x47\xe4\x42\xbc\x31\x34\xbf\x31\x39\x7f\xbe\x54\xb9\x28\x55\xb8\x50\x1e\x92\x3f\xb9\x99\x45\xa1\x04\xa4\xe0\xbb\xed\xdc\x4b\xe4\x6a\x9b\x0c\x54\x94\x36\x6d\x79\x61\xa4\xb1\x4a\x33\x75\x66\x65\xd9\x77\xb5\x9d\x95\x0b\x7c\x43\xf1\xd6\x81\x0b\xbc\x87\x30\xa8\x4f\x49\xb7\xf5\xf3\x3a\x9d\x4d\x8c\x96\x46\xaa\xe6\xd8\x75\xde\xc3\x65\x3b\x09\x34\xa2\x6c\x3e\x92\xaf\x42\xa7\x79\x6e\x8c\x8b\x60\x2a\x3d\xb8\x20\x3a\xcf\xf9\xc3\x87\x17\x84\x1b\x2e\x05\x75\x6b\x6b\x16\x65\x4f\x02\xde\x1a\x9b\x75\xb9\x70\x9b\x44\x6e\xcd\xf4\xd0\x42\xf1\xa8\x07\x39\x46\x9f\x38\xae\x5d\xa3\xba\x2e\x39\x45\x79\x65\xe2\xc2\x8c\x7c\x90\x30\x04\x49\xe1\xad\x49\xe6\x9d\x39\x68\x69\x0e\xc2\xd1\x59\xe8\x32\x90\xf4\xd1\xe6\xaf\x01\xc5\xe3\x3b\x23\x87\x09\xcc\xc8\xd4\x05\xa1\x95\xbc\xcd\xfd\x65\xd8\x9f\xd6\xdc\xc7\xce\x57\xa1\xbe\x9e\x39\xf1\xa3\x4c\xd1\x9c\x47\x12\x4c\x9e\xa1\x3c\xcd\xf4\xa5\x4b\xb8\xe1\x2b\xb9\x84\x98\x93\xfe\x63\xad\x4a\x06\x4c\x7c\x78\x23\x91\x93\x2d\xcd\x2c\x46\xc3\x47\x5b\xbf\x91\x6c\x43\x6e\x90\xb8\x27\xe8\xa3\x98\xda\x83\x05\x85\xd9\x3a\x64\x95\x23\x87\x5c\x58\x7f\xc0\xfb\xac\xef\xfe\xfa\x55\x47\x08\xf9\x31\x66\xb0\x7c\xcf\x8d\xb6\x47\xea\x39\xf7\xda\xc8\x14\xa7\x1a\x3b\x1e\x08\x87\x83\x74\x76\x89\x54\x58\x9f\x29\x1a\xcf\xa3\x94\x6b\xac\xf4\x15\x25\xcb\xa2\x73\x73\x43\x0a\x52\xf1\xb4\x0b\x0a\x73\xb7\x49\xff\x78\x42\x62\xda\xbf\x4a\xc2\x18\xc9\x03\xdc\xb4\xc1\x84\x95\x2b\xc7\xd5\x5f\xa1\xc8\xbb\xde\xfd\x51\x6c\xcf\x5d\x32\x27\x33\x57\xef\x82\xde\x5b\x83\x41\xaf\x5b\x30\xe8\x72\x67\xb4\xd0\x64\x37\xc0\x54\x3e\x9d\x8d\xfe\xe6\xe3\xdf\xc6\x9c\xcc\xc8\x8d\xa1\x51\xbf\x91\x61\x0f\x35\x11\x3b\xf7\x1c\xf3\x20\x1f\xf2\xd0\x9e\x93\x6b\x8d\xe9\x67\xe4\xc2\x2d\xbc\x9d\x8f\x5c\xe7\x15\x1c\xbb\x8d\x57\x4c\x79\x38\xb2\x82\xef\x79\x5a\xc6\x11\xe3\x55\x4a\xca\x2b\x94\x54\x13\xec\x4b\x5b\x2a\x16\xe0\xbe\x54\xb5\x16\x4d\x64\x4e\x42\x3d\xd4\x7d\xc2\xe1\x27\x3b\x57\x9d\xa9\xe5\xe7\x7d\x76\x0e\xde\xd4\xde\x25\xbc\xef\x61\xdc\x16\x34\x21\x53\x42\x92\x1b\xd9\xa7\x8b\x65\x3e\x09\xcb\x9e\xaf\xeb\x32\x2b\x7a\xcc\x59\xa5\x8c\xaa\xc9\x4c\x6b\xfd\x55\x32\xda\x61\x73\x77\xac\xa7\x57\xf2\x40\xdb\xb5\x1a\x6c\x4b\xd5\xd0\x7e\xbb\xd5\x7a\x8f\xeb\x3d\xbd\xae\xf7\xb4\x55\xef\x69\xbf\x5e\xa3\x30\x52\x67\x4e\x3e\x19\x35\x55\x86\x29\x46\xf7\x09\x83\x9f\x6e\x64\x7b\x18\x60\xe4\x9c\x8e\x4e\xed\x19\xe9\x72\x0c\xeb\xa6\x5f\xb0\xbe\x1b\xd9\x88\xb8\x87\x03\x9d\xad\xe8\xc8\x85\x1d\x57\x57\x87\x12\xcf\x37\x4a\x12\x9f\x50\x6f\xa9\x56\x68\x01\x6e\x46\x21\x55\x9f\xf1\xf6\xf4\xd5\x54\x75\xb6\x2b\x81\xe7\x38\x72\x7c\xb9\x02\xea\xb5\x6b\xec\x26\xce\xda\x00\x19\xfd\x02\xc1\xfb\xa2\x6f\x2d\xae\xdc\x75\x0e\x6d\xde\x4b\x5b\x80\xf7\x5e\xd5\xff\x64\x4b\xf0\xb6\x6c\xae\x1a\xbd\x74\x9d\x2f\x02\xce\x5d\xe7\x51\xff\xbf\x1f\xc1\x9e\xeb\xbc\x10\x64\xf8\x68\x40\x61\xff\x9e\xf0\x5e\x09\xc0\xb7\x85\x86\x7e\xac\xdf\x1d\x71\x5b\xef\xdc\x0b\x1b\x11\xec\x41\x06\x12\x43\x21\x54\xb7\xa8\x0e\x30\xda\x53\x1b\xd7\x3d\x91\xa0\xa6\x66\xa1\x44\xec\x7d\xb1\x2d\x6b\x01\xf9\x6e\xf0\xbe\xfb\x42\xad\x63\xe1\xbc\x8d\x58\xd7\x1c\xa0\xd7\xe6\x00\xe5\x52\x52\x71\x80\xee\x0d\x5a\xe5\xb1\x60\xcf\x57\xc6\x97\xdd\x3d\xbc\x1c\x58\xda\xf3\x86\xbb\xc9\x42\x81\x52\x46\xa9\x99\x0b\xa5\x8d\x90\x9b\x0f\x11\xfd\xd3\xd7\x1c\x23\x77\x6f\xf5\x78\x34\x8d\xdf\x38\xbd\x9b\xee\x9a\x71\x92\x7b\x6b\x23\x52\xcc\x8c\xa8\x90\xd1\x05\x06\x63\x6a\x81\xd4\x05\x85\x0f\xeb\x25\xfa\x3c\x5f\x67\x6e\xe9\xb4\xeb\xb6\xa8\x7b\xf3\x10\x4c\x2e\x43\xc1\x9d\xed\xa1\xe4\xce\xba\x28\xba\xbb\x3b\x10\xa8\x5f\xef\xc0\x75\xb2\x0d\xeb\xbf\x1e\xe5\xaa\xb5\xd4\xe1\x2e\x71\x8b\x04\x7c\xab\x6a\x47\x9c\xbc\x42\xb6\xef\x8c\xbc\x55\x2c\xd2\x00\x37\x3a\xc2\x5b\x23\xbf\x21\xaf\x67\x54\x8b\x0f\x15\x3b\x11\x5a\x99\x23\xf2\xf0\xf6\xec\x57\x26\x09\x29\x86\x80\x44\x86\xa4\x75\xc3\xc3\x05\xb8\x92\x9a\x5c\xa5\x68\xc2\xd9\x96\x44\xa7\xc4\xc4\xef\x12\xb8\xd0\x2a\x56\x0d\x6b\x99\x76\x52\xb6\x16\xc8\xa8\xb9\x0a\xca\x5e\x04\x77\x7c\x14\x4b\x5d\x09\x97\x01\x69\x45\x54\x8a\xc7\x40\x54\x85\x6c\x52\xc5\x79\xe9\x9c\x78\x48\xb7\x45\x9d\xf0\x9c\x93\x28\x01\xb6\x1a\x5a\x33\xc4\xb7\x2b\x90\x12\x67\x24\x52\xb3\xc0\xb0\x58\xf4\xf9\xca\xb6\xf8\x6a\x04\x7b\x76\x04\x2e\xb3\xfd\xbe\xbb\x8c\x21\xd4\xc2\x4c\x9d\x19\x89\x5d\x90\xc0\x28\x74\x9d\x19\x91\xea\x39\x59\xe9\x69\x39\x9c\x84\xec\xb3\xcb\x51\x60\x87\x18\x55\x02\x7f\x84\x89\xed\x01\xeb\xda\x5d\xf5\xa1\xa9\x82\x5c\xa4\xcd\x58\x36\x23\xfb\x66\x03\xbf\x71\x10\x99\x3a\x1d\x07\x01\xca\x86\xd4\x2e\xcb\xbe\xe6\x65\x6f\x4c\x19\x94\x65\x59\x86\x65\x9f\x03\xc2\xab\xd4\xba\x72\x98\x85\x3e\x72\x42\x1d\xb9\x94\xec\x13\x09\x3f\x31\xab\x2d\x1a\xe7\x96\x11\xcf\x9e\xae\x6d\x71\xd4\xd0\xe2\xf7\xb5\x2d\x8e\x1b\x5a\x0c\xeb\xa7\xc3\x3d\xa9\x9f\x8e\x6d\x5c\xfa\xb1\x33\x23\x1e\xda\x41\x41\xa2\x16\x7f\x8c\x67\x65\xdc\x77\xe1\xd2\x19\xf7\x3d\x98\x38\xe5\x0a\x48\xbd\x02\x97\x14\xc6\x4e\x4a\x66\xe4\x83\x0b\xdd\xbe\x7b\x8d\xeb\x34\x71\xfc\x51\x85\x15\xc2\xf1\x8d\x29\x4c\xbe\x53\x6a\x4f\xea\x1b\x89\x5b\x74\x82\xcc\xf4\xa4\x40\xdb\x13\xe7\x86\x1c\xbb\xe0\xa2\xbd\x23\x53\xa0\x70\xe9\x4c\xaa\x39\xc6\xf5\x3c\x98\x3d\x75\x26\x38\x93\x72\x60\x3c\x1f\x58\x81\x1d\xa7\xce\x0d\xd9\x2f\x3b\x0b\x55\x67\xd3\xd5\xce\x76\xec\x69\xad\xab\xac\xd6\xd5\xb3\x3a\x96\x79\x53\x5f\xc7\xa1\x46\x33\x17\x55\xd5\x6a\x09\xb1\x68\x54\x76\x01\xa2\xcf\x5e\xd3\xd1\x8c\x7c\x2b\x7e\xd8\x33\xf2\xa5\xf8\x01\xde\x0f\x8d\xb3\xbf\x06\xe4\xc1\xb0\x82\x8d\x2f\x11\x79\x5d\x38\x5b\x8e\xe3\x90\x0b\xe7\x9c\x04\x6a\x68\x8a\x00\x3f\x7c\x78\xd1\x77\x47\x88\xa2\x3e\x28\xc1\xe5\xab\x20\x17\x48\x80\x29\xb5\xc7\xc9\xea\x40\x2e\xd4\x37\x2e\x8b\x43\xf1\x35\x20\x97\x6a\xde\x49\x02\x2c\x83\x2b\x4e\x2e\x8d\x62\x67\x41\xe1\xd4\x75\xe6\x31\xbc\x73\xab\x4a\x6c\x0c\x56\xf8\x8a\xcd\x3f\x06\x5f\x39\xbf\xb6\xe0\xd4\xa5\xf0\xb1\x4d\x58\x8d\x81\xb7\xa7\x51\xce\x23\x17\x2e\x5b\xb1\xe4\x71\x0b\x97\x93\xe6\x94\x21\x0b\xcb\xe4\x39\x35\xf4\x33\x30\xe9\x93\x57\xbf\xc7\xeb\xc1\x78\xcd\x87\x6b\xd1\x78\xcd\x87\xeb\xb7\x43\xc5\x97\x1b\x70\x9a\x77\x63\xf3\x62\x25\xf5\x1a\x4a\xb5\x86\x6f\x38\xd1\xde\x0b\x4c\x95\x53\x0a\xef\x5c\x52\x18\xb0\x1d\xae\xe5\xdd\x4c\x5e\xad\xaa\xd3\x0e\x86\xef\x70\x8d\x99\xc9\x17\xb1\xd6\xa4\x3c\xd5\x6e\x05\x0b\x0a\xb7\xae\x33\x23\x5f\xb4\x6a\xd0\x68\xb7\xdf\xbd\xb2\xbe\x53\xf4\x1d\x7a\xe5\x3a\xd7\x31\xbc\x6d\x25\xe8\xef\x25\x89\x1f\xa1\xd8\xff\xc6\xbd\xbf\x73\xa1\xd8\x88\xeb\xee\x2c\xda\x3a\x81\xf7\xdd\x4f\x18\x60\xa0\xac\xc9\xb5\x37\x17\x08\x47\xe4\x7e\x83\x07\xad\x60\x54\xa5\x96\x6f\x34\x92\x9a\x91\xb7\x2e\xc4\x98\x30\xfd\x09\xdf\x36\xc1\x48\x3e\xb7\xdf\x4e\x30\x32\x23\x07\x46\xce\xeb\xb3\xaf\x0b\x0a\x5f\xdc\xf6\xab\x97\x59\x08\x9b\xdb\xfa\x1b\x45\x33\x78\x32\xc0\xfd\x7b\xb1\xbe\xdd\x90\x6f\xe9\x71\xe1\xcd\xd4\xfa\xba\x4f\x06\x65\xf7\xaa\xfa\xa7\x56\x65\x7b\x6d\xfc\x93\xff\xbf\x24\xea\xa7\xf0\xde\x6d\xbf\x29\x1f\xfc\x11\x8f\xe6\xe4\xbd\x0b\xf1\xff\xf9\x3f\x43\xd8\x25\x42\x6d\xc3\xf0\x61\x3c\xda\x25\x12\x04\xb5\x25\xb5\x95\x80\xf5\x75\x8d\x16\xeb\xbd\x16\x73\x51\xf1\x0d\xdf\xd6\x7c\x6b\x97\xcc\xc8\x57\x17\xe2\xde\x98\x13\x49\xe1\x08\xf5\x53\x1a\xac\xe2\xb4\xbd\xff\x6f\xaa\x7f\x6b\x80\xa9\x3e\xf4\x26\x8a\xf4\xee\x3d\x2f\x60\x77\xc8\xb7\xb0\x91\x4c\xef\x07\xb9\xee\x96\x82\x40\x71\x4f\x27\x7a\x9e\x3a\x33\xf2\x42\xc0\x00\xd3\x4c\xa5\x8e\x64\xc0\xd4\xab\x93\x00\x4e\x5d\xc8\x52\x0a\xde\x9a\xa9\x9d\x4b\x20\x0a\x87\xb7\x5e\xf8\x4d\xb2\xf4\x92\xe8\x4b\x5a\xb1\xa0\x14\xfe\xfc\x9e\xfb\x15\xab\x5d\x49\xd2\x7b\x46\x67\x09\xd3\xf6\x5d\xd1\xf6\x17\x9f\x3e\x1e\x19\x03\x0c\x6d\x6e\x0d\xc1\x6a\xdf\x71\xfd\xe6\xbc\xc8\x98\xa2\xb3\xa4\x7c\x45\x03\xd7\x73\x62\x99\x5b\x9d\xd4\x82\x19\xf1\x52\xf8\x96\x01\x11\x8e\xa0\x7d\xf7\x5a\x5f\xb1\x95\x1e\x4c\x2c\x25\x02\xf3\x7d\xaa\xd7\xb9\xe7\x13\xbe\x64\xa7\xfa\xa5\xce\x6c\x82\xf1\x7f\x4e\x5d\xf5\xfe\xc4\xbc\x4f\xc6\x63\x1e\xcb\xfc\xed\xb1\xb9\x41\xf4\x2d\x9d\xda\xfc\x95\xab\xd3\x9d\x9f\xe2\x75\x98\x6f\xb2\x09\xa1\x07\x6c\x0a\x16\x9b\x4c\xa2\x50\x07\xc0\x7a\x74\x95\x26\x98\xa9\xf2\x75\x4d\x27\xf9\x36\x20\x73\x12\xa6\xb8\x22\xb7\x5a\x6f\xec\xb6\xae\x37\x3b\x56\xbc\xca\x31\x30\xe4\xfd\x4e\x60\x6a\x0b\x48\xed\xb8\x9f\x02\x3b\xb5\x31\x3b\xbe\xeb\xdb\x98\x56\xc6\xfd\x6c\x63\xd2\xfc\x3d\x25\x6b\x2f\x28\xa4\xad\xe0\x11\x84\x04\x21\x78\x83\x69\xef\x3b\x0a\x51\xea\x34\x8a\x27\x52\x84\x63\x42\x17\xe0\xa7\xc6\xa1\x68\x66\xc1\x93\xc1\xf6\xef\xfc\x31\x2e\x8a\x6f\x01\x06\x5c\xc0\x1f\x97\x16\x6c\x3d\x31\xcf\x63\x4b\x63\x76\xb5\x25\x16\x1e\x94\xef\x14\xa6\xeb\x0f\xd7\xd3\x15\x3f\x3b\x7c\x59\x71\x99\xfb\xf5\xeb\xe9\x42\x0d\xfb\x69\xef\x3e\x96\xb5\xff\x89\x94\x7d\x66\xf9\xba\x69\x0b\xf5\x63\x8c\xc4\x74\x34\xb4\x07\x45\x38\xe3\xbb\xec\x7f\xb7\x86\xb5\x61\x3e\x7e\xb6\x21\x6b\x23\x7d\x36\xc8\x5f\x15\x83\x1d\x6e\x16\xef\x8a\x01\x0f\x1f\x0f\xf3\x77\x05\x6d\x18\xfe\x5e\xbc\x2b\xe8\xc3\xe6\x70\x33\x7f\x57\xd0\x88\xcd\xed\xad\xfc\x5d\x41\x27\x36\x9f\x16\xef\x2a\x81\x1c\x06\xdb\x1b\xb2\xbe\x32\x5b\x5b\xdb\x1b\x68\x89\x31\x4e\xef\xe6\x52\x2e\x5b\xeb\x78\x6a\xf5\x36\x66\xa4\x8b\x67\x85\x6e\x28\xe6\x7a\x92\xb6\x92\xd9\xfa\xd2\x6e\xd5\x21\x40\xef\xc6\xe6\x33\x7b\xf3\xf7\x3a\x2c\xd4\x69\xee\xd6\xa0\x4e\x74\x87\xf5\xd0\x1b\x83\x7c\x69\xeb\x91\x34\xea\x51\x33\x06\xf5\x08\x19\xc3\xd5\x45\x5c\x59\x41\xa4\xaf\x17\xe9\x9d\xb7\x14\x33\x32\xd1\xab\x03\x99\x93\x30\x63\xea\x39\xdc\xfc\xc3\xc9\x7e\xfd\x3a\x46\xcf\xb4\xf2\xda\xf5\x27\xfb\x6a\x4b\x60\x13\x5b\x80\xbb\x65\xc7\x0b\xc3\xc4\x85\x8c\x64\x1b\x43\x0a\xd2\x91\x3d\x64\x58\x67\x69\xfb\x7d\xd7\x8c\x8c\xcd\xf7\xf0\x7c\x0a\x73\x19\x35\x4f\xb5\xf5\x92\xcb\x9a\xf5\x1c\x6c\xb2\xa0\x70\x63\x2a\xcd\xd3\x86\x4a\x24\xc1\xdd\xde\xa4\x8f\xb6\x7e\x29\xa1\xf2\xba\xe5\x4c\x01\x77\xc4\xf3\xb6\x33\x2f\x9d\x00\x49\xb3\xc7\x88\xa4\x1b\xc3\x15\x7f\x86\xcb\x14\x74\x05\x22\x9d\x9b\x54\x3d\x84\x8c\x6c\xfd\x26\x7b\x9b\xb4\x21\xc8\x75\x51\x7b\xae\xaa\x16\x72\xe9\x32\x60\xf0\xde\x8c\x4c\x53\xc4\xf0\x35\x08\x31\x25\xc3\xa2\xe4\x49\xad\x64\xb3\x28\x79\x5a\x2b\xd9\x2a\x4a\x7e\xaf\x95\x6c\x17\x25\xcf\x6a\x25\x8f\x8b\x92\x12\xb0\x4c\xd1\x13\x55\x54\x83\x30\x24\xdf\x3b\x6b\xc8\xf7\x31\x9a\x7f\xfd\x31\x18\xc5\xf6\xe0\x8f\x63\x64\xda\x46\x02\x79\xb6\xa3\x35\xad\xea\x67\x76\x4e\x76\xd4\x12\x94\x60\xaa\xe3\x86\xac\x61\x5d\x8e\x52\xc0\x64\x9b\x06\xc8\x3e\xb9\xf9\xd3\xe7\x92\xd9\x7e\x9d\xae\x73\x24\x52\x64\xe8\xb7\x78\xe3\x09\xdf\xfe\x4d\x60\xa0\x29\xb9\xa1\x44\xbd\xb3\xd6\x8f\xde\x90\xd7\xea\xa3\x5f\x8a\x4f\xfd\x28\x9e\x44\x31\x90\x17\xe5\xe7\xaf\xda\xf0\x3d\x92\x55\x43\xaf\x48\xaa\xb8\xbf\x63\xdd\x5e\x2d\xc9\x99\x7e\xec\x49\xfa\xe8\x09\xdf\x46\x20\x7f\x99\xb6\x5e\x58\xa7\x48\xa1\x25\x64\x8a\x37\x52\x2d\x83\x90\x70\xe4\x34\xd4\x43\x4f\x4d\x2e\xa3\x68\x1f\x71\x95\x16\x66\xc5\x17\x24\x83\xf2\x12\x51\x3c\xe7\x65\x65\x59\xf1\x3c\x95\x60\x5a\x71\x4a\x47\x1c\x1d\x36\xce\xd7\xec\xe9\x9c\xbc\x4c\xf1\xb2\xed\x3a\x45\xdb\xd3\xe3\x14\x8b\x29\x0c\xd0\x9e\xbb\xa9\x65\x3d\x29\x55\x71\x28\x72\x02\xb2\x6d\xd7\x3b\x37\xbd\x42\xb9\x19\xf8\x13\x37\xc3\x3c\x09\x53\x65\x50\xa8\xc8\xb6\xfe\x7a\x37\x83\x4a\xf3\xcd\xfb\x36\x1f\x2c\x35\x1b\x96\xcd\xce\x53\x18\x0e\x75\x10\x85\x65\xf4\x81\x45\x9b\x95\x92\xc1\x52\xc9\xa0\x52\x52\xeb\xae\x52\xb2\xb5\x54\xb2\x55\x29\xd9\x5e\x2a\xd9\xae\x94\x3c\x5e\x2a\x79\x5c\x29\x79\xb2\x54\xf2\xa4\x52\xf2\x74\xa9\xe4\x69\xa5\xe4\xf7\xa5\x92\xdf\x2b\x25\xcf\x96\x4a\x9e\xe9\x92\x7a\x98\x7f\x9c\x90\xf1\xb4\x5c\x50\xd8\x6f\x87\x77\x64\xaa\x23\x56\xf2\x7b\x3f\xd9\x95\x2d\x80\x5d\xdb\x79\x89\xc2\xeb\x37\x9a\x80\xc5\xc0\x04\xaa\x90\x6f\xd5\xe3\x8e\xd6\xb3\x7c\x40\x21\x69\x37\x5d\x1b\x2f\xf2\xd8\x3e\x44\x03\x07\x76\xa2\x1e\x62\x0a\x53\x7b\x4e\xf6\x53\x40\x7f\x63\xb4\xef\x23\x69\x0a\x4f\x37\xf9\x63\x84\x70\x4e\x21\x55\x15\x91\xf5\xb7\x2c\xc8\x18\xc1\x48\x55\x94\x2a\xfe\xfb\x90\x93\x0f\xe9\x72\x0b\xaa\xf8\xf1\x1d\xa9\xb8\x71\x5d\xaa\x7a\xd9\xb3\x1f\x20\x3d\x3f\x6d\xc5\x40\x88\x38\x7a\xb1\x42\x9e\x0b\x0a\xef\xd2\x3b\x9c\x89\x8c\xf1\x6b\x25\x3e\xcd\xc7\xb4\x5d\x01\xe3\xeb\xd4\x1a\x27\xe8\x6a\xa3\x64\x09\x07\x05\x05\xcf\x41\xf9\x21\x71\x76\x33\xe2\x33\x92\xa5\x84\x69\x23\x8c\xe2\xb7\x57\x5e\x34\x98\x95\xcb\xf2\x95\xe3\xc5\xca\x99\x88\xb2\xf5\x65\x9a\x91\xd3\x54\xfb\x7c\x54\xd7\xca\xd3\x0b\xa4\x57\xbb\x58\x23\x56\x59\xa3\xeb\xd8\x61\xad\x91\x77\xab\xfb\x98\xa9\x91\x70\xd5\xb5\x54\x5d\x32\x70\xaf\x95\x5c\xfa\x59\x71\x37\x47\xb6\x07\xee\xa9\x8d\x01\x9d\xcf\xd6\x46\xdc\xbd\xb0\x39\xb8\x97\xaa\x8b\x44\xb5\x3e\x33\x41\x47\x85\x83\xc1\x2b\xc2\xf4\xf5\x8f\x8c\x45\x18\xb7\x22\x48\x10\x3e\x1e\x0c\xf2\xc8\xb2\xe9\x21\xbf\xe0\x37\x16\x04\x26\x00\xc5\x94\x45\x19\x2f\xe3\x64\x54\x63\xc5\x9e\xe9\x5b\xe5\x53\xe1\x54\x63\xcc\xde\x15\x56\x37\xcf\xc9\xf7\x97\x42\xea\xe6\x09\xfe\xfe\x7e\x3c\xdd\x96\xd8\xb6\x87\xc6\x94\xfc\x30\x75\xda\xe3\x87\x60\xc0\x91\x53\x13\x70\x44\xc9\xcc\xf9\x6a\x14\x52\x75\xf1\xa2\x14\xbf\xf3\x57\xb5\x00\x25\x2b\xe1\x48\x4a\xe9\xff\x24\x21\x9f\x04\x8e\xf4\xba\x0c\x18\x02\x27\x8d\x34\xac\x45\xb7\x60\x81\xf8\x5e\xcd\xf8\xb9\x9f\x80\x84\xd2\x32\xff\x30\xd5\x1a\xdf\xdb\xd4\x21\x3c\x71\x82\xb0\x1e\x05\x3b\x26\x3b\x31\xe1\x09\x79\xc5\x24\xef\xc7\xc9\x8c\xe8\x1b\x62\x0a\xaf\xd2\xaa\xce\xdd\x04\x92\x7f\xa9\x66\x9b\x08\xad\x73\x7f\x9b\xde\x15\x3b\x33\x77\x42\x32\x31\x79\x46\x26\x3c\xd2\xc8\x84\x77\x1a\x19\x37\xb1\xd1\x4c\x92\x29\x31\x5e\x3d\x7d\x06\x1c\x6d\x08\x19\x26\xae\x41\x6f\x1a\x66\xbc\x6a\x32\xf3\x97\x9b\xbf\xd2\xfc\x35\xc8\xe3\x85\x50\xe2\xfd\x0d\x39\x53\x67\xd7\xb2\xe0\xc1\xd0\x40\xba\x12\xdb\xdf\xa4\x8e\x3a\x6e\x96\xa5\xce\x9b\xfa\xf7\xd4\xd6\x89\xe2\x0d\xa2\xbb\xb6\x5f\x08\x75\xec\xf0\xe5\x02\x0e\x9a\xd4\x3b\xe7\x0a\xa1\xc4\x14\x7c\x54\xae\xea\xc0\x39\xe8\xe6\xa6\x93\x2c\x94\xd7\xa1\xcf\xf1\x7e\xb5\xbc\x84\x51\x9c\xa7\xc2\x8a\x78\x2b\x62\x74\xb3\x0a\x01\x5a\x2f\x59\xfc\x0f\xd9\x71\x79\x27\x8c\x31\xef\xd2\x84\xa5\xd2\xd2\x08\x11\xb5\xc9\xcd\xe8\x10\xaf\xae\x7d\x40\x53\xbc\x63\x6d\x8d\xae\xd3\xf7\xb8\x9f\xd1\xe0\x94\x9d\xe6\x1f\xde\xcd\x48\x40\xde\xa6\xb0\xd6\xeb\x69\x9f\xbc\x49\x41\x2d\x8e\x50\x6b\x83\x81\xc0\xb3\x65\x5c\xc4\xf1\x3a\xfd\x12\x27\xdf\x65\x44\xf6\xdd\x33\x7c\xe0\xf8\xa0\xb0\x2c\x3e\xcc\xc8\x41\x0a\xea\x11\x84\xfa\x8d\x90\xf7\xa5\x95\x08\x1c\xe3\x2f\xe4\xcc\x15\xeb\xf6\xa2\x9d\xa8\xca\x56\x49\x69\x4e\x5e\x28\x56\x63\xb8\xf9\x9b\x00\x5e\x33\xaa\x70\x99\x42\xef\xcc\x19\x6e\xfe\xa6\xc6\xb7\xd5\x1b\xd2\x0d\x25\x9e\x65\x7d\x36\xa1\xea\x87\x00\x4f\x49\x8d\x5a\x67\xbe\x09\x8c\x2a\xf1\x91\x39\x28\x1b\x32\x18\x6e\x2a\xd1\xab\x94\x07\x98\x91\x07\x14\x31\xd8\x98\x91\x2f\x6a\xa6\xec\xab\x16\x09\x90\x40\xd4\x38\x27\xbe\xf1\xf4\x37\x51\xc7\x58\x7c\x03\x11\xf3\x8f\x66\xea\xbe\x12\xbc\x6e\x85\xef\xd4\x3a\x2f\x4e\x37\x0a\x21\x69\xdb\x8e\x9d\xe1\x63\x10\x0e\xc6\xb9\x35\xc1\x66\x1a\x22\x92\x6c\xe5\xf5\x50\x9e\x68\xaf\xb7\x99\xd7\x43\xf1\x63\x4d\xc5\xe1\x12\xd3\x29\x01\xb7\x62\x2b\xe7\x3e\xd5\x7c\x14\x40\x9c\x99\xc7\x15\xb6\xb2\x6c\x33\x5c\xdf\x66\x60\xc7\xce\xa6\x9a\xdf\xe6\xba\xd1\x98\x4a\xeb\x96\x00\x57\x60\x08\xc2\x79\xda\x5c\xa9\x8c\xd2\xb2\xa6\x16\x92\xd5\x35\x12\xd8\x8f\x54\x81\x52\x0c\x3c\xd5\x36\xab\xef\xef\xa8\xbb\x55\xa9\xfb\xb5\xfd\x04\xcc\xc9\x5e\x9a\x47\x39\x2b\xe4\x1f\x0e\x92\x8e\xa4\x8d\x1d\xc5\xb8\x8c\xe8\x5c\xf9\xad\x01\x75\xf5\x1c\x14\x02\xf0\x4b\xcf\x5b\x07\x1b\x47\xcd\x2d\x7f\x34\xb6\xac\x0e\x5d\xd4\x5a\x66\xb9\x99\x49\x83\xe2\x27\x0f\x81\xcb\x97\xcc\x43\x0e\x5a\x3c\x65\x74\x0a\x84\x45\xc5\x9b\x39\x1e\x9d\xab\x33\xbc\x03\x5c\xfd\xb9\xa6\xd4\x3e\x27\xf8\xb8\x43\x01\x5f\x2c\xb4\x40\x39\x09\x40\x63\x78\x3c\xf0\xcf\xdb\x7d\x46\xf6\x49\x06\x3f\xd9\x44\xb1\x73\x13\xa6\xfd\x22\x6b\x12\x4d\xa5\x06\xee\xc4\xa6\x9a\xb8\x5e\x85\x21\xf4\x86\xea\x57\xf9\x5e\x6a\x12\x5a\x83\x78\xdd\x85\x28\x0d\x24\x6a\x02\x50\x5e\xbe\x23\x17\xb4\xea\x8f\xc8\x9b\x6c\x9e\x2b\x1e\xc6\x17\x18\x55\xbc\xb0\xcc\x7e\x5e\x22\x0a\x22\x94\x20\x8f\xe5\x98\xff\x85\x11\xf5\x12\x1f\x70\xb0\x43\x1c\x77\xec\x28\xd6\x1e\x59\xf6\x1e\x32\xfe\x62\x43\x7b\x86\xb2\x56\x26\xbf\xdf\x1d\x09\xed\xda\xc1\xf1\x22\x54\x6b\x13\x3c\x67\x25\x5f\x53\xd6\x67\xa2\x16\x5e\x0e\xb7\xee\x56\x6d\xc9\x55\x25\xc5\x37\x28\xda\x5a\x29\x28\xfc\xc7\x58\x1e\x08\xa0\xc8\x64\x54\xf4\xa3\x13\x9b\xef\xc8\x7c\xf2\x4b\x04\x37\x2f\x46\x0e\x9d\x2e\x8c\x2b\x7e\x6b\x0f\x3a\xbd\x78\xc5\xb4\x7e\x3f\x04\xbd\x76\x42\x2f\xce\x05\xc2\x05\x1d\x61\x23\x2d\x61\x09\x04\xbc\xa5\xcf\x10\x0a\x09\x86\xfc\xf2\x1c\xaf\xbc\x30\xd6\x3b\x7b\x65\x7b\x5a\x0a\x54\x12\x00\x82\xa9\x12\xfb\x12\x25\xf6\xa9\x77\x09\x20\x00\x2f\x0a\xe9\x57\xbb\xbd\xab\xb5\x09\xd0\x69\xc9\xc5\x28\x03\xed\x12\xd5\x1f\x83\xd1\xc0\x46\x52\x66\xac\xe5\x13\x67\x4e\x04\x84\x10\xb4\xdd\x9e\xc5\xa3\x19\x89\x23\x98\x91\x14\x9e\x0c\x00\xa3\x7e\xdb\x33\xf2\x2d\xc5\x37\x9b\xdb\xfa\xcd\xa2\x64\x2e\xf5\x3c\xae\xed\xa4\xef\xaa\x51\x27\x18\x89\xbf\xc8\x66\x85\xc3\x0b\xf4\x37\x2b\xc3\x5e\xf1\xcb\xc9\x4f\xbf\x5c\xf6\x5b\xac\x2d\xb6\x62\x87\x91\x2f\x28\x62\x73\xcc\x48\x3c\x7a\x9f\xda\x9f\x52\x70\x35\xc0\xad\x8c\x2b\xd0\xe3\x0a\x8a\x48\x60\x51\xbb\x2e\xa8\xce\x99\xce\xf0\x03\x39\x07\x4a\x9b\xb8\xcb\x33\x13\x67\x91\x47\xce\x1b\x01\x59\xe4\x1c\x08\x60\x51\xeb\x85\xd7\x91\x2d\xfa\xec\x08\xcd\xf5\xfb\x2e\x05\xcf\x16\x18\xb9\x4c\xe8\xa0\x67\xe0\xbe\xb5\x85\x8e\x5c\x26\xfa\x4c\x8d\xd6\x8b\x9c\xb7\x02\x92\xc8\x79\x25\x20\x8c\x9a\x0e\xfd\x9c\x24\x11\x0c\x07\x43\xdc\xe0\x5f\xbf\xf0\xe7\x93\x67\x5a\x2f\x97\x4b\xc9\x18\x7d\x0b\x4b\xb6\xb7\x30\x3a\xad\xa9\xb7\xfd\x18\x7f\x8d\xe4\xc6\xd0\x96\x78\xcd\xe7\x45\x3a\x7a\x6d\x45\x9b\x26\xe8\xa8\x27\xca\x35\x8f\x17\x14\x82\xa8\x5d\xc3\xa9\xba\x7d\x82\x9f\x1f\xcd\x48\xa8\x00\xc9\x8b\xb4\x87\x8c\x01\xa5\x30\xca\x61\xd1\x8d\xd6\x1a\x62\x72\xf4\x28\xe1\xda\x56\xa3\x29\x0a\x3e\x3a\xc9\x7d\x4d\xc0\x04\xb4\x7d\x2e\xaa\xa8\x4e\x0d\x9d\x99\x28\x59\x3a\x91\x84\xa4\x7f\x14\x0d\xe2\x6a\xa4\x2c\xed\x74\xc1\xa2\x22\x72\x6a\x1a\xad\x8f\x50\x59\x4d\xae\x61\x0a\xf1\xa2\x31\x6a\x15\x7d\x74\xc4\x7f\x25\xbe\x24\xce\x8c\x04\x11\x78\x3a\x01\x67\x18\x90\xa4\xb4\x3e\xc9\x67\x75\x43\xd2\x08\x18\x02\x42\x9f\x1d\xf5\x48\xb2\xc1\x30\x5e\x3d\xb0\xbe\x47\xf3\x74\x19\x7d\x17\x92\xe6\x38\x65\x88\x7b\x75\x2d\xaf\x52\x67\x4a\x5c\xb5\xf4\x3a\xf8\x89\x1a\xd5\xf3\xc2\xcf\xab\x79\x5d\x99\x5a\xa6\xe7\x99\xd9\x88\x24\x24\x18\x99\x0c\x3f\xac\xa5\xb0\xe7\x95\x40\x31\x1c\x23\x32\xd4\x5b\x17\x8b\x9c\xa1\x78\xa6\x97\x39\x01\xed\xc0\xde\x6a\x2e\xd0\xe1\xce\x4f\x76\x80\xa7\x8c\x02\x3b\xb3\x63\x60\x9b\x4a\xfa\x61\x92\x82\xeb\x9a\xf7\x6e\xa0\x5e\x71\x49\xc1\x7b\x63\x0b\x70\x27\xfa\xfd\xa2\x9e\x6b\x42\x83\xe4\xef\x45\x94\xb7\x8a\xa9\x2b\x9e\x0b\x51\xf2\xf3\xfa\x2c\x6d\x0e\x74\xda\x3c\x3a\xc2\x15\xe3\x7d\xef\x0d\xf0\xbe\xeb\x62\xc0\xa7\x2c\xd2\x16\x7b\x14\x62\x35\x39\x55\x1f\x55\xa4\xab\xf5\x27\xc8\xc9\xf2\x08\x7e\xaf\xb7\x78\xf6\x7b\x53\x03\x76\x90\x37\xd8\xac\x34\x08\x48\x54\xd6\x38\x53\xfd\x06\xea\x69\x13\xce\x89\x80\x41\x35\x9c\x4b\x6b\x4d\xec\x73\x38\x28\x16\x40\xb5\xd1\xe6\x50\x0b\x0a\x6f\x84\xb6\xc4\x38\x03\x25\xb2\x45\xce\x52\xd8\xbd\x98\xab\x0a\x7f\x27\x86\x5c\x64\x62\xc8\xf9\xa9\x62\x1e\x0e\x1a\x42\x55\x99\x7f\xbe\x85\x30\x80\x86\xe4\x2b\x95\xc8\xe7\x5e\xd8\x64\x3a\xfc\x32\x23\xf1\x06\xa2\x11\xec\xc9\x8f\xa0\x1b\x50\x8c\x86\x7e\x85\xdf\xce\x43\x6b\x99\x78\x50\xd3\xa8\x88\x07\x75\x20\x28\xbc\x4b\x49\x57\x12\xeb\xab\x48\xe2\x8b\x8e\x9f\x09\x34\x6a\xe8\xe8\x5c\xe9\x18\xa4\xbc\x1b\xad\xb5\x29\x67\xdc\x9e\x24\xe0\x9e\xd9\x31\xca\xc0\xe3\xc8\xc4\x58\xba\xbc\xb3\x19\xc1\xe8\xac\x28\x08\xab\x13\xa3\xb3\xf5\xda\xe3\x08\xfb\x99\xd4\x9a\xcb\x46\xa7\x66\xc3\x43\x33\xc2\x1c\xdc\x4f\xae\x9e\x65\x9f\x9d\xa2\xb8\x9d\xad\x72\x5c\x73\x22\x23\x38\x4d\x51\x14\xa8\x71\x5e\xb2\x9f\xf6\xdd\xb3\xe7\xb1\x93\xa1\x22\x62\x29\x84\xaf\x2e\x43\x73\x52\x52\xa1\xab\x12\x7e\xa6\xf6\x8c\x74\x23\xc8\x40\xf6\x53\x54\x75\xe2\x4f\x45\x25\xdd\xcf\x15\x3e\xd9\xe4\xbe\x41\x9b\x75\x1c\xa2\xfb\x19\x87\x88\x03\x66\xff\x5f\x0c\x95\x9d\x96\x43\x65\xa7\x15\x7e\xbc\x6d\xa8\x9e\x33\x8d\xf4\x50\x49\xa6\x07\x97\xa6\xe0\xa1\xc9\x93\xfa\x2a\xae\xb9\xfd\x21\x45\x25\x54\xd3\x77\xd9\xf2\x77\xb3\xe5\xef\x6e\xd9\xf5\x26\x97\x11\x4c\xa3\x4a\x9b\xcb\x08\x0e\xd2\x72\x38\xd8\x5a\x2f\xf8\x65\x04\x7e\x6d\xc5\xb7\x97\xba\x63\x27\xfa\x9b\xb1\x66\x5f\x4e\x2a\x6c\xe4\x4a\xb5\xcb\x08\xba\xb5\x5a\x4f\x96\x6b\x1d\x2f\x75\x76\x5c\x54\x7b\xba\x5a\xad\xe8\xac\xac\xf5\xbb\xad\x9d\x71\x57\xf6\xfb\x9c\xc8\xfe\x54\x89\x6d\xf8\xe7\xba\x55\x7d\xb6\x87\x6b\x80\xf3\xc7\xd5\x29\xa5\x04\x94\x13\x96\xd8\xfc\x3d\x92\xaf\x8e\xd6\xc0\x0b\xed\xdf\xa6\x97\x52\xff\x36\x25\x71\x51\x32\x8d\xa0\x41\xc5\x2f\xc0\x68\x60\x57\xa1\xca\x73\x92\xbe\xa7\xf6\x88\xa3\x6f\xb1\xfb\xd9\x16\x4e\xd2\x67\x5a\xd5\x5f\xdc\x22\x25\x0e\xf1\xaa\xf0\xa4\xa1\x46\x4d\x58\x89\x4a\x9e\x3a\xbd\x9e\xb9\x92\xc8\x0f\xf0\xf2\x87\x8a\x7b\x08\x0f\x57\xc8\xbb\xa1\xda\x06\x6a\x45\xeb\x8d\xb5\xf5\xc7\xd1\xba\x22\x5a\xe7\x3a\x55\x75\x52\xd1\x6a\xb1\x19\xf9\x9c\x02\x3a\xbb\x88\x3e\x7b\x5c\x04\x41\xae\x59\x69\x0f\xec\x1b\x44\x58\x5d\x0a\xec\xb1\x3d\xc7\xe7\xc7\x14\xdc\x0f\x76\x9c\x11\xeb\x65\x92\x45\x7e\x27\x4e\x64\x27\xcd\xdc\x71\x28\x51\x77\xa9\x70\x2a\xe4\xa9\x93\x3b\x61\x8a\xe5\x73\x2e\x3b\x98\x44\xa0\x6f\xe5\x8e\x47\x59\x35\xda\x72\x6e\xfe\xfe\xc1\x0e\x93\x8a\x1d\x73\x6e\x03\xff\x29\x83\x37\xc8\xb3\x05\xa9\x0e\xb8\x08\xaf\xf0\x04\x9e\x18\x83\xf1\x1f\x68\x30\x8e\x2f\x2a\x8e\x10\xcf\xcc\x21\xdf\x7a\xe0\xa8\x5d\x51\x28\xa4\xdf\x1d\xed\x26\x76\xe9\x10\x20\x37\xaa\x29\xa0\xad\x0d\xaf\x72\xaa\xcb\x31\x79\x4a\x0e\x2e\x4e\x09\xab\x9a\x01\x6b\xff\x87\xc4\x8c\x73\x4e\x0e\x5d\xe3\xde\xe2\x5e\x2b\x96\xe9\x98\xe2\xc0\x6f\xd3\x06\x57\x8b\x86\x9c\x9e\x48\x4a\xcb\xac\x9e\x98\x0f\xff\xb1\x7d\x43\x76\x53\x13\x27\xc4\xc3\xb8\xb1\x02\xc1\xc2\xdb\xb5\x71\x0e\x3a\xd9\x67\xa3\x2b\xa3\x80\x39\x39\x51\x4b\x86\xb3\xd7\x63\x7c\x8f\x6b\xb9\xe2\xc8\xb1\xf5\xc0\x08\xda\x23\xd5\x6c\x37\x51\x52\x6d\xc3\x08\x91\x2d\xe0\x0c\x48\xa6\x8f\xa2\xb1\x56\x5c\x19\xf3\x8c\x7c\x4c\x91\x4f\xaf\x8d\x54\xf4\xdd\x0f\x0b\x58\xb6\x50\x3f\x71\x69\xc5\x60\x45\x73\xce\x0d\xe0\xe9\xad\x82\xe7\x9e\x06\x43\x8c\xd6\xde\xf1\xc3\x74\x12\xb1\x79\x87\x05\x81\x0e\xbb\x84\x99\xca\xd3\xb5\xb0\x08\x2d\x10\x5e\xc0\xa8\xb7\xea\x42\xb1\xa7\x61\xb4\x84\xce\x2f\x39\x74\xa2\xff\xce\x14\xd5\xe0\xd7\x74\x35\x56\x47\x65\xd4\x6b\x9c\x54\x55\x8d\x57\xab\x8e\x63\x2b\x7d\xa8\x2d\x51\xeb\x3c\xd1\x38\xba\x38\x98\x51\xd2\xe0\x0b\xa2\x84\x10\x51\x56\xec\x4f\x57\x5c\x99\x54\x57\x2e\x2e\xf9\x63\x48\x96\x9c\x03\x87\x43\x3b\x2b\x7d\x72\xf4\x52\x25\x18\xfe\x7c\xc5\x89\x06\xaf\x6b\x14\x28\x2c\xad\xcf\x0b\xbd\x3e\x49\x93\x4f\x5f\xee\xbd\x50\xcc\x17\x4d\xb6\xa2\xf5\x51\xd0\x5e\xbd\xde\x7f\x7d\xfc\x7a\x39\x10\xda\x3c\xaa\x78\x19\xe8\xab\x3b\xe3\x62\x70\x13\xfd\xb5\x8b\xb4\xbe\xeb\xb7\xdc\xa5\xcd\x22\x10\x30\x8f\xf4\x8d\xc6\xf5\x5f\xe9\xb6\x21\x6e\xd6\xca\x25\xdd\x49\x42\xf0\x9e\x0e\xdd\xc8\x5b\x57\xe0\x42\x47\x21\x73\x0f\xb5\x73\xc5\x51\xd4\x68\x7f\x7c\xc4\x74\x52\x87\xdc\x0f\xf7\xca\xfe\x2a\x48\x4c\x81\xcd\xed\x18\xdc\x13\x7d\x2f\x7c\x1c\xb5\x5a\x1f\xae\xe6\x3f\xf7\xb2\xfc\x9e\xbe\x06\x91\x51\x52\xd3\x92\x86\x49\x7d\x9b\xe3\x4c\x6b\x4f\x16\x14\x5e\x47\xce\x21\xf9\x73\x08\x9b\x30\xf8\x4e\xe1\xac\x4d\x21\xb0\x42\xb6\x36\xeb\x07\x60\x6e\xcf\xc8\x71\xd4\xac\x2c\xde\xe3\x70\x14\xa9\xe9\xbe\x8e\xe8\x02\xe2\x9a\x0f\xf0\xca\x79\xec\xda\xc6\xc1\x4f\xc3\xb6\xfb\x1e\x91\xde\x5c\x1f\xf3\x39\xb9\x46\x2e\x0e\x76\x56\xa7\x9e\x53\x88\xf7\x8a\xb6\x1b\xe6\xbc\xef\xfa\x74\xd5\xb7\x57\x73\x9a\xde\x32\xe5\xc8\x1b\x57\xbe\xa6\x09\xdf\x9c\xdc\x44\x68\x24\xd0\x95\xe4\x58\x09\x33\xde\xa8\x24\x59\xbc\x4a\xb2\x2c\x6a\xef\x26\x25\xc5\xdb\x2e\x0e\xfb\xd2\x69\x0d\x91\x51\x61\xc8\xb7\x78\xda\x7d\xee\x9a\x41\xd2\xf7\x28\x6a\x27\xb8\x5b\xeb\x14\xd0\x93\x2e\xcc\x3d\xe9\x3c\x87\xad\x78\xd2\x25\x14\xbc\xef\x94\xda\x0d\x48\x20\x5c\x60\x30\xcf\xe6\xa3\x5e\xf5\xfa\x43\xff\xf1\x68\x8d\xbd\x55\xfb\xee\xaf\xa0\xd0\xe1\x9d\x28\x74\x7b\x75\xd7\xd0\x8d\x7b\x15\xc7\x56\x49\x61\x05\xdb\xba\x07\x36\x5a\x9e\xe8\x36\x76\x95\x1c\xa8\x32\x2f\x23\xdc\xd0\xc4\x1c\xfb\x1d\x33\x4d\x14\xa4\x22\x0a\x3c\x27\x0a\x28\x89\x57\x75\xfb\x59\x83\xa3\x9e\x1a\xdd\x10\xc1\xef\x24\x05\x09\x19\xbc\x66\x15\xf4\xb9\xae\x45\xb9\x47\xcb\xac\x4d\xa6\x5d\xe9\xde\xae\xcd\xd9\xcc\x0e\xed\x18\xd8\x17\x5b\x82\xfb\xcd\xe6\xe0\x76\x35\xa6\x78\x65\x4c\x3d\x12\x11\x5e\x84\x31\x8b\xd6\x65\x0d\x16\xc6\xb2\xe2\x85\x68\xcf\xf1\xa1\xcd\x53\x52\xf5\x99\x23\x93\xf4\xbb\x55\x83\xba\x6b\x0b\x30\xa9\x88\xe1\x8d\x19\x07\xf3\x7d\xc1\xd3\xb4\xdd\x3c\x45\x6b\x20\xd6\x1b\xa4\x08\xce\xfc\x79\x93\x39\x4a\xca\xa5\x8c\x6a\x56\x27\xb9\x41\x8a\x1f\xa6\xcc\x8d\xfe\xa5\x0c\xcf\x67\xda\x1a\x67\xc2\xb5\xf1\x87\x20\x27\x09\x79\xa3\x44\x94\x3c\x8f\x4c\x6e\x79\x72\x20\x74\xd2\x19\x3d\xb9\x32\xd9\x4c\xca\xc9\x0b\xa1\x33\x39\x8b\x3b\x6c\x2f\x7e\xb2\x0f\xb6\x04\xf6\xd1\xce\x80\x7d\xb2\x39\xb0\x67\x36\x03\x17\xd5\x67\xe7\x7a\x49\x0f\xcc\x92\x5e\x24\x27\x5c\xa4\x61\x12\x97\x8b\xea\x66\x61\xe4\xbf\x42\xe3\x9e\xa5\x57\x5f\x52\x2e\x2a\xaf\x04\x8b\xbd\xcb\x6a\x46\x9d\x69\xb8\xdc\xcf\xb4\xd2\x71\xca\x71\xae\xda\xc4\xe5\x65\x94\x1b\xdf\xc8\x50\x4d\xf1\x20\xb7\xae\x89\x83\xf0\xc2\x82\x57\x62\xa9\xfd\xbb\x38\x48\x70\x51\x74\xa5\x28\x4b\x31\x4c\xdd\x99\xea\xf3\xad\x49\x6d\x7d\x1e\xdd\xc3\x1d\x27\xe7\x0e\xb4\x5b\xfc\xc7\x00\x62\x78\x19\x2d\xd3\x65\xa1\xe8\xb2\x36\x06\xdf\x8b\xd6\xdd\x80\x69\xfe\xff\x3c\x82\x82\xbf\x3e\x63\xf0\x45\xf1\xd7\x39\x82\x70\x8f\xec\x9f\x2e\xfa\xbd\x2c\x0c\xda\xa3\xb0\x1f\xb5\xc7\x15\x7c\xa6\xa3\x2a\x3d\x59\xbd\xa9\x7c\x62\xb0\xc5\x94\xec\xba\x70\xa4\x0e\xb9\xfb\xd8\x70\xf6\x1c\x24\xd5\x81\xae\xea\x58\xe1\x31\x32\x65\xde\xcc\xf6\xc0\x3b\xb5\x5f\x71\xe2\xd1\x8a\x34\x33\xd4\xe4\xc9\x83\xc4\x99\x92\xb3\x08\x8e\x11\x75\x0c\x4c\xaf\x0a\x33\x68\xb2\x51\x77\x37\x35\xdd\x7d\x52\xdd\x81\x37\xd0\xb7\x40\x1a\xe9\x1d\x70\x60\xab\x26\xa9\x79\xc3\x53\xfb\xa5\x66\x0e\x0b\x01\xe0\x8b\x76\x51\xcd\x3d\x54\x6b\xfa\x03\xf4\x95\x76\xe6\xe4\x2a\x02\x13\x0b\x3d\x59\xa8\x21\x0e\xf5\xd0\xc2\xd5\xa1\x9d\xda\xef\x39\x51\xe4\x69\x68\x87\xe5\xa8\x3e\x57\x47\x35\xb0\xc3\x06\x04\xea\x9d\xda\x3f\x38\x09\x69\x3e\x3c\xdc\xcd\xd7\x98\x5e\xf7\x5a\x8b\x71\x57\xaa\x78\x59\xba\x0c\x9a\x3b\x7a\xc1\x49\x40\x97\xe7\xf9\x86\x93\xb7\xea\x6d\xa3\xdb\x7d\xde\xee\x6c\x99\x79\xdf\x6e\x76\xb3\x8f\x4b\x36\x6c\xb8\x24\xed\xed\x25\xa4\x5a\xd6\x12\x09\x40\x56\xa2\x59\xac\xda\x1e\x97\x83\xb9\x4a\x1a\xe9\xe7\x8c\xec\x19\x49\xa2\x20\x9c\x81\x86\x49\xcd\x71\xb8\x8f\xd5\x67\x66\x39\x4c\x06\x4d\x30\x89\xb7\x73\x05\x14\x6a\x32\xe8\x6a\x10\xd4\x9d\x78\x03\xdd\x89\x01\x41\x77\x75\x9f\x07\xb6\xdb\x0c\x74\x8f\x6d\x57\x1d\xeb\x7c\x38\xde\x59\x4b\x07\x67\xa6\x03\xb6\xc4\xa9\xa5\x1a\xd8\x4c\x5b\x03\x66\xe9\x6a\xeb\xa1\x9d\x36\x43\xd7\xa6\x9d\x3a\x37\xe4\xa2\xe8\xa2\x9b\xcf\xa1\xa1\x93\xae\xe9\xa4\x18\xc2\x0a\x48\xb8\x2b\x8c\xce\xef\xf5\x2a\xf3\x95\x2a\xf5\x10\x01\x5e\x5c\xaf\xb2\x59\xe7\x61\xbd\xeb\x4a\x95\x16\x29\xed\xc7\x32\xeb\xf6\x21\x5a\x9f\xf6\x71\x66\x73\xb8\xb5\x25\x64\x3a\x97\x57\x06\x3b\x9a\xe2\xec\x46\xcd\xee\x79\xee\xc3\x87\xc4\xb2\x34\xef\xa5\x95\x81\x6e\x9e\x88\xa1\xcf\x60\x37\x42\xed\x08\xb5\x4f\x17\x70\xda\x8a\x92\xaf\x65\x7e\x71\x38\xd2\x51\x7a\xed\x3c\x93\x83\x89\xa1\xfc\x6e\xf9\xe3\x52\xcc\x2b\x4d\x7d\xde\x90\xb5\x8c\x2e\x3c\x66\xd8\x86\x22\x45\xd4\x62\x01\x1f\xdb\x50\xb8\x0e\x58\xeb\x58\x26\xa7\x9e\x54\xf3\x92\x3a\x58\xe1\x03\x99\x47\x2a\x8c\x1d\xf5\xc8\x40\x3a\xef\x22\xbc\x61\xce\xaf\xe6\x2a\x19\x1a\xc5\x73\x89\xee\xeb\xb1\xaa\x13\x2f\xdd\xbd\x69\xdb\x0b\x1d\xa8\x18\x4e\x23\x1d\xb2\xa5\x9a\xfc\x80\xc2\x61\xeb\x1a\xb5\x84\x96\x7f\x10\x97\xfe\xf3\x26\x09\xd6\x72\x7a\x03\xd1\xcf\xf2\xa8\x91\xb4\x5c\x33\xbc\xd9\x78\x9e\xc7\x51\xe3\x7d\xf6\xf0\xe1\x72\x64\xb9\xa2\x4e\xec\xc8\xc5\x82\xc4\x64\x4a\x3e\x44\x70\xba\xe2\x1f\xf9\x52\xd3\xe8\x72\xa2\x7a\xc7\x1f\x3e\xd4\x91\xd3\xfa\x6c\x14\xf7\x5d\x3b\xa6\x0b\x25\x4b\x66\x14\xd4\x3a\x10\x4c\xf7\x7d\x4c\xfb\xdd\x51\x37\xb1\x31\xee\xc0\xc7\x08\xba\x89\x89\x1a\xfc\xd0\xd2\xa8\x52\xed\xfe\x13\x60\x52\xcb\xd6\x27\xd1\xbd\x6c\xb2\x2f\x15\xe3\xc4\x14\xec\xde\xda\x1c\x0e\xed\x04\x8e\x6c\x06\xc7\xb6\x07\x5f\xec\x0c\x76\x35\x2c\xdf\x46\x7f\x21\x93\x9b\x24\x45\xa0\x61\x1e\x18\x55\x33\x72\xd7\x6b\xd4\x1d\x1f\x22\x10\xfd\x1d\x10\xfd\x0c\x44\xff\x16\x44\x7f\x06\xf9\x6d\x12\x26\x56\x8c\x96\x72\xcd\x17\x99\xe6\xdb\x33\xa8\xc7\xfd\x1d\xdc\xd1\x0c\xcd\xe8\x6f\xd1\x8a\x7e\xf6\xbc\x2a\x3a\xbf\xc2\x75\x3f\xa3\xe0\xe9\xad\x2a\x99\x4a\x3d\xdc\xe6\xe4\x94\x33\x72\x1b\xa1\x3f\xcd\x79\x02\xa7\x19\x1c\x84\x04\x1f\xaf\x18\xcc\x43\x62\x05\x2c\x4a\xb9\xa5\x35\xeb\xf0\x36\x5a\x13\xa5\xa3\x31\x41\x7e\xf1\x8d\xc3\x44\x91\x15\x3c\x95\x6b\xef\x93\x67\xe4\xad\x1a\x0d\x91\x8e\x68\xbc\xc4\xbc\xad\x04\x1c\xc5\x49\xaa\x65\x51\x8b\x22\x20\xee\xcf\x80\xe0\xe5\xe9\x19\x25\x68\xdf\x43\xbf\xa3\x9d\x49\xee\x4e\xfe\xa6\x32\x7f\x6f\x4d\xaa\xbc\xc6\x95\xd6\xee\x0a\x67\x06\x33\x68\x44\x80\xb9\x01\x4b\xe2\x70\x41\x62\xf0\xe8\x28\x1f\x59\x91\x8a\xa6\xd8\x86\xef\x0a\x09\x16\x01\x45\x17\x70\xb0\x66\x3f\x1a\x13\xc0\xb8\x06\xbd\xe6\xc9\x1c\x51\x64\x5d\x28\x29\x6f\x46\xae\xe0\x44\x7d\xf3\x85\xb8\xcf\x3f\x6f\x04\xc9\xe3\xc2\x53\x38\x28\x42\x47\x53\xfc\xa1\x23\x44\xe3\x7d\xcb\x6d\x04\x2b\x31\xa2\x73\x48\x99\x63\x3e\x53\xaa\xdb\x14\x91\xa6\xa9\x82\xb3\x4a\x34\x6c\xf3\xbb\x0c\x7d\x6d\x5e\xe8\x48\xd7\xe6\x87\xf1\x23\x30\xf2\x9f\x1a\x9c\x12\xe5\xc2\xf8\x42\x0d\xaf\x96\x34\x31\xf9\x57\x77\x4e\x9f\x34\x8d\xa0\x31\x93\xac\x93\x10\xcf\xa0\xfc\x02\x87\x9f\x6a\x1c\x5e\x87\x36\x13\x5e\x56\x50\x88\xf5\x9e\x12\x89\x50\x56\x6e\xaa\x12\x13\x67\x4a\xce\x39\x3a\x3e\x7c\xf7\xe1\xad\x05\xd7\x12\x65\x77\x04\xec\x37\xe5\xca\xa8\x99\xe1\xbb\x33\x7c\xcb\xfd\x50\x5f\x67\x9f\x88\xe5\x34\xb0\x71\x69\x44\x1a\x43\xe6\xc8\xb5\xa7\x4c\x00\x3a\x13\x65\xf9\x39\x0b\xd7\xf8\xf3\xe7\x37\x68\x82\x82\x7b\xad\x50\x70\x02\xc2\x25\xe3\x80\xc2\x24\x20\xa7\xd4\xa4\xac\x0c\x5b\x06\x6e\x60\x28\xe6\x33\x0b\x75\x1d\x02\xc2\x2a\x1c\xa9\xe7\xdc\xd7\x42\x83\x08\x42\x68\xc3\xa0\x53\x72\xa2\xc0\x7d\x47\xc2\x83\xa1\xfa\xb7\xf2\x7f\x4c\x35\x65\x3e\x54\xf9\x78\x15\x5c\xf5\x6a\xaf\x0e\xf0\x0c\x4f\x3b\xbe\xd4\x42\x23\x85\x37\x91\x43\xb2\xc4\x41\x65\xd8\x15\x7c\xe2\x70\xa0\xe6\x71\x05\x2f\x13\xb4\x9c\x50\x8f\x57\x09\x1c\x98\xc7\x1f\x1c\x42\xfd\xf4\x9e\xc3\x99\x7e\x7a\xc1\xe1\xad\x29\x7e\xc5\xe1\x95\x79\xd4\x51\x17\x1b\x66\xa6\xf9\x98\x05\xfd\x4e\x9b\xcc\x26\x10\x25\x36\xb1\x53\x68\x19\x93\xa1\xb4\x79\x10\x39\x3f\x04\x7c\x8e\x4c\x64\xc7\x2f\xda\x76\x61\x6b\x01\x2f\xf4\xd3\xe6\x02\x7e\xe8\xa7\x27\x0b\xf8\x14\xdd\x27\xc9\xd5\x55\x8b\x89\xf2\x18\xb8\xf3\x92\xe9\xa8\xb7\x33\xf2\x29\xd2\x26\x4a\x6e\xa2\x73\xfb\x5a\x13\x91\xf8\x19\x36\xb2\x20\x48\x30\xf6\x9b\x92\x5a\x47\x8a\xa2\xdb\x8a\xfa\x7b\x4d\xad\x2e\x6a\xe9\x0a\xf2\x96\x49\x43\x88\x25\x6c\x9e\x47\x50\xaa\x76\x12\xd4\xc2\x45\xed\xe8\x4e\x8c\x2e\xe8\x5f\x8b\xf5\x14\x36\xc5\x7a\xaa\xd8\x6f\xd4\x7c\xac\x57\x12\x7f\x74\xae\x13\xec\x27\xd0\xb3\xb7\x96\x06\xee\xd7\x7c\x6e\xcc\xc0\x21\x73\x6e\x39\xc9\x97\xee\x52\xca\x89\xfd\xe8\x51\x94\x78\x2c\xba\x4c\x52\x69\x3f\x1b\x3c\xdb\x7a\x64\x55\x95\x1a\x11\x9c\x6b\x67\xf1\xb1\xf3\x53\xdf\xe5\x9d\xe2\xcd\x9c\x2c\x15\xde\x51\x02\xee\x89\x3d\xac\x80\x61\x77\x15\x4b\x4e\x57\x5f\xf9\xab\xaf\xa2\xd5\x57\xe9\xea\x2b\x77\xf5\x55\xb0\xfa\x2a\x5c\x7d\xd5\x80\xbd\x1b\x48\x31\x5b\x7d\x95\xad\xbe\x6a\x48\x77\xdb\xc0\xc6\x89\x35\x9c\x9d\x92\x68\x7d\x70\x9f\xd8\x21\xb8\xcf\xec\x00\x3c\xd7\xf6\xc0\xbb\xb6\x39\x78\xb1\x9d\x81\xf7\xc3\x96\xe0\xcd\xec\x14\xbc\xb9\xcd\xf0\x36\x14\xbc\x77\x76\x02\xde\xa9\x1d\x81\x77\x66\xc7\xe0\x75\xed\x29\x78\x03\x7b\x0c\xde\xd0\xee\x82\x7b\x64\xbb\x8b\xfa\xff\x96\xaf\x63\xf3\x9d\x7b\x30\x04\xf7\x00\x2f\xfd\xc8\x8c\x5c\x24\x18\xa6\x50\x3d\x5e\xaa\x47\x8f\x52\xc2\x29\x09\x29\x99\x25\x54\xf3\xcd\x24\xa3\x84\x51\x12\x26\xe5\x7f\x01\x25\x1e\x25\x92\x92\x9f\xde\x8d\x9d\x2c\x34\x97\xfc\x43\x38\xb7\xb1\x02\x91\xf7\xad\x08\xa1\x94\x44\xc4\x06\xb1\x6c\x6b\xe3\xac\x48\x77\x04\x5f\xd7\x59\xdd\x1a\x09\x4d\xda\xbb\x44\xc2\x2e\x29\xa5\xb3\x6f\x51\x3b\x43\x97\x28\x22\x76\xea\x9a\xd8\x46\xb1\xef\x7c\x8b\x88\xe5\x45\x2c\x4d\x3f\xb0\x31\xb7\x28\x08\x3f\x77\xed\x72\xaf\x95\x94\x28\x7d\xe7\x5b\x4c\x2c\x3f\x9c\x5a\x14\xb8\xfe\x91\x4e\x58\x6c\x51\xc8\x7c\xe7\x6b\x0c\xcc\x77\x66\x44\xfa\x70\x0a\x88\xcd\xb9\x79\xca\x7c\x62\xed\x27\xcc\x0f\xe3\x8b\x7e\xbf\x6f\xd1\xef\x3a\x28\x8e\xe7\x3b\x42\x40\xe2\xb7\xc4\x96\x49\xbe\x4c\x26\x5c\xbc\x64\x29\x27\x74\x01\xa1\xff\x17\xae\xd6\xf4\xbd\x5a\xae\x84\x58\xbe\x8b\x60\x7e\x1d\x57\x7c\x64\xc5\x65\x5a\xa0\x27\xe5\x66\x52\x26\x6a\x5a\xae\x7f\xcf\x70\x4c\xa9\x6e\x18\x5a\x14\x22\xdf\x61\x02\x7c\xbf\x7d\xe1\x23\x1f\x62\x30\x3d\x08\xb4\x5a\x9b\xfa\x8e\x27\xa0\xeb\x37\x6c\x71\xec\xc4\x23\x2b\x60\xbd\x71\x18\x67\xa9\x65\xab\xc7\x49\x94\xa5\x56\x89\x88\x02\x5f\x2d\xf2\x09\xe2\xa2\xd8\x27\x96\x2b\xe3\x8e\x2b\xe3\x5e\x92\xc9\x28\x8c\x79\x2f\x8c\x83\xa4\xe3\x26\xc2\xe7\xa2\x37\xe8\x8c\x45\x6f\xd8\x19\xbb\xbd\x21\xb2\x0b\x53\x1f\xac\x31\x13\x17\x61\xdc\x8b\x78\x20\x2d\xb0\x7a\x5b\x82\x8f\xd5\x1e\xe9\x3d\x4c\xb1\x73\xd5\x6d\xc0\x50\xe7\x8e\x9f\x18\x8b\xde\x26\xd6\x39\x55\x5b\xaf\xd8\xb7\xc4\x98\x0b\x8e\x35\x18\xc9\x50\x46\x0a\x84\x2e\xf5\xba\x64\x91\x45\x61\xa2\x9f\x99\x45\xe1\xc2\xd7\xb6\x84\xad\x4b\x74\xcc\xf3\x60\x77\xad\x55\x7e\x04\xa6\x0a\x39\x24\x7f\xe6\xf8\xda\x02\x7c\x4a\xd5\xe3\x77\x34\x4d\xf2\xd7\x26\x10\x8a\xab\x19\x2b\x4c\x00\x11\xed\x07\x0d\xc6\x2a\xc5\xb9\xf0\x49\x86\x59\x4d\x46\xfa\x98\xb1\x7e\x77\x44\xd0\x27\xa4\x48\x3d\x17\x3b\x26\xc1\xc1\x4c\x12\x8c\x2d\x9a\x48\x18\x4b\x22\x37\xac\x8e\x3a\x29\x94\x62\xca\xe6\xc6\x3a\x58\x43\x34\xd5\x10\x14\xf3\x9b\x54\xbf\x5a\xfb\xda\x58\x92\x7c\x20\x3a\x83\x56\x86\x1f\xab\xf4\xa4\x3f\xb0\x61\x7a\x5b\x7a\xaf\xdf\x61\xe8\xf8\xc6\x13\x78\x48\xf2\xf8\x4e\xfd\x74\x12\x85\x92\x3c\xfa\x67\xba\xf1\xe8\x42\x89\x9b\x37\x66\x8f\x99\xb8\xe0\xd2\xa2\x70\xad\x37\x56\xfa\x16\x85\x1d\xf3\x7c\x69\x51\x38\x32\xcf\x8a\xef\x3c\xf6\xdb\xef\xdf\x63\x74\xfb\xe8\xb3\x21\xa5\xa3\x0a\x38\xef\xc8\xfb\xc0\x73\x2e\xa2\x34\x02\x6c\x7e\x6e\x3a\x35\x80\xb5\xf0\xea\x43\x81\xac\x9d\x7f\xf0\xce\x2f\x59\x14\x4e\x18\x29\x46\xda\xf6\x3d\x75\x38\xdb\x3f\xb7\xa0\xf0\x5a\xaf\x4a\xa4\x70\xc5\xd9\xd2\xaa\x70\x28\x04\xa6\xf6\x0c\x11\xa2\x9a\x21\x42\x49\x15\xa3\xf3\x3c\x3f\x30\x66\x88\xb3\xcf\x31\x7e\x87\x11\x71\x2b\x39\x61\x50\x99\x23\xe0\x9c\x9c\x82\x96\x22\x28\x5c\xad\x3d\x1c\xf5\x94\x95\x71\xe1\x0d\xe5\x3f\xc7\x3b\x20\x5f\x7b\x25\xf4\x39\xcd\x53\x6b\xbd\x34\x3b\xce\x5c\x3c\xfd\xe7\xbe\x23\x19\xec\xf9\x6d\xee\x77\x10\x3b\xbb\x84\x70\x67\x46\xce\x7c\x13\x9b\x55\xc2\x27\x49\x2a\x09\x6f\x68\x35\x50\x7b\x2b\x2e\xf8\x54\xe0\x82\x98\x62\xb4\x76\x17\xf3\x76\x84\x4a\xc4\x41\xc7\x67\xb7\xc2\xb8\xbd\xf6\xf5\xce\x29\xdc\x37\x49\xd2\x50\x73\xcf\x28\x90\x84\x9e\xa5\x61\x8e\x45\xe1\x45\xdc\x0b\x25\x1f\xa7\x3d\x74\x34\xef\x44\x61\x2a\x7b\x3a\xa4\xbf\x7a\x5d\x02\xe0\x44\x21\x55\xb7\xb7\x5d\x82\xa0\x2c\x40\x62\xd6\x1b\x0e\xb0\x74\xb3\xe3\xf7\x82\x88\xdf\x74\x56\x3a\xce\x9b\xfd\x50\x22\x2b\x0c\xfe\x78\x81\x76\x8c\xef\xd5\x49\xf0\xfc\x26\x41\x44\x64\xe4\x67\xd7\x7e\x86\xb9\xdb\x50\x12\x3b\xf6\x75\xbc\x15\x5b\x41\x9a\x45\x81\x60\x90\xce\xa7\xb4\xdf\x1d\xe9\x37\xf6\x1b\xa6\x7d\x07\xbe\xe0\x37\x4e\x33\xb5\x36\x47\x7d\x97\x57\xaa\x20\xb5\x6e\x39\x06\x3e\x8b\x2f\xb8\xa8\x1c\x84\x36\xd8\xe7\x73\xde\x4b\x23\x96\x5e\x36\x1c\x80\x42\xcd\xa0\x48\x7f\x31\x84\xf8\xdf\x3d\x04\x97\x47\x51\xcb\x18\x0e\xb2\xe2\xfb\xcb\xaa\xd2\xe2\xf2\x66\xa4\xe5\x57\xc7\xda\xf8\x1c\x92\xcf\xd9\xaa\xc9\x7e\xe9\x1d\x1d\xa2\x0e\x7d\x60\x32\x8d\xb9\x8a\x4f\xd3\xe0\x56\x49\x71\x78\x6f\xbc\x72\xcb\x30\x86\x6c\xf3\x8c\xa2\x30\xbe\x5e\x99\xcb\x7e\x18\x5f\x6b\x84\x42\x30\x19\x18\x5c\x10\x81\xde\x72\x39\x16\x7d\x59\xf4\x82\x87\xb1\x53\x40\xe2\x10\xbb\xc1\x99\xbd\x65\xfa\x9c\xb0\xf7\xb4\x84\x1e\xc3\xc0\xe9\x88\xff\xe8\x81\xa2\xd1\xd6\xbe\xbf\x26\x1d\x71\x91\x27\x68\xd4\xee\xe5\xa0\x6d\x8c\xcb\xe5\x91\xd5\xe5\xd1\x27\xab\xca\x9c\xe4\xcb\xb1\x0c\x13\x92\xdf\xc8\x9e\x51\x51\x19\xf6\x25\x4b\xb9\xe8\xa5\x3c\xe2\x9e\x62\x5f\xc2\x38\x94\x21\x8b\x8a\xd2\xde\x38\xb9\xed\xdd\x51\x65\xc6\xdd\xeb\x50\xde\x51\xcb\x6c\x97\x97\x44\x4a\x66\xb4\xfe\xeb\xb1\xeb\x0d\xfc\x82\xee\x64\x3e\x11\x1b\xff\x70\xac\x7f\x6c\xc4\x1b\xff\xb0\xfe\x81\x5b\x72\x17\x65\xd1\x04\xe5\x90\x91\x73\xa2\x55\xd7\x30\xf6\x89\xf5\x06\x41\xb0\xe3\xce\x3b\xf2\x32\x4c\x3b\x11\x73\x79\x54\xf9\x8a\xb5\x91\xf3\xcf\x0b\xe0\xd4\x6e\x58\x22\xf5\x99\x94\x7b\x49\xec\x33\x31\x5f\x5d\x51\xd5\xc7\x87\x44\x76\x70\xc1\xcd\x79\xf8\xae\x10\xb8\xf7\xeb\x17\x46\xb2\xc6\x48\x3a\xcc\x59\x8f\x7e\x86\x83\x1c\xff\xcc\x49\x57\xe1\x1f\x86\x86\x4d\xd2\xf9\x2a\x08\xc6\x9d\xc2\xab\x97\xd1\x99\x24\x52\xb1\x26\x78\xbc\x2c\x7b\xe9\x67\x6a\x81\x74\x6a\xe3\x1f\x47\x7a\xb4\x83\x62\xd9\x67\x97\xa1\xe4\xbd\x74\xc2\x3c\x6e\x81\x15\x27\x33\xc1\x26\x95\xa9\x48\x3d\xfc\x25\xa8\x3a\xad\x63\xe1\xb1\xdb\xdb\x32\x50\x9f\x48\x60\xb0\x4b\x12\x1d\x8b\x47\x8c\x66\xe4\xb2\xa8\x56\x62\x78\x33\x84\xfc\x9c\xcc\xc8\x9e\x0f\x98\x84\x35\x2b\xce\x89\x3e\x14\x1f\xfc\xf6\x8b\x06\xcc\xd1\xab\xce\xc9\x34\x81\xa9\x36\x00\xf5\xab\x96\x42\xfa\xf8\x68\x0f\xab\xd8\xe4\x0c\x8b\xab\xf7\x3c\xd5\x29\x4c\xa2\xde\x63\x33\xa0\x5d\xd9\x46\x07\x5d\xb2\xef\xe3\xa9\xc4\x64\x8a\x2e\x5e\x13\x85\x78\x57\xb3\x07\x31\x64\x28\xe5\xd1\xaa\xdd\xbf\x7b\x8b\x5c\x2e\xc3\x0a\x0e\x22\x31\xa6\x9a\x3c\x5f\xee\x70\x46\x3e\xf8\x18\xe0\x4a\x11\x59\x50\x58\x2f\x2b\x34\xab\x1f\x99\x02\x27\xbd\xa3\x1a\xa6\xd2\x4e\x90\x64\xb1\x8f\x66\xe9\x9e\xb8\x43\xfc\x7c\x1f\x18\xf1\xf3\x54\x49\x40\xc4\xf2\x2e\xb9\x77\x8d\x87\xfb\x9d\x91\xa8\xe2\x49\xa6\x78\xcc\x8f\x86\x6b\xd2\xc7\x01\x0e\xfd\xd2\x38\xd5\xf0\xa1\x50\x34\xfe\x4e\x51\xa3\x75\x62\xd8\xd4\xf9\x44\xf1\x22\xb7\x7e\xbb\xfc\x9c\xf3\x04\x6a\xa5\x63\x36\x45\xf2\x5c\x62\xa0\x8f\x25\x20\x49\x05\x9e\x0a\x46\xb5\xee\xbd\xe7\x25\xb1\x14\x49\x54\xfc\x54\x03\x70\x93\x9b\xb2\xed\x3b\xcd\xcc\xfa\x66\x66\x58\x86\x0c\xc6\x72\x07\xbd\x7c\x9a\xa7\x7e\x99\x9f\x92\x52\xf8\xc4\xf4\xa5\x8f\x04\x91\x51\x83\xfe\xab\xe7\x65\xa5\x17\x3f\xf4\x50\xa9\x75\x77\x5d\x9f\xa7\x9e\x08\x27\xc8\xfc\x94\xe7\x29\x36\xc8\x45\x83\xf7\x2b\x7f\xbd\x17\x67\xfb\xaa\x99\x5c\x4c\xd5\xef\xab\x2a\x48\xcb\x2a\x1c\x3b\x2f\xf9\x6f\x83\x65\x99\x77\xad\xa0\x28\xf6\x2d\xb0\xa4\x60\x71\x3a\x61\x02\x95\xd5\x06\x1f\x04\x49\xac\xb1\xf3\x25\x17\x61\xf9\xda\xcb\x44\x8a\x78\x79\x92\x84\xb1\xd6\x74\xeb\x02\x83\x70\x11\x77\xc4\xdc\x2c\x7e\x3e\x14\x8d\x81\xf1\xf6\x0b\x07\xa3\x67\xfd\xd6\xbf\x67\x74\xe3\x37\x1a\x66\x0b\x0b\x36\x0a\x07\xbe\xf3\x0f\x1e\x4f\x9d\xaa\x5e\xf6\x1f\xf0\x59\x03\x62\xa8\x6a\x7c\xf1\x9d\xdf\xe1\x85\xef\x0c\xb7\xe0\x07\x0a\xc1\x52\xb3\xb6\xd7\x12\xba\x12\x9d\xe6\xe1\xd3\x3d\x54\x07\xc3\x42\x75\xf0\xbe\xe9\x24\xe8\x58\x53\xc6\x5c\xfb\xab\xaa\x91\x26\x60\x5d\xf3\xf9\xcb\xc4\xe7\x16\x60\xbc\x79\x3c\x9d\xc6\x59\xd1\x2f\x3c\x0b\xbb\x41\xd5\xbb\x30\x09\x4a\xff\xbf\x6f\x7e\xe1\xff\xe7\x09\x9d\x0a\x3b\x9e\x6a\x1d\xd0\x98\x45\xea\x50\x8a\x29\xce\x53\x7f\x9c\x82\x9c\xb6\xc6\x1c\xf3\xce\xb5\xe4\x7c\xad\xa3\xeb\x5c\x61\xb2\x57\xb6\x0f\x9e\xf3\x4d\x49\xdb\x90\x38\x27\x4c\x1f\x84\xcc\xc4\x53\x76\x7d\x0c\xad\xe5\x29\xb4\x1d\x3a\x3f\x7c\xc2\x29\x04\xce\x05\xf1\x70\xc9\x4c\x36\x96\x6f\x0c\x50\x16\x31\xd9\x6f\x2c\xcb\xf6\xfa\xdd\x91\x75\xc9\x52\xc3\x40\x5a\x36\xfe\x48\x33\xcf\xe3\x69\x55\x87\x52\x62\x5a\x91\xcc\x3a\x71\xd2\xbb\xc8\xa4\xe4\x22\x6d\xe1\xd7\x77\x35\x6b\xc8\x3c\xf5\xbd\x1a\xb5\xf1\x92\xa8\x63\x6d\x88\x42\xbb\x12\xc6\xbd\x59\xe8\xcb\x4b\x0b\xe4\xc8\xda\x1a\x0c\x26\x37\x96\x6d\x6d\xe2\xdf\x06\x89\xa1\xf1\xf3\xea\xcc\xf2\x58\xf6\x52\x29\xb8\xf4\x2e\x9b\xda\xa9\xaf\x22\x12\xe9\x99\x5b\xc2\x65\x0c\xf4\xd9\x6f\x4e\x7f\x8a\xc7\x21\x48\x44\x81\x17\x70\x1b\x31\x39\x98\x47\x6a\x6e\xc0\xea\x4c\xbf\xf0\x2b\x0e\xd3\x8d\xdb\x93\xa7\x79\xfb\xe2\x53\x93\x0d\xee\x81\xe3\x64\x79\xa3\xf7\x4c\xd5\x7b\x1e\x3b\xe7\x84\x41\x58\x71\x40\x34\x06\x2a\xdd\x51\xe6\xda\x33\xf2\xd6\x87\x07\xc8\x5b\xf7\x59\x41\x69\x32\x77\x41\x21\xf3\x48\x4b\x7e\xe6\x2f\x3e\x1d\xa9\xde\x87\xd4\xc6\x9a\xd2\x23\x5f\x59\x03\x1a\xac\x2c\x52\xcf\x95\x71\xb9\x50\xab\xcc\xda\x44\x84\x63\x26\xe6\x96\x3a\xe9\x24\xa0\x90\x34\x70\x61\x8a\xd1\x93\xa3\xfa\x4e\x78\x49\xd4\x63\x99\x4c\x3a\xb5\xaf\x29\xe2\xb1\xd9\xb4\x7d\x8d\x5b\x37\xb9\x8b\x7d\x54\x72\x83\x67\xb0\xd7\x1d\xd2\x50\x2f\x59\x91\x21\x8c\x17\x4f\x65\x26\x25\x6f\x03\x33\x12\x4f\x8b\xbe\x14\x7c\x28\xce\x7b\x89\xfd\x2e\x17\xe3\x25\x52\x96\x8e\x01\x2a\xe8\xf0\xfe\x45\xdf\x6a\xe6\x7f\x91\x00\x20\x87\x3a\x36\xb0\xed\xb2\x94\x23\x86\x46\x5c\xfc\x95\x91\x03\x9f\x96\x7d\x1f\xf8\xe5\xe8\x4c\x92\x0d\x3e\xbd\xa7\x4e\x36\x9b\x36\x98\xae\xe6\xda\x26\x4a\x47\x45\x94\x3c\x6b\x45\x99\xaa\x86\xec\x8b\x64\xe2\x27\x33\x7d\xf8\xb5\xea\x13\x91\x12\x9f\x62\xc8\x83\xca\x20\x85\x21\x1c\x6c\xba\x8e\xc5\x28\xd9\x88\xe0\x49\xc7\x0f\xdd\xce\xd8\xdd\xec\x8c\x45\xa3\x66\xc0\xe3\x9a\x88\xad\x65\x23\x4e\xd5\x97\x15\x8b\x20\x1b\xc0\x7c\x52\x01\x34\xb5\x47\x38\x81\x82\xb0\x7b\xd3\x7b\x92\xb8\x64\xea\xfc\x0e\xe1\xd4\xd9\x1e\x40\x30\x55\x44\xcb\x9d\x3a\x5b\xbf\x43\x3a\xbd\x67\x5a\xf6\xdc\xf0\xa9\xc8\xcb\x7e\xa1\x53\xa2\x16\x58\xe4\x34\x23\x92\x56\xb3\xb3\x47\xd3\x95\xec\xec\x39\xd5\x60\xe7\x68\x3e\xe0\x46\xa8\xa1\x75\xc7\xc8\xbc\x7a\x53\x6d\x5b\xbb\x8f\x9e\x17\x93\x00\x34\x6d\xd0\x51\x41\xdb\xc8\x68\x3a\xcd\xf5\x45\xef\x24\x86\xcd\xcd\xd0\x76\x59\x8c\x12\x85\x7d\xf4\x0e\x4b\x7d\xc9\x3e\x09\xe0\x34\xfb\x2b\x3d\x72\xec\xad\x89\xb4\xdc\x81\x9f\xeb\xf9\x22\x5b\x70\xb3\x6c\xc3\xcd\xe1\xb4\x58\x55\xdf\x23\x61\x81\x89\xdd\xa5\xf7\x49\xf1\x3e\x28\xdf\x2b\x41\x68\x12\x40\x62\xb0\x39\x9f\x22\x36\xcf\x50\x3d\x9a\xaf\x46\xde\x2c\x99\x56\x10\xbb\xcc\x7b\x88\xbc\x02\xb1\xff\xf0\x09\x43\x87\x95\x12\xb9\x1b\x67\x64\xbd\xbc\xde\x54\x23\x77\x56\x41\xee\xc9\x7a\xe4\x9e\x4c\xe9\x48\x7d\x61\x48\xed\xc4\x20\x77\xd7\x43\x4d\x57\x8a\xdf\x55\xdc\x0a\x32\x87\x5e\x96\x5a\x90\x72\xb5\xa7\x14\xa6\x1e\x49\xb1\xd1\xbf\x91\x0c\x08\xc4\x02\x31\x6d\x26\x05\x0b\x0a\x7e\x3b\xd7\x63\xe0\xd7\x9b\x42\xe6\x3c\x40\x59\x5b\x42\xdc\xf7\xf6\xa8\x92\xbc\x3f\x05\xb9\x59\xab\xa7\xa4\x64\xc5\xbc\x64\x6b\x58\x17\x8c\xc4\xd5\x20\xe2\xa2\xb3\x13\x9b\x82\xf5\x3a\x46\xbd\x8f\xe6\xfa\xb5\x64\x86\x56\x42\x02\x3c\xaf\xea\x35\x27\x46\xa5\xd0\x2c\xe1\xef\x72\x42\xdd\x76\x4e\x88\x35\x70\x42\x75\xfe\x27\x9a\xa2\x28\x0c\xb8\x0c\x15\xed\x2f\x70\x25\x43\xdc\x9f\x12\xed\x2b\xf1\xb0\x73\xcd\xe7\x9d\x20\x11\xc5\xa4\x73\x7d\x83\xd1\xf7\xff\x9b\xba\xfb\x97\xe8\x9c\xeb\x2d\x2b\xb9\xcb\x6f\x56\xde\x1a\xf6\x82\x70\x87\x64\x4e\x4c\x15\xc6\x8b\x9d\x4c\xe1\xbf\xea\x2a\x2b\x3e\xc3\x4b\xc6\x93\x88\x4b\xde\x1b\xf3\x38\xeb\x58\x1b\x84\x64\x7d\xb6\xf5\xeb\x57\xd6\x77\x5f\xd3\x87\x0f\xd5\xd1\xb3\xd2\xcb\x64\xa6\x68\x9d\x62\xa0\x3d\x92\xe0\xb9\xa1\x10\xe8\xc7\xca\x85\x86\x5c\xa5\x80\xaa\xd7\x52\x1d\x92\x4d\x15\x8e\xd3\x8a\xc1\x9c\x2e\xab\x95\x95\x0b\x0a\xd3\xa9\xf3\xb3\x6b\x3f\x59\x40\xf7\x0e\xe2\xdb\x48\x64\x4b\xc9\xd0\x6e\x2a\x5f\x27\xed\x9d\x30\x32\xf6\x88\xe8\x7b\x5f\x56\xf4\x41\x71\x4e\xa6\x2b\xb7\x94\x53\x93\x73\xeb\xb2\x81\x10\x6a\xa4\x1f\x2b\xb4\x5f\x26\x96\x6e\x4d\x02\x7a\x2d\xef\x48\x25\x1b\xf7\xbd\x2f\x8b\x42\xc8\xfb\x24\x75\xc8\x04\xb1\xac\x2b\x5e\x95\xa4\x15\xab\xa8\xb6\x16\x27\x1d\x0a\xb0\x24\x73\xdf\xc5\x3e\xbf\xc1\x7c\x44\x43\x9a\xaf\x45\xe5\x06\x43\xf0\x88\xe9\x05\x6c\x11\x7e\x97\xb7\x58\x2d\xd9\xd4\xdc\xe7\xa2\x62\x43\xf4\xb6\xd7\x2c\x71\x09\xa2\x87\xc6\xa6\xd0\xee\x58\x1b\xda\x5a\x0d\xad\x88\x44\x05\x0b\x4e\xa6\xed\x46\x4f\xee\xfe\xaf\x5f\xa2\xef\xbe\x1e\x29\xc0\x96\x8e\xa0\x0a\x31\x62\x4a\xb1\x3d\xd4\x3b\x6a\x1a\x8e\x16\x9c\xd1\x5f\x22\xe4\xd2\x10\x72\xaf\x20\xdb\xf2\xfe\xed\xa5\x6e\xbb\x6e\x2b\x70\x85\x3a\xab\xe7\x0d\x4f\x16\x9e\xaa\xcb\xf2\x54\x5d\xea\x53\xf5\x2f\xec\x52\xc9\x19\xd4\x13\xe1\x2a\x36\x80\x23\x7d\x9b\x4e\x91\x18\x5e\x78\x2b\x4c\x41\x85\x7a\x86\x53\x3a\x9a\x78\xc4\xa3\xb6\x61\x07\xd4\x2f\xa6\x7f\x05\x53\x3a\x1a\x7b\x5a\xd6\xe6\xd0\x16\x2e\x52\xc3\x70\x46\x29\xb5\x5f\xbb\x8b\xc2\x06\xa0\x04\x17\x13\x2a\xc0\x02\xcb\x8d\x12\xef\xba\x54\xdf\x1a\x7c\x3f\x1c\x0c\xfe\xaf\x52\x29\xd5\x82\x62\x3a\x4b\xbf\x7a\x22\xbc\xb8\x94\x25\xda\xe9\xa2\x58\x2a\x35\xbe\xb1\x67\xe4\x72\x8a\x5e\x08\xee\x0b\x5a\x5e\xdc\x03\x03\x6f\x41\xe1\x62\x0d\x0d\x7e\xa7\x79\x48\xa6\x6f\xf9\xbb\xfa\x9a\x7f\x47\x7b\x12\x9f\x00\xfa\x47\xbd\xd1\x91\xf6\x5e\xe3\x8d\x85\xf7\x63\xbd\x72\xd9\x63\xc2\xef\x54\xc9\x6f\xbd\xb0\x77\xc9\x99\x5f\x65\xe6\x2f\xab\x00\xd6\x51\x40\x26\x99\x9b\x76\x2a\x75\xf1\x45\xde\xe0\x86\xbc\xf2\x61\x00\x9e\x46\x21\xfb\x0c\x93\x57\x9a\x93\xf8\xc6\xd8\x5b\x2a\x32\x81\xf5\x86\x8d\xf5\x44\x9f\x5d\x8e\x2c\xb4\x14\xee\x10\xcd\x11\x50\xcb\xd6\x2f\x72\x71\xcf\xf3\x97\xb2\x63\xce\xc8\x64\xaa\xf5\xc8\x8c\x52\x98\x93\x5b\x1f\x72\x81\xd1\xb7\x40\xf4\xbf\xc0\x29\xcb\xdf\x97\x97\x7b\x20\xfa\x47\xf0\xa1\x28\xd0\x37\x6e\x20\xfa\xc7\xb0\xcb\x72\x72\xb6\xb2\x3e\x06\x62\xf4\x6c\xbd\x51\x39\x14\x9e\x0f\xc5\x9f\xa2\x52\x9b\x5d\xe2\xc6\xe7\xc5\x32\x2f\x96\x53\xf8\xe9\x9d\xdb\x0f\x06\x08\xa2\xd5\xcf\x9c\xb6\xf1\x74\xb9\x20\x5d\x5e\x94\xac\x18\xc8\x6c\x69\xaa\x62\xee\x3b\x36\x81\xd9\x0f\xe2\x85\x21\x93\xf1\x68\x9d\xa5\xc1\x56\x55\xca\x7e\x99\x44\x11\x9b\xa4\xbc\xc3\xa2\xc8\x28\xc8\x2d\xfa\xdd\x5e\x63\x39\xb0\xd4\x5c\x5b\x69\x2e\x37\xce\x27\x18\xfa\x30\x27\xbb\x3e\x24\x10\x2a\xe6\x49\x1a\xdc\x3b\xd3\x5a\xb9\xcb\xa1\x45\x61\x3e\x5d\xb2\xc8\x9a\x4d\x4b\x8b\xac\x38\x91\xb9\xa6\xde\xf4\x78\xa3\x1b\x22\x92\x49\xb5\x65\x87\xd6\xe8\x5d\xca\x71\xf4\x26\x51\x64\x76\xe7\x9e\x22\xee\x5d\x9a\x72\xc1\xfc\x30\xf9\x97\xd4\xe4\x02\xb1\x60\x8c\xe8\x4f\xfe\x27\x55\xe3\x0b\x0a\x47\x53\x63\xf9\x7b\x3c\x35\xc1\x2b\x5f\xe3\xc3\x70\xb0\x80\x33\x7c\xfa\x7d\x01\x57\xf8\xb0\xbd\x80\x97\xd3\x56\x9f\xe2\x8a\xd0\x3c\xf8\xc3\xc1\x58\xe6\x3a\x8e\xb9\x92\x5f\xcc\xb2\xbe\x93\x24\xd3\x28\xce\x73\x62\x48\x1c\x01\xa1\x23\x21\x70\x38\xb8\x8e\xb9\xd0\xca\x28\xa4\x8e\x09\x57\x2c\x30\xc7\xf2\xf3\xd8\xf1\x40\x38\x09\x48\x27\x04\xee\x04\x90\x39\x2e\x30\x27\x55\x12\xf6\xf9\x74\xad\x9b\x59\x27\x20\x2f\xa7\xe8\x78\xf2\x4d\x62\x76\x22\xf4\x96\x3f\x85\x39\xf9\x9a\x62\xf0\x43\x1d\xaa\x71\x6f\xda\x66\x90\x67\x32\xb3\xd5\x52\x6c\x0e\xb7\xb7\x07\xb9\x75\x70\x25\x32\x40\x2d\xd8\xc0\x76\x3d\xbd\x59\x2d\xc2\xc4\x93\x9a\xeb\xe4\xa0\x9e\xd4\xac\x6e\xdc\xb7\x89\x79\x45\xda\xe8\xc1\x04\x23\xaf\x73\x67\x4a\xce\xa7\x30\x1c\x02\x46\xee\x95\x40\x32\xa7\xc1\xcd\x5d\xd4\x33\x73\xc6\xb5\x30\x07\x68\xbe\x39\x7a\x6a\xc7\xbd\x95\x61\x3c\x31\x45\x4f\xf1\xef\xd0\x8e\x37\x86\x8b\x05\xd9\x51\x84\x77\x6f\x9a\x07\x37\x2e\x22\x1f\x3f\xed\x65\xc5\xbb\xcc\x29\x23\x20\xc7\x14\x62\x87\xc4\xf7\x1a\x9c\xfe\xd2\xc0\x6e\x1e\xe4\xa0\x7d\x90\x83\xf6\x41\x66\x3a\x01\x48\x11\xa0\x39\xd6\x2f\x61\x69\xf9\xe2\xaa\xfa\x43\x2e\x2f\x6d\x06\x92\xa2\x7d\xea\x2e\xc9\xe1\xe8\x43\x2b\xa7\x88\x01\x56\xfe\x78\x3a\x12\xf6\x8c\x7c\x98\x2a\x31\xcb\xc5\x84\x7f\x30\x23\x1f\x13\x10\x1a\x73\xf8\xfa\x9d\xd1\x0d\xee\xe2\x99\xdb\x5a\xc0\xe9\xf4\x4e\x6b\xd9\x5f\xbf\x8c\x7b\xa0\x71\xda\x59\x8a\x53\xbb\xa0\xf0\x6e\xa9\x0b\x89\xe9\x90\x8c\x35\xc3\x05\x39\xf2\x14\xe0\x1c\x79\xea\xa0\x8e\x2c\xbc\xaa\x1f\x27\xb1\xbc\x54\x02\x16\x64\xed\xf7\x37\x45\xfc\xe3\xb8\x08\xc9\x2b\xe8\xda\xb0\xd0\x0f\xe2\x7e\xf7\xe1\x43\x35\xd4\x19\xc9\xd0\xe8\x84\xd3\x91\xb0\x2d\x6b\xa1\x19\x5d\x1c\xf0\x15\x58\x1d\xae\x30\x39\x2a\xc1\xf0\x95\x00\xab\x33\x4e\xb2\x94\x27\xe8\xfd\x83\xba\x2c\x2c\xb8\x05\xab\x63\xe4\xf7\xe5\x9c\xca\x65\x38\x39\x76\x8b\x9d\xb6\x85\x92\xb3\xac\xe2\x0e\xd9\x45\x8b\xb4\x73\x62\xc6\x86\xa3\x03\xf5\x43\x60\xa0\x79\x0c\xa9\xcd\x7e\xfd\xda\xc4\xb0\xc0\x6e\xd9\xde\x3c\x74\x5c\x2e\x67\x9c\xc7\xd6\x82\xd0\x9c\xf7\x3f\x27\x98\x65\x42\xf1\x10\xa7\x53\x68\xcd\x34\x17\x02\xfa\xdd\x97\x83\x6d\x54\xb9\xf9\x4c\xf2\x8e\xcb\xbc\x6b\x6b\x83\xb0\x3e\x53\xff\xb8\x1b\x31\x6d\x94\x76\x55\xd5\x40\x24\xb1\xb4\x36\x92\x0d\x12\x6e\x10\x6f\xc3\xc4\xbd\xf3\x7d\xb0\xca\xb5\x84\x14\x1d\xec\xf3\x14\xd0\x8a\x49\xd8\x9d\x96\x74\xe2\x4c\x81\xd2\x67\x8c\xec\xce\x69\x45\x24\xfa\xb8\x96\x74\x2e\xb1\x96\xa7\xb9\xdd\xc1\xbb\x69\x9e\x15\xcd\x74\x72\x38\x6d\x75\x92\xdd\x47\x51\x06\xc3\x83\xa9\x9f\x1f\xa6\x20\xe1\x94\xb6\x5d\x71\x5d\x65\xa9\x0c\x83\x79\x71\xb5\x54\xd7\x38\x57\x6c\xd8\x38\xbf\xae\xb0\xb0\xab\x8e\x19\xf8\xcd\x9f\xf5\x5c\x7a\x7b\x1c\x8e\x3d\xbc\x95\x3c\xca\x94\xd8\x73\x80\xc2\xcf\x71\xa6\xe4\x9c\xaf\x8a\x2b\xb4\x8e\x2f\x33\x0b\xac\x37\x22\xb4\xc0\x3a\x62\xd2\xfa\xbe\x12\x0e\xa8\xda\xcb\xdd\xed\xd1\x4b\x05\x7b\xa9\xe1\xb5\xa5\xc1\x14\x15\xd7\x0f\x49\x2d\xf7\x82\xd4\xd8\x55\x05\x22\xb8\x62\x2c\x8c\xcd\x1d\x73\x09\x1a\x99\x44\xc8\xb8\x9a\xd2\x8a\xe1\xc8\xc7\xfa\x06\x9e\x20\x86\x1a\x2c\xe0\x76\x6a\x02\x9e\xbe\xd2\x5c\x97\xab\xfa\x7b\xab\x9f\x27\x16\x85\x37\xed\xe0\xf2\xb3\x6b\x3f\xa9\x66\x12\xc7\xa8\x23\x6b\xab\x3f\xae\x57\xff\x6c\x6e\x6e\xa5\x48\xe2\x0b\x8b\xae\xc9\x3d\xbe\x12\xf4\xc5\xa4\xaf\x8b\xfb\xdd\xd1\xdb\xc4\x4e\x39\xd5\xee\x8e\x0a\x3f\xf3\x22\xe1\x63\xbb\xe1\x47\x9e\xa2\xaa\x92\x9d\x8a\x58\x5e\x11\xf7\xd0\x4b\xe2\x29\x17\xb2\x93\x4a\x11\xea\x91\x4d\xf5\xfd\xf6\x7b\xc3\xf5\xcf\x39\x78\x82\x52\x78\x31\x6d\x73\x14\xae\x83\xba\x0c\xc7\x7c\x12\x7a\xd7\x55\xf0\xfe\x5c\xe8\x00\xd3\xcc\xbd\xe2\x9e\xac\xda\x14\x8d\xac\xd7\xb1\x6f\xd9\xd6\x51\xae\xe5\x5c\x86\x82\xcb\x24\x13\x4d\xfa\xe2\x6c\xd2\xd3\x8e\x03\xe6\x46\xa7\x38\x53\x0a\x43\xcc\xc9\x1b\x75\x20\x07\xb0\xc6\x74\x98\xc5\x17\x11\xef\x99\xcb\x81\x53\xf3\xdd\x77\xc6\x3a\x42\x01\x9a\x1b\x65\xc2\xd2\x0b\x3d\x23\x07\xd8\x9f\x5a\x20\x8a\xac\x70\xe5\x60\x86\x01\x91\x39\x3e\x17\x7d\x76\x5d\x8d\xf3\x6a\x0d\xd0\x0e\x2b\x4f\x5b\xa1\xdd\x4b\xb0\xda\xce\x9d\xd5\xd4\x79\x38\xf3\xc8\xa6\xe6\xcd\xa7\x21\x9f\xd5\xa7\x9a\xf3\xd6\x95\x6b\x34\x25\xcf\xdf\x63\x5d\x7a\x77\x2e\x8c\xea\xa9\x5c\x9a\x15\x51\x32\x89\x56\xbf\x50\xea\xac\xec\xd5\x7d\x54\xf2\x9a\xe4\x7f\x77\x27\x87\xff\xe6\x9d\x1c\xfe\xfd\x9d\xfc\x71\xbf\x9d\xfc\xb1\x76\x27\xff\xfe\xde\x0d\xff\xe5\xbd\x53\x27\xb4\x05\x9a\xf4\xf6\x91\xb8\x1d\x3d\x69\x6f\xd9\x36\xcd\x95\x42\x37\x96\x65\xcf\xc8\x3c\x81\xdf\x41\x22\xe3\xb5\x30\x48\x4a\x8e\x0c\xcf\x77\xad\xfe\xb9\xc2\xbb\x01\xf5\xb4\xa3\xfe\xb9\x2d\x68\x37\x32\x3b\xf1\x82\xc2\x8f\x69\x53\xfa\x00\xe3\xb4\x55\x9a\x45\x34\x98\x63\x8e\x3b\xee\x45\x2f\x60\x3e\xf7\x57\xcd\x33\x37\xd1\x3e\xbc\xc5\x9c\x55\xf2\x1b\xb9\xce\x96\x75\xb9\xbc\xd1\x90\x55\x57\x59\xbe\xac\x7e\x1e\x2f\xc7\x1d\x0f\xfe\xe6\x90\x4f\xaa\x86\xcb\xe5\xbc\x1b\x6f\x53\x44\xc9\x0a\x7d\x9a\xb6\x26\xef\x6d\x33\xb9\xd6\x21\xa7\x1c\x1d\x72\x0a\x23\xb7\xba\x68\x03\xbb\x4b\x88\xbc\xc3\x7f\x20\x37\x84\x44\x57\x00\xd9\x77\x57\x39\xc5\xf5\xbe\x00\x7f\xcf\xd2\xbf\x62\xd7\x2f\x8c\x5d\xbf\x30\x76\xfd\xc7\x3e\x32\x05\x85\xbd\x3e\x3a\x76\xd4\xec\xf5\x95\x14\xa2\xed\xba\x97\xbd\x63\xee\x6f\xd7\x2d\xda\xed\xba\x7f\x4c\xd1\xb9\x86\xe7\xfb\xf1\x7e\xda\x7e\xbc\x2a\x36\xa8\x6c\xa0\x3f\x57\x7e\xe9\x13\x6a\x60\xb4\x05\xe7\xd7\xe9\x7d\x3c\xf4\x56\x12\xea\xac\x2c\xa2\x59\x38\xd9\x77\x47\x7f\xce\xc8\xdb\x69\xce\x17\x7f\xae\xe8\xae\x76\xf2\x88\xb4\xfa\x2a\xce\xee\xa0\xab\xe4\x57\x81\xc9\x64\x0a\x04\xf3\x7e\x8a\x4e\x31\xa8\x6c\x6b\xee\xe7\x43\x52\x06\xb7\xad\x5c\x12\x9a\x73\xbf\xcc\x8c\xea\x75\xac\xe7\x0c\x2f\xbd\x09\x5b\x67\xa5\x6d\x63\xf1\xdf\xde\x8c\x89\x18\xf9\x9a\x65\x0b\x66\xc5\x92\x7d\x9b\xb6\x07\x6e\x6c\xf0\x71\xac\x0e\xa7\xc2\x30\x7b\x3e\xbc\xf4\x60\x46\xbe\xea\xb9\xd7\xb3\x25\x19\x5f\xc7\x3a\x87\xcc\x7c\x35\x82\xb8\xeb\x58\x63\xd9\x7b\x6c\x81\xe8\xae\x18\x61\xac\x4e\x6c\x97\xc4\x5d\x30\x3e\x42\x23\xab\xb3\x74\x55\x6d\xd1\x9a\xf9\xec\xf5\xb4\xd9\x00\xad\xc2\x90\x15\xbb\x72\x60\x12\x39\x76\x34\xcd\xc6\x0d\xc7\xcd\x29\x37\x2b\x37\x8f\x4f\x2b\x36\x4c\x5a\x89\xfd\x22\xab\x68\x84\x87\x88\xea\x61\x99\xa0\x6a\x61\xb4\x40\xd8\x66\x21\x0b\x1a\xdb\xb4\x85\x55\x2b\x8c\x5e\xc0\xb9\x8f\x22\x65\x4d\x37\xb8\x20\xe6\x38\xc9\xae\x61\xed\x79\xd7\x59\xab\x7c\x36\x77\xf9\x88\x47\x4f\xdc\x0a\xb7\xf2\x49\x68\x7a\xb8\x53\xc2\x24\x64\xdd\xfb\x1c\x52\x85\x9f\x3a\xd6\x46\xdc\x35\xbd\xf1\x6e\xcd\xd9\x05\x59\x02\xf4\x7d\xe7\x96\x6d\x7d\xc1\x2c\x9d\x8d\xf6\x4f\xe3\xa8\xb7\xd9\x59\xb5\x81\x38\x61\x44\x76\x57\x66\x1e\x2f\x33\x0e\x4b\x6d\x0d\x50\x68\x6d\xfa\xd2\x35\x22\x2a\x99\x0b\xaa\xc0\x70\xd9\x9e\x2d\xc0\xeb\x1a\x2d\x4e\xd2\xbd\x23\x1d\x0c\xeb\x33\x9e\x87\xf5\xf3\x2a\x11\xd9\x9b\x34\x01\xda\xca\x4a\xf3\x17\x49\x94\x8d\x75\xb2\x0a\x63\xf0\x5f\x31\xad\xe8\x58\x1b\xb2\x0a\xbc\xab\x68\x43\x94\x28\x06\xef\x96\xc5\x94\x30\x9d\x5b\xc0\x33\xd7\x72\xd9\xaa\xf1\x4e\x67\x09\x86\x8a\xad\xcf\x59\xa2\x95\x83\x7c\xdf\x91\xff\xcf\x8c\xb6\x32\xb0\x1c\x55\x68\x1f\x1f\xaf\xf9\x80\xdc\xbd\xba\xc6\x83\xeb\x3f\xb1\xb8\x39\xc0\xad\x5e\x37\xde\x75\x8e\x93\x1c\x1a\x17\x14\xc2\xee\x1d\xfa\x9a\x8a\x88\x59\x39\x70\x01\x49\xba\xf0\xce\x07\x23\x3d\x82\x12\x4c\x7a\xd1\x45\x6f\x1b\x8d\x42\x9f\x98\x30\x3d\xfb\x1e\xdc\x78\x14\x6e\x3c\xe2\x75\x29\xc4\x14\x8a\x66\xaf\x4c\x2a\x95\xb2\xe5\xd6\x52\xcb\xf3\xa5\x96\xb2\xd2\xf2\x35\x1a\xcd\x37\x7e\x6e\x6f\xa9\x91\x68\x58\x14\xbd\x51\xa6\xf1\xd0\x34\x5e\xd9\x29\x75\x6c\xff\x9f\xff\xdb\x5a\x71\x6f\x5a\xda\x8b\x3a\x9a\x33\xb8\xa3\xa3\x4d\x0a\x7a\x4b\x36\x1b\x37\x1e\x61\xdd\x76\xe1\xc1\x63\x11\x57\x5c\xe7\x92\xe8\xf0\x9d\xde\xe5\x5a\x12\x0a\x78\xf4\xdf\x24\x89\x7f\xa9\x71\xed\x60\x8d\x2e\x7d\x14\xf6\x25\x4f\x25\x89\x9d\x98\x8e\x2c\x9f\x49\xd6\xb3\x36\x62\x3b\x86\x47\xff\xfd\xcf\xf4\x37\x72\xc5\xa6\x4c\x5f\xfb\xd8\xbf\x54\xa1\xad\x98\xd8\x7f\x3e\xba\x94\xe3\xa8\x68\x2a\x1c\x81\x86\x59\x18\x1f\x3d\x50\xc8\xdd\x13\xa0\xbb\xba\x10\x6c\x3c\x3e\xe7\x7e\x88\x21\x45\xf2\xf0\x5c\xe0\x76\xdb\x7c\xab\x73\xa7\x6a\xf1\xcf\xf8\xd7\x3f\xc5\xaf\x7f\xc6\xda\xb7\x3a\xed\x6a\x0f\x5a\x7e\x23\x99\xe0\xcc\xa2\x10\x75\xd7\xe6\xf8\x9a\x93\x9d\x14\xb6\x60\xf8\x18\xbe\x0a\xe2\x76\x75\xc6\x58\x34\x82\xc8\xfe\x67\x90\xa3\x58\x7f\x7e\xe3\xf2\xfc\xa6\x5d\x73\x80\xb3\xfc\x00\x4b\x3c\xc0\xfc\xde\xd8\x11\x3e\x78\x84\xa9\xa5\xfe\x37\xa0\xc9\xff\x91\x71\x37\x0d\xf1\xdf\x8d\x30\xff\x03\x0b\x5e\x90\xe8\xa5\xc9\xfc\x6d\xd4\xe9\x77\x1b\xfd\x86\x74\xb0\x5d\xde\x67\x8f\x01\x73\xd3\x75\xc1\x53\x7f\x06\x80\xae\xa3\x1f\x20\x54\xbf\xf6\x30\x63\x1d\x7b\x85\xf1\xc2\xba\xa3\x73\x62\x7d\xe0\xb3\x3c\xe3\x84\x42\x67\xaf\xd1\x1d\x0a\xc3\x01\x5b\xaf\xfd\x50\x96\x65\x6f\x39\x31\xd1\x09\xab\xd1\xdf\x5a\xee\xbf\x73\x01\x6b\x4e\xc2\x2e\x64\x7d\xf7\x33\x64\x7d\x76\x0a\x59\x3f\x55\xf3\x16\x5d\xf0\x80\x55\x90\x6b\x11\x2d\x28\xee\x1a\x3d\x64\x81\x52\x8f\xa7\x98\x0a\xf5\x84\xc2\x94\x44\x5d\xb0\x5e\xe6\xb9\xcc\xf3\xaa\xb3\xa2\xea\x91\xae\x7a\xbc\xb4\xb4\x05\xe9\x98\x93\x6f\x53\xe0\x90\xe8\x08\x57\x59\x17\xa5\x44\x35\xc6\x2b\x45\xf4\x34\xda\x9b\x76\x1d\x2e\xa0\xdb\x75\x32\x01\xe3\x46\xe4\x12\x0b\x12\x08\x54\x73\x98\xb8\x1b\x97\xdd\x7b\x1a\x7b\x4f\x5a\x2b\x7a\x0c\xc5\xc8\x1d\xc1\x3b\xf3\x24\xeb\xa4\x99\x79\x98\xb1\x58\x76\x64\xd2\xd1\xa9\xe8\x97\x58\xf2\x91\x45\x81\x6d\xdb\xeb\x0d\x6a\x4f\x18\x39\xe0\x64\x46\x2e\xf5\x5c\xab\x76\x90\x2f\x93\x38\x08\xc5\x58\xd3\x1a\xf7\x87\x7d\xc0\xc9\x71\x42\xc1\x7b\x62\x5b\xaf\xf5\xd7\xf2\x7d\xc7\x64\x3d\x6b\x98\xe3\x26\xbd\x84\x31\xca\x4c\x79\x14\x18\x6d\x53\xe9\x1e\x61\x8e\xd5\x06\x1a\xcd\x9f\xfb\x26\x60\x21\x5a\x56\xb4\x7e\x05\xdd\x30\x36\x88\xf5\xd0\x04\x57\xd3\x2e\xe4\x5a\x30\x9e\x6b\x94\x7e\xf9\xd8\xa2\x70\xb3\x66\x9c\xff\x3b\xe3\x12\xac\xde\xf7\x98\x74\x19\xab\xf4\xe4\xa2\x8b\x4c\x48\x6a\x81\xe8\xb3\xd3\xba\xe8\xa9\xcb\x91\x2b\xc2\x1a\xee\xe7\x86\x8b\x1a\xec\x02\xb7\xd7\x37\xbd\x60\x1c\x2f\x54\x91\xb8\x3e\xfc\x45\xa7\xfa\xe5\x78\xfd\xb2\x02\x5d\x27\x46\xe3\x49\x29\x9c\x7a\x44\xd0\xc6\xb0\xf6\x4b\xf3\x5c\xaf\x07\x58\x27\xe6\xad\xc4\x2e\x30\x60\xbf\x8b\xae\x3b\x95\x41\xe9\x89\x5b\xb4\xf1\x0a\xeb\xdf\xd0\xff\x2b\x1e\x71\xad\xf0\x56\xab\x2a\x56\xd4\xb0\xa5\x5e\xe7\xa3\xa7\x36\xe8\x9a\x52\x38\xf4\x48\x3c\xc2\xdb\xf1\x49\x17\x04\x3c\x18\x52\x6a\xef\xc8\x42\x2d\x2a\x17\x14\xae\xbb\x0d\x91\x11\xcd\x1a\xca\x9a\xea\x87\x57\x82\x37\x62\xe0\x0f\x13\xbe\xb5\xcd\xec\x90\xcd\x17\xda\x0e\x77\xad\x81\xad\x7b\xb2\x30\x86\xb5\x78\xe5\x4a\x29\x06\x22\x18\x77\x57\x3d\xbb\xcb\x29\x36\x74\x74\xae\xb6\x5c\x01\xd9\x4d\x37\x8f\xa7\xa0\x5e\x50\x34\x76\x5e\x60\x68\x1d\xe3\xee\x9c\x43\x55\x6e\x40\xb5\xaa\x65\x91\xad\x5a\x96\x9d\x6e\x35\x61\xcb\xd1\x1a\x29\x03\x2d\xfa\x64\x1e\x03\xf6\xc4\x83\x03\x5e\xd7\x65\x88\xe2\x72\xa0\x12\x11\x33\xf3\xc9\x3b\x46\x6e\x3d\xd4\x86\x2d\x19\x3a\xb9\xcc\xbf\xe0\x1d\xfc\xb7\x37\x09\xa3\x28\x99\x99\x1f\x66\xa4\x06\x0d\x20\x9e\x94\xc9\x64\xc9\x5d\x4d\x5f\x6d\xc7\x86\x05\x5f\xb4\x7c\xee\x3b\xde\x2d\x2c\x28\x1c\xaf\xaa\x90\xc2\x80\xe8\x4c\x20\x15\x65\x79\x8b\x31\x64\x81\xb8\xcc\x3d\xea\x91\x02\xbe\x81\x5a\xbc\x55\xe5\xf5\xbd\xba\x68\x8c\xe2\x81\xbd\xc6\x7d\xef\x0a\x14\x0c\x15\xf7\x02\xaf\xff\x37\xd3\xc1\xcf\x68\x7c\x80\x17\xba\x7d\xd7\x5f\xb4\x52\xc4\xb3\xae\x31\x3f\xbb\xd2\xe4\xc7\xb5\x28\xbc\xbc\x97\x0a\xa9\xc2\x87\x8a\x64\xd6\xe4\x07\xaf\xa4\xc3\x4d\x94\x11\xb1\xee\x52\x8c\x8a\x19\xb9\xea\x36\xf1\xa6\x4b\x37\x75\xbd\xe1\xe0\x6e\xb7\x37\x51\xc8\x7a\xe7\xcd\xfc\xa4\x68\x0d\x52\xf1\xb9\x48\x81\x60\x62\xe4\x7c\xd5\xf7\xf0\xf4\x0e\xa6\xb0\xf4\x89\x84\x5a\x58\x8a\xc2\xbc\xf7\x14\x99\xea\xff\x34\xb9\xf8\xcc\xc9\x59\xf7\x7f\x8a\x56\xac\x74\xbe\x4c\x28\x64\xb9\x89\x2f\xbb\x60\xbd\x7b\x65\x99\x98\x6f\x7e\xf1\x4e\x53\xf5\x0e\x93\x58\x74\x8e\xa5\x9f\x69\x51\xac\x98\x82\xa5\x42\x76\x5a\x16\x6a\x15\xa4\xbf\xdc\xb8\x52\xae\x75\x95\x7e\xc7\x9d\x9b\xef\xb2\x93\xb2\x2c\x67\xb5\x75\xc1\x71\x75\x40\x92\xe3\x6b\x85\x97\xcc\xce\x14\xa5\xb9\x82\xd9\x82\x65\x73\x9b\xf3\x04\xde\x79\xe6\x76\x84\x82\xd4\xf9\x85\x40\x28\x22\xc8\x35\x11\x7c\xdd\x05\x09\x0f\x06\x05\x11\x5c\x50\xd8\x33\xec\xdd\xa6\x45\x61\x5f\x3f\x7b\x89\xaf\x40\xe8\x83\xfe\x35\x51\xfb\x04\xbb\xa6\x9a\xb1\xa4\x81\x53\xfd\x3b\x66\x53\x8b\xc2\xbb\xae\xf3\xf3\xc6\x2e\x93\x48\x80\x9b\xd8\x46\xe7\x6d\x2d\xe0\xa3\x2e\xd5\x6f\xad\x05\x1c\xe6\xb5\x8b\x60\xcc\x58\x72\x94\xff\x5a\xc0\x49\x51\xa3\xc8\x40\x85\x35\xf2\x5f\x0b\xb8\x2d\x6a\x98\xdc\x38\x58\xae\x9f\x17\xf0\xaa\xdb\x1e\xad\xad\x11\xf4\xbb\x75\xb0\x7f\xd7\xad\x81\xfc\xc7\x6e\x4e\x24\x0d\x3b\x60\x0c\x39\x97\xed\x37\x4f\xba\xb5\xd4\xa9\xb7\xdd\x5a\x6a\x8f\x8f\xdd\x3a\xbc\x1f\x76\x17\x0b\x7d\x0d\x35\xb2\x3a\xa5\x4f\xef\x82\xc2\xdb\x3b\xb9\xed\xa5\xd8\x15\x1b\x33\xf2\xca\x20\xe0\x55\x17\xec\x4a\xcc\x88\x5b\x46\x44\xff\x06\xc3\xf5\x18\x9f\xa2\x9a\x87\x91\x06\x8c\x37\x48\xe8\xdf\x75\xe1\xa4\x0b\xb7\x5d\x38\xec\x82\x5a\xf1\x3c\x3c\xe1\x44\x24\x63\x2e\x2f\x79\x96\xf6\xc3\xe4\x91\x9f\x78\xa9\xde\xfc\x30\xbe\xd0\x0f\x63\x16\xb3\x0b\x2e\x1e\xe9\xad\xd9\xe5\xd1\xc4\x5a\x7c\xa7\x70\xb0\x1e\x87\x2f\xf9\x27\x18\x59\x82\xf9\x3e\xba\xfe\x59\xdb\xe8\x74\x97\x7b\xf8\x98\x48\x46\x62\xf5\x96\x16\x3e\x7b\x24\xee\x7b\xa7\x75\xbc\x6d\x0c\x9f\x3a\x93\x8a\x58\x71\xe0\x55\x2d\xa3\x3f\x77\x9d\x50\x10\x4b\x60\x90\x96\x2f\xdd\xf6\x24\xf7\x9f\x3c\xb0\x70\x39\x55\x1f\x18\xff\x0a\x3e\x77\x89\x95\xca\x79\xc4\xd3\x4b\xce\x65\x61\x5d\x15\x25\xcc\x47\xcb\x2a\x41\x3c\x0c\xa0\x5d\x98\xe4\x71\x21\x12\x61\x8a\xe2\x8c\x58\x6f\x58\x18\x71\x5f\xd1\x61\xd5\xa6\xf3\xf2\xe8\xa8\x13\x88\x64\xac\x73\x45\x51\xe3\x05\xaa\x23\xb1\x1e\xc6\xe4\xa7\xf7\xca\xbe\x02\xef\xb3\x7d\xce\xc0\x3b\xb4\x1b\x19\xcb\xee\x48\x91\x11\x4d\x6c\xd9\xc2\x56\x3f\xb6\x81\xd9\x73\xf2\x35\x02\xeb\xbf\x2c\x20\xb1\x4e\x51\xc7\x9e\x80\x7e\x37\xb2\x14\x3f\x71\x8c\x6e\x91\xef\x23\xc5\x56\x64\xb0\xab\x48\xc3\x7c\x54\x06\xa6\xb4\xcb\x68\x95\x71\xdf\xf5\x14\x7f\xd9\x67\x19\x26\x03\x00\x6f\xdb\xee\x4a\xf2\x43\x50\xf0\x9e\xd9\xfb\x11\xf8\x6e\xc3\xc8\x14\x1f\x72\x48\xfe\x7c\xaf\x97\x1e\x39\x80\x9d\x0a\xc8\x58\x8b\xc5\x82\x3e\x67\x89\xf3\xf3\x80\x85\xb1\xfd\x33\x8c\x43\x69\xff\x10\xe4\x30\xa4\x64\xa0\x3e\x12\xf7\x5f\x47\xe3\x51\xde\x6f\xc7\x98\x4f\x05\x89\x20\xc8\xa3\x77\xc2\xb8\x23\x29\xfe\x11\x23\x0c\x84\x65\x39\x0e\x1f\x4d\xc8\x13\x6a\xc7\x44\xfc\xc9\xbf\x83\xfc\x93\x7f\xa7\xb6\x7a\x74\xd4\xe3\x82\x60\x97\xc0\x12\x6a\xe3\x93\xc3\x92\x05\x51\x6c\x10\x7d\xfe\xff\x06\x00\x00\xff\xff\xed\x2b\x91\x4f\xe5\xb1\x01\x00"), }, "/templates": &vfsgen۰DirInfo{ name: "templates", @@ -161,9 +161,9 @@ var Assets = func() http.FileSystem { "/templates/default.tmpl": &vfsgen۰CompressedFileInfo{ name: "default.tmpl", modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), - uncompressedSize: 8101, + uncompressedSize: 8398, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xec\x59\xcf\x6f\xeb\x36\x0c\xbe\xe7\xaf\x20\xfc\x76\x68\x0e\xf5\x1b\x76\x2c\x50\x0c\x0f\xc3\x7e\x1c\xba\x61\x68\xd1\x5d\x86\x21\x50\x6d\xc6\x55\x2b\x4b\xae\x44\x27\x0d\xd2\xfc\xef\x83\x6c\xc7\x91\x2d\x27\x91\xd3\xec\xb4\xdc\x12\x99\xfc\x48\x7f\x1f\x4d\xca\xf2\x7a\x0d\x29\xce\xb9\x44\x88\x66\x33\x26\x50\x53\xce\x24\xcb\x50\x47\xb0\xd9\x7c\x73\xfe\xaf\xd7\x80\x32\x85\xcd\x66\xb2\xd7\xe5\xf1\xfe\xce\x7a\xad\xd7\x10\xff\xfc\x4e\xa8\x25\x13\x8f\xf7\x77\xb0\xd9\x7c\xfd\xf2\xb5\xb2\x33\x3f\x6a\x4c\x90\x2f\x50\xdf\x5a\xa3\xfb\xe6\x0f\x7c\x40\xa9\xc5\x5b\x89\x7a\x55\xbb\x37\x81\xba\x91\x4c\xf9\xf4\x82\x09\xd9\x08\x7f\x5b\xef\x07\x62\x54\x1a\xf8\x00\x52\x8f\x45\x81\xba\x76\xe5\x73\xc0\xb7\xf6\x62\x34\xe7\x9a\xcb\xcc\xfa\xdc\x58\x9f\xea\x86\x4c\xfc\x4b\xb5\x0a\x1f\x20\x50\xba\x11\xff\x01\x6b\xf4\xab\x56\x65\x71\xc7\x9e\x50\x98\xf8\x41\x69\xc2\xf4\x4f\xc6\xb5\x89\xff\x62\xa2\x44\x1b\xf0\x45\x71\x09\x11\x58\x54\xa8\x43\x66\x04\x57\x16\x2b\xfe\x49\xe5\xb9\x92\xb5\xf3\xb4\x59\x73\xf0\xa6\xb0\xd9\x5c\xad\xd7\xb0\xe4\xf4\xdc\x35\x8e\xef\x31\x57\x0b\xec\x46\xff\x83\xe5\x68\x1a\x46\x87\xa2\xb7\x89\x4f\xdb\x5f\x7b\x64\x4a\xd1\x24\x9a\x17\xc4\x95\x8c\x0e\x70\x4c\xf8\x4e\xb5\xa4\x33\xc1\x0d\x35\xa6\x9a\xc9\x0c\x21\x86\xcd\xa6\xce\xeb\x66\xb2\x5b\xf4\x79\xb2\xac\x5c\x57\x44\xda\xf4\xed\xbf\x5b\x68\x6f\xa0\x49\xac\x0e\xfe\x4d\x4a\x45\xcc\xe6\xd4\x81\x74\x96\x4f\xc3\x7d\x50\xa5\x4e\xf0\xa6\x16\x13\x25\x6a\x46\x4a\xd7\x95\x38\x19\x20\xea\x20\x05\xb3\x9c\xe9\xd7\x54\x2d\xa5\xc7\xc5\x24\x94\x8c\xc0\xac\x27\xe3\xe9\x08\x45\x0e\x22\x64\x32\xcc\x88\x11\x2c\x79\x8d\x53\x9c\xb3\x52\x50\x4c\x9c\x04\x36\x54\x10\xe6\x85\x60\xd4\x7d\x38\xe3\x7d\x35\xd8\xc5\x29\x8d\x6d\x0f\xf9\x10\x54\xb7\x09\x05\xe2\xcd\x99\x10\x4f\x2c\x79\xf5\xf0\x06\xd3\xb7\xa0\xf0\x01\xc7\x0c\x05\x97\xaf\xc1\x19\x24\x4d\x06\x3c\x8d\xc2\x1c\x0a\x8d\xb6\xd6\x02\xad\x9d\x84\x0e\x32\x56\xf5\xe0\xc0\x94\x79\xa2\x24\xe6\xea\x85\x47\xe1\xf6\xa5\x16\xa1\x19\x87\xdf\xdc\x5c\x29\xaa\x27\x8e\x53\x83\xae\x79\x61\x6f\x2d\x2d\x69\xd5\xba\xf8\x0d\x6d\x5c\x39\xfa\x88\x89\xe0\x28\xe9\xf4\x82\xdc\x87\xb8\x9b\x8a\xa7\x69\xe6\xe3\x72\x69\x88\xc9\x04\xcd\x00\xae\xd7\xc1\xe3\xfd\xac\xaa\xc2\x64\x28\x39\xb6\xc0\x39\x1a\xc3\xb2\xd3\x9e\x6f\x0f\xcc\x57\xa8\x19\x78\x7b\x1a\xda\xe0\x84\x9b\xf4\xe6\x6b\x67\x80\x4f\xe1\x7b\xb8\xb6\x8d\xb3\x5a\x84\x7a\xb1\x6a\x9d\x87\x19\xe9\xee\x02\xaa\x20\xd7\xce\x1d\x0d\xc4\xbb\x47\xa3\xc4\x02\xd3\x5e\xc4\xed\x72\x78\xcc\xad\x87\x17\xf5\x3a\x84\x52\x53\xf5\xf1\xf1\xd5\xd4\x51\x7d\x89\xc9\x33\xa3\xb1\x9a\x4f\x2e\xfa\x1d\xd0\xcf\xdd\x28\x3f\x6a\xe1\xe1\x0d\xea\xb3\x47\xf5\x9e\x3e\xa4\x66\x76\x58\xee\xed\xa4\xbe\x79\xc1\x34\xad\x46\xd8\x13\xcb\x42\xad\x59\x86\x92\x66\xfd\x11\xd7\xad\xaf\x05\x4f\x48\x69\x55\x98\x5d\xd9\x12\x23\x9c\x75\x0b\xed\x52\x4b\xe3\x7a\x81\xcf\x2a\x4a\xe2\xb4\x9a\xa5\xdc\x14\x82\xad\x66\x7b\x76\x53\xc7\x1b\xb7\x8f\x9c\x2b\xc9\x49\x59\x42\x66\xa4\x94\x18\x39\x12\x3b\xb3\xab\x34\xcf\x6a\x81\xfa\x0c\xfb\x47\x0f\xea\xbf\xaf\xa7\xf3\x94\x53\x78\x35\x9d\xaf\x98\xfc\x2d\xfd\x21\x26\x77\x7b\xba\x31\x33\xc5\xdd\xcd\x49\xe7\x61\xdf\xbd\xa6\x8f\x7f\x47\x70\x70\x2e\xf2\x8e\x91\xd7\x65\x91\x50\x60\xa6\x59\x3e\x44\xe5\xff\x96\x94\x94\x9b\x44\xe9\x74\xb7\x37\x57\x92\x76\xdb\x7d\xbf\x14\xfb\xf6\xa7\x37\xae\x3e\xd2\x45\x0d\xbb\xad\x78\xc2\xf7\xcb\xa3\xfe\x69\x1e\x73\x43\xc8\x72\xb7\xf9\xe6\x39\xd3\xab\x93\xea\xb4\x8f\x75\x7a\xc5\x7b\x48\xcd\x49\x40\x88\x4c\x5f\x60\x94\x50\xce\xf1\xdc\xa7\x15\x6b\x43\x87\x6a\x36\x10\xfc\x04\xf1\x16\x3f\x9c\x8f\x72\x17\xeb\x42\xfa\x10\xe9\x2f\x5c\xb3\xb3\x3c\x2e\x1d\xa0\xde\x59\xc7\x85\xf3\x49\xf5\x1a\x33\xc8\x55\xa1\xb9\xd2\xdc\xbe\xa1\x5e\x37\x6f\x3b\xdf\x6d\x97\xe0\xe6\x16\xa2\x68\xfb\x12\xb4\x3d\xff\xee\xdc\xad\xf5\x01\x00\xa8\xfc\x0c\x2e\x70\xeb\xc7\x65\x8a\xef\xdb\x23\x78\x88\xb6\x97\xa2\x8e\x07\x9f\xc3\x15\xbe\x39\x8e\x51\xa2\x39\xf1\x84\x89\x68\xda\x1a\xb6\xf0\x6d\x5a\xb7\x10\xfd\xc6\xb3\xe7\x2e\x16\x0a\x83\x15\x20\x93\x69\x1f\x75\xc9\xb4\xe4\x32\x8b\xa6\x70\x25\xd1\x01\xaa\x61\xa6\x47\x62\xfd\x8e\x29\x2f\xf3\xf0\x68\x5c\xce\x95\x0d\x65\x57\x77\xa1\x8e\x86\xb9\x53\xcb\x5e\x0c\x99\xb6\x9a\xb8\xbf\xeb\x6f\x6a\x2e\x74\xc7\xad\xab\x53\x5b\x18\x5e\xec\x51\x6a\x8d\x56\x2c\x40\xb5\xb3\x2b\x17\xa4\xde\xf9\x14\x3c\xae\x62\x5f\xc9\x63\xca\xee\x90\xfa\x57\xdd\x56\xa7\x55\xf2\x8a\xd4\x3d\x36\x3a\x79\x52\x0d\x80\x31\xc1\x99\x39\xfd\xe0\x7d\x5f\x7a\x9f\xfe\x5a\x32\x00\x7c\xf8\x73\xc9\x80\xc3\xb1\x6f\x26\x43\xc9\x7b\x1f\x4e\xfe\x0d\x00\x00\xff\xff\x74\x5d\xc4\xb5\xa5\x1f\x00\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xec\x59\xcf\x6f\xeb\x36\x0c\xbe\xe7\xaf\x10\xfc\x76\x68\x0e\xf5\x1b\x76\x2c\x50\x0c\x0f\xc3\x7e\x1c\xba\x61\x68\xd1\x5d\x86\x21\x50\x6d\xc6\x55\x2b\x4b\xae\x44\x27\x0d\xd2\xfc\xef\x83\x6c\xc7\x91\x2c\x3b\x91\xdd\xec\xb4\xdc\x12\x99\xfc\x48\x7f\x1f\x4d\xca\xf2\x76\x4b\x52\x58\x32\x01\x24\x5a\x2c\x28\x07\x85\x39\x15\x34\x03\x15\x91\xdd\xee\x9b\xf5\x7f\xbb\x25\x20\x52\xb2\xdb\xcd\x06\x5d\x1e\xef\xef\x8c\xd7\x76\x4b\xe2\x9f\xdf\x11\x94\xa0\xfc\xf1\xfe\x8e\xec\x76\x5f\xbf\x7c\xad\xec\xf4\x8f\x0a\x12\x60\x2b\x50\xb7\xc6\xe8\xbe\xf9\x43\x3e\x48\xa9\xf8\x5b\x09\x6a\x53\xbb\x37\x81\xdc\x48\xba\x7c\x7a\x81\x04\x4d\x84\xbf\x8d\xf7\x03\x52\x2c\x35\xf9\x20\x28\x1f\x8b\x02\x54\xed\xca\x96\x04\xde\xda\x8b\xd1\x92\x29\x26\x32\xe3\x73\x63\x7c\xaa\x1b\xd2\xf1\x2f\xd5\x2a\xf9\x20\x1c\x84\x1d\xf1\x1f\x62\x8c\x7e\x55\xb2\x2c\xee\xe8\x13\x70\x1d\x3f\x48\x85\x90\xfe\x49\x99\xd2\xf1\x5f\x94\x97\x60\x02\xbe\x48\x26\x48\x44\x0c\x2a\xa9\x43\x66\x48\xae\x0c\x56\xfc\x93\xcc\x73\x29\x6a\xe7\x79\xb3\x66\xe1\xcd\xc9\x6e\x77\xb5\xdd\x92\x35\xc3\x67\xd7\x38\xbe\x87\x5c\xae\xc0\x8d\xfe\x07\xcd\x41\x37\x8c\xf6\x45\x6f\x13\x9f\xb7\xbf\x06\x64\x4a\x41\x27\x8a\x15\xc8\xa4\x88\x8e\x70\x8c\xf0\x8e\xb5\xa4\x0b\xce\x34\x36\xa6\x8a\x8a\x0c\x48\x4c\x76\xbb\x3a\xaf\x9b\xd9\x61\xd1\xe7\xc9\xb0\x72\x5d\x11\x69\xd2\x37\xff\x6e\x49\x7b\x03\x4d\x62\x75\xf0\x6f\x42\x48\xa4\x26\x27\x07\xd2\x5a\x9e\x86\xfb\x20\x4b\x95\xc0\x4d\x2d\x26\x08\x50\x14\xa5\xaa\x2b\x71\xd6\x43\xd4\x51\x0a\x16\x39\x55\xaf\xa9\x5c\x0b\x8f\x8b\x59\x28\x19\x81\x59\xcf\xc6\xd3\x11\x8a\x1c\x44\xc8\xac\x9f\x11\xcd\x69\xf2\x1a\xa7\xb0\xa4\x25\xc7\x18\x19\x72\x68\xa8\x40\xc8\x0b\x4e\xd1\x7d\x38\xe3\xa1\x1a\x74\x71\x4a\x6d\xda\x43\xde\x07\xe5\x36\xa1\x40\xbc\x25\xe5\xfc\x89\x26\xaf\x1e\x5e\x6f\xfa\x06\x94\x7c\x90\x53\x86\x9c\x89\xd7\xe0\x0c\x92\x26\x03\x96\x46\x61\x0e\x85\x02\x53\x6b\x81\xd6\x56\x42\x47\x19\xab\x7a\x70\x60\xca\x2c\x91\x02\x72\xf9\xc2\xa2\x70\xfb\x52\xf1\xd0\x8c\xc3\x6f\x6e\x29\x25\xd6\x13\xc7\xaa\x41\xdb\xbc\x30\xb7\x96\x96\xb8\x69\x5d\xfc\x86\x36\xae\x1c\x7d\xc4\x84\x33\x10\x38\xbd\x20\x87\x10\x0f\x53\x71\x9a\x66\x3e\x2e\x13\x1a\xa9\x48\x40\xf7\xe0\x7a\x1d\x3c\x1e\x66\x55\x16\x3a\x03\xc1\xa0\x05\xce\x41\x6b\x9a\x4d\x7b\xbe\x3d\x30\x5f\xa1\x66\xe0\x0d\x34\xb4\xde\x09\x37\xeb\xcc\x57\x67\x80\xcf\xc9\xf7\xe4\xda\x34\xce\x6a\x91\xd4\x8b\x55\xeb\x3c\xce\x88\xbb\x0b\xa8\x82\x5c\x5b\x77\xd4\x13\xef\x1e\xb4\xe4\x2b\x48\x3b\x11\xf7\xcb\xe1\x31\xf7\x1e\x5e\xd4\xeb\x10\x4a\x75\xd5\xc7\xc7\x57\x93\xa3\xfa\x1a\x92\x67\x8a\x63\x35\x9f\x5d\xf4\x3b\xa2\x9f\xbd\x51\x7e\x54\xdc\xc3\xeb\xd5\x67\x40\xf5\x8e\x3e\x28\x17\x66\x58\x0e\x76\x52\xdf\xbc\xa0\x0a\x37\x23\xec\x91\x66\xa1\xd6\x34\x03\x81\x8b\xee\x88\x73\xeb\x6b\xc5\x12\x94\x4a\x16\xfa\x50\xb6\x48\x11\x16\x6e\xa1\x5d\x6a\x69\x5c\x2f\xf0\x59\x05\x81\x0c\x37\x8b\x94\xe9\x82\xd3\xcd\x62\x60\x37\x75\xba\x71\xfb\xc8\xb9\x14\x0c\xa5\x21\x64\x81\x52\xf2\x91\x23\xd1\x99\x5d\xa5\x7e\x96\x2b\x50\x67\xd8\x3f\x7a\x50\xff\x7d\x3d\x9d\xa7\x9c\xc2\xab\xe9\x7c\xc5\xe4\x6f\xe9\x8f\x31\x79\xd8\xd3\x8d\x99\x29\xf6\x6e\x4e\x58\x0f\xfb\xe1\x35\x7d\xfc\x3b\x82\x85\x73\x91\x77\x8c\xbc\x36\x8b\x08\x1c\x32\x45\xf3\x3e\x2a\xff\xb7\xa4\xa4\x4c\x27\x52\xa5\x87\xbd\xb9\x14\x78\xd8\xee\xfb\xa5\xd8\xb5\x9f\xde\xb8\xba\x48\x17\x35\xcc\xb6\xe2\x09\xde\x2f\x8f\xfa\xa7\x79\xcc\x35\x02\xcd\xed\xe6\x9b\xe7\x54\x6d\x26\xd5\x69\x17\x6b\x7a\xc5\x7b\x48\xcd\x49\x40\x88\x4c\x5f\xc8\x28\xa1\xac\xe3\xb9\x4f\x2b\xd6\x86\x0e\xd5\xac\x27\xf8\x04\xf1\x56\x3f\x9c\x8f\x72\x1b\xeb\x42\x7a\x1f\xe9\x2f\x4c\xd1\xb3\x3c\x2e\x0e\x50\xe7\xac\xe3\xc2\xf9\xac\x7a\x8d\xe9\xe5\xaa\x50\x4c\x2a\x66\xde\x50\xaf\x9b\xb7\x9d\xef\xf6\x4b\xe4\xe6\x96\x44\xd1\xfe\x25\x68\x7f\xfe\xed\xdc\xad\xf1\x21\x84\x90\xca\x4f\xc3\x0a\xf6\x7e\x4c\xa4\xf0\xbe\x3f\x82\x27\xd1\xfe\x52\xe4\x78\xb0\x25\xb9\x82\x37\xcb\x31\x4a\x14\x43\x96\x50\x1e\xcd\x5b\xc3\x16\xbe\x4d\xeb\x96\x44\xbf\xb1\xec\xd9\xc5\x02\xae\xa1\x02\xa4\x22\xed\xa2\xae\xa9\x12\x4c\x64\xd1\x9c\x5c\x09\xb0\x80\x6a\x98\xf9\x89\x58\xbf\x43\xca\xca\x3c\x3c\x1a\x13\x4b\x69\x42\x99\xd5\x43\xa8\x93\x61\xee\xe4\xba\x13\x43\xa4\xad\x26\xf6\xef\xfa\x9b\x9a\x0d\xed\xb8\xb9\x3a\xb5\x85\xe1\xc5\x1e\xa5\xd6\x68\xc5\x02\x54\x3b\xbb\x72\x41\xea\x9d\x4f\xc1\xd3\x2a\x76\x95\x3c\xa5\xec\x01\xa9\x7b\xd5\x6e\x75\x4a\x26\xaf\x80\xee\xb1\xd1\xe4\x49\xd5\x03\x46\x39\xa3\x7a\xfa\xc1\xfb\x50\x7a\x9f\xfe\x5a\xd2\x03\x7c\xfc\x73\x49\x8f\xc3\xa9\x6f\x26\x7d\xc9\x7b\x1f\x4e\x9c\x49\x4f\x11\x41\xe5\x52\xe3\x65\xd4\x7b\x63\xe7\xdf\x00\x00\x00\xff\xff\xa7\x3a\x7d\xf7\xce\x20\x00\x00"), }, "/templates/email.tmpl": &vfsgen۰CompressedFileInfo{ name: "email.tmpl", diff --git a/vendor/github.com/prometheus/alertmanager/cluster/channel.go b/vendor/github.com/prometheus/alertmanager/cluster/channel.go index 923a0e6539e..4e392bd7e79 100644 --- a/vendor/github.com/prometheus/alertmanager/cluster/channel.go +++ b/vendor/github.com/prometheus/alertmanager/cluster/channel.go @@ -21,6 +21,7 @@ import ( "github.com/gogo/protobuf/proto" "github.com/hashicorp/memberlist" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/alertmanager/cluster/clusterpb" ) @@ -53,22 +54,25 @@ func NewChannel( stopc <-chan struct{}, reg prometheus.Registerer, ) *Channel { - oversizeGossipMessageFailureTotal := prometheus.NewCounter(prometheus.CounterOpts{ + if reg == nil { + return nil + } + oversizeGossipMessageFailureTotal := promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "alertmanager_oversized_gossip_message_failure_total", Help: "Number of oversized gossip message sends that failed.", ConstLabels: prometheus.Labels{"key": key}, }) - oversizeGossipMessageSentTotal := prometheus.NewCounter(prometheus.CounterOpts{ + oversizeGossipMessageSentTotal := promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "alertmanager_oversized_gossip_message_sent_total", Help: "Number of oversized gossip message sent.", ConstLabels: prometheus.Labels{"key": key}, }) - oversizeGossipMessageDroppedTotal := prometheus.NewCounter(prometheus.CounterOpts{ + oversizeGossipMessageDroppedTotal := promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "alertmanager_oversized_gossip_message_dropped_total", Help: "Number of oversized gossip messages that were dropped due to a full message queue.", ConstLabels: prometheus.Labels{"key": key}, }) - oversizeGossipDuration := prometheus.NewHistogram(prometheus.HistogramOpts{ + oversizeGossipDuration := promauto.With(reg).NewHistogram(prometheus.HistogramOpts{ Name: "alertmanager_oversize_gossip_message_duration_seconds", Help: "Duration of oversized gossip message requests.", ConstLabels: prometheus.Labels{"key": key}, @@ -78,8 +82,6 @@ func NewChannel( NativeHistogramMinResetDuration: 1 * time.Hour, }) - reg.MustRegister(oversizeGossipDuration, oversizeGossipMessageFailureTotal, oversizeGossipMessageDroppedTotal, oversizeGossipMessageSentTotal) - c := &Channel{ key: key, send: send, diff --git a/vendor/github.com/prometheus/alertmanager/cluster/cluster.go b/vendor/github.com/prometheus/alertmanager/cluster/cluster.go index 5b38bc00be8..418ddeab7ff 100644 --- a/vendor/github.com/prometheus/alertmanager/cluster/cluster.go +++ b/vendor/github.com/prometheus/alertmanager/cluster/cluster.go @@ -1,4 +1,4 @@ -// Copyright 2018 Prometheus Team +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -15,10 +15,10 @@ package cluster import ( "context" + "crypto/rand" "errors" "fmt" "log/slog" - "math/rand" "net" "sort" "strconv" @@ -27,8 +27,9 @@ import ( "time" "github.com/hashicorp/memberlist" - "github.com/oklog/ulid" + "github.com/oklog/ulid/v2" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" ) // ClusterPeer represents a single Peer in a gossip cluster. @@ -59,7 +60,8 @@ type Peer struct { mlist *memberlist.Memberlist delegate *delegate - resolvedPeers []string + resolvedPeers []string + resolvePeersTimeout time.Duration mtx sync.RWMutex states map[string]State @@ -116,15 +118,16 @@ func (s PeerStatus) String() string { } const ( - DefaultPushPullInterval = 60 * time.Second - DefaultGossipInterval = 200 * time.Millisecond - DefaultTCPTimeout = 10 * time.Second - DefaultProbeTimeout = 500 * time.Millisecond - DefaultProbeInterval = 1 * time.Second - DefaultReconnectInterval = 10 * time.Second - DefaultReconnectTimeout = 6 * time.Hour - DefaultRefreshInterval = 15 * time.Second - MaxGossipPacketSize = 1400 + DefaultPushPullInterval = 60 * time.Second + DefaultGossipInterval = 200 * time.Millisecond + DefaultTCPTimeout = 10 * time.Second + DefaultProbeTimeout = 500 * time.Millisecond + DefaultProbeInterval = 1 * time.Second + DefaultReconnectInterval = 10 * time.Second + DefaultReconnectTimeout = 6 * time.Hour + DefaultRefreshInterval = 15 * time.Second + DefaultResolvePeersTimeout = 15 * time.Second + MaxGossipPacketSize = 1400 ) func Create( @@ -137,11 +140,13 @@ func Create( pushPullInterval time.Duration, gossipInterval time.Duration, tcpTimeout time.Duration, + resolveTimeout time.Duration, probeTimeout time.Duration, probeInterval time.Duration, tlsTransportConfig *TLSTransportConfig, allowInsecureAdvertise bool, label string, + name string, ) (*Peer, error) { bindHost, bindPortStr, err := net.SplitHostPort(bindAddr) if err != nil { @@ -166,7 +171,9 @@ func Create( } } - resolvedPeers, err := resolvePeers(context.Background(), knownPeers, advertiseAddr, &net.Resolver{}, waitIfEmpty) + ctx, cancel := context.WithTimeout(context.Background(), resolveTimeout) + defer cancel() + resolvedPeers, err := resolvePeers(ctx, knownPeers, advertiseAddr, &net.Resolver{}, waitIfEmpty) if err != nil { return nil, fmt.Errorf("resolve peers: %w", err) } @@ -187,38 +194,40 @@ func Create( advertisePort = bindPort } - // TODO(fabxc): generate human-readable but random names? - name, err := ulid.New(ulid.Now(), rand.New(rand.NewSource(time.Now().UnixNano()))) - if err != nil { - return nil, err + // Generate a random name if none is provided. + if name == "" { + id, err := ulid.New(ulid.Now(), rand.Reader) + if err != nil { + return nil, err + } + name = id.String() } p := &Peer{ - states: map[string]State{}, - stopc: make(chan struct{}), - readyc: make(chan struct{}), - logger: l, - peers: map[string]peer{}, - resolvedPeers: resolvedPeers, - knownPeers: knownPeers, + states: map[string]State{}, + stopc: make(chan struct{}), + readyc: make(chan struct{}), + logger: l, + peers: map[string]peer{}, + resolvedPeers: resolvedPeers, + resolvePeersTimeout: resolveTimeout, + knownPeers: knownPeers, } - p.register(reg, name.String()) + p.register(reg, name) - retransmit := len(knownPeers) / 2 - if retransmit < 3 { - retransmit = 3 - } + retransmit := max(len(knownPeers)/2, 3) p.delegate = newDelegate(l, reg, p, retransmit) cfg := memberlist.DefaultLANConfig() - cfg.Name = name.String() + cfg.Name = name cfg.BindAddr = bindHost cfg.BindPort = bindPort cfg.Delegate = p.delegate cfg.Ping = p.delegate cfg.Alive = p.delegate cfg.Events = p.delegate + cfg.Conflict = p.delegate cfg.GossipInterval = gossipInterval cfg.PushPullInterval = pushPullInterval cfg.TCPTimeout = tcpTimeout @@ -333,7 +342,7 @@ func (p *Peer) setInitialFailed(peers []string, myAddr string) { } func (p *Peer) register(reg prometheus.Registerer, name string) { - peerInfo := prometheus.NewGauge( + peerInfo := promauto.With(reg).NewGauge( prometheus.GaugeOpts{ Name: "alertmanager_cluster_peer_info", Help: "A metric with a constant '1' value labeled by peer name.", @@ -341,7 +350,7 @@ func (p *Peer) register(reg prometheus.Registerer, name string) { }, ) peerInfo.Set(1) - clusterFailedPeers := prometheus.NewGaugeFunc(prometheus.GaugeOpts{ + promauto.With(reg).NewGaugeFunc(prometheus.GaugeOpts{ Name: "alertmanager_cluster_failed_peers", Help: "Number indicating the current number of failed peers in the cluster.", }, func() float64 { @@ -350,40 +359,37 @@ func (p *Peer) register(reg prometheus.Registerer, name string) { return float64(len(p.failedPeers)) }) - p.failedReconnectionsCounter = prometheus.NewCounter(prometheus.CounterOpts{ + p.failedReconnectionsCounter = promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "alertmanager_cluster_reconnections_failed_total", Help: "A counter of the number of failed cluster peer reconnection attempts.", }) - p.reconnectionsCounter = prometheus.NewCounter(prometheus.CounterOpts{ + p.reconnectionsCounter = promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "alertmanager_cluster_reconnections_total", Help: "A counter of the number of cluster peer reconnections.", }) - p.failedRefreshCounter = prometheus.NewCounter(prometheus.CounterOpts{ + p.failedRefreshCounter = promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "alertmanager_cluster_refresh_join_failed_total", Help: "A counter of the number of failed cluster peer joined attempts via refresh.", }) - p.refreshCounter = prometheus.NewCounter(prometheus.CounterOpts{ + p.refreshCounter = promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "alertmanager_cluster_refresh_join_total", Help: "A counter of the number of cluster peer joined via refresh.", }) - p.peerLeaveCounter = prometheus.NewCounter(prometheus.CounterOpts{ + p.peerLeaveCounter = promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "alertmanager_cluster_peers_left_total", Help: "A counter of the number of peers that have left.", }) - p.peerUpdateCounter = prometheus.NewCounter(prometheus.CounterOpts{ + p.peerUpdateCounter = promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "alertmanager_cluster_peers_update_total", Help: "A counter of the number of peers that have updated metadata.", }) - p.peerJoinCounter = prometheus.NewCounter(prometheus.CounterOpts{ + p.peerJoinCounter = promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "alertmanager_cluster_peers_joined_total", Help: "A counter of the number of peers that have joined.", }) - - reg.MustRegister(peerInfo, clusterFailedPeers, p.failedReconnectionsCounter, p.reconnectionsCounter, - p.peerLeaveCounter, p.peerUpdateCounter, p.peerJoinCounter, p.refreshCounter, p.failedRefreshCounter) } func (p *Peer) runPeriodicTask(d time.Duration, f func()) { @@ -442,7 +448,9 @@ func (p *Peer) reconnect() { func (p *Peer) refresh() { logger := p.logger.With("msg", "refresh") - resolvedPeers, err := resolvePeers(context.Background(), p.knownPeers, p.advertiseAddr, &net.Resolver{}, false) + ctx, cancel := context.WithTimeout(context.Background(), p.resolvePeersTimeout) + defer cancel() + resolvedPeers, err := resolvePeers(ctx, p.knownPeers, p.advertiseAddr, &net.Resolver{}, false) if err != nil { logger.Debug(fmt.Sprintf("%v", p.knownPeers), "err", err) return diff --git a/vendor/github.com/prometheus/alertmanager/cluster/delegate.go b/vendor/github.com/prometheus/alertmanager/cluster/delegate.go index 5353d54da67..624c206493c 100644 --- a/vendor/github.com/prometheus/alertmanager/cluster/delegate.go +++ b/vendor/github.com/prometheus/alertmanager/cluster/delegate.go @@ -1,4 +1,4 @@ -// Copyright 2018 Prometheus Team +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -20,6 +20,7 @@ import ( "github.com/gogo/protobuf/proto" "github.com/hashicorp/memberlist" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/alertmanager/cluster/clusterpb" ) @@ -46,6 +47,7 @@ type delegate struct { messagesPruned prometheus.Counter nodeAlive *prometheus.CounterVec nodePingDuration *prometheus.HistogramVec + conflictsCount prometheus.Counter } func newDelegate(l *slog.Logger, reg prometheus.Registerer, p *Peer, retransmit int) *delegate { @@ -53,56 +55,56 @@ func newDelegate(l *slog.Logger, reg prometheus.Registerer, p *Peer, retransmit NumNodes: p.ClusterSize, RetransmitMult: retransmit, } - messagesReceived := prometheus.NewCounterVec(prometheus.CounterOpts{ + messagesReceived := promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ Name: "alertmanager_cluster_messages_received_total", Help: "Total number of cluster messages received.", }, []string{"msg_type"}) - messagesReceivedSize := prometheus.NewCounterVec(prometheus.CounterOpts{ + messagesReceivedSize := promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ Name: "alertmanager_cluster_messages_received_size_total", Help: "Total size of cluster messages received.", }, []string{"msg_type"}) - messagesSent := prometheus.NewCounterVec(prometheus.CounterOpts{ + messagesSent := promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ Name: "alertmanager_cluster_messages_sent_total", Help: "Total number of cluster messages sent.", }, []string{"msg_type"}) - messagesSentSize := prometheus.NewCounterVec(prometheus.CounterOpts{ + messagesSentSize := promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ Name: "alertmanager_cluster_messages_sent_size_total", Help: "Total size of cluster messages sent.", }, []string{"msg_type"}) - messagesPruned := prometheus.NewCounter(prometheus.CounterOpts{ + messagesPruned := promauto.With(reg).NewCounter(prometheus.CounterOpts{ Name: "alertmanager_cluster_messages_pruned_total", Help: "Total number of cluster messages pruned.", }) - gossipClusterMembers := prometheus.NewGaugeFunc(prometheus.GaugeOpts{ + promauto.With(reg).NewGaugeFunc(prometheus.GaugeOpts{ Name: "alertmanager_cluster_members", Help: "Number indicating current number of members in cluster.", }, func() float64 { return float64(p.ClusterSize()) }) - peerPosition := prometheus.NewGaugeFunc(prometheus.GaugeOpts{ + promauto.With(reg).NewGaugeFunc(prometheus.GaugeOpts{ Name: "alertmanager_peer_position", Help: "Position the Alertmanager instance believes it's in. The position determines a peer's behavior in the cluster.", }, func() float64 { return float64(p.Position()) }) - healthScore := prometheus.NewGaugeFunc(prometheus.GaugeOpts{ + promauto.With(reg).NewGaugeFunc(prometheus.GaugeOpts{ Name: "alertmanager_cluster_health_score", Help: "Health score of the cluster. Lower values are better and zero means 'totally healthy'.", }, func() float64 { return float64(p.mlist.GetHealthScore()) }) - messagesQueued := prometheus.NewGaugeFunc(prometheus.GaugeOpts{ + promauto.With(reg).NewGaugeFunc(prometheus.GaugeOpts{ Name: "alertmanager_cluster_messages_queued", Help: "Number of cluster messages which are queued.", }, func() float64 { return float64(bcast.NumQueued()) }) - nodeAlive := prometheus.NewCounterVec(prometheus.CounterOpts{ + nodeAlive := promauto.With(reg).NewCounterVec(prometheus.CounterOpts{ Name: "alertmanager_cluster_alive_messages_total", Help: "Total number of received alive messages.", }, []string{"peer"}, ) - nodePingDuration := prometheus.NewHistogramVec(prometheus.HistogramOpts{ + nodePingDuration := promauto.With(reg).NewHistogramVec(prometheus.HistogramOpts{ Name: "alertmanager_cluster_pings_seconds", Help: "Histogram of latencies for ping messages.", Buckets: []float64{.005, .01, .025, .05, .1, .25, .5}, @@ -111,6 +113,10 @@ func newDelegate(l *slog.Logger, reg prometheus.Registerer, p *Peer, retransmit NativeHistogramMinResetDuration: 1 * time.Hour, }, []string{"peer"}, ) + conflictsCount := promauto.With(reg).NewCounter(prometheus.CounterOpts{ + Name: "alertmanager_cluster_peer_name_conflicts_total", + Help: "Total number of times memberlist has noticed conflicting peer names", + }) messagesReceived.WithLabelValues(fullState) messagesReceivedSize.WithLabelValues(fullState) @@ -121,11 +127,6 @@ func newDelegate(l *slog.Logger, reg prometheus.Registerer, p *Peer, retransmit messagesSent.WithLabelValues(update) messagesSentSize.WithLabelValues(update) - reg.MustRegister(messagesReceived, messagesReceivedSize, messagesSent, messagesSentSize, - gossipClusterMembers, peerPosition, healthScore, messagesQueued, messagesPruned, - nodeAlive, nodePingDuration, - ) - d := &delegate{ logger: l, Peer: p, @@ -137,6 +138,7 @@ func newDelegate(l *slog.Logger, reg prometheus.Registerer, p *Peer, retransmit messagesPruned: messagesPruned, nodeAlive: nodeAlive, nodePingDuration: nodePingDuration, + conflictsCount: conflictsCount, } go d.handleQueueDepth() @@ -173,6 +175,12 @@ func (d *delegate) NotifyMsg(b []byte) { } } +// NotifyConflict is the callback when memberlist encounters two nodes with the same ID. +func (d *delegate) NotifyConflict(existing, other *memberlist.Node) { + d.logger.Warn("Found conflicting peer IDs", "peer", existing.Name) + d.conflictsCount.Inc() +} + // GetBroadcasts is called when user data messages can be broadcasted. func (d *delegate) GetBroadcasts(overhead, limit int) [][]byte { msgs := d.bcast.GetBroadcasts(overhead, limit) diff --git a/vendor/github.com/prometheus/alertmanager/cluster/tls_transport.go b/vendor/github.com/prometheus/alertmanager/cluster/tls_transport.go index f7d4b13d1c2..2af3d9f9d44 100644 --- a/vendor/github.com/prometheus/alertmanager/cluster/tls_transport.go +++ b/vendor/github.com/prometheus/alertmanager/cluster/tls_transport.go @@ -30,6 +30,7 @@ import ( "github.com/hashicorp/go-sockaddr" "github.com/hashicorp/memberlist" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" common "github.com/prometheus/common/config" "github.com/prometheus/exporter-toolkit/web" ) @@ -76,6 +77,10 @@ func NewTLSTransport( bindPort int, cfg *TLSTransportConfig, ) (*TLSTransport, error) { + if reg == nil { + return nil, errors.New("missing Prometheus registry") + } + if cfg == nil { return nil, errors.New("must specify TLSTransportConfig") } @@ -289,7 +294,7 @@ func (t *TLSTransport) handle(conn net.Conn) { } func (t *TLSTransport) registerMetrics(reg prometheus.Registerer) { - t.packetsSent = prometheus.NewCounter( + t.packetsSent = promauto.With(reg).NewCounter( prometheus.CounterOpts{ Namespace: metricNamespace, Subsystem: metricSubsystem, @@ -297,7 +302,7 @@ func (t *TLSTransport) registerMetrics(reg prometheus.Registerer) { Help: "The number of packet bytes sent to outgoing connections (excluding internal metadata).", }, ) - t.packetsRcvd = prometheus.NewCounter( + t.packetsRcvd = promauto.With(reg).NewCounter( prometheus.CounterOpts{ Namespace: metricNamespace, Subsystem: metricSubsystem, @@ -305,7 +310,7 @@ func (t *TLSTransport) registerMetrics(reg prometheus.Registerer) { Help: "The number of packet bytes received from incoming connections (excluding internal metadata).", }, ) - t.streamsSent = prometheus.NewCounter( + t.streamsSent = promauto.With(reg).NewCounter( prometheus.CounterOpts{ Namespace: metricNamespace, Subsystem: metricSubsystem, @@ -314,7 +319,7 @@ func (t *TLSTransport) registerMetrics(reg prometheus.Registerer) { }, ) - t.streamsRcvd = prometheus.NewCounter( + t.streamsRcvd = promauto.With(reg).NewCounter( prometheus.CounterOpts{ Namespace: metricNamespace, Subsystem: metricSubsystem, @@ -322,7 +327,7 @@ func (t *TLSTransport) registerMetrics(reg prometheus.Registerer) { Help: "The number of stream connections received.", }, ) - t.readErrs = prometheus.NewCounter( + t.readErrs = promauto.With(reg).NewCounter( prometheus.CounterOpts{ Namespace: metricNamespace, Subsystem: metricSubsystem, @@ -330,7 +335,7 @@ func (t *TLSTransport) registerMetrics(reg prometheus.Registerer) { Help: "The number of errors encountered while reading from incoming connections.", }, ) - t.writeErrs = prometheus.NewCounterVec( + t.writeErrs = promauto.With(reg).NewCounterVec( prometheus.CounterOpts{ Namespace: metricNamespace, Subsystem: metricSubsystem, @@ -339,13 +344,4 @@ func (t *TLSTransport) registerMetrics(reg prometheus.Registerer) { }, []string{"connection_type"}, ) - - if reg != nil { - reg.MustRegister(t.packetsSent) - reg.MustRegister(t.packetsRcvd) - reg.MustRegister(t.streamsSent) - reg.MustRegister(t.streamsRcvd) - reg.MustRegister(t.readErrs) - reg.MustRegister(t.writeErrs) - } } diff --git a/vendor/github.com/prometheus/alertmanager/config/config.go b/vendor/github.com/prometheus/alertmanager/config/config.go index 09cd7138705..4f8d803e63c 100644 --- a/vendor/github.com/prometheus/alertmanager/config/config.go +++ b/vendor/github.com/prometheus/alertmanager/config/config.go @@ -1,4 +1,4 @@ -// Copyright 2015 Prometheus Team +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -298,6 +298,9 @@ func resolveFilepaths(baseDir string, cfg *Config) { for _, cfg := range receiver.RocketchatConfigs { cfg.HTTPConfig.SetDirectory(baseDir) } + for _, cfg := range receiver.MattermostConfigs { + cfg.HTTPConfig.SetDirectory(baseDir) + } } } @@ -348,6 +351,8 @@ type Config struct { MuteTimeIntervals []MuteTimeInterval `yaml:"mute_time_intervals,omitempty" json:"mute_time_intervals,omitempty"` TimeIntervals []TimeInterval `yaml:"time_intervals,omitempty" json:"time_intervals,omitempty"` + TracingConfig TracingConfig `yaml:"tracing,omitempty" json:"tracing,omitempty"` + // original is the input from which the config was parsed. original string } @@ -377,10 +382,23 @@ func (c *Config) UnmarshalYAML(unmarshal func(any) error) error { *c.Global = DefaultGlobalConfig() } + if c.Global.SlackAppToken != "" && len(c.Global.SlackAppTokenFile) > 0 { + return errors.New("at most one of slack_app_token & slack_app_token_file must be configured") + } + if c.Global.SlackAPIURL != nil && len(c.Global.SlackAPIURLFile) > 0 { return errors.New("at most one of slack_api_url & slack_api_url_file must be configured") } + if (c.Global.SlackAppToken != "" || len(c.Global.SlackAppTokenFile) > 0) && (c.Global.SlackAPIURL != nil || len(c.Global.SlackAPIURLFile) > 0) { + // Support transition from workaround suggested in https://github.com/prometheus/alertmanager/issues/2513, + // where users might set `slack_api_url` at the top level and then have `http_config` with individual + // bearer tokens in the receivers. + if c.Global.SlackAPIURL.String() != c.Global.SlackAppURL.String() { + return errors.New("at most one of slack_app_token/slack_app_token_file & slack_api_url/slack_api_url_file must be configured") + } + } + if c.Global.OpsGenieAPIKey != "" && len(c.Global.OpsGenieAPIKeyFile) > 0 { return errors.New("at most one of opsgenie_api_key & opsgenie_api_key_file must be configured") } @@ -450,16 +468,40 @@ func (c *Config) UnmarshalYAML(unmarshal func(any) error) error { } } for _, sc := range rcv.SlackConfigs { - if sc.HTTPConfig == nil { - sc.HTTPConfig = c.Global.HTTPConfig + if sc.AppURL == nil { + if c.Global.SlackAppURL == nil { + return errors.New("no global Slack App URL set") + } + sc.AppURL = c.Global.SlackAppURL + } + // we only want to set the app token from global if there's no local authorization or webhook url + if sc.AppToken == "" && len(sc.AppTokenFile) == 0 && (sc.HTTPConfig == nil || sc.HTTPConfig.Authorization == nil) && sc.APIURL == nil { + sc.AppToken = c.Global.SlackAppToken + sc.AppTokenFile = c.Global.SlackAppTokenFile } if sc.APIURL == nil && len(sc.APIURLFile) == 0 { - if c.Global.SlackAPIURL == nil && len(c.Global.SlackAPIURLFile) == 0 { - return errors.New("no global Slack API URL set either inline or in a file") - } sc.APIURL = c.Global.SlackAPIURL sc.APIURLFile = c.Global.SlackAPIURLFile } + if sc.APIURL == nil && len(sc.APIURLFile) == 0 && sc.AppToken == "" && len(sc.AppTokenFile) == 0 { + return errors.New("no Slack API URL nor App token set either inline or in a file") + } + if sc.HTTPConfig == nil { + // we don't want to change the global http config when setting the receiver's http config, do we do a copy + httpconfig := *c.Global.HTTPConfig + sc.HTTPConfig = &httpconfig + } + if sc.AppToken != "" || len(sc.AppTokenFile) != 0 { + if sc.HTTPConfig.Authorization != nil { + return errors.New("http authorization can't be set when using Slack App tokens") + } + sc.HTTPConfig.Authorization = &commoncfg.Authorization{ + Type: "Bearer", + Credentials: commoncfg.Secret(sc.AppToken), + CredentialsFile: sc.AppTokenFile, + } + sc.APIURL = (*SecretURL)(sc.AppURL) + } } for _, poc := range rcv.PushoverConfigs { if poc.HTTPConfig == nil { @@ -637,6 +679,11 @@ func (c *Config) UnmarshalYAML(unmarshal func(any) error) error { rocketchat.TokenFile = c.Global.RocketchatTokenFile } } + for _, mattermost := range rcv.MattermostConfigs { + if mattermost.HTTPConfig == nil { + mattermost.HTTPConfig = c.Global.HTTPConfig + } + } names[rcv.Name] = struct{}{} } @@ -741,6 +788,7 @@ func DefaultGlobalConfig() GlobalConfig { TelegramAPIUrl: mustParseURL("https://api.telegram.org"), WebexAPIURL: mustParseURL("https://webexapis.com/v1/messages"), RocketchatAPIURL: mustParseURL("https://open.rocket.chat/"), + SlackAppURL: mustParseURL("https://slack.com/api/chat.postMessage"), } } @@ -855,6 +903,9 @@ type GlobalConfig struct { SMTPTLSConfig *commoncfg.TLSConfig `yaml:"smtp_tls_config,omitempty" json:"smtp_tls_config,omitempty"` SlackAPIURL *SecretURL `yaml:"slack_api_url,omitempty" json:"slack_api_url,omitempty"` SlackAPIURLFile string `yaml:"slack_api_url_file,omitempty" json:"slack_api_url_file,omitempty"` + SlackAppToken Secret `yaml:"slack_app_token,omitempty" json:"slack_app_token,omitempty"` + SlackAppTokenFile string `yaml:"slack_app_token_file,omitempty" json:"slack_app_token_file,omitempty"` + SlackAppURL *URL `yaml:"slack_app_url,omitempty" json:"slack_app_url,omitempty"` PagerdutyURL *URL `yaml:"pagerduty_url,omitempty" json:"pagerduty_url,omitempty"` OpsGenieAPIURL *URL `yaml:"opsgenie_api_url,omitempty" json:"opsgenie_api_url,omitempty"` OpsGenieAPIKey Secret `yaml:"opsgenie_api_key,omitempty" json:"opsgenie_api_key,omitempty"` @@ -955,6 +1006,8 @@ func (r *Route) UnmarshalYAML(unmarshal func(any) error) error { // target labels if an alert matching the source labels exists. // Both alerts have to have a set of labels being equal. type InhibitRule struct { + // Name is an optional name for the inhibition rule. + Name string `yaml:"name,omitempty" json:"name,omitempty"` // SourceMatch defines a set of labels that have to equal the given // value for source alerts. Deprecated. Remove before v1.0 release. SourceMatch map[string]string `yaml:"source_match,omitempty" json:"source_match,omitempty"` @@ -1027,6 +1080,7 @@ type Receiver struct { MSTeamsV2Configs []*MSTeamsV2Config `yaml:"msteamsv2_configs,omitempty" json:"msteamsv2_configs,omitempty"` JiraConfigs []*JiraConfig `yaml:"jira_configs,omitempty" json:"jira_configs,omitempty"` RocketchatConfigs []*RocketchatConfig `yaml:"rocketchat_configs,omitempty" json:"rocketchat_configs,omitempty"` + MattermostConfigs []*MattermostConfig `yaml:"mattermost_configs,omitempty" json:"mattermost_configs,omitempty"` } // UnmarshalYAML implements the yaml.Unmarshaler interface for Receiver. diff --git a/vendor/github.com/prometheus/alertmanager/config/coordinator.go b/vendor/github.com/prometheus/alertmanager/config/coordinator.go index 68d1f0307ac..e9f3e21d8f4 100644 --- a/vendor/github.com/prometheus/alertmanager/config/coordinator.go +++ b/vendor/github.com/prometheus/alertmanager/config/coordinator.go @@ -20,6 +20,7 @@ import ( "sync" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" ) // Coordinator coordinates Alertmanager configurations beyond the lifetime of a @@ -53,21 +54,19 @@ func NewCoordinator(configFilePath string, r prometheus.Registerer, l *slog.Logg } func (c *Coordinator) registerMetrics(r prometheus.Registerer) { - configHash := prometheus.NewGauge(prometheus.GaugeOpts{ + configHash := promauto.With(r).NewGauge(prometheus.GaugeOpts{ Name: "alertmanager_config_hash", Help: "Hash of the currently loaded alertmanager configuration. Note that this is not a cryptographically strong hash.", }) - configSuccess := prometheus.NewGauge(prometheus.GaugeOpts{ + configSuccess := promauto.With(r).NewGauge(prometheus.GaugeOpts{ Name: "alertmanager_config_last_reload_successful", Help: "Whether the last configuration reload attempt was successful.", }) - configSuccessTime := prometheus.NewGauge(prometheus.GaugeOpts{ + configSuccessTime := promauto.With(r).NewGauge(prometheus.GaugeOpts{ Name: "alertmanager_config_last_reload_success_timestamp_seconds", Help: "Timestamp of the last successful configuration reload.", }) - r.MustRegister(configHash, configSuccess, configSuccessTime) - c.configHashMetric = configHash c.configSuccessMetric = configSuccess c.configSuccessTimeMetric = configSuccessTime diff --git a/vendor/github.com/prometheus/alertmanager/config/notifiers.go b/vendor/github.com/prometheus/alertmanager/config/notifiers.go index e8b7dcf28cb..bf7be0b28a5 100644 --- a/vendor/github.com/prometheus/alertmanager/config/notifiers.go +++ b/vendor/github.com/prometheus/alertmanager/config/notifiers.go @@ -72,9 +72,9 @@ var ( DefaultEmailSubject = `{{ template "email.default.subject" . }}` // DefaultPagerdutyDetails defines the default values for PagerDuty details. - DefaultPagerdutyDetails = map[string]string{ - "firing": `{{ template "pagerduty.default.instances" .Alerts.Firing }}`, - "resolved": `{{ template "pagerduty.default.instances" .Alerts.Resolved }}`, + DefaultPagerdutyDetails = map[string]any{ + "firing": `{{ .Alerts.Firing | toJson }}`, + "resolved": `{{ .Alerts.Resolved | toJson }}`, "num_firing": `{{ .Alerts.Firing | len }}`, "num_resolved": `{{ .Alerts.Resolved | len }}`, } @@ -206,10 +206,21 @@ var ( NotifierConfig: NotifierConfig{ VSendResolved: true, }, - APIType: "auto", - Summary: `{{ template "jira.default.summary" . }}`, - Description: `{{ template "jira.default.description" . }}`, - Priority: `{{ template "jira.default.priority" . }}`, + APIType: "auto", + Summary: JiraFieldConfig{ + Template: `{{ template "jira.default.summary" . }}`, + }, + Description: JiraFieldConfig{ + Template: `{{ template "jira.default.description" . }}`, + }, + Priority: `{{ template "jira.default.priority" . }}`, + } + + DefaultMattermostConfig = MattermostConfig{ + NotifierConfig: NotifierConfig{ + VSendResolved: true, + }, + Text: `{{ template "mattermost.default.text" . }}`, } ) @@ -304,6 +315,13 @@ type EmailConfig struct { Text string `yaml:"text,omitempty" json:"text,omitempty"` RequireTLS *bool `yaml:"require_tls,omitempty" json:"require_tls,omitempty"` TLSConfig *commoncfg.TLSConfig `yaml:"tls_config,omitempty" json:"tls_config,omitempty"` + Threading ThreadingConfig `yaml:"threading,omitempty" json:"threading,omitempty"` +} + +// ThreadingConfig configures mail threading. +type ThreadingConfig struct { + Enabled bool `yaml:"enabled,omitempty" json:"enabled,omitempty"` + ThreadByDate string `yaml:"thread_by_date,omitempty" json:"thread_by_date,omitempty"` } // UnmarshalYAML implements the yaml.Unmarshaler interface. @@ -327,6 +345,15 @@ func (c *EmailConfig) UnmarshalYAML(unmarshal func(any) error) error { } c.Headers = normalizedHeaders + if c.Threading.Enabled { + if _, ok := normalizedHeaders["References"]; ok { + return errors.New("conflicting configuration: threading.enabled conflicts with custom References header") + } + if _, ok := normalizedHeaders["In-Reply-To"]; ok { + return errors.New("conflicting configuration: threading.enabled conflicts with custom In-Reply-To header") + } + } + return nil } @@ -336,22 +363,25 @@ type PagerdutyConfig struct { HTTPConfig *commoncfg.HTTPClientConfig `yaml:"http_config,omitempty" json:"http_config,omitempty"` - ServiceKey Secret `yaml:"service_key,omitempty" json:"service_key,omitempty"` - ServiceKeyFile string `yaml:"service_key_file,omitempty" json:"service_key_file,omitempty"` - RoutingKey Secret `yaml:"routing_key,omitempty" json:"routing_key,omitempty"` - RoutingKeyFile string `yaml:"routing_key_file,omitempty" json:"routing_key_file,omitempty"` - URL *URL `yaml:"url,omitempty" json:"url,omitempty"` - Client string `yaml:"client,omitempty" json:"client,omitempty"` - ClientURL string `yaml:"client_url,omitempty" json:"client_url,omitempty"` - Description string `yaml:"description,omitempty" json:"description,omitempty"` - Details map[string]string `yaml:"details,omitempty" json:"details,omitempty"` - Images []PagerdutyImage `yaml:"images,omitempty" json:"images,omitempty"` - Links []PagerdutyLink `yaml:"links,omitempty" json:"links,omitempty"` - Source string `yaml:"source,omitempty" json:"source,omitempty"` - Severity string `yaml:"severity,omitempty" json:"severity,omitempty"` - Class string `yaml:"class,omitempty" json:"class,omitempty"` - Component string `yaml:"component,omitempty" json:"component,omitempty"` - Group string `yaml:"group,omitempty" json:"group,omitempty"` + ServiceKey Secret `yaml:"service_key,omitempty" json:"service_key,omitempty"` + ServiceKeyFile string `yaml:"service_key_file,omitempty" json:"service_key_file,omitempty"` + RoutingKey Secret `yaml:"routing_key,omitempty" json:"routing_key,omitempty"` + RoutingKeyFile string `yaml:"routing_key_file,omitempty" json:"routing_key_file,omitempty"` + URL *URL `yaml:"url,omitempty" json:"url,omitempty"` + Client string `yaml:"client,omitempty" json:"client,omitempty"` + ClientURL string `yaml:"client_url,omitempty" json:"client_url,omitempty"` + Description string `yaml:"description,omitempty" json:"description,omitempty"` + Details map[string]any `yaml:"details,omitempty" json:"details,omitempty"` + Images []PagerdutyImage `yaml:"images,omitempty" json:"images,omitempty"` + Links []PagerdutyLink `yaml:"links,omitempty" json:"links,omitempty"` + Source string `yaml:"source,omitempty" json:"source,omitempty"` + Severity string `yaml:"severity,omitempty" json:"severity,omitempty"` + Class string `yaml:"class,omitempty" json:"class,omitempty"` + Component string `yaml:"component,omitempty" json:"component,omitempty"` + Group string `yaml:"group,omitempty" json:"group,omitempty"` + // Timeout is the maximum time allowed to invoke the pagerduty. Setting this to 0 + // does not impose a timeout. + Timeout time.Duration `yaml:"timeout" json:"timeout"` } // PagerdutyLink is a link. @@ -384,7 +414,7 @@ func (c *PagerdutyConfig) UnmarshalYAML(unmarshal func(any) error) error { return errors.New("at most one of service_key & service_key_file must be configured") } if c.Details == nil { - c.Details = make(map[string]string) + c.Details = make(map[string]any) } if c.Source == "" { c.Source = c.Client @@ -488,8 +518,11 @@ type SlackConfig struct { HTTPConfig *commoncfg.HTTPClientConfig `yaml:"http_config,omitempty" json:"http_config,omitempty"` - APIURL *SecretURL `yaml:"api_url,omitempty" json:"api_url,omitempty"` - APIURLFile string `yaml:"api_url_file,omitempty" json:"api_url_file,omitempty"` + APIURL *SecretURL `yaml:"api_url,omitempty" json:"api_url,omitempty"` + APIURLFile string `yaml:"api_url_file,omitempty" json:"api_url_file,omitempty"` + AppToken Secret `yaml:"app_token,omitempty" json:"app_token,omitempty"` + AppTokenFile string `yaml:"app_token_file,omitempty" json:"app_token_file,omitempty"` + AppURL *URL `yaml:"app_url,omitempty" json:"app_url,omitempty"` // Slack channel override, (like #other-channel or @username). Channel string `yaml:"channel,omitempty" json:"channel,omitempty"` @@ -512,6 +545,9 @@ type SlackConfig struct { LinkNames bool `yaml:"link_names" json:"link_names,omitempty"` MrkdwnIn []string `yaml:"mrkdwn_in,omitempty" json:"mrkdwn_in,omitempty"` Actions []*SlackAction `yaml:"actions,omitempty" json:"actions,omitempty"` + // Timeout is the maximum time allowed to invoke the slack. Setting this to 0 + // does not impose a timeout. + Timeout time.Duration `yaml:"timeout" json:"timeout"` } // UnmarshalYAML implements the yaml.Unmarshaler interface. @@ -525,6 +561,12 @@ func (c *SlackConfig) UnmarshalYAML(unmarshal func(any) error) error { if c.APIURL != nil && len(c.APIURLFile) > 0 { return errors.New("at most one of api_url & api_url_file must be configured") } + if c.AppToken != "" && len(c.AppTokenFile) > 0 { + return errors.New("at most one of app_token & app_token_file must be configured") + } + if (c.APIURL != nil || len(c.APIURLFile) > 0) && (c.AppToken != "" || len(c.AppTokenFile) > 0) { + return errors.New("at most one of api_url/api_url_file & app_token/app_token_file must be configured") + } return nil } @@ -556,7 +598,7 @@ type IncidentioConfig struct { } // UnmarshalYAML implements the yaml.Unmarshaler interface. -func (c *IncidentioConfig) UnmarshalYAML(unmarshal func(interface{}) error) error { +func (c *IncidentioConfig) UnmarshalYAML(unmarshal func(any) error) error { *c = DefaultIncidentioConfig type plain IncidentioConfig if err := unmarshal((*plain)(c)); err != nil { @@ -956,6 +998,13 @@ func (c *MSTeamsV2Config) UnmarshalYAML(unmarshal func(any) error) error { return nil } +type JiraFieldConfig struct { + // Template is the template string used to render the field. + Template string `yaml:"template,omitempty" json:"template,omitempty"` + // EnableUpdate indicates whether this field should be omitted when updating an existing issue. + EnableUpdate *bool `yaml:"enable_update,omitempty" json:"enable_update,omitempty"` +} + type JiraConfig struct { NotifierConfig `yaml:",inline" json:",inline"` HTTPConfig *commoncfg.HTTPClientConfig `yaml:"http_config,omitempty" json:"http_config,omitempty"` @@ -963,12 +1012,12 @@ type JiraConfig struct { APIURL *URL `yaml:"api_url,omitempty" json:"api_url,omitempty"` APIType string `yaml:"api_type,omitempty" json:"api_type,omitempty"` - Project string `yaml:"project,omitempty" json:"project,omitempty"` - Summary string `yaml:"summary,omitempty" json:"summary,omitempty"` - Description string `yaml:"description,omitempty" json:"description,omitempty"` - Labels []string `yaml:"labels,omitempty" json:"labels,omitempty"` - Priority string `yaml:"priority,omitempty" json:"priority,omitempty"` - IssueType string `yaml:"issue_type,omitempty" json:"issue_type,omitempty"` + Project string `yaml:"project,omitempty" json:"project,omitempty"` + Summary JiraFieldConfig `yaml:"summary,omitempty" json:"summary,omitempty"` + Description JiraFieldConfig `yaml:"description,omitempty" json:"description,omitempty"` + Labels []string `yaml:"labels,omitempty" json:"labels,omitempty"` + Priority string `yaml:"priority,omitempty" json:"priority,omitempty"` + IssueType string `yaml:"issue_type,omitempty" json:"issue_type,omitempty"` ReopenTransition string `yaml:"reopen_transition,omitempty" json:"reopen_transition,omitempty"` ResolveTransition string `yaml:"resolve_transition,omitempty" json:"resolve_transition,omitempty"` @@ -978,6 +1027,28 @@ type JiraConfig struct { Fields map[string]any `yaml:"fields,omitempty" json:"custom_fields,omitempty"` } +func (f *JiraFieldConfig) EnableUpdateValue() bool { + if f.EnableUpdate == nil { + return true + } + return *f.EnableUpdate +} + +// Supports both the legacy string and the new object form. +func (f *JiraFieldConfig) UnmarshalYAML(unmarshal func(any) error) error { + // Try simple string first (backward compatibility). + var s string + if err := unmarshal(&s); err == nil { + f.Template = s + // DisableUpdate stays false by default. + return nil + } + + // Fallback to full object form. + type plain JiraFieldConfig + return unmarshal((*plain)(f)) +} + func (c *JiraConfig) UnmarshalYAML(unmarshal func(any) error) error { *c = DefaultJiraConfig type plain JiraConfig @@ -1066,3 +1137,98 @@ func (c *RocketchatConfig) UnmarshalYAML(unmarshal func(any) error) error { } return nil } + +// MattermostPriority defines the priority for a mattermost notification. +type MattermostPriority struct { + Priority string `yaml:"priority,omitempty" json:"priority,omitempty"` + RequestedAck bool `yaml:"requested_ack,omitempty" json:"requested_ack,omitempty"` + PersistentNotifications bool `yaml:"persistent_notifications,omitempty" json:"persistent_notifications,omitempty"` +} + +// MattermostProps defines additional properties for a mattermost notification. +// Only 'card' property takes effect now. +type MattermostProps struct { + Card string `yaml:"card,omitempty" json:"card,omitempty"` +} + +// MattermostField configures a single Mattermost field for Slack compatibility. +// See https://developers.mattermost.com/integrate/reference/message-attachments/#fields for more information. +type MattermostField struct { + Title string `yaml:"title,omitempty" json:"title,omitempty"` + Value string `yaml:"value,omitempty" json:"value,omitempty"` + Short *bool `yaml:"short,omitempty" json:"short,omitempty"` +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface for MattermostField. +func (c *MattermostField) UnmarshalYAML(unmarshal func(any) error) error { + type plain MattermostField + if err := unmarshal((*plain)(c)); err != nil { + return err + } + if c.Title == "" { + return errors.New("missing title in Mattermost field configuration") + } + if c.Value == "" { + return errors.New("missing value in Mattermost field configuration") + } + return nil +} + +// MattermostAttachment defines an attachment for a Mattermost notification. +// See https://developers.mattermost.com/integrate/reference/message-attachments/#fields for more information. +type MattermostAttachment struct { + Fallback string `yaml:"fallback,omitempty" json:"fallback,omitempty"` + Color string `yaml:"color,omitempty" json:"color,omitempty"` + Pretext string `yaml:"pretext,omitempty" json:"pretext,omitempty"` + Text string `yaml:"text,omitempty" json:"text,omitempty"` + AuthorName string `yaml:"author_name,omitempty" json:"author_name,omitempty"` + AuthorLink string `yaml:"author_link,omitempty" json:"author_link,omitempty"` + AuthorIcon string `yaml:"author_icon,omitempty" json:"author_icon,omitempty"` + Title string `yaml:"title,omitempty" json:"title,omitempty"` + TitleLink string `yaml:"title_link,omitempty" json:"title_link,omitempty"` + Fields []*MattermostField `yaml:"fields,omitempty" json:"fields,omitempty"` + ThumbURL string `yaml:"thumb_url,omitempty" json:"thumb_url,omitempty"` + Footer string `yaml:"footer,omitempty" json:"footer,omitempty"` + FooterIcon string `yaml:"footer_icon,omitempty" json:"footer_icon,omitempty"` + ImageURL string `yaml:"image_url,omitempty" json:"image_url,omitempty"` +} + +// MattermostConfig configures notifications via Mattermost. +// See https://developers.mattermost.com/integrate/webhooks/incoming/ for more information. +type MattermostConfig struct { + NotifierConfig `yaml:",inline" json:",inline"` + + HTTPConfig *commoncfg.HTTPClientConfig `yaml:"http_config,omitempty" json:"http_config,omitempty"` + WebhookURL *SecretURL `yaml:"webhook_url,omitempty" json:"webhook_url,omitempty"` + WebhookURLFile string `yaml:"webhook_url_file,omitempty" json:"webhook_url_file,omitempty"` + + Channel string `yaml:"channel,omitempty" json:"channel,omitempty"` + Username string `yaml:"username,omitempty" json:"username,omitempty"` + + Text string `yaml:"text,omitempty" json:"text,omitempty"` + IconURL string `yaml:"icon_url,omitempty" json:"icon_url,omitempty"` + IconEmoji string `yaml:"icon_emoji,omitempty" json:"icon_emoji,omitempty"` + Attachments []*MattermostAttachment `yaml:"attachments,omitempty" json:"attachments,omitempty"` + Type string `yaml:"type,omitempty" json:"type,omitempty"` + Props *MattermostProps `yaml:"props,omitempty" json:"props,omitempty"` + Priority *MattermostPriority `yaml:"priority,omitempty" json:"priority,omitempty"` +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface. +func (c *MattermostConfig) UnmarshalYAML(unmarshal func(any) error) error { + *c = DefaultMattermostConfig + type plain MattermostConfig + if err := unmarshal((*plain)(c)); err != nil { + return err + } + + if c.WebhookURL == nil && c.WebhookURLFile == "" { + return errors.New("one of webhook_url or webhook_url_file must be configured") + } + + if c.WebhookURL != nil && len(c.WebhookURLFile) > 0 { + return errors.New("at most one of webhook_url & webhook_url_file must be configured") + } + + return nil +} diff --git a/vendor/github.com/prometheus/alertmanager/config/tracing.go b/vendor/github.com/prometheus/alertmanager/config/tracing.go new file mode 100644 index 00000000000..b88d926070f --- /dev/null +++ b/vendor/github.com/prometheus/alertmanager/config/tracing.go @@ -0,0 +1,92 @@ +// Copyright The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package config + +import ( + "errors" + "fmt" + + commoncfg "github.com/prometheus/common/config" + "github.com/prometheus/common/model" +) + +// TODO: probably move these into prometheus/common since they're copied from +// prometheus/prometheus? + +type TracingClientType string + +const ( + TracingClientHTTP TracingClientType = "http" + TracingClientGRPC TracingClientType = "grpc" + + GzipCompression = "gzip" +) + +// UnmarshalYAML implements the yaml.Unmarshaler interface. +func (t *TracingClientType) UnmarshalYAML(unmarshal func(any) error) error { + *t = TracingClientType("") + type plain TracingClientType + if err := unmarshal((*plain)(t)); err != nil { + return err + } + + switch *t { + case TracingClientHTTP, TracingClientGRPC: + return nil + default: + return fmt.Errorf("expected tracing client type to be to be %s or %s, but got %s", + TracingClientHTTP, TracingClientGRPC, *t, + ) + } +} + +// TracingConfig configures the tracing options. +type TracingConfig struct { + ClientType TracingClientType `yaml:"client_type,omitempty"` + Endpoint string `yaml:"endpoint,omitempty"` + SamplingFraction float64 `yaml:"sampling_fraction,omitempty"` + Insecure bool `yaml:"insecure,omitempty"` + TLSConfig *commoncfg.TLSConfig `yaml:"tls_config,omitempty"` + Headers *commoncfg.Headers `yaml:"headers,omitempty"` + Compression string `yaml:"compression,omitempty"` + Timeout model.Duration `yaml:"timeout,omitempty"` +} + +// SetDirectory joins any relative file paths with dir. +func (t *TracingConfig) SetDirectory(dir string) { + t.TLSConfig.SetDirectory(dir) + t.Headers.SetDirectory(dir) +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface. +func (t *TracingConfig) UnmarshalYAML(unmarshal func(any) error) error { + *t = TracingConfig{ + ClientType: TracingClientGRPC, + } + type plain TracingConfig + if err := unmarshal((*plain)(t)); err != nil { + return err + } + + if t.Endpoint == "" { + return errors.New("tracing endpoint must be set") + } + + if t.Compression != "" && t.Compression != GzipCompression { + return fmt.Errorf("invalid compression type %s provided, valid options: %s", + t.Compression, GzipCompression) + } + + return nil +} diff --git a/vendor/github.com/prometheus/alertmanager/dispatch/dispatch.go b/vendor/github.com/prometheus/alertmanager/dispatch/dispatch.go index 973f084a436..1e11e934678 100644 --- a/vendor/github.com/prometheus/alertmanager/dispatch/dispatch.go +++ b/vendor/github.com/prometheus/alertmanager/dispatch/dispatch.go @@ -1,4 +1,4 @@ -// Copyright 2018 Prometheus Team +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -18,12 +18,20 @@ import ( "errors" "fmt" "log/slog" + "maps" "sort" "sync" + "sync/atomic" "time" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/common/model" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/propagation" + "go.opentelemetry.io/otel/trace" "github.com/prometheus/alertmanager/notify" "github.com/prometheus/alertmanager/provider" @@ -31,6 +39,14 @@ import ( "github.com/prometheus/alertmanager/types" ) +const ( + DispatcherStateUnknown = iota + DispatcherStateWaitingToStart + DispatcherStateRunning +) + +var tracer = otel.Tracer("github.com/prometheus/alertmanager/dispatch") + // DispatcherMetrics represents metrics associated to a dispatcher. type DispatcherMetrics struct { aggrGroups prometheus.Gauge @@ -40,20 +56,23 @@ type DispatcherMetrics struct { // NewDispatcherMetrics returns a new registered DispatchMetrics. func NewDispatcherMetrics(registerLimitMetrics bool, r prometheus.Registerer) *DispatcherMetrics { + if r == nil { + return nil + } m := DispatcherMetrics{ - aggrGroups: prometheus.NewGauge( + aggrGroups: promauto.With(r).NewGauge( prometheus.GaugeOpts{ Name: "alertmanager_dispatcher_aggregation_groups", Help: "Number of active aggregation groups", }, ), - processingDuration: prometheus.NewSummary( + processingDuration: promauto.With(r).NewSummary( prometheus.SummaryOpts{ Name: "alertmanager_dispatcher_alert_processing_duration_seconds", Help: "Summary of latencies for the processing of alerts.", }, ), - aggrGroupLimitReached: prometheus.NewCounter( + aggrGroupLimitReached: promauto.With(r).NewCounter( prometheus.CounterOpts{ Name: "alertmanager_dispatcher_aggregation_group_limit_reached_total", Help: "Number of times when dispatcher failed to create new aggregation group due to limit.", @@ -61,29 +80,24 @@ func NewDispatcherMetrics(registerLimitMetrics bool, r prometheus.Registerer) *D ), } - if r != nil { - r.MustRegister(m.aggrGroups, m.processingDuration) - if registerLimitMetrics { - r.MustRegister(m.aggrGroupLimitReached) - } - } - return &m } // Dispatcher sorts incoming alerts into aggregation groups and // assigns the correct notifiers to each. type Dispatcher struct { - route *Route - alerts provider.Alerts - stage notify.Stage - marker types.GroupMarker - metrics *DispatcherMetrics - limits Limits + route *Route + alerts provider.Alerts + stage notify.Stage + marker types.GroupMarker + metrics *DispatcherMetrics + limits Limits + propagator propagation.TextMapPropagator timeout func(time.Duration) time.Duration mtx sync.RWMutex + loadingFinished sync.WaitGroup aggrGroupsPerRoute map[*Route]map[model.Fingerprint]*aggrGroup aggrGroupsNum int @@ -93,6 +107,9 @@ type Dispatcher struct { cancel func() logger *slog.Logger + + startTimer *time.Timer + state int } // Limits describes limits used by Dispatcher. @@ -105,46 +122,59 @@ type Limits interface { // NewDispatcher returns a new Dispatcher. func NewDispatcher( - ap provider.Alerts, - r *Route, - s notify.Stage, - mk types.GroupMarker, - to func(time.Duration) time.Duration, - mi time.Duration, - lim Limits, - l *slog.Logger, - m *DispatcherMetrics, + alerts provider.Alerts, + route *Route, + stage notify.Stage, + marker types.GroupMarker, + timeout func(time.Duration) time.Duration, + maintenanceInterval time.Duration, + limits Limits, + logger *slog.Logger, + metrics *DispatcherMetrics, ) *Dispatcher { - if lim == nil { - lim = nilLimits{} + if limits == nil { + limits = nilLimits{} } disp := &Dispatcher{ - alerts: ap, - stage: s, - route: r, - marker: mk, - timeout: to, - maintenanceInterval: mi, - logger: l.With("component", "dispatcher"), - metrics: m, - limits: lim, + alerts: alerts, + stage: stage, + route: route, + marker: marker, + timeout: timeout, + maintenanceInterval: maintenanceInterval, + logger: logger.With("component", "dispatcher"), + metrics: metrics, + limits: limits, + propagator: otel.GetTextMapPropagator(), + state: DispatcherStateUnknown, } + disp.loadingFinished.Add(1) return disp } // Run starts dispatching alerts incoming via the updates channel. -func (d *Dispatcher) Run() { +func (d *Dispatcher) Run(dispatchStartTime time.Time) { d.done = make(chan struct{}) d.mtx.Lock() + d.logger.Debug("preparing to start", "startTime", dispatchStartTime) + d.startTimer = time.NewTimer(time.Until(dispatchStartTime)) + d.state = DispatcherStateWaitingToStart + d.logger.Debug("setting state", "state", "waiting_to_start") d.aggrGroupsPerRoute = map[*Route]map[model.Fingerprint]*aggrGroup{} d.aggrGroupsNum = 0 d.metrics.aggrGroups.Set(0) d.ctx, d.cancel = context.WithCancel(context.Background()) d.mtx.Unlock() - d.run(d.alerts.Subscribe()) + initalAlerts, it := d.alerts.SlurpAndSubscribe("dispatcher") + for _, alert := range initalAlerts { + d.routeAlert(d.ctx, alert) + } + d.loadingFinished.Done() + + d.run(it) close(d.done) } @@ -165,19 +195,30 @@ func (d *Dispatcher) run(it provider.AlertIterator) { return } - d.logger.Debug("Received alert", "alert", alert) - // Log errors but keep trying. if err := it.Err(); err != nil { d.logger.Error("Error on alert update", "err", err) continue } - now := time.Now() - for _, r := range d.route.Match(alert.Labels) { - d.processAlert(alert, r) + ctx := d.ctx + if alert.Header != nil { + ctx = d.propagator.Extract(ctx, propagation.MapCarrier(alert.Header)) + } + + d.routeAlert(ctx, alert.Data) + + case <-d.startTimer.C: + if d.state == DispatcherStateWaitingToStart { + d.state = DispatcherStateRunning + d.logger.Debug("started", "state", "running") + d.logger.Debug("Starting all existing aggregation groups") + for _, groups := range d.aggrGroupsPerRoute { + for _, ag := range groups { + d.runAG(ag) + } + } } - d.metrics.processingDuration.Observe(time.Since(now).Seconds()) case <-maintenance.C: d.doMaintenance() @@ -187,6 +228,30 @@ func (d *Dispatcher) run(it provider.AlertIterator) { } } +func (d *Dispatcher) routeAlert(ctx context.Context, alert *types.Alert) { + d.logger.Debug("Received alert", "alert", alert) + + ctx, span := tracer.Start(ctx, "dispatch.Dispatcher.routeAlert", + trace.WithAttributes( + attribute.String("alerting.alert.name", alert.Name()), + attribute.String("alerting.alert.fingerprint", alert.Fingerprint().String()), + ), + trace.WithSpanKind(trace.SpanKindInternal), + ) + defer span.End() + + now := time.Now() + for _, r := range d.route.Match(alert.Labels) { + span.AddEvent("dispatching alert to route", + trace.WithAttributes( + attribute.String("alerting.route.receiver.name", r.RouteOpts.Receiver), + ), + ) + d.groupAlert(ctx, alert, r) + } + d.metrics.processingDuration.Observe(time.Since(now).Seconds()) +} + func (d *Dispatcher) doMaintenance() { d.mtx.Lock() defer d.mtx.Unlock() @@ -203,6 +268,20 @@ func (d *Dispatcher) doMaintenance() { } } +func (d *Dispatcher) WaitForLoading() { + d.loadingFinished.Wait() +} + +func (d *Dispatcher) LoadingDone() <-chan struct{} { + doneChan := make(chan struct{}) + go func() { + d.WaitForLoading() + close(doneChan) + }() + + return doneChan +} + // AlertGroup represents how alerts exist within an aggrGroup. type AlertGroup struct { Alerts types.AlertSlice @@ -224,11 +303,31 @@ func (ag AlertGroups) Less(i, j int) bool { func (ag AlertGroups) Len() int { return len(ag) } // Groups returns a slice of AlertGroups from the dispatcher's internal state. -func (d *Dispatcher) Groups(routeFilter func(*Route) bool, alertFilter func(*types.Alert, time.Time) bool) (AlertGroups, map[model.Fingerprint][]string) { +func (d *Dispatcher) Groups(ctx context.Context, routeFilter func(*Route) bool, alertFilter func(*types.Alert, time.Time) bool) (AlertGroups, map[model.Fingerprint][]string, error) { + select { + case <-ctx.Done(): + return nil, nil, ctx.Err() + case <-d.LoadingDone(): + } + d.WaitForLoading() groups := AlertGroups{} + // Make a snapshot of the aggrGroupsPerRoute map to use for this function. + // This ensures that we hold the Dispatcher.mtx for as little time as + // possible. + // It also prevents us from holding the any locks in alertFilter or routeFilter + // while we hold the dispatcher lock d.mtx.RLock() - defer d.mtx.RUnlock() + aggrGroupsPerRoute := map[*Route]map[model.Fingerprint]*aggrGroup{} + for route, ags := range d.aggrGroupsPerRoute { + // Since other goroutines could modify d.aggrGroupsPerRoute, we need to + // copy it. We DON'T need to copy the aggrGroup objects because they each + // have a mutex protecting their internal state. + // The aggrGroup methods use the internal lock. It is important to avoid + // accessing internal fields on the aggrGroup objects. + aggrGroupsPerRoute[route] = maps.Clone(ags) + } + d.mtx.RUnlock() // Keep a list of receivers for an alert to prevent checking each alert // again against all routes. The alert has already matched against this @@ -236,7 +335,7 @@ func (d *Dispatcher) Groups(routeFilter func(*Route) bool, alertFilter func(*typ receivers := map[model.Fingerprint][]string{} now := time.Now() - for route, ags := range d.aggrGroupsPerRoute { + for route, ags := range aggrGroupsPerRoute { if !routeFilter(route) { continue } @@ -286,7 +385,7 @@ func (d *Dispatcher) Groups(routeFilter func(*Route) bool, alertFilter func(*typ sort.Strings(receivers[i]) } - return groups, receivers + return groups, receivers, nil } // Stop the dispatcher. @@ -308,12 +407,23 @@ func (d *Dispatcher) Stop() { // notifyFunc is a function that performs notification for the alert // with the given fingerprint. It aborts on context cancelation. -// Returns false iff notifying failed. +// Returns false if notifying failed. type notifyFunc func(context.Context, ...*types.Alert) bool -// processAlert determines in which aggregation group the alert falls +// groupAlert determines in which aggregation group the alert falls // and inserts it. -func (d *Dispatcher) processAlert(alert *types.Alert, route *Route) { +func (d *Dispatcher) groupAlert(ctx context.Context, alert *types.Alert, route *Route) { + _, span := tracer.Start(ctx, "dispatch.Dispatcher.groupAlert", + trace.WithAttributes( + attribute.String("alerting.alert.name", alert.Name()), + attribute.String("alerting.alert.fingerprint", alert.Fingerprint().String()), + attribute.String("alerting.route.receiver.name", route.RouteOpts.Receiver), + ), + trace.WithSpanKind(trace.SpanKindInternal), + ) + defer span.End() + + now := time.Now() groupLabels := getGroupLabels(alert, route) fp := groupLabels.Fingerprint() @@ -329,31 +439,73 @@ func (d *Dispatcher) processAlert(alert *types.Alert, route *Route) { ag, ok := routeGroups[fp] if ok { - ag.insert(alert) + ag.insert(ctx, alert) return } // If the group does not exist, create it. But check the limit first. if limit := d.limits.MaxNumberOfAggregationGroups(); limit > 0 && d.aggrGroupsNum >= limit { d.metrics.aggrGroupLimitReached.Inc() - d.logger.Error("Too many aggregation groups, cannot create new group for alert", "groups", d.aggrGroupsNum, "limit", limit, "alert", alert.Name()) + err := errors.New("too many aggregation groups, cannot create new group for alert") + message := "Failed to create aggregation group" + d.logger.Error(message, "err", err.Error(), "groups", d.aggrGroupsNum, "limit", limit, "alert", alert.Name()) + span.SetStatus(codes.Error, message) + span.RecordError(err, + trace.WithAttributes( + attribute.Int("alerting.aggregation_group.count", d.aggrGroupsNum), + attribute.Int("alerting.aggregation_group.limit", limit), + ), + ) return } - ag = newAggrGroup(d.ctx, groupLabels, route, d.timeout, d.logger) + ag = newAggrGroup(d.ctx, groupLabels, route, d.timeout, d.marker.(types.AlertMarker), d.logger) routeGroups[fp] = ag d.aggrGroupsNum++ d.metrics.aggrGroups.Inc() + span.AddEvent("new AggregationGroup created", + trace.WithAttributes( + attribute.String("alerting.aggregation_group.key", ag.GroupKey()), + attribute.Int("alerting.aggregation_group.count", d.aggrGroupsNum), + ), + ) // Insert the 1st alert in the group before starting the group's run() // function, to make sure that when the run() will be executed the 1st // alert is already there. - ag.insert(alert) + ag.insert(ctx, alert) + + if alert.StartsAt.Add(ag.opts.GroupWait).Before(now) { + message := "Alert is old enough for immediate flush, resetting timer to zero" + ag.logger.Debug(message, "alert", alert.Name(), "fingerprint", alert.Fingerprint(), "startsAt", alert.StartsAt) + span.AddEvent(message, + trace.WithAttributes( + attribute.String("alerting.alert.StartsAt", alert.StartsAt.Format(time.RFC3339)), + ), + ) + ag.resetTimer(0) + } + // Check dispatcher and alert state to determine if we should run the AG now. + switch d.state { + case DispatcherStateWaitingToStart: + span.AddEvent("Not starting Aggregation Group, dispatcher is not running") + d.logger.Debug("Dispatcher still waiting to start") + case DispatcherStateRunning: + span.AddEvent("Starting Aggregation Group") + d.runAG(ag) + default: + d.logger.Warn("unknown state detected", "state", "unknown") + } +} +func (d *Dispatcher) runAG(ag *aggrGroup) { + if ag.running.Load() { + return + } go ag.run(func(ctx context.Context, alerts ...*types.Alert) bool { _, _, err := d.stage.Exec(ctx, d.logger, alerts...) if err != nil { - logger := d.logger.With("num_alerts", len(alerts), "err", err) + logger := d.logger.With("aggrGroup", ag.GroupKey(), "num_alerts", len(alerts), "err", err) if errors.Is(ctx.Err(), context.Canceled) { // It is expected for the context to be canceled on // configuration reload or shutdown. In this case, the @@ -389,18 +541,24 @@ type aggrGroup struct { routeKey string alerts *store.Alerts + marker types.AlertMarker ctx context.Context cancel func() done chan struct{} next *time.Timer timeout func(time.Duration) time.Duration - - mtx sync.RWMutex - hasFlushed bool + running atomic.Bool } // newAggrGroup returns a new aggregation group. -func newAggrGroup(ctx context.Context, labels model.LabelSet, r *Route, to func(time.Duration) time.Duration, logger *slog.Logger) *aggrGroup { +func newAggrGroup( + ctx context.Context, + labels model.LabelSet, + r *Route, + to func(time.Duration) time.Duration, + marker types.AlertMarker, + logger *slog.Logger, +) *aggrGroup { if to == nil { to = func(d time.Duration) time.Duration { return d } } @@ -411,6 +569,7 @@ func newAggrGroup(ctx context.Context, labels model.LabelSet, r *Route, to func( opts: &r.RouteOpts, timeout: to, alerts: store.NewAlerts(), + marker: marker, done: make(chan struct{}), } ag.ctx, ag.cancel = context.WithCancel(ctx) @@ -437,6 +596,7 @@ func (ag *aggrGroup) String() string { } func (ag *aggrGroup) run(nf notifyFunc) { + ag.running.Store(true) defer close(ag.done) defer ag.next.Stop() @@ -463,13 +623,23 @@ func (ag *aggrGroup) run(nf notifyFunc) { ctx = notify.WithRouteID(ctx, ag.routeID) // Wait the configured interval before calling flush again. - ag.mtx.Lock() - ag.next.Reset(ag.opts.GroupInterval) - ag.hasFlushed = true - ag.mtx.Unlock() + ag.resetTimer(ag.opts.GroupInterval) ag.flush(func(alerts ...*types.Alert) bool { - return nf(ctx, alerts...) + ctx, span := tracer.Start(ctx, "dispatch.AggregationGroup.flush", + trace.WithAttributes( + attribute.String("alerting.aggregation_group.key", ag.GroupKey()), + attribute.Int("alerting.alerts.count", len(alerts)), + ), + trace.WithSpanKind(trace.SpanKindInternal), + ) + defer span.End() + + success := nf(ctx, alerts...) + if !success { + span.SetStatus(codes.Error, "notification failed") + } + return success }) cancel() @@ -487,18 +657,27 @@ func (ag *aggrGroup) stop() { <-ag.done } +// resetTimer resets the timer for the AG. +func (ag *aggrGroup) resetTimer(t time.Duration) { + ag.next.Reset(t) +} + // insert inserts the alert into the aggregation group. -func (ag *aggrGroup) insert(alert *types.Alert) { +func (ag *aggrGroup) insert(ctx context.Context, alert *types.Alert) { + _, span := tracer.Start(ctx, "dispatch.AggregationGroup.insert", + trace.WithAttributes( + attribute.String("alerting.alert.name", alert.Name()), + attribute.String("alerting.alert.fingerprint", alert.Fingerprint().String()), + attribute.String("alerting.aggregation_group.key", ag.GroupKey()), + ), + trace.WithSpanKind(trace.SpanKindInternal), + ) + defer span.End() if err := ag.alerts.Set(alert); err != nil { - ag.logger.Error("error on set alert", "err", err) - } - - // Immediately trigger a flush if the wait duration for this - // alert is already over. - ag.mtx.Lock() - defer ag.mtx.Unlock() - if !ag.hasFlushed && alert.StartsAt.Add(ag.opts.GroupWait).Before(time.Now()) { - ag.next.Reset(0) + message := "error on set alert" + span.SetStatus(codes.Error, message) + span.RecordError(err) + ag.logger.Error(message, "err", err) } } @@ -539,6 +718,14 @@ func (ag *aggrGroup) flush(notify func(...*types.Alert) bool) { // we would delete an active alert thinking it was resolved. if err := ag.alerts.DeleteIfNotModified(resolvedSlice); err != nil { ag.logger.Error("error on delete alerts", "err", err) + } else { + // Delete markers for resolved alerts that are not in the store. + for _, alert := range resolvedSlice { + _, err := ag.alerts.Get(alert.Fingerprint()) + if errors.Is(err, store.ErrNotFound) { + ag.marker.Delete(alert.Fingerprint()) + } + } } } } diff --git a/vendor/github.com/prometheus/alertmanager/featurecontrol/featurecontrol.go b/vendor/github.com/prometheus/alertmanager/featurecontrol/featurecontrol.go index d6da3ac88f2..b4b7cf4735c 100644 --- a/vendor/github.com/prometheus/alertmanager/featurecontrol/featurecontrol.go +++ b/vendor/github.com/prometheus/alertmanager/featurecontrol/featurecontrol.go @@ -113,7 +113,7 @@ func NewFlags(logger *slog.Logger, features string) (Flagger, error) { return NoopFlags{}, nil } - for _, feature := range strings.Split(features, ",") { + for feature := range strings.SplitSeq(features, ",") { switch feature { case FeatureReceiverNameInMetrics: opts = append(opts, enableReceiverNameInMetrics()) diff --git a/vendor/github.com/prometheus/alertmanager/inhibit/index.go b/vendor/github.com/prometheus/alertmanager/inhibit/index.go new file mode 100644 index 00000000000..fd60e48701c --- /dev/null +++ b/vendor/github.com/prometheus/alertmanager/inhibit/index.go @@ -0,0 +1,64 @@ +// Copyright The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package inhibit + +import ( + "sync" + + "github.com/prometheus/common/model" +) + +// index contains map of fingerprints to fingerprints. +// The keys are fingerprints of the equal labels of source alerts. +// The values are fingerprints of the source alerts. +// For more info see comments on inhibitor and InhibitRule. +type index struct { + mtx sync.RWMutex + items map[model.Fingerprint]model.Fingerprint +} + +func newIndex() *index { + return &index{ + items: make(map[model.Fingerprint]model.Fingerprint), + } +} + +func (c *index) Get(key model.Fingerprint) (model.Fingerprint, bool) { + c.mtx.RLock() + defer c.mtx.RUnlock() + + fp, ok := c.items[key] + return fp, ok +} + +func (c *index) Set(key, value model.Fingerprint) { + c.mtx.Lock() + defer c.mtx.Unlock() + + c.items[key] = value +} + +func (c *index) Delete(key model.Fingerprint) { + c.mtx.Lock() + defer c.mtx.Unlock() + + delete(c.items, key) +} + +func (c *index) Len() int { + c.mtx.RLock() + defer c.mtx.RUnlock() + + return len(c.items) +} diff --git a/vendor/github.com/prometheus/alertmanager/inhibit/inhibit.go b/vendor/github.com/prometheus/alertmanager/inhibit/inhibit.go index 3650186e370..6e0a61f40e5 100644 --- a/vendor/github.com/prometheus/alertmanager/inhibit/inhibit.go +++ b/vendor/github.com/prometheus/alertmanager/inhibit/inhibit.go @@ -1,4 +1,4 @@ -// Copyright 2015 Prometheus Team +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -21,6 +21,11 @@ import ( "github.com/oklog/run" "github.com/prometheus/common/model" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/propagation" + "go.opentelemetry.io/otel/trace" "github.com/prometheus/alertmanager/config" "github.com/prometheus/alertmanager/pkg/labels" @@ -29,37 +34,59 @@ import ( "github.com/prometheus/alertmanager/types" ) +var tracer = otel.Tracer("github.com/prometheus/alertmanager/inhibit") + // An Inhibitor determines whether a given label set is muted based on the // currently active alerts and a set of inhibition rules. It implements the // Muter interface. type Inhibitor struct { - alerts provider.Alerts - rules []*InhibitRule - marker types.AlertMarker - logger *slog.Logger + alerts provider.Alerts + rules []*InhibitRule + marker types.AlertMarker + logger *slog.Logger + propagator propagation.TextMapPropagator - mtx sync.RWMutex - cancel func() + mtx sync.RWMutex + loadingFinished sync.WaitGroup + cancel func() } // NewInhibitor returns a new Inhibitor. func NewInhibitor(ap provider.Alerts, rs []config.InhibitRule, mk types.AlertMarker, logger *slog.Logger) *Inhibitor { ih := &Inhibitor{ - alerts: ap, - marker: mk, - logger: logger, + alerts: ap, + marker: mk, + logger: logger, + propagator: otel.GetTextMapPropagator(), } - for _, cr := range rs { + + ih.loadingFinished.Add(1) + ruleNames := make(map[string]struct{}) + for i, cr := range rs { + if _, ok := ruleNames[cr.Name]; ok { + ih.logger.Debug("duplicate inhibition rule name", "index", i, "name", cr.Name) + } + r := NewInhibitRule(cr) ih.rules = append(ih.rules, r) + + if cr.Name != "" { + ruleNames[cr.Name] = struct{}{} + } } return ih } func (ih *Inhibitor) run(ctx context.Context) { - it := ih.alerts.Subscribe() + initalAlerts, it := ih.alerts.SlurpAndSubscribe("inhibitor") defer it.Close() + for _, a := range initalAlerts { + ih.processAlert(ctx, a) + } + + ih.loadingFinished.Done() + for { select { case <-ctx.Done(): @@ -69,18 +96,47 @@ func (ih *Inhibitor) run(ctx context.Context) { ih.logger.Error("Error iterating alerts", "err", err) continue } - // Update the inhibition rules' cache. - for _, r := range ih.rules { - if r.SourceMatchers.Matches(a.Labels) { - if err := r.scache.Set(a); err != nil { - ih.logger.Error("error on set alert", "err", err) - } - } + traceCtx := context.Background() + if a.Header != nil { + traceCtx = ih.propagator.Extract(traceCtx, propagation.MapCarrier(a.Header)) } + ih.processAlert(traceCtx, a.Data) } } } +func (ih *Inhibitor) processAlert(ctx context.Context, a *types.Alert) { + _, span := tracer.Start(ctx, "inhibit.Inhibitor.processAlert", + trace.WithAttributes( + attribute.String("alerting.alert.name", a.Name()), + attribute.String("alerting.alert.fingerprint", a.Fingerprint().String()), + ), + trace.WithSpanKind(trace.SpanKindInternal), + ) + defer span.End() + + // Update the inhibition rules' cache. + for _, r := range ih.rules { + if r.SourceMatchers.Matches(a.Labels) { + attr := attribute.String("alerting.inhibit_rule.name", r.Name) + span.AddEvent("alert matched rule source", trace.WithAttributes(attr)) + if err := r.scache.Set(a); err != nil { + message := "error on set alert" + ih.logger.Error(message, "err", err) + span.SetStatus(codes.Error, message) + span.RecordError(err) + continue + } + span.SetAttributes(attr) + r.updateIndex(a) + } + } +} + +func (ih *Inhibitor) WaitForLoading() { + ih.loadingFinished.Wait() +} + // Run the Inhibitor's background processing. func (ih *Inhibitor) Run() { var ( @@ -124,22 +180,40 @@ func (ih *Inhibitor) Stop() { // Mutes returns true iff the given label set is muted. It implements the Muter // interface. -func (ih *Inhibitor) Mutes(lset model.LabelSet) bool { +func (ih *Inhibitor) Mutes(ctx context.Context, lset model.LabelSet) bool { fp := lset.Fingerprint() + _, span := tracer.Start(ctx, "inhibit.Inhibitor.Mutes", + trace.WithAttributes(attribute.String("alerting.alert.fingerprint", fp.String())), + trace.WithSpanKind(trace.SpanKindInternal), + ) + defer span.End() + + now := time.Now() for _, r := range ih.rules { if !r.TargetMatchers.Matches(lset) { // If target side of rule doesn't match, we don't need to look any further. continue } + span.AddEvent("alert matched rule target", + trace.WithAttributes( + attribute.String("alerting.inhibit_rule.name", r.Name), + ), + ) // If we are here, the target side matches. If the source side matches, too, we // need to exclude inhibiting alerts for which the same is true. - if inhibitedByFP, eq := r.hasEqual(lset, r.SourceMatchers.Matches(lset)); eq { + if inhibitedByFP, eq := r.hasEqual(lset, r.SourceMatchers.Matches(lset), now); eq { ih.marker.SetInhibited(fp, inhibitedByFP.String()) + span.AddEvent("alert inhibited", + trace.WithAttributes( + attribute.String("alerting.inhibit_rule.source.fingerprint", inhibitedByFP.String()), + ), + ) return true } } ih.marker.SetInhibited(fp) + span.AddEvent("alert not inhibited") return false } @@ -150,6 +224,8 @@ func (ih *Inhibitor) Mutes(lset model.LabelSet) bool { // from sending notifications if their meaning is logically a subset of a // higher-level alert. type InhibitRule struct { + // Name is an optional name for the inhibition rule. + Name string // The set of Filters which define the group of source alerts (which inhibit // the target alerts). SourceMatchers labels.Matchers @@ -162,6 +238,12 @@ type InhibitRule struct { // Cache of alerts matching source labels. scache *store.Alerts + + // Index of fingerprints of source alert equal labels to fingerprint of source alert. + // The index helps speed up source alert lookups from scache significantely in scenarios with 100s of source alerts cached. + // The index items might overwrite eachother if multiple source alerts have exact equal labels. + // Overwrites only happen if the new source alert has bigger EndsAt value. + sindex *index } // NewInhibitRule returns a new InhibitRule based on a configuration definition. @@ -170,6 +252,7 @@ func NewInhibitRule(cr config.InhibitRule) *InhibitRule { sourcem labels.Matchers targetm labels.Matchers ) + // cr.SourceMatch will be deprecated. This for loop appends regex matchers. for ln, lv := range cr.SourceMatch { matcher, err := labels.NewMatcher(labels.MatchEqual, ln, lv) @@ -217,11 +300,87 @@ func NewInhibitRule(cr config.InhibitRule) *InhibitRule { equal[model.LabelName(ln)] = struct{}{} } - return &InhibitRule{ + rule := &InhibitRule{ + Name: cr.Name, SourceMatchers: sourcem, TargetMatchers: targetm, Equal: equal, scache: store.NewAlerts(), + sindex: newIndex(), + } + + rule.scache.SetGCCallback(rule.gcCallback) + + return rule +} + +// fingerprintEquals returns the fingerprint of the equal labels of the given label set. +func (r *InhibitRule) fingerprintEquals(lset model.LabelSet) model.Fingerprint { + equalSet := model.LabelSet{} + for n := range r.Equal { + equalSet[n] = lset[n] + } + return equalSet.Fingerprint() +} + +// updateIndex updates the source alert index if necessary. +func (r *InhibitRule) updateIndex(alert *types.Alert) { + fp := alert.Fingerprint() + // Calculate source labelset subset which is in equals. + eq := r.fingerprintEquals(alert.Labels) + + // Check if the equal labelset is already in the index. + indexed, ok := r.sindex.Get(eq) + if !ok { + // If not, add it. + r.sindex.Set(eq, fp) + return + } + // If the indexed fingerprint is the same as the new fingerprint, do nothing. + if indexed == fp { + return + } + + // New alert and existing index are not the same, compare them. + existing, err := r.scache.Get(indexed) + if err != nil { + // failed to get the existing alert, overwrite the index. + r.sindex.Set(eq, fp) + return + } + + // If the new alert resolves after the existing alert, replace the index. + if existing.ResolvedAt(alert.EndsAt) { + r.sindex.Set(eq, fp) + return + } + // If the existing alert resolves after the new alert, do nothing. +} + +// findEqualSourceAlert returns the source alert that matches the equal labels of the given label set. +func (r *InhibitRule) findEqualSourceAlert(lset model.LabelSet, now time.Time) (*types.Alert, bool) { + equalsFP := r.fingerprintEquals(lset) + sourceFP, ok := r.sindex.Get(equalsFP) + if ok { + alert, err := r.scache.Get(sourceFP) + if err != nil { + return nil, false + } + + if alert.ResolvedAt(now) { + return nil, false + } + + return alert, true + } + + return nil, false +} + +func (r *InhibitRule) gcCallback(alerts []types.Alert) { + for _, a := range alerts { + fp := r.fingerprintEquals(a.Labels) + r.sindex.Delete(fp) } } @@ -229,23 +388,14 @@ func NewInhibitRule(cr config.InhibitRule) *InhibitRule { // labels for the given label set. If so, the fingerprint of one of those alerts // is returned. If excludeTwoSidedMatch is true, alerts that match both the // source and the target side of the rule are disregarded. -func (r *InhibitRule) hasEqual(lset model.LabelSet, excludeTwoSidedMatch bool) (model.Fingerprint, bool) { - now := time.Now() -Outer: - for _, a := range r.scache.List() { - // The cache might be stale and contain resolved alerts. - if a.ResolvedAt(now) { - continue +func (r *InhibitRule) hasEqual(lset model.LabelSet, excludeTwoSidedMatch bool, now time.Time) (model.Fingerprint, bool) { + equal, found := r.findEqualSourceAlert(lset, now) + if found { + if excludeTwoSidedMatch && r.TargetMatchers.Matches(equal.Labels) { + return model.Fingerprint(0), false } - for n := range r.Equal { - if a.Labels[n] != lset[n] { - continue Outer - } - } - if excludeTwoSidedMatch && r.TargetMatchers.Matches(a.Labels) { - continue Outer - } - return a.Fingerprint(), true + return equal.Fingerprint(), found } + return model.Fingerprint(0), false } diff --git a/vendor/github.com/prometheus/alertmanager/matcher/parse/token.go b/vendor/github.com/prometheus/alertmanager/matcher/parse/token.go index 96baeeef43b..3e73fb8536a 100644 --- a/vendor/github.com/prometheus/alertmanager/matcher/parse/token.go +++ b/vendor/github.com/prometheus/alertmanager/matcher/parse/token.go @@ -16,6 +16,7 @@ package parse import ( "errors" "fmt" + "slices" "strconv" "unicode/utf8" ) @@ -73,12 +74,7 @@ func (t token) isEOF() bool { // isOneOf returns true if the token is one of the specified kinds. func (t token) isOneOf(kinds ...tokenKind) bool { - for _, k := range kinds { - if k == t.kind { - return true - } - } - return false + return slices.Contains(kinds, t.kind) } // unquote the value in token. If unquoted returns it unmodified. diff --git a/vendor/github.com/prometheus/alertmanager/nflog/nflog.go b/vendor/github.com/prometheus/alertmanager/nflog/nflog.go index 584ee9b04fd..74d07cc1c7d 100644 --- a/vendor/github.com/prometheus/alertmanager/nflog/nflog.go +++ b/vendor/github.com/prometheus/alertmanager/nflog/nflog.go @@ -23,6 +23,7 @@ import ( "fmt" "io" "log/slog" + "maps" "math/rand" "os" "sync" @@ -31,6 +32,7 @@ import ( "github.com/coder/quartz" "github.com/matttproud/golang_protobuf_extensions/pbutil" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/common/promslog" "github.com/prometheus/alertmanager/cluster" @@ -108,37 +110,37 @@ type metrics struct { func newMetrics(r prometheus.Registerer) *metrics { m := &metrics{} - m.gcDuration = prometheus.NewSummary(prometheus.SummaryOpts{ + m.gcDuration = promauto.With(r).NewSummary(prometheus.SummaryOpts{ Name: "alertmanager_nflog_gc_duration_seconds", Help: "Duration of the last notification log garbage collection cycle.", Objectives: map[float64]float64{}, }) - m.snapshotDuration = prometheus.NewSummary(prometheus.SummaryOpts{ + m.snapshotDuration = promauto.With(r).NewSummary(prometheus.SummaryOpts{ Name: "alertmanager_nflog_snapshot_duration_seconds", Help: "Duration of the last notification log snapshot.", Objectives: map[float64]float64{}, }) - m.snapshotSize = prometheus.NewGauge(prometheus.GaugeOpts{ + m.snapshotSize = promauto.With(r).NewGauge(prometheus.GaugeOpts{ Name: "alertmanager_nflog_snapshot_size_bytes", Help: "Size of the last notification log snapshot in bytes.", }) - m.maintenanceTotal = prometheus.NewCounter(prometheus.CounterOpts{ + m.maintenanceTotal = promauto.With(r).NewCounter(prometheus.CounterOpts{ Name: "alertmanager_nflog_maintenance_total", Help: "How many maintenances were executed for the notification log.", }) - m.maintenanceErrorsTotal = prometheus.NewCounter(prometheus.CounterOpts{ + m.maintenanceErrorsTotal = promauto.With(r).NewCounter(prometheus.CounterOpts{ Name: "alertmanager_nflog_maintenance_errors_total", Help: "How many maintenances were executed for the notification log that failed.", }) - m.queriesTotal = prometheus.NewCounter(prometheus.CounterOpts{ + m.queriesTotal = promauto.With(r).NewCounter(prometheus.CounterOpts{ Name: "alertmanager_nflog_queries_total", Help: "Number of notification log queries were received.", }) - m.queryErrorsTotal = prometheus.NewCounter(prometheus.CounterOpts{ + m.queryErrorsTotal = promauto.With(r).NewCounter(prometheus.CounterOpts{ Name: "alertmanager_nflog_query_errors_total", Help: "Number notification log received queries that failed.", }) - m.queryDuration = prometheus.NewHistogram(prometheus.HistogramOpts{ + m.queryDuration = promauto.With(r).NewHistogram(prometheus.HistogramOpts{ Name: "alertmanager_nflog_query_duration_seconds", Help: "Duration of notification log query evaluation.", Buckets: prometheus.DefBuckets, @@ -146,24 +148,11 @@ func newMetrics(r prometheus.Registerer) *metrics { NativeHistogramMaxBucketNumber: 100, NativeHistogramMinResetDuration: 1 * time.Hour, }) - m.propagatedMessagesTotal = prometheus.NewCounter(prometheus.CounterOpts{ + m.propagatedMessagesTotal = promauto.With(r).NewCounter(prometheus.CounterOpts{ Name: "alertmanager_nflog_gossip_messages_propagated_total", Help: "Number of received gossip messages that have been further gossiped.", }) - if r != nil { - r.MustRegister( - m.gcDuration, - m.snapshotDuration, - m.snapshotSize, - m.queriesTotal, - m.queryErrorsTotal, - m.queryDuration, - m.propagatedMessagesTotal, - m.maintenanceTotal, - m.maintenanceErrorsTotal, - ) - } return m } @@ -171,9 +160,7 @@ type state map[string]*pb.MeshEntry func (s state) clone() state { c := make(state, len(s)) - for k, v := range s { - c[k] = v - } + maps.Copy(c, s) return c } @@ -248,6 +235,10 @@ func (o *Options) validate() error { return errors.New("only one of SnapshotFile and SnapshotReader must be set") } + if o.Metrics == nil { + return errors.New("missing prometheus.Registerer") + } + return nil } diff --git a/vendor/github.com/prometheus/alertmanager/notify/discord/discord.go b/vendor/github.com/prometheus/alertmanager/notify/discord/discord.go index 42d8724e67d..0382a0906c8 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/discord/discord.go +++ b/vendor/github.com/prometheus/alertmanager/notify/discord/discord.go @@ -60,7 +60,7 @@ type Notifier struct { // New returns a new Discord notifier. func New(c *config.DiscordConfig, t *template.Template, l *slog.Logger, httpOpts ...commoncfg.HTTPClientOption) (*Notifier, error) { - client, err := commoncfg.NewClientFromConfig(*c.HTTPConfig, "discord", httpOpts...) + client, err := notify.NewClientWithTracing(*c.HTTPConfig, "discord", httpOpts...) if err != nil { return nil, err } @@ -95,10 +95,11 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) return false, err } - n.logger.Debug("extracted group key", "key", key) + logger := n.logger.With("group_key", key) + logger.Debug("extracted group key") alerts := types.Alerts(as...) - data := notify.GetTemplateData(ctx, n.tmpl, as, n.logger) + data := notify.GetTemplateData(ctx, n.tmpl, as, logger) tmpl := notify.TmplText(n.tmpl, data, &err) if err != nil { return false, err @@ -109,14 +110,14 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) return false, err } if truncated { - n.logger.Warn("Truncated title", "key", key, "max_runes", maxTitleLenRunes) + logger.Warn("Truncated title", "max_runes", maxTitleLenRunes) } description, truncated := notify.TruncateInRunes(tmpl(n.conf.Message), maxDescriptionLenRunes) if err != nil { return false, err } if truncated { - n.logger.Warn("Truncated message", "key", key, "max_runes", maxDescriptionLenRunes) + logger.Warn("Truncated message", "max_runes", maxDescriptionLenRunes) } content, truncated := notify.TruncateInRunes(tmpl(n.conf.Content), maxContentLenRunes) @@ -124,7 +125,7 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) return false, err } if truncated { - n.logger.Warn("Truncated message", "key", key, "max_runes", maxContentLenRunes) + logger.Warn("Truncated message", "max_runes", maxContentLenRunes) } color := colorGrey @@ -160,7 +161,7 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) if _, err := netUrl.Parse(n.conf.AvatarURL); err == nil { w.AvatarURL = n.conf.AvatarURL } else { - n.logger.Warn("Bad avatar url", "key", key) + logger.Warn("Bad avatar url", "key", key) } } diff --git a/vendor/github.com/prometheus/alertmanager/notify/email/email.go b/vendor/github.com/prometheus/alertmanager/notify/email/email.go index 7bd910ca6bd..6ed98d1b40c 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/email/email.go +++ b/vendor/github.com/prometheus/alertmanager/notify/email/email.go @@ -80,7 +80,7 @@ func (n *Email) auth(mechs string) (smtp.Auth, error) { } err := &types.MultiError{} - for _, mech := range strings.Split(mechs, " ") { + for mech := range strings.SplitSeq(mechs, " ") { switch mech { case "CRAM-MD5": secret := string(n.conf.AuthSecret) @@ -265,6 +265,31 @@ func (n *Email) Notify(ctx context.Context, as ...*types.Alert) (bool, error) { fmt.Fprintf(buffer, "Message-Id: %s\r\n", fmt.Sprintf("<%d.%d@%s>", time.Now().UnixNano(), rand.Uint64(), n.hostname)) } + if n.conf.Threading.Enabled { + key, err := notify.ExtractGroupKey(ctx) + if err != nil { + return false, err + } + // Add threading headers. All notifications for the same alert group + // (identified by key hash) are threaded together. + threadBy := "" + if n.conf.Threading.ThreadByDate != "none" { + // ThreadByDate is 'daily': + // Use current date so all mails for this alert today thread together. + threadBy = time.Now().Format("2006-01-02") + } + keyHash := key.Hash() + if len(keyHash) > 16 { + keyHash = keyHash[:16] + } + // The thread root ID is a Message-ID that doesn't correspond to + // any actual email. Email clients following the (commonly used) JWZ + // algorithm will create a dummy container to group these messages. + threadRootID := fmt.Sprintf("", keyHash, threadBy) + fmt.Fprintf(buffer, "References: %s\r\n", threadRootID) + fmt.Fprintf(buffer, "In-Reply-To: %s\r\n", threadRootID) + } + multipartBuffer := &bytes.Buffer{} multipartWriter := multipart.NewWriter(multipartBuffer) diff --git a/vendor/github.com/prometheus/alertmanager/notify/incidentio/incidentio.go b/vendor/github.com/prometheus/alertmanager/notify/incidentio/incidentio.go index efee649a76c..b985853eaba 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/incidentio/incidentio.go +++ b/vendor/github.com/prometheus/alertmanager/notify/incidentio/incidentio.go @@ -73,7 +73,7 @@ func New(conf *config.IncidentioConfig, t *template.Template, l *slog.Logger, ht } } - client, err := commoncfg.NewClientFromConfig(httpConfig, "incidentio", httpOpts...) + client, err := notify.NewClientWithTracing(httpConfig, "incidentio", httpOpts...) if err != nil { return nil, err } diff --git a/vendor/github.com/prometheus/alertmanager/notify/jira/jira.go b/vendor/github.com/prometheus/alertmanager/notify/jira/jira.go index 5d91382fe47..3b0f2f5e0a7 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/jira/jira.go +++ b/vendor/github.com/prometheus/alertmanager/notify/jira/jira.go @@ -27,7 +27,6 @@ import ( commoncfg "github.com/prometheus/common/config" "github.com/prometheus/common/model" - "github.com/trivago/tgo/tcontainer" "github.com/prometheus/alertmanager/config" "github.com/prometheus/alertmanager/notify" @@ -50,7 +49,7 @@ type Notifier struct { } func New(c *config.JiraConfig, t *template.Template, l *slog.Logger, httpOpts ...commoncfg.HTTPClientOption) (*Notifier, error) { - client, err := commoncfg.NewClientFromConfig(*c.HTTPConfig, "jira", httpOpts...) + client, err := notify.NewClientWithTracing(*c.HTTPConfig, "jira", httpOpts...) if err != nil { return nil, err } @@ -72,6 +71,7 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) } logger := n.logger.With("group_key", key.String()) + logger.Debug("extracted group key") var ( alerts = types.Alerts(as...) @@ -102,8 +102,7 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) } else { path = "issue/" + existingIssue.Key method = http.MethodPut - - logger.Debug("updating existing issue", "issue_key", existingIssue.Key) + logger.Debug("updating existing issue", "issue_key", existingIssue.Key, "summary_update_enabled", n.conf.Summary.EnableUpdateValue(), "description_update_enabled", n.conf.Description.EnableUpdateValue()) } requestBody, err := n.prepareIssueRequestBody(ctx, logger, key.Hash(), tmplTextFunc) @@ -111,6 +110,15 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) return false, err } + if method == http.MethodPut && requestBody.Fields != nil { + if !n.conf.Description.EnableUpdateValue() { + requestBody.Fields.Description = nil + } + if !n.conf.Summary.EnableUpdateValue() { + requestBody.Fields.Summary = nil + } + } + _, shouldRetry, err = n.doAPIRequest(ctx, method, path, requestBody) if err != nil { return shouldRetry, fmt.Errorf("failed to %s request to %q: %w", method, path, err) @@ -119,11 +127,12 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) return n.transitionIssue(ctx, logger, existingIssue, alerts.HasFiring()) } -func (n *Notifier) prepareIssueRequestBody(_ context.Context, logger *slog.Logger, groupID string, tmplTextFunc templateFunc) (issue, error) { - summary, err := tmplTextFunc(n.conf.Summary) +func (n *Notifier) prepareIssueRequestBody(_ context.Context, logger *slog.Logger, groupID string, tmplTextFunc template.TemplateFunc) (issue, error) { + summary, err := tmplTextFunc(n.conf.Summary.Template) if err != nil { return issue{}, fmt.Errorf("summary template: %w", err) } + project, err := tmplTextFunc(n.conf.Project) if err != nil { return issue{}, fmt.Errorf("project template: %w", err) @@ -133,11 +142,12 @@ func (n *Notifier) prepareIssueRequestBody(_ context.Context, logger *slog.Logge return issue{}, fmt.Errorf("issue_type template: %w", err) } - // Recursively convert any maps to map[string]interface{}, filtering out all non-string keys, so the json encoder - // doesn't blow up when marshaling JIRA requests. - fieldsWithStringKeys, err := tcontainer.ConvertToMarshalMap(n.conf.Fields, func(v string) string { return v }) - if err != nil { - return issue{}, fmt.Errorf("convertToMarshalMap: %w", err) + fieldsWithStringKeys := make(map[string]any, len(n.conf.Fields)) + for key, value := range n.conf.Fields { + fieldsWithStringKeys[key], err = template.DeepCopyWithTemplate(value, tmplTextFunc) + if err != nil { + return issue{}, fmt.Errorf("fields template: %w", err) + } } summary, truncated := notify.TruncateInRunes(summary, maxSummaryLenRunes) @@ -148,12 +158,12 @@ func (n *Notifier) prepareIssueRequestBody(_ context.Context, logger *slog.Logge requestBody := issue{Fields: &issueFields{ Project: &issueProject{Key: project}, Issuetype: &idNameValue{Name: issueType}, - Summary: summary, + Summary: &summary, Labels: make([]string, 0, len(n.conf.Labels)+1), Fields: fieldsWithStringKeys, }} - issueDescriptionString, err := tmplTextFunc(n.conf.Description) + issueDescriptionString, err := tmplTextFunc(n.conf.Description.Template) if err != nil { return issue{}, fmt.Errorf("description template: %w", err) } @@ -163,14 +173,13 @@ func (n *Notifier) prepareIssueRequestBody(_ context.Context, logger *slog.Logge logger.Warn("Truncated description", "max_runes", maxDescriptionLenRunes) } - requestBody.Fields.Description = issueDescriptionString - if strings.HasSuffix(n.conf.APIURL.Path, "/3") { - var issueDescription any - if err := json.Unmarshal([]byte(issueDescriptionString), &issueDescription); err != nil { - return issue{}, fmt.Errorf("description unmarshaling: %w", err) + descriptionCopy := issueDescriptionString + if isAPIv3Path(n.conf.APIURL.Path) { + if !json.Valid([]byte(descriptionCopy)) { + return issue{}, fmt.Errorf("description template: invalid JSON for API v3") } - requestBody.Fields.Description = issueDescription } + requestBody.Fields.Description = &descriptionCopy for i, label := range n.conf.Labels { label, err = tmplTextFunc(label) @@ -194,7 +203,7 @@ func (n *Notifier) prepareIssueRequestBody(_ context.Context, logger *slog.Logge return requestBody, nil } -func (n *Notifier) searchExistingIssue(ctx context.Context, logger *slog.Logger, groupID string, firing bool, tmplTextFunc templateFunc) (*issue, bool, error) { +func (n *Notifier) searchExistingIssue(ctx context.Context, logger *slog.Logger, groupID string, firing bool, tmplTextFunc template.TemplateFunc) (*issue, bool, error) { jql := strings.Builder{} if n.conf.WontFixResolution != "" { @@ -387,3 +396,7 @@ func (n *Notifier) doAPIRequestFullPath(ctx context.Context, method, path string return responseBody, false, nil } + +func isAPIv3Path(path string) bool { + return strings.HasSuffix(strings.TrimRight(path, "/"), "/3") +} diff --git a/vendor/github.com/prometheus/alertmanager/notify/jira/types.go b/vendor/github.com/prometheus/alertmanager/notify/jira/types.go index e04eb6d4f86..ac933f81ddb 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/jira/types.go +++ b/vendor/github.com/prometheus/alertmanager/notify/jira/types.go @@ -15,10 +15,9 @@ package jira import ( "encoding/json" + "maps" ) -type templateFunc func(string) (string, error) - type issue struct { Key string `json:"key,omitempty"` Fields *issueFields `json:"fields,omitempty"` @@ -26,13 +25,13 @@ type issue struct { } type issueFields struct { - Description any `json:"description"` + Description *string `json:"description,omitempty"` Issuetype *idNameValue `json:"issuetype,omitempty"` Labels []string `json:"labels,omitempty"` Priority *idNameValue `json:"priority,omitempty"` Project *issueProject `json:"project,omitempty"` Resolution *idNameValue `json:"resolution,omitempty"` - Summary string `json:"summary"` + Summary *string `json:"summary,omitempty"` Status *issueStatus `json:"status,omitempty"` Fields map[string]any `json:"-"` @@ -70,11 +69,15 @@ type issueTransitions struct { // MarshalJSON merges the struct issueFields and issueFields.CustomField together. func (i issueFields) MarshalJSON() ([]byte, error) { - jsonFields := map[string]any{ - "description": i.Description, - "summary": i.Summary, + jsonFields := map[string]any{} + + if i.Summary != nil { + jsonFields["summary"] = *i.Summary } + if i.Description != nil { + jsonFields["description"] = *i.Description + } if i.Issuetype != nil { jsonFields["issuetype"] = i.Issuetype } @@ -99,9 +102,7 @@ func (i issueFields) MarshalJSON() ([]byte, error) { jsonFields["status"] = i.Status } - for key, field := range i.Fields { - jsonFields[key] = field - } + maps.Copy(jsonFields, i.Fields) return json.Marshal(jsonFields) } diff --git a/vendor/github.com/prometheus/alertmanager/notify/msteams/msteams.go b/vendor/github.com/prometheus/alertmanager/notify/msteams/msteams.go index f53f020b3b1..e6923a17e14 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/msteams/msteams.go +++ b/vendor/github.com/prometheus/alertmanager/notify/msteams/msteams.go @@ -61,7 +61,7 @@ type teamsMessage struct { // New returns a new notifier that uses the Microsoft Teams Webhook API. func New(c *config.MSTeamsConfig, t *template.Template, l *slog.Logger, httpOpts ...commoncfg.HTTPClientOption) (*Notifier, error) { - client, err := commoncfg.NewClientFromConfig(*c.HTTPConfig, "msteams", httpOpts...) + client, err := notify.NewClientWithTracing(*c.HTTPConfig, "msteams", httpOpts...) if err != nil { return nil, err } @@ -85,9 +85,10 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) return false, err } - n.logger.Debug("extracted group key", "key", key) + logger := n.logger.With("group_key", key) + logger.Debug("extracted group key") - data := notify.GetTemplateData(ctx, n.tmpl, as, n.logger) + data := notify.GetTemplateData(ctx, n.tmpl, as, logger) tmpl := notify.TmplText(n.tmpl, data, &err) if err != nil { return false, err diff --git a/vendor/github.com/prometheus/alertmanager/notify/msteamsv2/msteamsv2.go b/vendor/github.com/prometheus/alertmanager/notify/msteamsv2/msteamsv2.go index f013bc3bdc3..010df739d1e 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/msteamsv2/msteamsv2.go +++ b/vendor/github.com/prometheus/alertmanager/notify/msteamsv2/msteamsv2.go @@ -85,7 +85,7 @@ type teamsMessage struct { // New returns a new notifier that uses the Microsoft Teams Power Platform connector. func New(c *config.MSTeamsV2Config, t *template.Template, l *slog.Logger, httpOpts ...commoncfg.HTTPClientOption) (*Notifier, error) { - client, err := commoncfg.NewClientFromConfig(*c.HTTPConfig, "msteamsv2", httpOpts...) + client, err := notify.NewClientWithTracing(*c.HTTPConfig, "msteamsv2", httpOpts...) if err != nil { return nil, err } @@ -109,9 +109,10 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) return false, err } - n.logger.Debug("extracted group key", "key", key) + logger := n.logger.With("group_key", key) + logger.Debug("extracted group key") - data := notify.GetTemplateData(ctx, n.tmpl, as, n.logger) + data := notify.GetTemplateData(ctx, n.tmpl, as, logger) tmpl := notify.TmplText(n.tmpl, data, &err) if err != nil { return false, err diff --git a/vendor/github.com/prometheus/alertmanager/notify/notify.go b/vendor/github.com/prometheus/alertmanager/notify/notify.go index b7ae41fadac..e58c16f6eec 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/notify.go +++ b/vendor/github.com/prometheus/alertmanager/notify/notify.go @@ -25,7 +25,12 @@ import ( "github.com/cenkalti/backoff/v4" "github.com/cespare/xxhash/v2" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/common/model" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/trace" "github.com/prometheus/alertmanager/featurecontrol" "github.com/prometheus/alertmanager/inhibit" @@ -36,6 +41,8 @@ import ( "github.com/prometheus/alertmanager/types" ) +var tracer = otel.Tracer("github.com/prometheus/alertmanager/notify") + // ResolvedSender returns true if resolved notifications should be sent. type ResolvedSender interface { SendResolved() bool @@ -80,8 +87,24 @@ func NewIntegration(notifier Notifier, rs ResolvedSender, name string, idx int, } // Notify implements the Notifier interface. -func (i *Integration) Notify(ctx context.Context, alerts ...*types.Alert) (bool, error) { - return i.notifier.Notify(ctx, alerts...) +func (i *Integration) Notify(ctx context.Context, alerts ...*types.Alert) (recoverable bool, err error) { + ctx, span := tracer.Start(ctx, "notify.Integration.Notify", + trace.WithAttributes(attribute.String("alerting.notify.integration.name", i.name)), + trace.WithAttributes(attribute.Int("alerting.alerts.count", len(alerts))), + trace.WithSpanKind(trace.SpanKindClient), + ) + + defer func() { + span.SetAttributes(attribute.Bool("alerting.notify.error.recoverable", recoverable)) + if err != nil { + span.SetStatus(codes.Error, err.Error()) + span.RecordError(err) + } + span.End() + }() + + recoverable, err = i.notifier.Notify(ctx, alerts...) + return recoverable, err } // SendResolved implements the ResolvedSender interface. @@ -276,32 +299,32 @@ func NewMetrics(r prometheus.Registerer, ff featurecontrol.Flagger) *Metrics { } m := &Metrics{ - numNotifications: prometheus.NewCounterVec(prometheus.CounterOpts{ + numNotifications: promauto.With(r).NewCounterVec(prometheus.CounterOpts{ Namespace: "alertmanager", Name: "notifications_total", Help: "The total number of attempted notifications.", }, labels), - numTotalFailedNotifications: prometheus.NewCounterVec(prometheus.CounterOpts{ + numTotalFailedNotifications: promauto.With(r).NewCounterVec(prometheus.CounterOpts{ Namespace: "alertmanager", Name: "notifications_failed_total", Help: "The total number of failed notifications.", }, append(labels, "reason")), - numNotificationRequestsTotal: prometheus.NewCounterVec(prometheus.CounterOpts{ + numNotificationRequestsTotal: promauto.With(r).NewCounterVec(prometheus.CounterOpts{ Namespace: "alertmanager", Name: "notification_requests_total", Help: "The total number of attempted notification requests.", }, labels), - numNotificationRequestsFailedTotal: prometheus.NewCounterVec(prometheus.CounterOpts{ + numNotificationRequestsFailedTotal: promauto.With(r).NewCounterVec(prometheus.CounterOpts{ Namespace: "alertmanager", Name: "notification_requests_failed_total", Help: "The total number of failed notification requests.", }, labels), - numNotificationSuppressedTotal: prometheus.NewCounterVec(prometheus.CounterOpts{ + numNotificationSuppressedTotal: promauto.With(r).NewCounterVec(prometheus.CounterOpts{ Namespace: "alertmanager", Name: "notifications_suppressed_total", Help: "The total number of notifications suppressed for being silenced, inhibited, outside of active time intervals or within muted time intervals.", }, []string{"reason"}), - notificationLatencySeconds: prometheus.NewHistogramVec(prometheus.HistogramOpts{ + notificationLatencySeconds: promauto.With(r).NewHistogramVec(prometheus.HistogramOpts{ Namespace: "alertmanager", Name: "notification_latency_seconds", Help: "The latency of notifications in seconds.", @@ -313,12 +336,6 @@ func NewMetrics(r prometheus.Registerer, ff featurecontrol.Flagger) *Metrics { ff: ff, } - r.MustRegister( - m.numNotifications, m.numTotalFailedNotifications, - m.numNotificationRequestsTotal, m.numNotificationRequestsFailedTotal, - m.numNotificationSuppressedTotal, m.notificationLatencySeconds, - ) - return m } @@ -368,6 +385,7 @@ func (m *Metrics) InitializeFor(receiver map[string][]Integration) { "incidentio", "jira", "rocketchat", + "mattermost", } { m.numNotifications.WithLabelValues(integration) m.numNotificationRequestsTotal.WithLabelValues(integration) @@ -458,6 +476,15 @@ func (rs RoutingStage) Exec(ctx context.Context, l *slog.Logger, alerts ...*type return ctx, nil, errors.New("receiver missing") } + ctx, span := tracer.Start(ctx, "notify.RoutingStage.Exec", + trace.WithAttributes( + attribute.String("alerting.notify.receiver.name", receiver), + attribute.Int("alerting.alerts.count", len(alerts)), + ), + trace.WithSpanKind(trace.SpanKindInternal), + ) + defer span.End() + s, ok := rs[receiver] if !ok { return ctx, nil, errors.New("stage for receiver missing") @@ -552,6 +579,12 @@ func NewMuteStage(m types.Muter, metrics *Metrics) *MuteStage { // Exec implements the Stage interface. func (n *MuteStage) Exec(ctx context.Context, logger *slog.Logger, alerts ...*types.Alert) (context.Context, []*types.Alert, error) { + ctx, span := tracer.Start(ctx, "notify.MuteStage.Exec", + trace.WithAttributes(attribute.Int("alerting.alerts.count", len(alerts))), + trace.WithSpanKind(trace.SpanKindInternal), + ) + defer span.End() + var ( filtered []*types.Alert muted []*types.Alert @@ -559,7 +592,7 @@ func (n *MuteStage) Exec(ctx context.Context, logger *slog.Logger, alerts ...*ty for _, a := range alerts { // TODO(fabxc): increment total alerts counter. // Do not send the alert if muted. - if n.muter.Mutes(a.Labels) { + if n.muter.Mutes(ctx, a.Labels) { muted = append(muted, a) } else { filtered = append(filtered, a) @@ -576,6 +609,11 @@ func (n *MuteStage) Exec(ctx context.Context, logger *slog.Logger, alerts ...*ty reason = SuppressedReasonInhibition default: } + span.SetAttributes( + attribute.Int("alerting.alerts.muted.count", len(muted)), + attribute.Int("alerting.alerts.filtered.count", len(filtered)), + attribute.String("alerting.suppressed.reason", reason), + ) n.metrics.numNotificationSuppressedTotal.WithLabelValues(reason).Add(float64(len(muted))) logger.Debug("Notifications will not be sent for muted alerts", "alerts", fmt.Sprintf("%v", muted), "reason", reason) } @@ -704,6 +742,13 @@ func (n *DedupStage) Exec(ctx context.Context, _ *slog.Logger, alerts ...*types. return ctx, nil, errors.New("group key missing") } + ctx, span := tracer.Start(ctx, "notify.DedupStage.Exec", + trace.WithAttributes(attribute.String("alerting.group.key", gkey)), + trace.WithAttributes(attribute.Int("alerting.alerts.count", len(alerts))), + trace.WithSpanKind(trace.SpanKindInternal), + ) + defer span.End() + repeatInterval, ok := RepeatInterval(ctx) if !ok { return ctx, nil, errors.New("repeat interval missing") @@ -744,6 +789,7 @@ func (n *DedupStage) Exec(ctx context.Context, _ *slog.Logger, alerts ...*types. } if n.needsUpdate(entry, firingSet, resolvedSet, repeatInterval) { + span.AddEvent("notify.DedupStage.Exec nflog needs update") return ctx, alerts, nil } return ctx, nil, nil @@ -776,10 +822,23 @@ func NewRetryStage(i Integration, groupName string, metrics *Metrics) *RetryStag func (r RetryStage) Exec(ctx context.Context, l *slog.Logger, alerts ...*types.Alert) (context.Context, []*types.Alert, error) { r.metrics.numNotifications.WithLabelValues(r.labelValues...).Inc() + + ctx, span := tracer.Start(ctx, "notify.RetryStage.Exec", + trace.WithAttributes(attribute.String("alerting.group.name", r.groupName)), + trace.WithAttributes(attribute.String("alerting.integration.name", r.integration.name)), + trace.WithAttributes(attribute.StringSlice("alerting.label.values", r.labelValues)), + trace.WithAttributes(attribute.Int("alerting.alerts.count", len(alerts))), + trace.WithSpanKind(trace.SpanKindInternal), + ) + defer span.End() + ctx, alerts, err := r.exec(ctx, l, alerts...) failureReason := DefaultReason.String() if err != nil { + span.SetStatus(codes.Error, err.Error()) + span.RecordError(err) + var e *ErrorWithReason if errors.As(err, &e) { failureReason = e.Reason.String() @@ -921,6 +980,13 @@ func (n SetNotifiesStage) Exec(ctx context.Context, l *slog.Logger, alerts ...*t return ctx, nil, errors.New("group key missing") } + ctx, span := tracer.Start(ctx, "notify.SetNotifiesStage.Exec", + trace.WithAttributes(attribute.String("alerting.group.key", gkey)), + trace.WithAttributes(attribute.Int("alerting.alerts.count", len(alerts))), + trace.WithSpanKind(trace.SpanKindInternal), + ) + defer span.End() + firing, ok := FiringAlerts(ctx) if !ok { return ctx, nil, errors.New("firing alerts missing") @@ -937,6 +1003,11 @@ func (n SetNotifiesStage) Exec(ctx context.Context, l *slog.Logger, alerts ...*t } expiry := 2 * repeat + span.SetAttributes( + attribute.Int("alerting.alerts.firing.count", len(firing)), + attribute.Int("alerting.alerts.resolved.count", len(resolved)), + ) + return ctx, alerts, n.nflog.Log(n.recv, gkey, firing, resolved, expiry) } @@ -955,15 +1026,26 @@ func NewTimeMuteStage(muter types.TimeMuter, marker types.GroupMarker, metrics * // Exec implements the stage interface for TimeMuteStage. // TimeMuteStage is responsible for muting alerts whose route is not in an active time. func (tms TimeMuteStage) Exec(ctx context.Context, l *slog.Logger, alerts ...*types.Alert) (context.Context, []*types.Alert, error) { + ctx, span := tracer.Start(ctx, "notify.TimeMuteStage.Exec", + trace.WithAttributes(attribute.Int("alerting.alerts.count", len(alerts))), + trace.WithSpanKind(trace.SpanKindInternal), + ) + defer span.End() + routeID, ok := RouteID(ctx) if !ok { - return ctx, nil, errors.New("route ID missing") + err := errors.New("route ID missing") + span.SetStatus(codes.Error, err.Error()) + span.RecordError(err) + return ctx, nil, err } + span.SetAttributes(attribute.String("alerting.route.id", routeID)) gkey, ok := GroupKey(ctx) if !ok { return ctx, nil, errors.New("group key missing") } + span.SetAttributes(attribute.String("alerting.group.key", gkey)) muteTimeIntervalNames, ok := MuteTimeIntervalNames(ctx) if !ok { @@ -981,6 +1063,8 @@ func (tms TimeMuteStage) Exec(ctx context.Context, l *slog.Logger, alerts ...*ty muted, mutedBy, err := tms.muter.Mutes(muteTimeIntervalNames, now) if err != nil { + span.SetStatus(codes.Error, err.Error()) + span.RecordError(err) return ctx, alerts, err } // If muted is false then mutedBy is nil and the muted marker is removed. @@ -990,6 +1074,7 @@ func (tms TimeMuteStage) Exec(ctx context.Context, l *slog.Logger, alerts ...*ty if muted { tms.metrics.numNotificationSuppressedTotal.WithLabelValues(SuppressedReasonMuteTimeInterval).Add(float64(len(alerts))) l.Debug("Notifications not sent, route is within mute time", "alerts", len(alerts)) + span.AddEvent("notify.TimeMuteStage.Exec muted the alerts") return ctx, nil, nil } @@ -1010,6 +1095,13 @@ func (tas TimeActiveStage) Exec(ctx context.Context, l *slog.Logger, alerts ...* return ctx, nil, errors.New("route ID missing") } + ctx, span := tracer.Start(ctx, "notify.TimeActiveStage.Exec", + trace.WithAttributes(attribute.String("alerting.route.id", routeID)), + trace.WithAttributes(attribute.Int("alerting.alerts.count", len(alerts))), + trace.WithSpanKind(trace.SpanKindInternal), + ) + defer span.End() + gkey, ok := GroupKey(ctx) if !ok { return ctx, nil, errors.New("group key missing") @@ -1046,6 +1138,7 @@ func (tas TimeActiveStage) Exec(ctx context.Context, l *slog.Logger, alerts ...* // If the current time is not inside an active time, all alerts are removed from the pipeline if !active { + span.AddEvent("notify.TimeActiveStage.Exec not active, removing all alerts") tas.metrics.numNotificationSuppressedTotal.WithLabelValues(SuppressedReasonActiveTimeInterval).Add(float64(len(alerts))) l.Debug("Notifications not sent, route is not within active time", "alerts", len(alerts)) return ctx, nil, nil diff --git a/vendor/github.com/prometheus/alertmanager/notify/opsgenie/opsgenie.go b/vendor/github.com/prometheus/alertmanager/notify/opsgenie/opsgenie.go index 54c0e245548..a267b45e700 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/opsgenie/opsgenie.go +++ b/vendor/github.com/prometheus/alertmanager/notify/opsgenie/opsgenie.go @@ -19,6 +19,7 @@ import ( "encoding/json" "fmt" "log/slog" + "maps" "net/http" "os" "strings" @@ -46,7 +47,7 @@ type Notifier struct { // New returns a new OpsGenie notifier. func New(c *config.OpsGenieConfig, t *template.Template, l *slog.Logger, httpOpts ...commoncfg.HTTPClientOption) (*Notifier, error) { - client, err := commoncfg.NewClientFromConfig(*c.HTTPConfig, "opsgenie", httpOpts...) + client, err := notify.NewClientWithTracing(*c.HTTPConfig, "opsgenie", httpOpts...) if err != nil { return nil, err } @@ -132,17 +133,16 @@ func (n *Notifier) createRequests(ctx context.Context, as ...*types.Alert) ([]*h if err != nil { return nil, false, err } - data := notify.GetTemplateData(ctx, n.tmpl, as, n.logger) + logger := n.logger.With("group_key", key) + logger.Debug("extracted group key") - n.logger.Debug("extracted group key", "key", key) + data := notify.GetTemplateData(ctx, n.tmpl, as, logger) tmpl := notify.TmplText(n.tmpl, data, &err) details := make(map[string]string) - for k, v := range data.CommonLabels { - details[k] = v - } + maps.Copy(details, data.CommonLabels) for k, v := range n.conf.Details { details[k] = tmpl(v) @@ -174,7 +174,7 @@ func (n *Notifier) createRequests(ctx context.Context, as ...*types.Alert) ([]*h default: message, truncated := notify.TruncateInRunes(tmpl(n.conf.Message), maxMessageLenRunes) if truncated { - n.logger.Warn("Truncated message", "alert", key, "max_runes", maxMessageLenRunes) + logger.Warn("Truncated message", "alert", key, "max_runes", maxMessageLenRunes) } createEndpointURL := n.conf.APIURL.Copy() diff --git a/vendor/github.com/prometheus/alertmanager/notify/pagerduty/pagerduty.go b/vendor/github.com/prometheus/alertmanager/notify/pagerduty/pagerduty.go index abab5a70be1..85327239923 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/pagerduty/pagerduty.go +++ b/vendor/github.com/prometheus/alertmanager/notify/pagerduty/pagerduty.go @@ -55,7 +55,7 @@ type Notifier struct { // New returns a new PagerDuty notifier. func New(c *config.PagerdutyConfig, t *template.Template, l *slog.Logger, httpOpts ...commoncfg.HTTPClientOption) (*Notifier, error) { - client, err := commoncfg.NewClientFromConfig(*c.HTTPConfig, "pagerduty", httpOpts...) + client, err := notify.NewClientWithTracing(*c.HTTPConfig, "pagerduty", httpOpts...) if err != nil { return nil, err } @@ -63,11 +63,11 @@ func New(c *config.PagerdutyConfig, t *template.Template, l *slog.Logger, httpOp if c.ServiceKey != "" || c.ServiceKeyFile != "" { n.apiV1 = "https://events.pagerduty.com/generic/2010-04-15/create_event.json" // Retrying can solve the issue on 403 (rate limiting) and 5xx response codes. - // https://v2.developer.pagerduty.com/docs/trigger-events + // https://developer.pagerduty.com/docs/events-api-v1-overview#api-response-codes--retry-logic n.retrier = ¬ify.Retrier{RetryCodes: []int{http.StatusForbidden}, CustomDetailsFunc: errDetails} } else { // Retrying can solve the issue on 429 (rate limiting) and 5xx response codes. - // https://v2.developer.pagerduty.com/docs/events-api-v2#api-response-codes--retry-logic + // https://developer.pagerduty.com/docs/events-api-v2-overview#response-codes--retry-logic n.retrier = ¬ify.Retrier{RetryCodes: []int{http.StatusTooManyRequests}, CustomDetailsFunc: errDetails} } return n, nil @@ -89,7 +89,7 @@ type pagerDutyMessage struct { Payload *pagerDutyPayload `json:"payload"` Client string `json:"client,omitempty"` ClientURL string `json:"client_url,omitempty"` - Details map[string]string `json:"details,omitempty"` + Details map[string]any `json:"details,omitempty"` Images []pagerDutyImage `json:"images,omitempty"` Links []pagerDutyLink `json:"links,omitempty"` } @@ -106,14 +106,14 @@ type pagerDutyImage struct { } type pagerDutyPayload struct { - Summary string `json:"summary"` - Source string `json:"source"` - Severity string `json:"severity"` - Timestamp string `json:"timestamp,omitempty"` - Class string `json:"class,omitempty"` - Component string `json:"component,omitempty"` - Group string `json:"group,omitempty"` - CustomDetails map[string]string `json:"custom_details,omitempty"` + Summary string `json:"summary"` + Source string `json:"source"` + Severity string `json:"severity"` + Timestamp string `json:"timestamp,omitempty"` + Class string `json:"class,omitempty"` + Component string `json:"component,omitempty"` + Group string `json:"group,omitempty"` + CustomDetails map[string]any `json:"custom_details,omitempty"` } func (n *Notifier) encodeMessage(msg *pagerDutyMessage) (bytes.Buffer, error) { @@ -126,9 +126,9 @@ func (n *Notifier) encodeMessage(msg *pagerDutyMessage) (bytes.Buffer, error) { truncatedMsg := fmt.Sprintf("Custom details have been removed because the original event exceeds the maximum size of %s", units.MetricBytes(maxEventSize).String()) if n.apiV1 != "" { - msg.Details = map[string]string{"error": truncatedMsg} + msg.Details = map[string]any{"error": truncatedMsg} } else { - msg.Payload.CustomDetails = map[string]string{"error": truncatedMsg} + msg.Payload.CustomDetails = map[string]any{"error": truncatedMsg} } warningMsg := fmt.Sprintf("Truncated Details because message of size %s exceeds limit %s", units.MetricBytes(buf.Len()).String(), units.MetricBytes(maxEventSize).String()) @@ -148,8 +148,7 @@ func (n *Notifier) notifyV1( eventType string, key notify.Key, data *template.Data, - details map[string]string, - as ...*types.Alert, + details map[string]any, ) (bool, error) { var tmplErr error tmpl := notify.TmplText(n.tmpl, data, &tmplErr) @@ -209,8 +208,7 @@ func (n *Notifier) notifyV2( eventType string, key notify.Key, data *template.Data, - details map[string]string, - as ...*types.Alert, + details map[string]any, ) (bool, error) { var tmplErr error tmpl := notify.TmplText(n.tmpl, data, &tmplErr) @@ -308,31 +306,43 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) if err != nil { return false, err } + logger := n.logger.With("group_key", key) var ( alerts = types.Alerts(as...) - data = notify.GetTemplateData(ctx, n.tmpl, as, n.logger) + data = notify.GetTemplateData(ctx, n.tmpl, as, logger) eventType = pagerDutyEventTrigger ) + if alerts.Status() == model.AlertResolved { eventType = pagerDutyEventResolve } - n.logger.Debug("extracted group key", "key", key, "eventType", eventType) + logger.Debug("extracted group key", "eventType", eventType) - details := make(map[string]string, len(n.conf.Details)) - for k, v := range n.conf.Details { - detail, err := n.tmpl.ExecuteTextString(v, data) - if err != nil { - return false, fmt.Errorf("%q: failed to template %q: %w", k, v, err) - } - details[k] = detail + details, err := n.renderDetails(data) + if err != nil { + return false, fmt.Errorf("failed to render details: %w", err) } + if n.conf.Timeout > 0 { + nfCtx, cancel := context.WithTimeoutCause(ctx, n.conf.Timeout, fmt.Errorf("configured pagerduty timeout reached (%s)", n.conf.Timeout)) + defer cancel() + ctx = nfCtx + } + + nf := n.notifyV2 if n.apiV1 != "" { - return n.notifyV1(ctx, eventType, key, data, details, as...) + nf = n.notifyV1 + } + retry, err := nf(ctx, eventType, key, data, details) + if err != nil { + if ctx.Err() != nil { + err = fmt.Errorf("%w: %w", err, context.Cause(ctx)) + } + return retry, err } - return n.notifyV2(ctx, eventType, key, data, details, as...) + return retry, nil } func errDetails(status int, body io.Reader) string { @@ -351,3 +361,24 @@ func errDetails(status int, body io.Reader) string { } return fmt.Sprintf("%s: %s", pgr.Message, strings.Join(pgr.Errors, ",")) } + +func (n *Notifier) renderDetails( + data *template.Data, +) (map[string]any, error) { + var ( + tmplTextErr error + tmplText = notify.TmplText(n.tmpl, data, &tmplTextErr) + tmplTextFunc = func(tmpl string) (string, error) { + return tmplText(tmpl), tmplTextErr + } + ) + var err error + rendered := make(map[string]any, len(n.conf.Details)) + for k, v := range n.conf.Details { + rendered[k], err = template.DeepCopyWithTemplate(v, tmplTextFunc) + if err != nil { + return nil, err + } + } + return rendered, nil +} diff --git a/vendor/github.com/prometheus/alertmanager/notify/pushover/pushover.go b/vendor/github.com/prometheus/alertmanager/notify/pushover/pushover.go index 1032de99030..3f5155668c2 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/pushover/pushover.go +++ b/vendor/github.com/prometheus/alertmanager/notify/pushover/pushover.go @@ -52,7 +52,7 @@ type Notifier struct { // New returns a new Pushover notifier. func New(c *config.PushoverConfig, t *template.Template, l *slog.Logger, httpOpts ...commoncfg.HTTPClientOption) (*Notifier, error) { - client, err := commoncfg.NewClientFromConfig(*c.HTTPConfig, "pushover", httpOpts...) + client, err := notify.NewClientWithTracing(*c.HTTPConfig, "pushover", httpOpts...) if err != nil { return nil, err } @@ -72,10 +72,10 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) if !ok { return false, fmt.Errorf("group key missing") } - data := notify.GetTemplateData(ctx, n.tmpl, as, n.logger) + logger := n.logger.With("group_key", key) + logger.Debug("extracted group key") - // @tjhop: should this use `group` for the keyval like most other notify implementations? - n.logger.Debug("extracted group key", "incident", key) + data := notify.GetTemplateData(ctx, n.tmpl, as, logger) var ( err error @@ -113,7 +113,7 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) title, truncated := notify.TruncateInRunes(tmpl(n.conf.Title), maxTitleLenRunes) if truncated { - n.logger.Warn("Truncated title", "incident", key, "max_runes", maxTitleLenRunes) + logger.Warn("Truncated title", "incident", key, "max_runes", maxTitleLenRunes) } parameters.Add("title", title) @@ -130,7 +130,7 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) message, truncated = notify.TruncateInRunes(message, maxMessageLenRunes) if truncated { - n.logger.Warn("Truncated message", "incident", key, "max_runes", maxMessageLenRunes) + logger.Warn("Truncated message", "incident", key, "max_runes", maxMessageLenRunes) } message = strings.TrimSpace(message) if message == "" { @@ -141,7 +141,7 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) supplementaryURL, truncated := notify.TruncateInRunes(tmpl(n.conf.URL), maxURLLenRunes) if truncated { - n.logger.Warn("Truncated URL", "incident", key, "max_runes", maxURLLenRunes) + logger.Warn("Truncated URL", "incident", key, "max_runes", maxURLLenRunes) } parameters.Add("url", supplementaryURL) parameters.Add("url_title", tmpl(n.conf.URLTitle)) @@ -167,7 +167,7 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) } u.RawQuery = parameters.Encode() // Don't log the URL as it contains secret data (see #1825). - n.logger.Debug("Sending message", "incident", key) + logger.Debug("Sending message", "incident", key) resp, err := notify.PostText(ctx, n.client, u.String(), nil) if err != nil { return true, notify.RedactURL(err) diff --git a/vendor/github.com/prometheus/alertmanager/notify/rocketchat/rocketchat.go b/vendor/github.com/prometheus/alertmanager/notify/rocketchat/rocketchat.go index ec225bd0eac..8d1a6f40855 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/rocketchat/rocketchat.go +++ b/vendor/github.com/prometheus/alertmanager/notify/rocketchat/rocketchat.go @@ -88,7 +88,7 @@ func (t *rocketchatRoundTripper) RoundTrip(req *http.Request) (res *http.Respons // New returns a new Rocketchat notification handler. func New(c *config.RocketchatConfig, t *template.Template, l *slog.Logger, httpOpts ...commoncfg.HTTPClientOption) (*Notifier, error) { - client, err := commoncfg.NewClientFromConfig(*c.HTTPConfig, "rocketchat", httpOpts...) + client, err := notify.NewClientWithTracing(*c.HTTPConfig, "rocketchat", httpOpts...) if err != nil { return nil, err } @@ -140,7 +140,14 @@ func getToken(c *config.RocketchatConfig) (string, error) { func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) { var err error - data := notify.GetTemplateData(ctx, n.tmpl, as, n.logger) + key, err := notify.ExtractGroupKey(ctx) + if err != nil { + return false, err + } + logger := n.logger.With("group_key", key) + logger.Debug("extracted group key") + + data := notify.GetTemplateData(ctx, n.tmpl, as, logger) tmplText := notify.TmplText(n.tmpl, data, &err) if err != nil { return false, err @@ -152,11 +159,7 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) title, truncated := notify.TruncateInRunes(title, maxTitleLenRunes) if truncated { - key, err := notify.ExtractGroupKey(ctx) - if err != nil { - return false, err - } - n.logger.Warn("Truncated title", "key", key, "max_runes", maxTitleLenRunes) + logger.Warn("Truncated title", "max_runes", maxTitleLenRunes) } att := &Attachment{ Title: title, diff --git a/vendor/github.com/prometheus/alertmanager/notify/slack/slack.go b/vendor/github.com/prometheus/alertmanager/notify/slack/slack.go index c335ab5f00c..c888fa13e39 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/slack/slack.go +++ b/vendor/github.com/prometheus/alertmanager/notify/slack/slack.go @@ -48,7 +48,7 @@ type Notifier struct { // New returns a new Slack notification handler. func New(c *config.SlackConfig, t *template.Template, l *slog.Logger, httpOpts ...commoncfg.HTTPClientOption) (*Notifier, error) { - client, err := commoncfg.NewClientFromConfig(*c.HTTPConfig, "slack", httpOpts...) + client, err := notify.NewClientWithTracing(*c.HTTPConfig, "slack", httpOpts...) if err != nil { return nil, err } @@ -93,8 +93,16 @@ type attachment struct { // Notify implements the Notifier interface. func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) { var err error + + key, err := notify.ExtractGroupKey(ctx) + if err != nil { + return false, err + } + logger := n.logger.With("group_key", key) + logger.Debug("extracted group key") + var ( - data = notify.GetTemplateData(ctx, n.tmpl, as, n.logger) + data = notify.GetTemplateData(ctx, n.tmpl, as, logger) tmplText = notify.TmplText(n.tmpl, data, &err) ) var markdownIn []string @@ -107,11 +115,7 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) title, truncated := notify.TruncateInRunes(tmplText(n.conf.Title), maxTitleLenRunes) if truncated { - key, err := notify.ExtractGroupKey(ctx) - if err != nil { - return false, err - } - n.logger.Warn("Truncated title", "key", key, "max_runes", maxTitleLenRunes) + logger.Warn("Truncated title", "max_runes", maxTitleLenRunes) } att := &attachment{ Title: title, @@ -204,8 +208,17 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) u = strings.TrimSpace(string(content)) } + if n.conf.Timeout > 0 { + postCtx, cancel := context.WithTimeoutCause(ctx, n.conf.Timeout, fmt.Errorf("configured slack timeout reached (%s)", n.conf.Timeout)) + defer cancel() + ctx = postCtx + } + resp, err := n.postJSONFunc(ctx, n.client, u, &buf) if err != nil { + if ctx.Err() != nil { + err = fmt.Errorf("%w: %w", err, context.Cause(ctx)) + } return true, notify.RedactURL(err) } defer notify.Drain(resp) diff --git a/vendor/github.com/prometheus/alertmanager/notify/sns/sns.go b/vendor/github.com/prometheus/alertmanager/notify/sns/sns.go index 7a995c32311..80b039b8b1e 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/sns/sns.go +++ b/vendor/github.com/prometheus/alertmanager/notify/sns/sns.go @@ -51,7 +51,7 @@ type Notifier struct { // New returns a new SNS notification handler. func New(c *config.SNSConfig, t *template.Template, l *slog.Logger, httpOpts ...commoncfg.HTTPClientOption) (*Notifier, error) { - client, err := commoncfg.NewClientFromConfig(*c.HTTPConfig, "sns", httpOpts...) + client, err := notify.NewClientWithTracing(*c.HTTPConfig, "sns", httpOpts...) if err != nil { return nil, err } diff --git a/vendor/github.com/prometheus/alertmanager/notify/telegram/telegram.go b/vendor/github.com/prometheus/alertmanager/notify/telegram/telegram.go index 4c8d0c0e80d..00f2f0d4b9f 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/telegram/telegram.go +++ b/vendor/github.com/prometheus/alertmanager/notify/telegram/telegram.go @@ -44,7 +44,7 @@ type Notifier struct { // New returns a new Telegram notification handler. func New(conf *config.TelegramConfig, t *template.Template, l *slog.Logger, httpOpts ...commoncfg.HTTPClientOption) (*Notifier, error) { - httpclient, err := commoncfg.NewClientFromConfig(*conf.HTTPConfig, "telegram", httpOpts...) + httpclient, err := notify.NewClientWithTracing(*conf.HTTPConfig, "telegram", httpOpts...) if err != nil { return nil, err } @@ -64,9 +64,17 @@ func New(conf *config.TelegramConfig, t *template.Template, l *slog.Logger, http } func (n *Notifier) Notify(ctx context.Context, alert ...*types.Alert) (bool, error) { + key, ok := notify.GroupKey(ctx) + if !ok { + return false, fmt.Errorf("group key missing") + } + + logger := n.logger.With("group_key", key) + logger.Debug("extracted group key") + var ( err error - data = notify.GetTemplateData(ctx, n.tmpl, alert, n.logger) + data = notify.GetTemplateData(ctx, n.tmpl, alert, logger) tmpl = notify.TmplText(n.tmpl, data, &err) ) @@ -74,17 +82,12 @@ func (n *Notifier) Notify(ctx context.Context, alert ...*types.Alert) (bool, err tmpl = notify.TmplHTML(n.tmpl, data, &err) } - key, ok := notify.GroupKey(ctx) - if !ok { - return false, fmt.Errorf("group key missing") - } - messageText, truncated := notify.TruncateInRunes(tmpl(n.conf.Message), maxMessageLenRunes) if err != nil { return false, err } if truncated { - n.logger.Warn("Truncated message", "alert", key, "max_runes", maxMessageLenRunes) + logger.Warn("Truncated message", "max_runes", maxMessageLenRunes) } n.client.Token, err = n.getBotToken() @@ -101,7 +104,7 @@ func (n *Notifier) Notify(ctx context.Context, alert ...*types.Alert) (bool, err if err != nil { return true, err } - n.logger.Debug("Telegram message successfully published", "message_id", message.ID, "chat_id", message.Chat.ID) + logger.Debug("Telegram message successfully published", "message_id", message.ID, "chat_id", message.Chat.ID) return false, nil } diff --git a/vendor/github.com/prometheus/alertmanager/notify/util.go b/vendor/github.com/prometheus/alertmanager/notify/util.go index c3c7aa22702..7bef014d210 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/util.go +++ b/vendor/github.com/prometheus/alertmanager/notify/util.go @@ -22,11 +22,14 @@ import ( "log/slog" "net/http" "net/url" + "slices" "strings" + commoncfg "github.com/prometheus/common/config" "github.com/prometheus/common/version" "github.com/prometheus/alertmanager/template" + "github.com/prometheus/alertmanager/tracing" "github.com/prometheus/alertmanager/types" ) @@ -36,6 +39,18 @@ const truncationMarker = "…" // UserAgentHeader is the default User-Agent for notification requests. var UserAgentHeader = version.ComponentUserAgent("Alertmanager") +// NewClientWithTracing creates a new HTTP client with tracing included +// Clients are reused across requests, so tracing is configured once at creation +// rather than on each request. +func NewClientWithTracing(cfg commoncfg.HTTPClientConfig, name string, httpOpts ...commoncfg.HTTPClientOption) (*http.Client, error) { + client, err := commoncfg.NewClientFromConfig(cfg, name, httpOpts...) + if err != nil { + return nil, err + } + client.Transport = tracing.Transport(client.Transport) + return client, nil +} + // RedactURL removes the URL part from an error of *url.Error type. func RedactURL(err error) error { var e *url.Error @@ -74,6 +89,7 @@ func request(ctx context.Context, client *http.Client, method, url, bodyType str if bodyType != "" { req.Header.Set("Content-Type", bodyType) } + return client.Do(req.WithContext(ctx)) } @@ -222,15 +238,7 @@ func (r *Retrier) Check(statusCode int, body io.Reader) (bool, error) { } // 5xx responses are considered to be always retried. - retry := statusCode/100 == 5 - if !retry { - for _, code := range r.RetryCodes { - if code == statusCode { - retry = true - break - } - } - } + retry := statusCode/100 == 5 || slices.Contains(r.RetryCodes, statusCode) s := fmt.Sprintf("unexpected status code %v", statusCode) var details string diff --git a/vendor/github.com/prometheus/alertmanager/notify/victorops/victorops.go b/vendor/github.com/prometheus/alertmanager/notify/victorops/victorops.go index ac89222ece6..746a10b55d5 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/victorops/victorops.go +++ b/vendor/github.com/prometheus/alertmanager/notify/victorops/victorops.go @@ -46,7 +46,7 @@ type Notifier struct { // New returns a new VictorOps notifier. func New(c *config.VictorOpsConfig, t *template.Template, l *slog.Logger, httpOpts ...commoncfg.HTTPClientOption) (*Notifier, error) { - client, err := commoncfg.NewClientFromConfig(*c.HTTPConfig, "victorops", httpOpts...) + client, err := notify.NewClientWithTracing(*c.HTTPConfig, "victorops", httpOpts...) if err != nil { return nil, err } @@ -141,7 +141,7 @@ func (n *Notifier) createVictorOpsPayload(ctx context.Context, as ...*types.Aler stateMessage, truncated := notify.TruncateInRunes(stateMessage, maxMessageLenRunes) if truncated { - n.logger.Warn("Truncated state_message", "incident", key, "max_runes", maxMessageLenRunes) + n.logger.Warn("Truncated state_message", "group_key", key, "max_runes", maxMessageLenRunes) } msg := map[string]string{ diff --git a/vendor/github.com/prometheus/alertmanager/notify/webex/webex.go b/vendor/github.com/prometheus/alertmanager/notify/webex/webex.go index 8ec916dfb6d..922ea543d5d 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/webex/webex.go +++ b/vendor/github.com/prometheus/alertmanager/notify/webex/webex.go @@ -44,7 +44,7 @@ type Notifier struct { // New returns a new Webex notifier. func New(c *config.WebexConfig, t *template.Template, l *slog.Logger, httpOpts ...commoncfg.HTTPClientOption) (*Notifier, error) { - client, err := commoncfg.NewClientFromConfig(*c.HTTPConfig, "webex", httpOpts...) + client, err := notify.NewClientWithTracing(*c.HTTPConfig, "webex", httpOpts...) if err != nil { return nil, err } @@ -72,9 +72,10 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) return false, err } - n.logger.Debug("extracted group key", "key", key) + logger := n.logger.With("group_key", key) + logger.Debug("extracted group key") - data := notify.GetTemplateData(ctx, n.tmpl, as, n.logger) + data := notify.GetTemplateData(ctx, n.tmpl, as, logger) tmpl := notify.TmplText(n.tmpl, data, &err) if err != nil { return false, err @@ -87,7 +88,7 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) message, truncated := notify.TruncateInBytes(message, maxMessageSize) if truncated { - n.logger.Debug("message truncated due to exceeding maximum allowed length by webex", "truncated_message", message) + logger.Debug("message truncated due to exceeding maximum allowed length by webex", "truncated_message", message) } w := webhook{ diff --git a/vendor/github.com/prometheus/alertmanager/notify/webhook/webhook.go b/vendor/github.com/prometheus/alertmanager/notify/webhook/webhook.go index 41b9f497dcb..f6f67eb68ea 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/webhook/webhook.go +++ b/vendor/github.com/prometheus/alertmanager/notify/webhook/webhook.go @@ -42,7 +42,7 @@ type Notifier struct { // New returns a new Webhook. func New(conf *config.WebhookConfig, t *template.Template, l *slog.Logger, httpOpts ...commoncfg.HTTPClientOption) (*Notifier, error) { - client, err := commoncfg.NewClientFromConfig(*conf.HTTPConfig, "webhook", httpOpts...) + client, err := notify.NewClientWithTracing(*conf.HTTPConfig, "webhook", httpOpts...) if err != nil { return nil, err } @@ -82,12 +82,11 @@ func (n *Notifier) Notify(ctx context.Context, alerts ...*types.Alert) (bool, er groupKey, err := notify.ExtractGroupKey(ctx) if err != nil { - // @tjhop: should we `return false, err` here as we do in most - // other Notify() implementations? - n.logger.Error("error extracting group key", "err", err) + return false, err } - // @tjhop: should we debug log the key here like most other Notify() implementations? + logger := n.logger.With("group_key", groupKey) + logger.Debug("extracted group key") msg := &Message{ Version: "4", diff --git a/vendor/github.com/prometheus/alertmanager/notify/wechat/wechat.go b/vendor/github.com/prometheus/alertmanager/notify/wechat/wechat.go index 4aab58ca30c..9f561e039fe 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/wechat/wechat.go +++ b/vendor/github.com/prometheus/alertmanager/notify/wechat/wechat.go @@ -71,7 +71,7 @@ type weChatResponse struct { // New returns a new Wechat notifier. func New(c *config.WechatConfig, t *template.Template, l *slog.Logger, httpOpts ...commoncfg.HTTPClientOption) (*Notifier, error) { - client, err := commoncfg.NewClientFromConfig(*c.HTTPConfig, "wechat", httpOpts...) + client, err := notify.NewClientWithTracing(*c.HTTPConfig, "wechat", httpOpts...) if err != nil { return nil, err } @@ -86,8 +86,10 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) return false, err } - n.logger.Debug("extracted group key", "key", key) - data := notify.GetTemplateData(ctx, n.tmpl, as, n.logger) + logger := n.logger.With("group_key", key) + logger.Debug("extracted group key") + + data := notify.GetTemplateData(ctx, n.tmpl, as, logger) tmpl := notify.TmplText(n.tmpl, data, &err) if err != nil { @@ -174,7 +176,7 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) if err != nil { return true, err } - n.logger.Debug(string(body), "incident", key) + logger.Debug(string(body)) var weResp weChatResponse if err := json.Unmarshal(body, &weResp); err != nil { diff --git a/vendor/github.com/prometheus/alertmanager/pkg/labels/parse.go b/vendor/github.com/prometheus/alertmanager/pkg/labels/parse.go index f84b29e84b1..13360174c90 100644 --- a/vendor/github.com/prometheus/alertmanager/pkg/labels/parse.go +++ b/vendor/github.com/prometheus/alertmanager/pkg/labels/parse.go @@ -127,8 +127,8 @@ func ParseMatcher(s string) (_ *Matcher, err error) { expectTrailingQuote bool ) - if strings.HasPrefix(rawValue, "\"") { - rawValue = strings.TrimPrefix(rawValue, "\"") + if after, ok := strings.CutPrefix(rawValue, "\""); ok { + rawValue = after expectTrailingQuote = true } diff --git a/vendor/github.com/prometheus/alertmanager/provider/mem/mem.go b/vendor/github.com/prometheus/alertmanager/provider/mem/mem.go index 3948697d845..3b9dc623def 100644 --- a/vendor/github.com/prometheus/alertmanager/provider/mem/mem.go +++ b/vendor/github.com/prometheus/alertmanager/provider/mem/mem.go @@ -20,7 +20,12 @@ import ( "time" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/common/model" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/propagation" + "go.opentelemetry.io/otel/trace" "github.com/prometheus/alertmanager/provider" "github.com/prometheus/alertmanager/store" @@ -29,6 +34,8 @@ import ( const alertChannelLength = 200 +var tracer = otel.Tracer("github.com/prometheus/alertmanager/provider/mem") + // Alerts gives access to a set of alerts. All methods are goroutine-safe. type Alerts struct { cancel context.CancelFunc @@ -43,7 +50,10 @@ type Alerts struct { callback AlertStoreCallback - logger *slog.Logger + logger *slog.Logger + propagator propagation.TextMapPropagator + + subscriberChannelWrites *prometheus.CounterVec } type AlertStoreCallback interface { @@ -61,13 +71,14 @@ type AlertStoreCallback interface { } type listeningAlerts struct { - alerts chan *types.Alert + name string + alerts chan *provider.Alert done chan struct{} } func (a *Alerts) registerMetrics(r prometheus.Registerer) { newMemAlertByStatus := func(s types.AlertState) prometheus.GaugeFunc { - return prometheus.NewGaugeFunc( + return promauto.With(r).NewGaugeFunc( prometheus.GaugeOpts{ Name: "alertmanager_alerts", Help: "How many alerts by state.", @@ -79,9 +90,17 @@ func (a *Alerts) registerMetrics(r prometheus.Registerer) { ) } - r.MustRegister(newMemAlertByStatus(types.AlertStateActive)) - r.MustRegister(newMemAlertByStatus(types.AlertStateSuppressed)) - r.MustRegister(newMemAlertByStatus(types.AlertStateUnprocessed)) + newMemAlertByStatus(types.AlertStateActive) + newMemAlertByStatus(types.AlertStateSuppressed) + newMemAlertByStatus(types.AlertStateUnprocessed) + + a.subscriberChannelWrites = promauto.With(r).NewCounterVec( + prometheus.CounterOpts{ + Name: "alertmanager_alerts_subscriber_channel_writes_total", + Help: "Number of times alerts were written to subscriber channels", + }, + []string{"subscriber"}, + ) } // NewAlerts returns a new alert provider. @@ -92,13 +111,14 @@ func NewAlerts(ctx context.Context, m types.AlertMarker, intervalGC time.Duratio ctx, cancel := context.WithCancel(ctx) a := &Alerts{ - marker: m, - alerts: store.NewAlerts(), - cancel: cancel, - listeners: map[int]listeningAlerts{}, - next: 0, - logger: l.With("component", "provider"), - callback: alertCallback, + marker: m, + alerts: store.NewAlerts(), + cancel: cancel, + listeners: map[int]listeningAlerts{}, + next: 0, + logger: l.With("component", "provider"), + propagator: otel.GetTextMapPropagator(), + callback: alertCallback, } if r != nil { @@ -154,40 +174,52 @@ func (a *Alerts) Close() { } } -func max(a, b int) int { - if a > b { - return a - } - return b -} - // Subscribe returns an iterator over active alerts that have not been // resolved and successfully notified about. // They are not guaranteed to be in chronological order. -func (a *Alerts) Subscribe() provider.AlertIterator { +func (a *Alerts) Subscribe(name string) provider.AlertIterator { a.mtx.Lock() defer a.mtx.Unlock() var ( done = make(chan struct{}) alerts = a.alerts.List() - ch = make(chan *types.Alert, max(len(alerts), alertChannelLength)) + ch = make(chan *provider.Alert, max(len(alerts), alertChannelLength)) ) for _, a := range alerts { - ch <- a + ch <- &provider.Alert{ + Header: map[string]string{}, + Data: a, + } } - a.listeners[a.next] = listeningAlerts{alerts: ch, done: done} + a.listeners[a.next] = listeningAlerts{name: name, alerts: ch, done: done} a.next++ return provider.NewAlertIterator(ch, done, nil) } +func (a *Alerts) SlurpAndSubscribe(name string) ([]*types.Alert, provider.AlertIterator) { + a.mtx.Lock() + defer a.mtx.Unlock() + + var ( + done = make(chan struct{}) + alerts = a.alerts.List() + ch = make(chan *provider.Alert, alertChannelLength) + ) + + a.listeners[a.next] = listeningAlerts{name: name, alerts: ch, done: done} + a.next++ + + return alerts, provider.NewAlertIterator(ch, done, nil) +} + // GetPending returns an iterator over all the alerts that have // pending notifications. func (a *Alerts) GetPending() provider.AlertIterator { var ( - ch = make(chan *types.Alert, alertChannelLength) + ch = make(chan *provider.Alert, alertChannelLength) done = make(chan struct{}) ) a.mtx.Lock() @@ -198,7 +230,10 @@ func (a *Alerts) GetPending() provider.AlertIterator { defer close(ch) for _, a := range alerts { select { - case ch <- a: + case ch <- &provider.Alert{ + Header: map[string]string{}, + Data: a, + }: case <-done: return } @@ -216,10 +251,18 @@ func (a *Alerts) Get(fp model.Fingerprint) (*types.Alert, error) { } // Put adds the given alert to the set. -func (a *Alerts) Put(alerts ...*types.Alert) error { +func (a *Alerts) Put(ctx context.Context, alerts ...*types.Alert) error { a.mtx.Lock() defer a.mtx.Unlock() + ctx, span := tracer.Start(ctx, "provider.mem.Put", + trace.WithAttributes( + attribute.Int("alerting.alerts.count", len(alerts)), + ), + trace.WithSpanKind(trace.SpanKindProducer), + ) + defer span.End() + for _, alert := range alerts { fp := alert.Fingerprint() @@ -249,9 +292,17 @@ func (a *Alerts) Put(alerts ...*types.Alert) error { a.callback.PostStore(alert, existing) + metadata := map[string]string{} + a.propagator.Inject(ctx, propagation.MapCarrier(metadata)) + msg := &provider.Alert{ + Data: alert, + Header: metadata, + } + for _, l := range a.listeners { select { - case l.alerts <- alert: + case l.alerts <- msg: + a.subscriberChannelWrites.WithLabelValues(l.name).Inc() case <-l.done: } } @@ -262,9 +313,6 @@ func (a *Alerts) Put(alerts ...*types.Alert) error { // count returns the number of non-resolved alerts we currently have stored filtered by the provided state. func (a *Alerts) count(state types.AlertState) int { - a.mtx.Lock() - defer a.mtx.Unlock() - var count int for _, alert := range a.alerts.List() { if alert.Resolved() { diff --git a/vendor/github.com/prometheus/alertmanager/provider/provider.go b/vendor/github.com/prometheus/alertmanager/provider/provider.go index 4d1f76f2069..dcc40f89fed 100644 --- a/vendor/github.com/prometheus/alertmanager/provider/provider.go +++ b/vendor/github.com/prometheus/alertmanager/provider/provider.go @@ -14,6 +14,7 @@ package provider import ( + "context" "fmt" "github.com/prometheus/common/model" @@ -24,6 +25,12 @@ import ( // ErrNotFound is returned if a provider cannot find a requested item. var ErrNotFound = fmt.Errorf("item not found") +type Alert struct { + // Header contains metadata, for example propagated tracing information. + Header map[string]string + Data *types.Alert +} + // Iterator provides the functions common to all iterators. To be useful, a // specific iterator interface (e.g. AlertIterator) has to be implemented that // provides a Next method. @@ -44,11 +51,11 @@ type AlertIterator interface { // exhausted. It is not necessary to exhaust the iterator but Close must // be called in any case to release resources used by the iterator (even // if the iterator is exhausted). - Next() <-chan *types.Alert + Next() <-chan *Alert } // NewAlertIterator returns a new AlertIterator based on the generic alertIterator type. -func NewAlertIterator(ch <-chan *types.Alert, done chan struct{}, err error) AlertIterator { +func NewAlertIterator(ch <-chan *Alert, done chan struct{}, err error) AlertIterator { return &alertIterator{ ch: ch, done: done, @@ -58,12 +65,12 @@ func NewAlertIterator(ch <-chan *types.Alert, done chan struct{}, err error) Ale // alertIterator implements AlertIterator. So far, this one fits all providers. type alertIterator struct { - ch <-chan *types.Alert + ch <-chan *Alert done chan struct{} err error } -func (ai alertIterator) Next() <-chan *types.Alert { +func (ai alertIterator) Next() <-chan *Alert { return ai.ch } @@ -75,12 +82,24 @@ type Alerts interface { // Subscribe returns an iterator over active alerts that have not been // resolved and successfully notified about. // They are not guaranteed to be in chronological order. - Subscribe() AlertIterator + Subscribe(name string) AlertIterator + + // SlurpAndSubcribe returns a list of all active alerts which are available + // in the provider before the call to SlurpAndSubcribe and an iterator + // of all alerts available after the call to SlurpAndSubcribe. + // SlurpAndSubcribe can be used by clients which need to build in memory state + // to know when they've processed the 'initial' batch of alerts in a provider + // after they reload their subscription. + // Implementation of SlurpAndSubcribe is optional - providers may choose to + // return an empty list for the first return value and the result of Subscribe + // for the second return value. + SlurpAndSubscribe(name string) ([]*types.Alert, AlertIterator) + // GetPending returns an iterator over all alerts that have // pending notifications. GetPending() AlertIterator // Get returns the alert for a given fingerprint. Get(model.Fingerprint) (*types.Alert, error) // Put adds the given set of alerts to the set. - Put(...*types.Alert) error + Put(ctx context.Context, alerts ...*types.Alert) error } diff --git a/vendor/github.com/prometheus/alertmanager/silence/silence.go b/vendor/github.com/prometheus/alertmanager/silence/silence.go index 8d1b341a1f5..3969cce3bb2 100644 --- a/vendor/github.com/prometheus/alertmanager/silence/silence.go +++ b/vendor/github.com/prometheus/alertmanager/silence/silence.go @@ -17,6 +17,7 @@ package silence import ( "bytes" + "context" "errors" "fmt" "io" @@ -25,16 +26,22 @@ import ( "os" "reflect" "regexp" + "slices" "sort" "sync" "time" "github.com/coder/quartz" - uuid "github.com/gofrs/uuid" + uuid "github.com/google/uuid" "github.com/matttproud/golang_protobuf_extensions/pbutil" "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/common/model" "github.com/prometheus/common/promslog" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/trace" "github.com/prometheus/alertmanager/cluster" "github.com/prometheus/alertmanager/matcher/compat" @@ -43,27 +50,27 @@ import ( "github.com/prometheus/alertmanager/types" ) +var tracer = otel.Tracer("github.com/prometheus/alertmanager/silence") + // ErrNotFound is returned if a silence was not found. var ErrNotFound = errors.New("silence not found") // ErrInvalidState is returned if the state isn't valid. var ErrInvalidState = errors.New("invalid state") -type matcherCache map[string]labels.Matchers +type matcherIndex map[string]labels.Matchers -// Get retrieves the matchers for a given silence. If it is a missed cache -// access, it compiles and adds the matchers of the requested silence to the -// cache. -func (c matcherCache) Get(s *pb.Silence) (labels.Matchers, error) { +// get retrieves the matchers for a given silence. +func (c matcherIndex) get(s *pb.Silence) (labels.Matchers, error) { if m, ok := c[s.Id]; ok { return m, nil } - return c.add(s) + return nil, ErrNotFound } // add compiles a silences' matchers and adds them to the cache. // It returns the compiled matchers. -func (c matcherCache) add(s *pb.Silence) (labels.Matchers, error) { +func (c matcherIndex) add(s *pb.Silence) (labels.Matchers, error) { ms := make(labels.Matchers, len(s.Matchers)) for i, m := range s.Matchers { @@ -92,6 +99,39 @@ func (c matcherCache) add(s *pb.Silence) (labels.Matchers, error) { return ms, nil } +// silenceVersion associates a silence with the Silences version when it was created. +type silenceVersion struct { + id string + version int +} + +// versionIndex is a index into Silences ordered by the version of Silences when the +// silence was created. The index is always sorted from lowest to highest version. +// +// The versionIndex allows clients of Silences.Query to incrementally update local caches +// of query results. Instead of a new version requiring the client to scan everything +// again to get an up-to-date picture of Silences, they can use the versionIndex to figure +// out which silences have been added since the last version they saw. This means they can +// just scan the NEW silences, rather than all of them. +type versionIndex []silenceVersion + +// add pushes a new silenceVersionMapping to the back of the silenceVersionIndex. It does not +// validate the input. +func (s *versionIndex) add(version int, sil string) { + *s = append(*s, silenceVersion{version: version, id: sil}) +} + +// findVersionGreaterThan uses a log(n) search to find the first index of the versionIndex +// which has a version higher than version. If any entries with a higher version exist, +// it returns true and the starting index (which is guaranteed to be a valid index into +// the slice). Otherwise it returns false. +func (s versionIndex) findVersionGreaterThan(version int) (index int, found bool) { + startIdx := sort.Search(len(s), func(i int) bool { + return s[i].version > version + }) + return startIdx, startIdx < len(s) +} + // Silencer binds together a AlertMarker and a Silences to implement the Muter // interface. type Silencer struct { @@ -110,71 +150,120 @@ func NewSilencer(s *Silences, m types.AlertMarker, l *slog.Logger) *Silencer { } // Mutes implements the Muter interface. -func (s *Silencer) Mutes(lset model.LabelSet) bool { +func (s *Silencer) Mutes(ctx context.Context, lset model.LabelSet) bool { fp := lset.Fingerprint() activeIDs, pendingIDs, markerVersion, _ := s.marker.Silenced(fp) + ctx, span := tracer.Start(ctx, "silence.Silencer.Mutes", + trace.WithAttributes( + attribute.String("alerting.alert.fingerprint", fp.String()), + ), + trace.WithSpanKind(trace.SpanKindInternal), + ) + defer span.End() + var ( - err error - allSils []*pb.Silence + oldSils []*pb.Silence + newSils []*pb.Silence newVersion = markerVersion ) - if markerVersion == s.silences.Version() { - totalSilences := len(activeIDs) + len(pendingIDs) - // No new silences added, just need to check which of the old - // silences are still relevant and which of the pending ones - // have become active. - if totalSilences == 0 { - // Super fast path: No silences ever applied to this - // alert, none have been added. We are done. - return false - } - // This is still a quite fast path: No silences have been added, - // we only need to check which of the applicable silences are - // currently active. Note that newVersion is left at - // markerVersion because the Query call might already return a - // newer version, which is not the version our old list of - // applicable silences is based on. - allIDs := append(append(make([]string, 0, totalSilences), activeIDs...), pendingIDs...) - allSils, _, err = s.silences.Query( + totalMarkerSilences := len(activeIDs) + len(pendingIDs) + markerIsUpToDate := markerVersion == s.silences.Version() + + if markerIsUpToDate && totalMarkerSilences == 0 { + // Very fast path: no new silences have been added and this lset was not + // silenced last time we checked. + span.AddEvent("No new silences to match since last check", + trace.WithAttributes( + attribute.Int("alerting.silences.count", totalMarkerSilences), + ), + ) + return false + } + // Either there are new silences and we need to check if those match lset or there were + // silences last time we queried so we need to see if those are still active/have become + // active. It's possible for there to be both old and new silences. + + if totalMarkerSilences > 0 { + // there were old silences for this lset, we need to find them to check if they + // are still active/pending, or have ended. + var err error + allIDs := append(append(make([]string, 0, totalMarkerSilences), activeIDs...), pendingIDs...) + oldSils, _, err = s.silences.Query( + ctx, QIDs(allIDs...), QState(types.SilenceStateActive, types.SilenceStatePending), ) - } else { - // New silences have been added, do a full query. - allSils, newVersion, err = s.silences.Query( + if err != nil { + span.SetStatus(codes.Error, err.Error()) + span.RecordError(err) + s.logger.Error( + "Querying old silences failed, alerts might not get silenced correctly", + "err", err, + ) + } + } + + if !markerIsUpToDate { + // New silences have been added since the last time the marker was updated. Do a full + // query for any silences newer than the markerVersion that match the lset. + // On this branch we WILL update newVersion since we can be sure we've seen any silences + // newer than markerVersion. + var err error + newSils, newVersion, err = s.silences.Query( + ctx, + QSince(markerVersion), QState(types.SilenceStateActive, types.SilenceStatePending), QMatches(lset), ) + if err != nil { + span.SetStatus(codes.Error, err.Error()) + span.RecordError(err) + s.logger.Error( + "Querying silences failed, alerts might not get silenced correctly", + "err", err, + ) + } } - if err != nil { - s.logger.Error("Querying silences failed, alerts might not get silenced correctly", "err", err) - } - if len(allSils) == 0 { + // Note: if markerIsUpToDate, newVersion is left at markerVersion because the Query call + // might already return a newer version, which is not the version our old list of + // applicable silences is based on. + + totalSilences := len(oldSils) + len(newSils) + if totalSilences == 0 { // Easy case, neither active nor pending silences anymore. s.marker.SetActiveOrSilenced(fp, newVersion, nil, nil) + span.AddEvent("No silences to match", trace.WithAttributes( + attribute.Int("alerting.silences.count", totalSilences), + )) return false } + // It is still possible that nothing has changed, but finding out is not // much less effort than just recreating the IDs from the query // result. So let's do it in any case. Note that we cannot reuse the // current ID slices for concurrency reasons. - activeIDs, pendingIDs = nil, nil + activeIDs = make([]string, 0, totalSilences) + pendingIDs = make([]string, 0, totalSilences) now := s.silences.nowUTC() - for _, sil := range allSils { - switch getState(sil, now) { - case types.SilenceStatePending: - pendingIDs = append(pendingIDs, sil.Id) - case types.SilenceStateActive: - activeIDs = append(activeIDs, sil.Id) - default: - // Do nothing, silence has expired in the meantime. + + // Categorize old and new silences by their current state + for _, sils := range [...][]*pb.Silence{oldSils, newSils} { + for _, sil := range sils { + switch getState(sil, now) { + case types.SilenceStatePending: + pendingIDs = append(pendingIDs, sil.Id) + case types.SilenceStateActive: + activeIDs = append(activeIDs, sil.Id) + default: + // Do nothing, silence has expired in the meantime. + } } } s.logger.Debug( "determined current silences state", "now", now, - "total", len(allSils), + "total", totalSilences, "active", len(activeIDs), "pending", len(pendingIDs), ) @@ -182,8 +271,12 @@ func (s *Silencer) Mutes(lset model.LabelSet) bool { sort.Strings(pendingIDs) s.marker.SetActiveOrSilenced(fp, newVersion, activeIDs, pendingIDs) - - return len(activeIDs) > 0 + mutes := len(activeIDs) > 0 + span.AddEvent("Silencer mutes alert", trace.WithAttributes( + attribute.Int("alerting.silences.active.count", len(activeIDs)), + attribute.Int("alerting.silences.pending.count", len(pendingIDs)), + )) + return mutes } // Silences holds a silence state that can be modified, queried, and snapshot. @@ -199,7 +292,8 @@ type Silences struct { st state version int // Increments whenever silences are added. broadcast func([]byte) - mc matcherCache + mi matcherIndex + vi versionIndex } // Limits contains the limits for silences. @@ -217,18 +311,26 @@ type Limits struct { type MaintenanceFunc func() (int64, error) type metrics struct { - gcDuration prometheus.Summary - snapshotDuration prometheus.Summary - snapshotSize prometheus.Gauge - queriesTotal prometheus.Counter - queryErrorsTotal prometheus.Counter - queryDuration prometheus.Histogram - silencesActive prometheus.GaugeFunc - silencesPending prometheus.GaugeFunc - silencesExpired prometheus.GaugeFunc - propagatedMessagesTotal prometheus.Counter - maintenanceTotal prometheus.Counter - maintenanceErrorsTotal prometheus.Counter + gcDuration prometheus.Summary + gcErrorsTotal prometheus.Counter + snapshotDuration prometheus.Summary + snapshotSize prometheus.Gauge + queriesTotal prometheus.Counter + queryErrorsTotal prometheus.Counter + queryDuration prometheus.Histogram + queryScannedTotal prometheus.Counter + querySkippedTotal prometheus.Counter + silencesActive prometheus.GaugeFunc + silencesPending prometheus.GaugeFunc + silencesExpired prometheus.GaugeFunc + stateSize prometheus.Gauge + matcherIndexSize prometheus.Gauge + versionIndexSize prometheus.Gauge + propagatedMessagesTotal prometheus.Counter + maintenanceTotal prometheus.Counter + maintenanceErrorsTotal prometheus.Counter + matcherCompileIndexSilenceErrorsTotal prometheus.Counter + matcherCompileLoadSnapshotErrorsTotal prometheus.Counter } func newSilenceMetricByState(s *Silences, st types.SilenceState) prometheus.GaugeFunc { @@ -239,7 +341,7 @@ func newSilenceMetricByState(s *Silences, st types.SilenceState) prometheus.Gaug ConstLabels: prometheus.Labels{"state": string(st)}, }, func() float64 { - count, err := s.CountState(st) + count, err := s.CountState(context.Background(), st) if err != nil { s.logger.Error("Counting silences failed", "err", err) } @@ -251,37 +353,50 @@ func newSilenceMetricByState(s *Silences, st types.SilenceState) prometheus.Gaug func newMetrics(r prometheus.Registerer, s *Silences) *metrics { m := &metrics{} - m.gcDuration = prometheus.NewSummary(prometheus.SummaryOpts{ + m.gcDuration = promauto.With(r).NewSummary(prometheus.SummaryOpts{ Name: "alertmanager_silences_gc_duration_seconds", Help: "Duration of the last silence garbage collection cycle.", Objectives: map[float64]float64{}, }) - m.snapshotDuration = prometheus.NewSummary(prometheus.SummaryOpts{ + m.gcErrorsTotal = promauto.With(r).NewCounter(prometheus.CounterOpts{ + Name: "alertmanager_silences_gc_errors_total", + Help: "How many silence GC errors were encountered.", + }) + m.snapshotDuration = promauto.With(r).NewSummary(prometheus.SummaryOpts{ Name: "alertmanager_silences_snapshot_duration_seconds", Help: "Duration of the last silence snapshot.", Objectives: map[float64]float64{}, }) - m.snapshotSize = prometheus.NewGauge(prometheus.GaugeOpts{ + m.snapshotSize = promauto.With(r).NewGauge(prometheus.GaugeOpts{ Name: "alertmanager_silences_snapshot_size_bytes", Help: "Size of the last silence snapshot in bytes.", }) - m.maintenanceTotal = prometheus.NewCounter(prometheus.CounterOpts{ + m.maintenanceTotal = promauto.With(r).NewCounter(prometheus.CounterOpts{ Name: "alertmanager_silences_maintenance_total", Help: "How many maintenances were executed for silences.", }) - m.maintenanceErrorsTotal = prometheus.NewCounter(prometheus.CounterOpts{ + m.maintenanceErrorsTotal = promauto.With(r).NewCounter(prometheus.CounterOpts{ Name: "alertmanager_silences_maintenance_errors_total", Help: "How many maintenances were executed for silences that failed.", }) - m.queriesTotal = prometheus.NewCounter(prometheus.CounterOpts{ + matcherCompileErrorsTotal := promauto.With(r).NewCounterVec( + prometheus.CounterOpts{ + Name: "alertmanager_silences_matcher_compile_errors_total", + Help: "How many silence matcher compilations failed.", + }, + []string{"stage"}, + ) + m.matcherCompileIndexSilenceErrorsTotal = matcherCompileErrorsTotal.WithLabelValues("index") + m.matcherCompileLoadSnapshotErrorsTotal = matcherCompileErrorsTotal.WithLabelValues("load_snapshot") + m.queriesTotal = promauto.With(r).NewCounter(prometheus.CounterOpts{ Name: "alertmanager_silences_queries_total", Help: "How many silence queries were received.", }) - m.queryErrorsTotal = prometheus.NewCounter(prometheus.CounterOpts{ + m.queryErrorsTotal = promauto.With(r).NewCounter(prometheus.CounterOpts{ Name: "alertmanager_silences_query_errors_total", Help: "How many silence received queries did not succeed.", }) - m.queryDuration = prometheus.NewHistogram(prometheus.HistogramOpts{ + m.queryDuration = promauto.With(r).NewHistogram(prometheus.HistogramOpts{ Name: "alertmanager_silences_query_duration_seconds", Help: "Duration of silence query evaluation.", Buckets: prometheus.DefBuckets, @@ -289,7 +404,15 @@ func newMetrics(r prometheus.Registerer, s *Silences) *metrics { NativeHistogramMaxBucketNumber: 100, NativeHistogramMinResetDuration: 1 * time.Hour, }) - m.propagatedMessagesTotal = prometheus.NewCounter(prometheus.CounterOpts{ + m.queryScannedTotal = promauto.With(r).NewCounter(prometheus.CounterOpts{ + Name: "alertmanager_silences_query_silences_scanned_total", + Help: "How many silences were scanned during query evaluation.", + }) + m.querySkippedTotal = promauto.With(r).NewCounter(prometheus.CounterOpts{ + Name: "alertmanager_silences_query_silences_skipped_total", + Help: "How many silences were skipped during query evaluation using the version index.", + }) + m.propagatedMessagesTotal = promauto.With(r).NewCounter(prometheus.CounterOpts{ Name: "alertmanager_silences_gossip_messages_propagated_total", Help: "Number of received gossip messages that have been further gossiped.", }) @@ -297,24 +420,20 @@ func newMetrics(r prometheus.Registerer, s *Silences) *metrics { m.silencesActive = newSilenceMetricByState(s, types.SilenceStateActive) m.silencesPending = newSilenceMetricByState(s, types.SilenceStatePending) m.silencesExpired = newSilenceMetricByState(s, types.SilenceStateExpired) + m.stateSize = promauto.With(r).NewGauge(prometheus.GaugeOpts{ + Name: "alertmanager_silences_state_size", + Help: "The number of silences in the state map.", + }) + m.matcherIndexSize = promauto.With(r).NewGauge(prometheus.GaugeOpts{ + Name: "alertmanager_silences_matcher_index_size", + Help: "The number of entries in the matcher cache index.", + }) + m.versionIndexSize = promauto.With(r).NewGauge(prometheus.GaugeOpts{ + Name: "alertmanager_silences_version_index_size", + Help: "The number of entries in the version index.", + }) } - if r != nil { - r.MustRegister( - m.gcDuration, - m.snapshotDuration, - m.snapshotSize, - m.queriesTotal, - m.queryErrorsTotal, - m.queryDuration, - m.silencesActive, - m.silencesPending, - m.silencesExpired, - m.propagatedMessagesTotal, - m.maintenanceTotal, - m.maintenanceErrorsTotal, - ) - } return m } @@ -351,13 +470,17 @@ func New(o Options) (*Silences, error) { s := &Silences{ clock: quartz.NewReal(), - mc: matcherCache{}, + mi: make(matcherIndex, 512), + vi: make(versionIndex, 0, 512), logger: promslog.NewNopLogger(), retention: o.Retention, limits: o.Limits, broadcast: func([]byte) {}, st: state{}, } + if o.Metrics == nil { + return nil, errors.New("Options.Metrics is nil") + } s.metrics = newMetrics(o.Metrics, s) if o.Logger != nil { @@ -388,6 +511,16 @@ func (s *Silences) nowUTC() time.Time { return s.clock.Now().UTC() } +// updateSizeMetrics updates the size metrics for state, matcher index, and version index. +// Must be called while holding s.mtx. +func (s *Silences) updateSizeMetrics() { + if s.metrics != nil && s.metrics.stateSize != nil { + s.metrics.stateSize.Set(float64(len(s.st))) + s.metrics.matcherIndexSize.Set(float64(len(s.mi))) + s.metrics.versionIndexSize.Set(float64(len(s.vi))) + } +} + // Maintenance garbage collects the silence state at the given interval. If the snapshot // file is set, a snapshot is written to it afterwards. // Terminates on receiving from stopc. @@ -446,8 +579,7 @@ Loop: break Loop case <-t.C: if err := runMaintenance(doMaintenance); err != nil { - // @tjhop: this should probably log at error level - s.logger.Info("Running maintenance failed", "err", err) + s.logger.Error("Running maintenance failed", "err", err) } } } @@ -457,8 +589,7 @@ Loop: return } if err := runMaintenance(doMaintenance); err != nil { - // @tjhop: this should probably log at error level - s.logger.Info("Creating shutdown snapshot failed", "err", err) + s.logger.Error("Creating shutdown snapshot failed", "err", err) } } @@ -470,22 +601,60 @@ func (s *Silences) GC() (int, error) { now := s.nowUTC() var n int + var errs error s.mtx.Lock() defer s.mtx.Unlock() - for id, sil := range s.st { + // During GC we will delete expired silences from the state map and the indices. + // If between the last GC's deletion, and including any silences that were added + // until now, we have more than 50% spare capacity, we want to reallocate to a smaller + // slice, while still leaving some growth buffer. + needsRealloc := cap(s.vi) > 1024 && len(s.vi) < cap(s.vi)/2 + + var targetVi versionIndex + if needsRealloc { + // Allocate new slice with growth buffer. + newCap := max(len(s.vi)*5/4, 1024) + targetVi = make(versionIndex, 0, newCap) + } else { + targetVi = s.vi[:0] + } + + // Iterate state map directly (fast - no extra lookups). + for _, sv := range s.vi { + sil, ok := s.st[sv.id] + expire := false + if !ok { + // Silence in version index but not in state - remove from version index and count error + s.metrics.gcErrorsTotal.Inc() + errs = errors.Join(errs, fmt.Errorf("silence %s in version index missing from state", sv.id)) + // not adding to targetVi effectively removes it + continue + } if sil.ExpiresAt.IsZero() { - return n, errors.New("unexpected zero expiration timestamp") + // Invalid expiration timestamp - remove silence and count error + s.metrics.gcErrorsTotal.Inc() + errs = errors.Join(errs, fmt.Errorf("silence %s has zero expiration timestamp", sil.Silence.Id)) + expire = true } - if !sil.ExpiresAt.After(now) { - delete(s.st, id) - delete(s.mc, sil.Silence.Id) + if expire || !sil.ExpiresAt.After(now) { + delete(s.st, sil.Silence.Id) + delete(s.mi, sil.Silence.Id) n++ + } else { + targetVi = append(targetVi, sv) } } - return n, nil + if !needsRealloc { + // If we didn't reallocate, clear tail to prevent string pointer leaks + clear(s.vi[len(targetVi):]) + } + s.vi = targetVi + s.updateSizeMetrics() + + return n, errs } func validateMatcher(m *pb.Matcher) error { @@ -562,6 +731,16 @@ func (s *Silences) checkSizeLimits(msil *pb.MeshSilence) error { return nil } +func (s *Silences) indexSilence(sil *pb.Silence) { + s.version++ + s.vi.add(s.version, sil.Id) + _, err := s.mi.add(sil) + if err != nil { + s.metrics.matcherCompileIndexSilenceErrorsTotal.Inc() + s.logger.Error("Failed to compile silence matchers", "silence_id", sil.Id, "err", err) + } +} + func (s *Silences) getSilence(id string) (*pb.Silence, bool) { msil, ok := s.st[id] if !ok { @@ -584,7 +763,8 @@ func (s *Silences) setSilence(msil *pb.MeshSilence, now time.Time) error { } _, added := s.st.merge(msil, now) if added { - s.version++ + s.indexSilence(msil.Silence) + s.updateSizeMetrics() } s.broadcast(b) return nil @@ -592,7 +772,10 @@ func (s *Silences) setSilence(msil *pb.MeshSilence, now time.Time) error { // Set the specified silence. If a silence with the ID already exists and the modification // modifies history, the old silence gets expired and a new one is created. -func (s *Silences) Set(sil *pb.Silence) error { +func (s *Silences) Set(ctx context.Context, sil *pb.Silence) error { + _, span := tracer.Start(ctx, "silences.Set") + defer span.End() + now := s.nowUTC() if sil.StartsAt.IsZero() { sil.StartsAt = now @@ -628,7 +811,7 @@ func (s *Silences) Set(sil *pb.Silence) error { } } - uid, err := uuid.NewV4() + uid, err := uuid.NewRandom() if err != nil { return fmt.Errorf("generate uuid: %w", err) } @@ -683,9 +866,15 @@ func canUpdate(a, b *pb.Silence, now time.Time) bool { } // Expire the silence with the given ID immediately. -func (s *Silences) Expire(id string) error { +func (s *Silences) Expire(ctx context.Context, id string) error { s.mtx.Lock() defer s.mtx.Unlock() + + _, span := tracer.Start(ctx, "silences.Expire", trace.WithAttributes( + attribute.String("alerting.silence.id", id), + )) + defer span.End() + return s.expire(id) } @@ -719,6 +908,7 @@ type QueryParam func(*query) error type query struct { ids []string + since *int filters []silenceFilter } @@ -729,16 +919,35 @@ type silenceFilter func(*pb.Silence, *Silences, time.Time) (bool, error) // QIDs configures a query to select the given silence IDs. func QIDs(ids ...string) QueryParam { return func(q *query) error { + if len(ids) == 0 { + return errors.New("QIDs filter must have at least one id") + } + if q.since != nil { + return fmt.Errorf("QSince cannot be used with QIDs") + } q.ids = append(q.ids, ids...) return nil } } +// QSince filters silences to those created after the provided version. This can be used to +// scan all silences which have been added after the provided version to incrementally update +// a cache. +func QSince(version int) QueryParam { + return func(q *query) error { + if len(q.ids) != 0 { + return fmt.Errorf("QSince cannot be used with QIDs") + } + q.since = &version + return nil + } +} + // QMatches returns silences that match the given label set. func QMatches(set model.LabelSet) QueryParam { return func(q *query) error { f := func(sil *pb.Silence, s *Silences, _ time.Time) (bool, error) { - m, err := s.mc.Get(sil) + m, err := s.mi.get(sil) if err != nil { return true, err } @@ -766,10 +975,8 @@ func QState(states ...types.SilenceState) QueryParam { f := func(sil *pb.Silence, _ *Silences, now time.Time) (bool, error) { s := getState(sil, now) - for _, ps := range states { - if s == ps { - return true, nil - } + if slices.Contains(states, s) { + return true, nil } return false, nil } @@ -780,8 +987,12 @@ func QState(states ...types.SilenceState) QueryParam { // QueryOne queries with the given parameters and returns the first result. // Returns ErrNotFound if the query result is empty. -func (s *Silences) QueryOne(params ...QueryParam) (*pb.Silence, error) { - res, _, err := s.Query(params...) +func (s *Silences) QueryOne(ctx context.Context, params ...QueryParam) (*pb.Silence, error) { + _, span := tracer.Start(ctx, "inhibit.Silences.QueryOne", + trace.WithSpanKind(trace.SpanKindInternal), + ) + defer span.End() + res, _, err := s.Query(ctx, params...) if err != nil { return nil, err } @@ -793,10 +1004,11 @@ func (s *Silences) QueryOne(params ...QueryParam) (*pb.Silence, error) { // Query for silences based on the given query parameters. It returns the // resulting silences and the state version the result is based on. -func (s *Silences) Query(params ...QueryParam) ([]*pb.Silence, int, error) { - s.mtx.Lock() - defer s.mtx.Unlock() - +func (s *Silences) Query(ctx context.Context, params ...QueryParam) ([]*pb.Silence, int, error) { + _, span := tracer.Start(ctx, "inhibit.Silences.Query", + trace.WithSpanKind(trace.SpanKindInternal), + ) + defer span.End() s.metrics.queriesTotal.Inc() defer prometheus.NewTimer(s.metrics.queryDuration).ObserveDuration() @@ -822,51 +1034,94 @@ func (s *Silences) Version() int { } // CountState counts silences by state. -func (s *Silences) CountState(states ...types.SilenceState) (int, error) { +func (s *Silences) CountState(ctx context.Context, states ...types.SilenceState) (int, error) { + _, span := tracer.Start(ctx, "inhibit.Silences.CountState", + trace.WithSpanKind(trace.SpanKindInternal), + ) + defer span.End() // This could probably be optimized. - sils, _, err := s.Query(QState(states...)) + sils, _, err := s.Query(ctx, QState(states...)) if err != nil { return -1, err } return len(sils), nil } +// query executes the given query and returns the resulting silences. func (s *Silences) query(q *query, now time.Time) ([]*pb.Silence, int, error) { - // If we have no ID constraint, all silences are our base set. This and - // the use of post-filter functions is the trivial solution for now. var res []*pb.Silence + var err error + + scannedCount := 0 + defer func() { + s.metrics.queryScannedTotal.Add(float64(scannedCount)) + }() + // appendIfFiltersMatch appends the given silence to the result set + // if it matches all filters in the query. In case of a filter error, the error is returned. + appendIfFiltersMatch := func(res []*pb.Silence, sil *pb.Silence) ([]*pb.Silence, error) { + for _, f := range q.filters { + matches, err := f(sil, s, now) + // In case of error return it immediately and don't process further filters. + if err != nil { + return res, err + } + // If one filter doesn't match, return the result unchanged, immediately. + if !matches { + return res, nil + } + } + // All filters matched, append the silence to the result. + return append(res, cloneSilence(sil)), nil + } + + // Preallocate result slice if we have IDs (if not this will be a no-op) + res = make([]*pb.Silence, 0, len(q.ids)) + + // Take a read lock on Silences: we can read but not modify the Silences struct. + s.mtx.RLock() + defer s.mtx.RUnlock() + + // If we have IDs, only consider the silences with the given IDs, if they exist. if q.ids != nil { for _, id := range q.ids { - if s, ok := s.st[id]; ok { - res = append(res, s.Silence) + if sil, ok := s.st[id]; ok { + scannedCount++ + // append the silence to the results if it satisfies the query. + res, err = appendIfFiltersMatch(res, sil.Silence) + if err != nil { + return nil, s.version, err + } } } } else { - for _, sil := range s.st { - res = append(res, sil.Silence) + start := 0 + if q.since != nil { + var found bool + start, found = s.vi.findVersionGreaterThan(*q.since) + // no new silences, nothing to do + if !found { + return res, s.version, nil + } + // Track how many silences we skipped using the version index. + s.metrics.querySkippedTotal.Add(float64(start)) } - } - - var resf []*pb.Silence - for _, sil := range res { - remove := false - for _, f := range q.filters { - ok, err := f(sil, s, now) + // Preallocate result slice with a reasonable capacity. If we are + // scanning less than 64 silences, we can allocate that many, + // otherwise we just allocate 64 and let it grow as needed. + res = make([]*pb.Silence, 0, min(64, len(s.vi)-start)) + for _, sv := range s.vi[start:] { + scannedCount++ + sil := s.st[sv.id] + // append the silence to the results if it satisfies the query. + res, err = appendIfFiltersMatch(res, sil.Silence) if err != nil { return nil, s.version, err } - if !ok { - remove = true - break - } - } - if !remove { - resf = append(resf, cloneSilence(sil)) } } - return resf, s.version, nil + return res, s.version, nil } // loadSnapshot loads a snapshot generated by Snapshot() into the state. @@ -876,6 +1131,11 @@ func (s *Silences) loadSnapshot(r io.Reader) error { if err != nil { return err } + + mi := make(matcherIndex, len(st)) // for a map, len is ok as a size hint. + // Choose new version index capacity with some growth buffer. + vi := make(versionIndex, 0, max(len(st)*5/4, 1024)) + for _, e := range st { // Comments list was moved to a single comment. Upgrade on loading the snapshot. if len(e.Silence.Comments) > 0 { @@ -883,11 +1143,22 @@ func (s *Silences) loadSnapshot(r io.Reader) error { e.Silence.CreatedBy = e.Silence.Comments[0].Author e.Silence.Comments = nil } - st[e.Silence.Id] = e + // Add to matcher index, and only if successful, to the new state. + if _, err := mi.add(e.Silence); err != nil { + s.metrics.matcherCompileLoadSnapshotErrorsTotal.Inc() + s.logger.Error("Failed to compile silence matchers during snapshot load", "silence_id", e.Silence.Id, "err", err) + } else { + st[e.Silence.Id] = e + + vi.add(s.version+1, e.Silence.Id) + } } s.mtx.Lock() s.st = st + s.mi = mi + s.vi = vi s.version++ + s.updateSizeMetrics() s.mtx.Unlock() return nil @@ -933,7 +1204,7 @@ func (s *Silences) Merge(b []byte) error { merged, added := s.st.merge(e, now) if merged { if added { - s.version++ + s.indexSilence(e.Silence) } if !cluster.OversizedMessage(b) { // If this is the first we've seen the message and it's @@ -946,6 +1217,7 @@ func (s *Silences) Merge(b []byte) error { } } } + s.updateSizeMetrics() return nil } diff --git a/vendor/github.com/prometheus/alertmanager/store/store.go b/vendor/github.com/prometheus/alertmanager/store/store.go index 11e440c1415..bcb69b0f3a9 100644 --- a/vendor/github.com/prometheus/alertmanager/store/store.go +++ b/vendor/github.com/prometheus/alertmanager/store/store.go @@ -150,3 +150,11 @@ func (a *Alerts) Empty() bool { return len(a.c) == 0 } + +// Len returns the number of alerts in the store. +func (a *Alerts) Len() int { + a.Lock() + defer a.Unlock() + + return len(a.c) +} diff --git a/vendor/github.com/prometheus/alertmanager/template/default.tmpl b/vendor/github.com/prometheus/alertmanager/template/default.tmpl index 57e877c0c21..cdbceb5324b 100644 --- a/vendor/github.com/prometheus/alertmanager/template/default.tmpl +++ b/vendor/github.com/prometheus/alertmanager/template/default.tmpl @@ -217,3 +217,14 @@ Alerts Resolved: {{ define "rocketchat.default.emoji" }}{{ end }} {{ define "rocketchat.default.iconurl" }}{{ end }} {{ define "rocketchat.default.text" }}{{ end }} + +{{ define "mattermost.default.text" }} +{{ if gt (len .Alerts.Firing) 0 }} +# Alerts Firing: +{{ template "__text_alert_list_markdown" .Alerts.Firing }} +{{ end }} +{{ if gt (len .Alerts.Resolved) 0 }} +# Alerts Resolved: +{{ template "__text_alert_list_markdown" .Alerts.Resolved }} +{{ end }} +{{ end }} \ No newline at end of file diff --git a/vendor/github.com/prometheus/alertmanager/template/template.go b/vendor/github.com/prometheus/alertmanager/template/template.go index 31939902878..b361ec03de5 100644 --- a/vendor/github.com/prometheus/alertmanager/template/template.go +++ b/vendor/github.com/prometheus/alertmanager/template/template.go @@ -15,11 +15,13 @@ package template import ( "bytes" + "encoding/json" tmplhtml "html/template" "io" "net/url" "path" "path/filepath" + "reflect" "regexp" "sort" "strings" @@ -30,6 +32,7 @@ import ( "github.com/prometheus/common/model" "golang.org/x/text/cases" "golang.org/x/text/language" + "gopkg.in/yaml.v2" "github.com/prometheus/alertmanager/asset" "github.com/prometheus/alertmanager/types" @@ -186,6 +189,10 @@ var DefaultFuncs = FuncMap{ "safeHtml": func(text string) tmplhtml.HTML { return tmplhtml.HTML(text) }, + "safeUrl": func(text string) tmplhtml.URL { + return tmplhtml.URL(text) + }, + "urlUnescape": url.QueryUnescape, "reReplaceAll": func(pattern, repl, text string) string { re := regexp.MustCompile(pattern) return re.ReplaceAllString(text, repl) @@ -207,6 +214,13 @@ var DefaultFuncs = FuncMap{ }, "since": time.Since, "humanizeDuration": commonTemplates.HumanizeDuration, + "toJson": func(v any) (string, error) { + bytes, err := json.Marshal(v) + if err != nil { + return "", err + } + return string(bytes), nil + }, } // Pair is a key/value string pair. @@ -423,3 +437,66 @@ func (t *Template) Data(recv string, groupLabels model.LabelSet, alerts ...*type return data } + +type TemplateFunc func(string) (string, error) + +// DeepCopyWithTemplate returns a deep copy of a map/slice/array/string/int/bool or combination thereof, executing the +// provided template (with the provided data) on all string keys or values. All maps are connverted to +// map[string]any, with all non-string keys discarded. +func DeepCopyWithTemplate(value any, tmplTextFunc TemplateFunc) (any, error) { + if value == nil { + return value, nil + } + + valueMeta := reflect.ValueOf(value) + switch valueMeta.Kind() { + + case reflect.String: + parsed, ok := tmplTextFunc(value.(string)) + if ok == nil { + var inlineType any + err := yaml.Unmarshal([]byte(parsed), &inlineType) + if err != nil || (inlineType != nil && reflect.TypeOf(inlineType).Kind() == reflect.String) { + // ignore error, thus the string is not an interface + return parsed, ok + } + return DeepCopyWithTemplate(inlineType, tmplTextFunc) + } + return parsed, ok + + case reflect.Array, reflect.Slice: + arrayLen := valueMeta.Len() + converted := make([]any, arrayLen) + for i := range arrayLen { + var err error + converted[i], err = DeepCopyWithTemplate(valueMeta.Index(i).Interface(), tmplTextFunc) + if err != nil { + return nil, err + } + } + return converted, nil + + case reflect.Map: + keys := valueMeta.MapKeys() + converted := make(map[string]any, len(keys)) + + for _, keyMeta := range keys { + var err error + strKey, isString := keyMeta.Interface().(string) + if !isString { + continue + } + strKey, err = tmplTextFunc(strKey) + if err != nil { + return nil, err + } + converted[strKey], err = DeepCopyWithTemplate(valueMeta.MapIndex(keyMeta).Interface(), tmplTextFunc) + if err != nil { + return nil, err + } + } + return converted, nil + default: + return value, nil + } +} diff --git a/vendor/github.com/prometheus/alertmanager/tracing/http.go b/vendor/github.com/prometheus/alertmanager/tracing/http.go new file mode 100644 index 00000000000..23ed944ef07 --- /dev/null +++ b/vendor/github.com/prometheus/alertmanager/tracing/http.go @@ -0,0 +1,50 @@ +// Copyright 2024 Prometheus Team +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tracing + +import ( + "context" + "fmt" + "net/http" + "net/http/httptrace" + + "go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace" + "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" +) + +// TODO: maybe move these into prometheus/common? + +// Transport wraps the provided http.RoundTripper with one that starts a span +// and injects the span context into the outbound request headers. If the +// provided http.RoundTripper is nil, http.DefaultTransport will be used as the +// base http.RoundTripper. +func Transport(rt http.RoundTripper) http.RoundTripper { + rt = otelhttp.NewTransport(rt, + otelhttp.WithClientTrace(func(ctx context.Context) *httptrace.ClientTrace { + return otelhttptrace.NewClientTrace(ctx) + }), + ) + + return rt +} + +// Middleware returns a new HTTP handler that will trace all requests with the +// HTTP method and path as the span name. +func Middleware(handler http.Handler) http.Handler { + return otelhttp.NewHandler(handler, "", + otelhttp.WithSpanNameFormatter(func(_ string, r *http.Request) string { + return fmt.Sprintf("%s %s", r.Method, r.URL.Path) + }), + ) +} diff --git a/vendor/github.com/prometheus/alertmanager/tracing/tracing.go b/vendor/github.com/prometheus/alertmanager/tracing/tracing.go new file mode 100644 index 00000000000..1fbe59ff1c0 --- /dev/null +++ b/vendor/github.com/prometheus/alertmanager/tracing/tracing.go @@ -0,0 +1,273 @@ +// Copyright 2021 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package tracing + +import ( + "context" + "fmt" + "log/slog" + "reflect" + "time" + + commoncfg "github.com/prometheus/common/config" + "github.com/prometheus/common/version" + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp" + "go.opentelemetry.io/otel/propagation" + "go.opentelemetry.io/otel/sdk/resource" + tracesdk "go.opentelemetry.io/otel/sdk/trace" + semconv "go.opentelemetry.io/otel/semconv/v1.37.0" + "go.opentelemetry.io/otel/trace" + "go.opentelemetry.io/otel/trace/noop" + "google.golang.org/grpc/credentials" + + "github.com/prometheus/alertmanager/config" +) + +const serviceName = "alertmanager" + +// Manager is capable of building, (re)installing and shutting down +// the tracer provider. +type Manager struct { + logger *slog.Logger + done chan struct{} + config config.TracingConfig + shutdownFunc func() error +} + +// NewManager creates a new tracing manager. +func NewManager(logger *slog.Logger) *Manager { + return &Manager{ + logger: logger, + done: make(chan struct{}), + } +} + +// Run starts the tracing manager. It registers the global text map propagator and error handler. +// It is blocking. +func (m *Manager) Run() { + otel.SetTextMapPropagator(propagation.TraceContext{}) + otel.SetErrorHandler(otelErrHandler(func(err error) { + m.logger.Error("OpenTelemetry handler returned an error", "err", err) + })) + <-m.done +} + +// ApplyConfig takes care of refreshing the tracing configuration by shutting down +// the current tracer provider (if any is registered) and installing a new one. +func (m *Manager) ApplyConfig(cfg *config.Config) error { + // Update only if a config change is detected. If TLS configuration is + // set, we have to restart the manager to make sure that new TLS + // certificates are picked up. + var blankTLSConfig commoncfg.TLSConfig + if reflect.DeepEqual(m.config, cfg.TracingConfig) && (m.config.TLSConfig == nil || *m.config.TLSConfig == blankTLSConfig) { + return nil + } + + if m.shutdownFunc != nil { + if err := m.shutdownFunc(); err != nil { + return fmt.Errorf("failed to shut down the tracer provider: %w", err) + } + } + + // If no endpoint is set, assume tracing should be disabled. + if cfg.TracingConfig.Endpoint == "" { + m.config = cfg.TracingConfig + m.shutdownFunc = nil + otel.SetTracerProvider(noop.NewTracerProvider()) + m.logger.Info("Tracing provider uninstalled.") + return nil + } + + tp, shutdownFunc, err := buildTracerProvider(context.Background(), cfg.TracingConfig) + if err != nil { + return fmt.Errorf("failed to install a new tracer provider: %w", err) + } + + m.shutdownFunc = shutdownFunc + m.config = cfg.TracingConfig + otel.SetTracerProvider(tp) + + m.logger.Info("Successfully installed a new tracer provider.") + return nil +} + +// Stop gracefully shuts down the tracer provider and stops the tracing manager. +func (m *Manager) Stop() { + defer close(m.done) + + if m.shutdownFunc == nil { + return + } + + if err := m.shutdownFunc(); err != nil { + m.logger.Error("failed to shut down the tracer provider", "err", err) + } + + m.logger.Info("Tracing manager stopped") +} + +type otelErrHandler func(err error) + +func (o otelErrHandler) Handle(err error) { + o(err) +} + +// buildTracerProvider return a new tracer provider ready for installation, together +// with a shutdown function. +func buildTracerProvider(ctx context.Context, tracingCfg config.TracingConfig) (trace.TracerProvider, func() error, error) { + client, err := getClient(tracingCfg) + if err != nil { + return nil, nil, err + } + + exp, err := otlptrace.New(ctx, client) + if err != nil { + return nil, nil, err + } + + // Create a resource describing the service and the runtime. + res, err := resource.New( + ctx, + resource.WithSchemaURL(semconv.SchemaURL), + resource.WithAttributes( + semconv.ServiceNameKey.String(serviceName), + semconv.ServiceVersionKey.String(version.Version), + ), + resource.WithProcessRuntimeDescription(), + resource.WithTelemetrySDK(), + ) + if err != nil { + return nil, nil, err + } + + tp := tracesdk.NewTracerProvider( + tracesdk.WithBatcher(exp), + tracesdk.WithSampler(tracesdk.ParentBased( + tracesdk.TraceIDRatioBased(tracingCfg.SamplingFraction), + )), + tracesdk.WithResource(res), + ) + + return tp, func() error { + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second) + defer cancel() + err := tp.Shutdown(ctx) + if err != nil { + return err + } + + return nil + }, nil +} + +// headersToMap converts prometheus/common Headers to a simple map[string]string. +// It takes the first value from Values, Secrets, or Files for each header. +func headersToMap(headers *commoncfg.Headers) (map[string]string, error) { + if headers == nil || len(headers.Headers) == 0 { + return nil, nil + } + + result := make(map[string]string) + for name, header := range headers.Headers { + if len(header.Values) > 0 { + result[name] = header.Values[0] + } else if len(header.Secrets) > 0 { + result[name] = string(header.Secrets[0]) + } else if len(header.Files) > 0 { + // Note: Files would need to be read at runtime. For tracing config, + // we only support direct values and secrets. + return nil, fmt.Errorf("header files are not supported for tracing configuration") + } + } + return result, nil +} + +// getClient returns an appropriate OTLP client (either gRPC or HTTP), based +// on the provided tracing configuration. +func getClient(tracingCfg config.TracingConfig) (otlptrace.Client, error) { + var client otlptrace.Client + switch tracingCfg.ClientType { + case config.TracingClientGRPC: + opts := []otlptracegrpc.Option{otlptracegrpc.WithEndpoint(tracingCfg.Endpoint)} + + switch { + case tracingCfg.Insecure: + opts = append(opts, otlptracegrpc.WithInsecure()) + case tracingCfg.TLSConfig != nil: + // Use of TLS Credentials forces the use of TLS. Therefore it can + // only be set when `insecure` is set to false. + tlsConf, err := commoncfg.NewTLSConfig(tracingCfg.TLSConfig) + if err != nil { + return nil, err + } + opts = append(opts, otlptracegrpc.WithTLSCredentials(credentials.NewTLS(tlsConf))) + } + + if tracingCfg.Compression != "" { + opts = append(opts, otlptracegrpc.WithCompressor(tracingCfg.Compression)) + } + + headers, err := headersToMap(tracingCfg.Headers) + if err != nil { + return nil, err + } + if len(headers) > 0 { + opts = append(opts, otlptracegrpc.WithHeaders(headers)) + } + + if tracingCfg.Timeout != 0 { + opts = append(opts, otlptracegrpc.WithTimeout(time.Duration(tracingCfg.Timeout))) + } + + client = otlptracegrpc.NewClient(opts...) + case config.TracingClientHTTP: + opts := []otlptracehttp.Option{otlptracehttp.WithEndpoint(tracingCfg.Endpoint)} + + switch { + case tracingCfg.Insecure: + opts = append(opts, otlptracehttp.WithInsecure()) + case tracingCfg.TLSConfig != nil: + tlsConf, err := commoncfg.NewTLSConfig(tracingCfg.TLSConfig) + if err != nil { + return nil, err + } + opts = append(opts, otlptracehttp.WithTLSClientConfig(tlsConf)) + } + + if tracingCfg.Compression == config.GzipCompression { + opts = append(opts, otlptracehttp.WithCompression(otlptracehttp.GzipCompression)) + } + + headers, err := headersToMap(tracingCfg.Headers) + if err != nil { + return nil, err + } + if len(headers) > 0 { + opts = append(opts, otlptracehttp.WithHeaders(headers)) + } + + if tracingCfg.Timeout != 0 { + opts = append(opts, otlptracehttp.WithTimeout(time.Duration(tracingCfg.Timeout))) + } + + client = otlptracehttp.NewClient(opts...) + default: + return nil, fmt.Errorf("unknown tracing client type: %s", tracingCfg.ClientType) + } + + return client, nil +} diff --git a/vendor/github.com/prometheus/alertmanager/types/types.go b/vendor/github.com/prometheus/alertmanager/types/types.go index 727ac320e3e..2cf9dd4501d 100644 --- a/vendor/github.com/prometheus/alertmanager/types/types.go +++ b/vendor/github.com/prometheus/alertmanager/types/types.go @@ -14,6 +14,7 @@ package types import ( + "context" "fmt" "strings" "sync" @@ -471,7 +472,7 @@ func (a *Alert) Merge(o *Alert) *Alert { // maintain an underlying AlertMarker are expected to update it during a call of // Mutes. type Muter interface { - Mutes(model.LabelSet) bool + Mutes(ctx context.Context, lset model.LabelSet) bool } // A TimeMuter determines if the time is muted by one or more active or mute @@ -482,10 +483,10 @@ type TimeMuter interface { } // A MuteFunc is a function that implements the Muter interface. -type MuteFunc func(model.LabelSet) bool +type MuteFunc func(ctx context.Context, lset model.LabelSet) bool // Mutes implements the Muter interface. -func (f MuteFunc) Mutes(lset model.LabelSet) bool { return f(lset) } +func (f MuteFunc) Mutes(ctx context.Context, lset model.LabelSet) bool { return f(ctx, lset) } // A Silence determines whether a given label set is muted. type Silence struct { diff --git a/vendor/github.com/prometheus/alertmanager/ui/web.go b/vendor/github.com/prometheus/alertmanager/ui/web.go index 3b81135237e..4c6d1894632 100644 --- a/vendor/github.com/prometheus/alertmanager/ui/web.go +++ b/vendor/github.com/prometheus/alertmanager/ui/web.go @@ -1,4 +1,4 @@ -// Copyright 2015 Prometheus Team +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -19,6 +19,7 @@ import ( "net/http" _ "net/http/pprof" // Comment this line to disable pprof endpoint. "path" + "strings" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/prometheus/common/route" @@ -87,8 +88,17 @@ func Register(r *route.Router, reloadCh chan<- chan error, logger *slog.Logger) w.WriteHeader(http.StatusOK) }) - r.Get("/debug/*subpath", http.DefaultServeMux.ServeHTTP) - r.Post("/debug/*subpath", http.DefaultServeMux.ServeHTTP) + debugHandlerFunc := func(w http.ResponseWriter, req *http.Request) { + subpath := route.Param(req.Context(), "subpath") + req.URL.Path = path.Join("/debug", subpath) + // path.Join removes trailing slashes, but some pprof handlers expect them. + if strings.HasSuffix(subpath, "/") && !strings.HasSuffix(req.URL.Path, "/") { + req.URL.Path += "/" + } + http.DefaultServeMux.ServeHTTP(w, req) + } + r.Get("/debug/*subpath", debugHandlerFunc) + r.Post("/debug/*subpath", debugHandlerFunc) } func disableCaching(w http.ResponseWriter) { diff --git a/vendor/github.com/trivago/tgo/tcontainer/arrays.go b/vendor/github.com/trivago/tgo/tcontainer/arrays.go deleted file mode 100644 index ede9aed3ed7..00000000000 --- a/vendor/github.com/trivago/tgo/tcontainer/arrays.go +++ /dev/null @@ -1,113 +0,0 @@ -// Copyright 2015-2018 trivago N.V. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package tcontainer - -import "sort" - -// Int64Slice is a typedef to allow sortable int64 slices -type Int64Slice []int64 - -func (s Int64Slice) Len() int { - return len(s) -} - -func (s Int64Slice) Less(i, j int) bool { - return s[i] < s[j] -} - -func (s Int64Slice) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} - -// Sort is a shortcut for sort.Sort(s) -func (s Int64Slice) Sort() { - sort.Sort(s) -} - -// IsSorted is a shortcut for sort.IsSorted(s) -func (s Int64Slice) IsSorted() bool { - return sort.IsSorted(s) -} - -// Set sets all values in this slice to the given value -func (s Int64Slice) Set(v int64) { - for i := range s { - s[i] = v - } -} - -// Uint64Slice is a typedef to allow sortable uint64 slices -type Uint64Slice []uint64 - -func (s Uint64Slice) Len() int { - return len(s) -} - -func (s Uint64Slice) Less(i, j int) bool { - return s[i] < s[j] -} - -func (s Uint64Slice) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} - -// Sort is a shortcut for sort.Sort(s) -func (s Uint64Slice) Sort() { - sort.Sort(s) -} - -// IsSorted is a shortcut for sort.IsSorted(s) -func (s Uint64Slice) IsSorted() bool { - return sort.IsSorted(s) -} - -// Set sets all values in this slice to the given value -func (s Uint64Slice) Set(v uint64) { - for i := range s { - s[i] = v - } -} - -// Float32Slice is a typedef to allow sortable float32 slices -type Float32Slice []float32 - -func (s Float32Slice) Len() int { - return len(s) -} - -func (s Float32Slice) Less(i, j int) bool { - return s[i] < s[j] -} - -func (s Float32Slice) Swap(i, j int) { - s[i], s[j] = s[j], s[i] -} - -// Sort is a shortcut for sort.Sort(s) -func (s Float32Slice) Sort() { - sort.Sort(s) -} - -// IsSorted is a shortcut for sort.IsSorted(s) -func (s Float32Slice) IsSorted() bool { - return sort.IsSorted(s) -} - -// Set sets all values in this slice to the given value -func (s Float32Slice) Set(v float32) { - for i := range s { - s[i] = v - } -} diff --git a/vendor/github.com/trivago/tgo/tcontainer/bytepool.go b/vendor/github.com/trivago/tgo/tcontainer/bytepool.go deleted file mode 100644 index c1290b766d3..00000000000 --- a/vendor/github.com/trivago/tgo/tcontainer/bytepool.go +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright 2015-2018 trivago N.V. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package tcontainer - -import ( - "reflect" - "runtime" - "sync/atomic" - "unsafe" -) - -const ( - tiny = 64 - small = 512 - medium = 1024 - large = 1024 * 10 - huge = 1024 * 100 - - tinyCount = 16384 // 1 MB - smallCount = 2048 // 1 MB - mediumCount = 1024 // 1 MB - largeCount = 102 // ~1 MB - hugeCount = 10 // ~1 MB -) - -type byteSlab struct { - buffer []byte - bufferSize uintptr - stride uintptr - basePtr *uintptr - nextPtr *uintptr -} - -// BytePool is a fragmentation friendly way to allocated byte slices. -type BytePool struct { - tinySlab byteSlab - smallSlab byteSlab - mediumSlab byteSlab - largeSlab byteSlab - hugeSlab byteSlab -} - -func newByteSlab(size, count int) byteSlab { - bufferSize := count * size - buffer := make([]byte, bufferSize) - basePtr := (*reflect.SliceHeader)(unsafe.Pointer(&buffer)).Data - nextPtr := basePtr + uintptr(bufferSize) - - return byteSlab{ - buffer: buffer, - bufferSize: uintptr(bufferSize), - stride: uintptr(size), - basePtr: &basePtr, - nextPtr: &nextPtr, - } -} - -func (slab *byteSlab) getSlice(size int) (chunk []byte) { - chunkHeader := (*reflect.SliceHeader)(unsafe.Pointer(&chunk)) - chunkHeader.Len = size - chunkHeader.Cap = int(slab.stride) - - for { - // WARNING: The following two lines are order sensitive - basePtr := atomic.LoadUintptr(slab.basePtr) - nextPtr := atomic.AddUintptr(slab.nextPtr, -slab.stride) - lastPtr := basePtr + slab.bufferSize - - switch { - case nextPtr < basePtr || nextPtr >= lastPtr: - // out of range either means alloc while realloc or race between - // base and next during realloc. In the latter case we lose a chunk. - runtime.Gosched() - - case nextPtr == basePtr: - // Last item: realloc - slab.buffer = make([]byte, slab.bufferSize) - dataPtr := (*reflect.SliceHeader)(unsafe.Pointer(&slab.buffer)).Data - - // WARNING: The following two lines are order sensitive - atomic.StoreUintptr(slab.nextPtr, dataPtr+slab.bufferSize) - atomic.StoreUintptr(slab.basePtr, dataPtr) - fallthrough - - default: - chunkHeader.Data = nextPtr - return - } - } -} - -// NewBytePool creates a new BytePool with each slab using 1 MB of storage. -// The pool contains 5 slabs of different sizes: 64B, 512B, 1KB, 10KB and 100KB. -// Allocations above 100KB will be allocated directly. -func NewBytePool() BytePool { - return BytePool{ - tinySlab: newByteSlab(tiny, tinyCount), - smallSlab: newByteSlab(small, smallCount), - mediumSlab: newByteSlab(medium, mediumCount), - largeSlab: newByteSlab(large, largeCount), - hugeSlab: newByteSlab(huge, hugeCount), - } -} - -// NewBytePoolWithSize creates a new BytePool with each slab size using n MB of -// storage. See NewBytePool() for slab size details. -func NewBytePoolWithSize(n int) BytePool { - if n <= 0 { - n = 1 - } - return BytePool{ - tinySlab: newByteSlab(tiny, tinyCount*n), - smallSlab: newByteSlab(small, smallCount*n), - mediumSlab: newByteSlab(medium, mediumCount*n), - largeSlab: newByteSlab(large, largeCount*n), - hugeSlab: newByteSlab(huge, hugeCount*n), - } -} - -// Get returns a slice allocated to a normalized size. -// Sizes are organized in evenly sized buckets so that fragmentation is kept low. -func (b *BytePool) Get(size int) []byte { - switch { - case size == 0: - return []byte{} - - case size <= tiny: - return b.tinySlab.getSlice(size) - - case size <= small: - return b.smallSlab.getSlice(size) - - case size <= medium: - return b.mediumSlab.getSlice(size) - - case size <= large: - return b.largeSlab.getSlice(size) - - case size <= huge: - return b.hugeSlab.getSlice(size) - - default: - return make([]byte, size) - } -} diff --git a/vendor/github.com/trivago/tgo/tcontainer/marshalmap.go b/vendor/github.com/trivago/tgo/tcontainer/marshalmap.go deleted file mode 100644 index 7564f3b5f7c..00000000000 --- a/vendor/github.com/trivago/tgo/tcontainer/marshalmap.go +++ /dev/null @@ -1,565 +0,0 @@ -// Copyright 2015-2018 trivago N.V. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package tcontainer - -import ( - "fmt" - "reflect" - "strconv" - "strings" - "time" - - "github.com/trivago/tgo/treflect" -) - -// MarshalMap is a wrapper type to attach converter methods to maps normally -// returned by marshalling methods, i.e. key/value parsers. -// All methods that do a conversion will return an error if the value stored -// behind key is not of the expected type or if the key is not existing in the -// map. -type MarshalMap map[string]interface{} - -const ( - // MarshalMapSeparator defines the rune used for path separation - MarshalMapSeparator = '/' - // MarshalMapArrayBegin defines the rune starting array index notation - MarshalMapArrayBegin = '[' - // MarshalMapArrayEnd defines the rune ending array index notation - MarshalMapArrayEnd = ']' -) - -// NewMarshalMap creates a new marshal map (string -> interface{}) -func NewMarshalMap() MarshalMap { - return make(map[string]interface{}) -} - -// TryConvertToMarshalMap converts collections to MarshalMap if possible. -// This is a deep conversion, i.e. each element in the collection will be -// traversed. You can pass a formatKey function that will be applied to all -// string keys that are detected. -func TryConvertToMarshalMap(value interface{}, formatKey func(string) string) interface{} { - valueMeta := reflect.ValueOf(value) - switch valueMeta.Kind() { - default: - return value - - case reflect.Array, reflect.Slice: - arrayLen := valueMeta.Len() - converted := make([]interface{}, arrayLen) - for i := 0; i < arrayLen; i++ { - converted[i] = TryConvertToMarshalMap(valueMeta.Index(i).Interface(), formatKey) - } - return converted - - case reflect.Map: - converted := NewMarshalMap() - keys := valueMeta.MapKeys() - - for _, keyMeta := range keys { - strKey, isString := keyMeta.Interface().(string) - if !isString { - continue - } - if formatKey != nil { - strKey = formatKey(strKey) - } - val := valueMeta.MapIndex(keyMeta).Interface() - converted[strKey] = TryConvertToMarshalMap(val, formatKey) - } - return converted // ### return, converted MarshalMap ### - } -} - -// ConvertToMarshalMap tries to convert a compatible map type to a marshal map. -// Compatible types are map[interface{}]interface{}, map[string]interface{} and of -// course MarshalMap. The same rules as for ConvertValueToMarshalMap apply. -func ConvertToMarshalMap(value interface{}, formatKey func(string) string) (MarshalMap, error) { - converted := TryConvertToMarshalMap(value, formatKey) - if result, isMap := converted.(MarshalMap); isMap { - return result, nil - } - return nil, fmt.Errorf("Root value cannot be converted to MarshalMap") -} - -// Clone creates a copy of the given MarshalMap. -func (mmap MarshalMap) Clone() MarshalMap { - clone := cloneMap(reflect.ValueOf(mmap)) - return clone.Interface().(MarshalMap) -} - -func cloneMap(mapValue reflect.Value) reflect.Value { - clone := reflect.MakeMap(mapValue.Type()) - keys := mapValue.MapKeys() - - for _, k := range keys { - v := mapValue.MapIndex(k) - switch k.Kind() { - default: - clone.SetMapIndex(k, v) - - case reflect.Array, reflect.Slice: - if v.Type().Elem().Kind() == reflect.Map { - sliceCopy := reflect.MakeSlice(v.Type(), v.Len(), v.Len()) - for i := 0; i < v.Len(); i++ { - element := v.Index(i) - sliceCopy.Index(i).Set(cloneMap(element)) - } - } else { - sliceCopy := reflect.MakeSlice(v.Type(), 0, v.Len()) - reflect.Copy(sliceCopy, v) - clone.SetMapIndex(k, sliceCopy) - } - - case reflect.Map: - vClone := cloneMap(v) - clone.SetMapIndex(k, vClone) - } - } - - return clone -} - -// Bool returns a value at key that is expected to be a boolean -func (mmap MarshalMap) Bool(key string) (bool, error) { - val, exists := mmap.Value(key) - if !exists { - return false, fmt.Errorf(`"%s" is not set`, key) - } - - boolValue, isBool := val.(bool) - if !isBool { - return false, fmt.Errorf(`"%s" is expected to be a boolean`, key) - } - return boolValue, nil -} - -// Uint returns a value at key that is expected to be an uint64 or compatible -// integer value. -func (mmap MarshalMap) Uint(key string) (uint64, error) { - val, exists := mmap.Value(key) - if !exists { - return 0, fmt.Errorf(`"%s" is not set`, key) - } - - if intVal, isNumber := treflect.Uint64(val); isNumber { - return intVal, nil - } - - return 0, fmt.Errorf(`"%s" is expected to be an unsigned number type`, key) -} - -// Int returns a value at key that is expected to be an int64 or compatible -// integer value. -func (mmap MarshalMap) Int(key string) (int64, error) { - val, exists := mmap.Value(key) - if !exists { - return 0, fmt.Errorf(`"%s" is not set`, key) - } - - if intVal, isNumber := treflect.Int64(val); isNumber { - return intVal, nil - } - - return 0, fmt.Errorf(`"%s" is expected to be a signed number type`, key) -} - -// Float returns a value at key that is expected to be a float64 or compatible -// float value. -func (mmap MarshalMap) Float(key string) (float64, error) { - val, exists := mmap.Value(key) - if !exists { - return 0, fmt.Errorf(`"%s" is not set`, key) - } - - if floatVal, isNumber := treflect.Float64(val); isNumber { - return floatVal, nil - } - - return 0, fmt.Errorf(`"%s" is expected to be a signed number type`, key) -} - -// Duration returns a value at key that is expected to be a string -func (mmap MarshalMap) Duration(key string) (time.Duration, error) { - val, exists := mmap.Value(key) - if !exists { - return time.Duration(0), fmt.Errorf(`"%s" is not set`, key) - } - - switch val.(type) { - case time.Duration: - return val.(time.Duration), nil - case string: - return time.ParseDuration(val.(string)) - } - - return time.Duration(0), fmt.Errorf(`"%s" is expected to be a duration or string`, key) -} - -// String returns a value at key that is expected to be a string -func (mmap MarshalMap) String(key string) (string, error) { - val, exists := mmap.Value(key) - if !exists { - return "", fmt.Errorf(`"%s" is not set`, key) - } - - strValue, isString := val.(string) - if !isString { - return "", fmt.Errorf(`"%s" is expected to be a string`, key) - } - return strValue, nil -} - -// Bytes returns a value at key that is expected to be a []byte -func (mmap MarshalMap) Bytes(key string) ([]byte, error) { - val, exists := mmap.Value(key) - if !exists { - return []byte{}, fmt.Errorf(`"%s" is not set`, key) - } - - bytesValue, isBytes := val.([]byte) - if !isBytes { - return []byte{}, fmt.Errorf(`"%s" is expected to be a []byte`, key) - } - return bytesValue, nil -} - -// Slice is an alias for Array -func (mmap MarshalMap) Slice(key string) ([]interface{}, error) { - return mmap.Array(key) -} - -// Array returns a value at key that is expected to be a []interface{} -func (mmap MarshalMap) Array(key string) ([]interface{}, error) { - val, exists := mmap.Value(key) - if !exists { - return nil, fmt.Errorf(`"%s" is not set`, key) - } - - arrayValue, isArray := val.([]interface{}) - if !isArray { - return nil, fmt.Errorf(`"%s" is expected to be an array`, key) - } - return arrayValue, nil -} - -// Map returns a value at key that is expected to be a -// map[interface{}]interface{}. -func (mmap MarshalMap) Map(key string) (map[interface{}]interface{}, error) { - val, exists := mmap.Value(key) - if !exists { - return nil, fmt.Errorf(`"%s" is not set`, key) - } - - mapValue, isMap := val.(map[interface{}]interface{}) - if !isMap { - return nil, fmt.Errorf(`"%s" is expected to be a map`, key) - } - return mapValue, nil -} - -func castToStringArray(key string, value interface{}) ([]string, error) { - switch value.(type) { - case string: - return []string{value.(string)}, nil - - case []interface{}: - arrayVal := value.([]interface{}) - stringArray := make([]string, 0, len(arrayVal)) - - for _, val := range arrayVal { - strValue, isString := val.(string) - if !isString { - return nil, fmt.Errorf(`"%s" does not contain string keys`, key) - } - stringArray = append(stringArray, strValue) - } - return stringArray, nil - - case []string: - return value.([]string), nil - - default: - return nil, fmt.Errorf(`"%s" is not a valid string array type`, key) - } -} - -// StringSlice is an alias for StringArray -func (mmap MarshalMap) StringSlice(key string) ([]string, error) { - return mmap.StringArray(key) -} - -// StringArray returns a value at key that is expected to be a []string -// This function supports conversion (by copy) from -// * []interface{} -func (mmap MarshalMap) StringArray(key string) ([]string, error) { - val, exists := mmap.Value(key) - if !exists { - return nil, fmt.Errorf(`"%s" is not set`, key) - } - - return castToStringArray(key, val) -} - -func castToInt64Array(key string, value interface{}) ([]int64, error) { - switch value.(type) { - case int: - return []int64{value.(int64)}, nil - - case []interface{}: - arrayVal := value.([]interface{}) - intArray := make([]int64, 0, len(arrayVal)) - - for _, val := range arrayVal { - intValue, isInt := val.(int64) - if !isInt { - return nil, fmt.Errorf(`"%s" does not contain int keys`, key) - } - intArray = append(intArray, intValue) - } - return intArray, nil - - case []int64: - return value.([]int64), nil - - default: - return nil, fmt.Errorf(`"%s" is not a valid string array type`, key) - } -} - -// Int64Slice is an alias for Int64Array -func (mmap MarshalMap) Int64Slice(key string) ([]int64, error) { - return mmap.Int64Array(key) -} - -// Int64Array returns a value at key that is expected to be a []int64 -// This function supports conversion (by copy) from -// * []interface{} -func (mmap MarshalMap) Int64Array(key string) ([]int64, error) { - val, exists := mmap.Value(key) - if !exists { - return nil, fmt.Errorf(`"%s" is not set`, key) - } - - return castToInt64Array(key, val) -} - -// StringMap returns a value at key that is expected to be a map[string]string. -// This function supports conversion (by copy) from -// * map[interface{}]interface{} -// * map[string]interface{} -func (mmap MarshalMap) StringMap(key string) (map[string]string, error) { - val, exists := mmap.Value(key) - if !exists { - return nil, fmt.Errorf(`"%s" is not set`, key) - } - - switch val.(type) { - case map[string]string: - return val.(map[string]string), nil - - default: - valueMeta := reflect.ValueOf(val) - if valueMeta.Kind() != reflect.Map { - return nil, fmt.Errorf(`"%s" is expected to be a map[string]string but is %T`, key, val) - } - - result := make(map[string]string) - for _, keyMeta := range valueMeta.MapKeys() { - strKey, isString := keyMeta.Interface().(string) - if !isString { - return nil, fmt.Errorf(`"%s" is expected to be a map[string]string. Key is not a string`, key) - } - - value := valueMeta.MapIndex(keyMeta) - strValue, isString := value.Interface().(string) - if !isString { - return nil, fmt.Errorf(`"%s" is expected to be a map[string]string. Value is not a string`, key) - } - - result[strKey] = strValue - } - - return result, nil - } -} - -// StringSliceMap is an alias for StringArrayMap -func (mmap MarshalMap) StringSliceMap(key string) (map[string][]string, error) { - return mmap.StringArrayMap(key) -} - -// StringArrayMap returns a value at key that is expected to be a -// map[string][]string. This function supports conversion (by copy) from -// * map[interface{}][]interface{} -// * map[interface{}]interface{} -// * map[string]interface{} -func (mmap MarshalMap) StringArrayMap(key string) (map[string][]string, error) { - val, exists := mmap.Value(key) - if !exists { - return nil, fmt.Errorf(`"%s" is not set`, key) - } - - switch val.(type) { - case map[string][]string: - return val.(map[string][]string), nil - - default: - valueMeta := reflect.ValueOf(val) - if valueMeta.Kind() != reflect.Map { - return nil, fmt.Errorf(`"%s" is expected to be a map[string][]string but is %T`, key, val) - } - - result := make(map[string][]string) - for _, keyMeta := range valueMeta.MapKeys() { - strKey, isString := keyMeta.Interface().(string) - if !isString { - return nil, fmt.Errorf(`"%s" is expected to be a map[string][]string. Key is not a string`, key) - } - - value := valueMeta.MapIndex(keyMeta) - arrayValue, err := castToStringArray(strKey, value.Interface()) - if err != nil { - return nil, fmt.Errorf(`"%s" is expected to be a map[string][]string. Value is not a []string`, key) - } - - result[strKey] = arrayValue - } - - return result, nil - } -} - -// MarshalMap returns a value at key that is expected to be another MarshalMap -// This function supports conversion (by copy) from -// * map[interface{}]interface{} -func (mmap MarshalMap) MarshalMap(key string) (MarshalMap, error) { - val, exists := mmap.Value(key) - if !exists { - return nil, fmt.Errorf(`"%s" is not set`, key) - } - - return ConvertToMarshalMap(val, nil) -} - -// Value returns a value from a given value path. -// Fields can be accessed by their name. Nested fields can be accessed by using -// "/" as a separator. Arrays can be addressed using the standard array -// notation "[]". -// Examples: -// "key" -> mmap["key"] single value -// "key1/key2" -> mmap["key1"]["key2"] nested map -// "key1[0]" -> mmap["key1"][0] nested array -// "key1[0]key2" -> mmap["key1"][0]["key2"] nested array, nested map -func (mmap MarshalMap) Value(key string) (val interface{}, exists bool) { - exists = mmap.resolvePath(key, mmap, func(p, k reflect.Value, v interface{}) { - val = v - }) - return val, exists -} - -// Delete a value from a given path. -// The path must point to a map key. Deleting from arrays is not supported. -func (mmap MarshalMap) Delete(key string) { - mmap.resolvePath(key, mmap, func(p, k reflect.Value, v interface{}) { - if v != nil { - p.SetMapIndex(k, reflect.Value{}) - } - }) -} - -// Set a value for a given path. -// The path must point to a map key. Setting array elements is not supported. -func (mmap MarshalMap) Set(key string, val interface{}) { - mmap.resolvePath(key, mmap, func(p, k reflect.Value, v interface{}) { - p.SetMapIndex(k, reflect.ValueOf(val)) - }) -} - -func (mmap MarshalMap) resolvePathKey(key string) (int, int) { - keyEnd := len(key) - nextKeyStart := keyEnd - pathIdx := strings.IndexRune(key, MarshalMapSeparator) - arrayIdx := strings.IndexRune(key, MarshalMapArrayBegin) - - if pathIdx > -1 && pathIdx < keyEnd { - keyEnd = pathIdx - nextKeyStart = pathIdx + 1 // don't include slash - } - if arrayIdx > -1 && arrayIdx < keyEnd { - keyEnd = arrayIdx - nextKeyStart = arrayIdx // include bracket because of multidimensional arrays - } - - // a -> key: "a", remain: "" -- value - // a/b/c -> key: "a", remain: "b/c" -- nested map - // a[1]b/c -> key: "a", remain: "[1]b/c" -- nested array - - return keyEnd, nextKeyStart -} - -func (mmap MarshalMap) resolvePath(k string, v interface{}, action func(p, k reflect.Value, v interface{})) bool { - if len(k) == 0 { - action(reflect.Value{}, reflect.ValueOf(k), v) // ### return, found requested value ### - return true - } - - vValue := reflect.ValueOf(v) - switch vValue.Kind() { - case reflect.Array, reflect.Slice: - startIdx := strings.IndexRune(k, MarshalMapArrayBegin) // Must be first char, otherwise malformed - endIdx := strings.IndexRune(k, MarshalMapArrayEnd) // Must be > startIdx, otherwise malformed - - if startIdx == -1 || endIdx == -1 { - return false - } - - if startIdx == 0 && endIdx > startIdx { - index, err := strconv.Atoi(k[startIdx+1 : endIdx]) - - // [1] -> index: "1", remain: "" -- value - // [1]a/b -> index: "1", remain: "a/b" -- nested map - // [1][2] -> index: "1", remain: "[2]" -- nested array - - if err == nil && index < vValue.Len() { - item := vValue.Index(index).Interface() - key := k[endIdx+1:] - return mmap.resolvePath(key, item, action) // ### return, nested array ### - } - } - - case reflect.Map: - kValue := reflect.ValueOf(k) - if storedValue := vValue.MapIndex(kValue); storedValue.IsValid() { - action(vValue, kValue, storedValue.Interface()) - return true - } - - keyEnd, nextKeyStart := mmap.resolvePathKey(k) - if keyEnd == len(k) { - action(vValue, kValue, nil) // call action to support setting non-existing keys - return false // ### return, key not found ### - } - - nextKey := k[:keyEnd] - nkValue := reflect.ValueOf(nextKey) - - if storedValue := vValue.MapIndex(nkValue); storedValue.IsValid() { - remain := k[nextKeyStart:] - return mmap.resolvePath(remain, storedValue.Interface(), action) // ### return, nested map ### - } - } - - return false -} diff --git a/vendor/github.com/trivago/tgo/tcontainer/trie.go b/vendor/github.com/trivago/tgo/tcontainer/trie.go deleted file mode 100644 index f72170937c8..00000000000 --- a/vendor/github.com/trivago/tgo/tcontainer/trie.go +++ /dev/null @@ -1,227 +0,0 @@ -// Copyright 2015-2018 trivago N.V. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package tcontainer - -// TrieNode represents a single node inside a trie. -// Each node can contain a payload which can be retrieved after a successfull -// match. In addition to that PathLen will contain the length of the match. -type TrieNode struct { - suffix []byte - children []*TrieNode - longestPath int - PathLen int - Payload interface{} -} - -// NewTrie creates a new root TrieNode -func NewTrie(data []byte, payload interface{}) *TrieNode { - return &TrieNode{ - suffix: data, - children: []*TrieNode{}, - longestPath: len(data), - PathLen: len(data), - Payload: payload, - } -} - -func (node *TrieNode) addNewChild(data []byte, payload interface{}, pathLen int) { - if node.longestPath < pathLen { - node.longestPath = pathLen - } - - idx := len(node.children) - node.children = append(node.children, nil) - - for idx > 0 { - nextIdx := idx - 1 - if node.children[nextIdx].longestPath > pathLen { - break - } - node.children[idx] = node.children[nextIdx] - idx = nextIdx - } - - node.children[idx] = &TrieNode{ - suffix: data, - children: []*TrieNode{}, - longestPath: pathLen, - PathLen: pathLen, - Payload: payload, - } -} - -func (node *TrieNode) replace(oldChild *TrieNode, newChild *TrieNode) { - for i, child := range node.children { - if child == oldChild { - node.children[i] = newChild - return // ### return, replaced ### - } - } -} - -// ForEach applies a function to each node in the tree including and below the -// passed node. -func (node *TrieNode) ForEach(callback func(*TrieNode)) { - callback(node) - for _, child := range node.children { - child.ForEach(callback) - } -} - -// Add adds a new data path to the trie. -// The TrieNode returned is the (new) root node so you should always reassign -// the root with the return value of Add. -func (node *TrieNode) Add(data []byte, payload interface{}) *TrieNode { - return node.addPath(data, payload, len(data), nil) -} - -func (node *TrieNode) addPath(data []byte, payload interface{}, pathLen int, parent *TrieNode) *TrieNode { - dataLen := len(data) - suffixLen := len(node.suffix) - testLen := suffixLen - if dataLen < suffixLen { - testLen = dataLen - } - - var splitIdx int - for splitIdx = 0; splitIdx < testLen; splitIdx++ { - if data[splitIdx] != node.suffix[splitIdx] { - break // ### break, split found ### - } - } - - if splitIdx == suffixLen { - // Continue down or stop here (full suffix match) - - if splitIdx == dataLen { - node.Payload = payload // may overwrite - return node // ### return, path already stored ### - } - - data = data[splitIdx:] - if suffixLen > 0 { - for _, child := range node.children { - if child.suffix[0] == data[0] { - child.addPath(data, payload, pathLen, node) - return node // ### return, continue on path ### - } - } - } - - node.addNewChild(data, payload, pathLen) - return node // ### return, new leaf ### - } - - if splitIdx == dataLen { - // Make current node a subpath of new data node (full data match) - // This case implies that dataLen < suffixLen as splitIdx == suffixLen - // did not match. - - node.suffix = node.suffix[splitIdx:] - - newParent := NewTrie(data, payload) - newParent.PathLen = pathLen - newParent.longestPath = node.longestPath - newParent.children = []*TrieNode{node} - - if parent != nil { - parent.replace(node, newParent) - } - return newParent // ### return, rotation ### - } - - // New parent required with both nodes as children (partial match) - - node.suffix = node.suffix[splitIdx:] - - newParent := NewTrie(data[:splitIdx], nil) - newParent.PathLen = 0 - newParent.longestPath = node.longestPath - newParent.children = []*TrieNode{node} - newParent.addNewChild(data[splitIdx:], payload, pathLen) - - if parent != nil { - parent.replace(node, newParent) - } - return newParent // ### return, new parent ### -} - -// Match compares the trie to the given data stream. -// Match returns true if data can be completely matched to the trie. -func (node *TrieNode) Match(data []byte) *TrieNode { - dataLen := len(data) - suffixLen := len(node.suffix) - if dataLen < suffixLen { - return nil // ### return, cannot be fully matched ### - } - - for i := 0; i < suffixLen; i++ { - if data[i] != node.suffix[i] { - return nil // ### return, no match ### - } - } - - if dataLen == suffixLen { - if node.PathLen > 0 { - return node // ### return, full match ### - } - return nil // ### return, invalid match ### - } - - data = data[suffixLen:] - numChildren := len(node.children) - for i := 0; i < numChildren; i++ { - matchedNode := node.children[i].Match(data) - if matchedNode != nil { - return matchedNode // ### return, match found ### - } - } - - return nil // ### return, no valid path ### -} - -// MatchStart compares the trie to the beginning of the given data stream. -// MatchStart returns true if the beginning of data can be matched to the trie. -func (node *TrieNode) MatchStart(data []byte) *TrieNode { - dataLen := len(data) - suffixLen := len(node.suffix) - if dataLen < suffixLen { - return nil // ### return, cannot be fully matched ### - } - - for i := 0; i < suffixLen; i++ { - if data[i] != node.suffix[i] { - return nil // ### return, no match ### - } - } - - // Match longest path first - - data = data[suffixLen:] - numChildren := len(node.children) - for i := 0; i < numChildren; i++ { - matchedNode := node.children[i].MatchStart(data) - if matchedNode != nil { - return matchedNode // ### return, match found ### - } - } - - // May be only a part of data but we have a valid match - - if node.PathLen > 0 { - return node // ### return, full match ### - } - return nil // ### return, no valid path ### -} diff --git a/vendor/github.com/trivago/tgo/treflect/clone.go b/vendor/github.com/trivago/tgo/treflect/clone.go deleted file mode 100644 index b8871262632..00000000000 --- a/vendor/github.com/trivago/tgo/treflect/clone.go +++ /dev/null @@ -1,80 +0,0 @@ -// Copyright 2015-2018 trivago N.V. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package treflect - -import ( - "reflect" -) - -// Clone does a deep copy of the given value. -// Please note that field have to be public in order to be copied. -// Private fields will be ignored. -func Clone(v interface{}) interface{} { - value := reflect.ValueOf(v) - copy := clone(value) - return copy.Interface() -} - -func clone(v reflect.Value) reflect.Value { - switch v.Kind() { - case reflect.Struct: - copy := reflect.New(v.Type()) - - for i := 0; i < v.Type().NumField(); i++ { - field := v.Field(i) - targetField := copy.Elem().Field(i) - if !targetField.CanSet() { - continue // ignore private fields - } - fieldCopy := clone(field) - targetField.Set(fieldCopy) - } - return copy.Elem() - - case reflect.Chan: - copy := reflect.MakeChan(v.Type(), v.Len()) - return copy - - case reflect.Map: - copy := reflect.MakeMap(v.Type()) - keys := v.MapKeys() - for _, k := range keys { - fieldCopy := clone(v.MapIndex(k)) - copy.SetMapIndex(k, fieldCopy) - } - return copy - - case reflect.Slice: - copy := reflect.MakeSlice(v.Type(), v.Len(), v.Len()) - for i := 0; i < v.Len(); i++ { - elementCopy := clone(v.Index(i)) - copy.Index(i).Set(elementCopy) - } - return copy - - case reflect.Array: - copy := reflect.New(v.Type()).Elem() - for i := 0; i < v.Len(); i++ { - elementCopy := clone(v.Index(i)) - copy.Index(i).Set(elementCopy) - } - return copy - - default: - copy := reflect.New(v.Type()) - copy.Elem().Set(v) - return copy.Elem() - } -} diff --git a/vendor/github.com/trivago/tgo/treflect/reflection.go b/vendor/github.com/trivago/tgo/treflect/reflection.go deleted file mode 100644 index 48a11f477e7..00000000000 --- a/vendor/github.com/trivago/tgo/treflect/reflection.go +++ /dev/null @@ -1,371 +0,0 @@ -// Copyright 2015-2018 trivago N.V. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package treflect - -import ( - "fmt" - "reflect" - "unsafe" -) - -// GetMissingMethods checks if a given object implements all methods of a -// given interface. It returns the interface coverage [0..1] as well as an array -// of error messages. If the interface is correctly implemented the coverage is -// 1 and the error message array is empty. -func GetMissingMethods(objType reflect.Type, ifaceType reflect.Type) (float32, []string) { - missing := []string{} - if objType.Implements(ifaceType) { - return 1.0, missing - } - - methodCount := ifaceType.NumMethod() - for mIdx := 0; mIdx < methodCount; mIdx++ { - ifaceMethod := ifaceType.Method(mIdx) - objMethod, exists := objType.MethodByName(ifaceMethod.Name) - signatureMismatch := false - - switch { - case !exists: - missing = append(missing, fmt.Sprintf("Missing: \"%s\" %v", ifaceMethod.Name, ifaceMethod.Type)) - continue // ### continue, error found ### - - case ifaceMethod.Type.NumOut() != objMethod.Type.NumOut(): - signatureMismatch = true - - case ifaceMethod.Type.NumIn()+1 != objMethod.Type.NumIn(): - signatureMismatch = true - - default: - for oIdx := 0; !signatureMismatch && oIdx < ifaceMethod.Type.NumOut(); oIdx++ { - signatureMismatch = ifaceMethod.Type.Out(oIdx) != objMethod.Type.Out(oIdx) - } - for iIdx := 0; !signatureMismatch && iIdx < ifaceMethod.Type.NumIn(); iIdx++ { - signatureMismatch = ifaceMethod.Type.In(iIdx) != objMethod.Type.In(iIdx+1) - } - } - - if signatureMismatch { - missing = append(missing, fmt.Sprintf("Invalid: \"%s\" %v is not %v", ifaceMethod.Name, objMethod.Type, ifaceMethod.Type)) - } - } - - return float32(methodCount-len(missing)) / float32(methodCount), missing -} - -// Int64 converts any signed number type to an int64. -// The second parameter is returned as false if a non-number type was given. -func Int64(v interface{}) (int64, bool) { - - switch reflect.TypeOf(v).Kind() { - case reflect.Int: - return int64(v.(int)), true - case reflect.Int8: - return int64(v.(int8)), true - case reflect.Int16: - return int64(v.(int16)), true - case reflect.Int32: - return int64(v.(int32)), true - case reflect.Int64: - return v.(int64), true - case reflect.Float32: - return int64(v.(float32)), true - case reflect.Float64: - return int64(v.(float64)), true - } - - return 0, false -} - -// Uint64 converts any unsigned number type to an uint64. -// The second parameter is returned as false if a non-number type was given. -func Uint64(v interface{}) (uint64, bool) { - - switch reflect.TypeOf(v).Kind() { - case reflect.Uint: - return uint64(v.(uint)), true - case reflect.Uint8: - return uint64(v.(uint8)), true - case reflect.Uint16: - return uint64(v.(uint16)), true - case reflect.Uint32: - return uint64(v.(uint32)), true - case reflect.Uint64: - return v.(uint64), true - } - - return 0, false -} - -// Float32 converts any number type to an float32. -// The second parameter is returned as false if a non-number type was given. -func Float32(v interface{}) (float32, bool) { - - switch reflect.TypeOf(v).Kind() { - case reflect.Int: - return float32(v.(int)), true - case reflect.Uint: - return float32(v.(uint)), true - case reflect.Int8: - return float32(v.(int8)), true - case reflect.Uint8: - return float32(v.(uint8)), true - case reflect.Int16: - return float32(v.(int16)), true - case reflect.Uint16: - return float32(v.(uint16)), true - case reflect.Int32: - return float32(v.(int32)), true - case reflect.Uint32: - return float32(v.(uint32)), true - case reflect.Int64: - return float32(v.(int64)), true - case reflect.Uint64: - return float32(v.(uint64)), true - case reflect.Float32: - return v.(float32), true - case reflect.Float64: - return float32(v.(float64)), true - } - - return 0, false -} - -// Float64 converts any number type to an float64. -// The second parameter is returned as false if a non-number type was given. -func Float64(v interface{}) (float64, bool) { - - switch reflect.TypeOf(v).Kind() { - case reflect.Int: - return float64(v.(int)), true - case reflect.Uint: - return float64(v.(uint)), true - case reflect.Int8: - return float64(v.(int8)), true - case reflect.Uint8: - return float64(v.(uint8)), true - case reflect.Int16: - return float64(v.(int16)), true - case reflect.Uint16: - return float64(v.(uint16)), true - case reflect.Int32: - return float64(v.(int32)), true - case reflect.Uint32: - return float64(v.(uint32)), true - case reflect.Int64: - return float64(v.(int64)), true - case reflect.Uint64: - return float64(v.(uint64)), true - case reflect.Float32: - return float64(v.(float32)), true - case reflect.Float64: - return v.(float64), true - } - - return 0, false -} - -// RemovePtrFromType will return the type of t and strips away any pointer(s) -// in front of the actual type. -func RemovePtrFromType(t interface{}) reflect.Type { - var v reflect.Type - if rt, isType := t.(reflect.Type); isType { - v = rt - } else { - v = reflect.TypeOf(t) - } - for v.Kind() == reflect.Ptr { - v = v.Elem() - } - return v -} - -// RemovePtrFromValue will return the value of t and strips away any pointer(s) -// in front of the actual type. -func RemovePtrFromValue(t interface{}) reflect.Value { - var v reflect.Value - if rv, isValue := t.(reflect.Value); isValue { - v = rv - } else { - v = reflect.ValueOf(t) - } - for v.Type().Kind() == reflect.Ptr { - v = v.Elem() - } - return v -} - -// UnsafeCopy will copy data from src to dst while ignoring type information. -// Both types need to be of the same size and dst and src have to be pointers. -// UnsafeCopy will panic if these requirements are not met. -func UnsafeCopy(dst, src interface{}) { - dstValue := reflect.ValueOf(dst) - srcValue := reflect.ValueOf(src) - UnsafeCopyValue(dstValue, srcValue) -} - -// UnsafeCopyValue will copy data from src to dst while ignoring type -// information. Both types need to be of the same size or this function will -// panic. Also both types must support dereferencing via reflect.Elem() -func UnsafeCopyValue(dstValue reflect.Value, srcValue reflect.Value) { - dstType := dstValue.Elem().Type() - srcType := srcValue.Type() - - var srcPtr uintptr - if srcValue.Kind() != reflect.Ptr { - // If we don't get a pointer to our source data we need to forcefully - // retrieve it by accessing the interface pointer. This is ok as we - // only read from it. - iface := srcValue.Interface() - srcPtr = reflect.ValueOf(&iface).Elem().InterfaceData()[1] // Pointer to data - } else { - srcType = srcValue.Elem().Type() - srcPtr = srcValue.Pointer() - } - - if dstType.Size() != srcType.Size() { - panic("Type size mismatch between " + dstType.String() + " and " + srcType.String()) - } - - dstAsSlice := *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{ - Data: dstValue.Pointer(), - Len: int(dstType.Size()), - Cap: int(dstType.Size()), - })) - - srcAsSlice := *(*[]byte)(unsafe.Pointer(&reflect.SliceHeader{ - Data: srcPtr, - Len: int(srcType.Size()), - Cap: int(srcType.Size()), - })) - - copy(dstAsSlice, srcAsSlice) -} - -// SetMemberByName sets member name of the given pointer-to-struct to the data -// passed to this function. The member may be private, too. -func SetMemberByName(ptrToStruct interface{}, name string, data interface{}) { - structVal := reflect.Indirect(reflect.ValueOf(ptrToStruct)) - member := structVal.FieldByName(name) - - SetValue(member, data) -} - -// SetMemberByIndex sets member idx of the given pointer-to-struct to the data -// passed to this function. The member may be private, too. -func SetMemberByIndex(ptrToStruct interface{}, idx int, data interface{}) { - structVal := reflect.Indirect(reflect.ValueOf(ptrToStruct)) - member := structVal.Field(idx) - - SetValue(member, data) -} - -// SetValue sets an addressable value to the data passed to this function. -// In contrast to golangs reflect package this will also work with private -// variables. Please note that this function may not support all types, yet. -func SetValue(member reflect.Value, data interface{}) { - if member.CanSet() { - member.Set(reflect.ValueOf(data).Convert(member.Type())) - return // ### return, easy way ### - } - - if !member.CanAddr() { - panic("SetValue requires addressable member type") - } - - ptrToMember := unsafe.Pointer(member.UnsafeAddr()) - dataValue := reflect.ValueOf(data) - - switch member.Kind() { - case reflect.Bool: - *(*bool)(ptrToMember) = dataValue.Bool() - - case reflect.Uint: - *(*uint)(ptrToMember) = uint(dataValue.Uint()) - - case reflect.Uint8: - *(*uint8)(ptrToMember) = uint8(dataValue.Uint()) - - case reflect.Uint16: - *(*uint16)(ptrToMember) = uint16(dataValue.Uint()) - - case reflect.Uint32: - *(*uint32)(ptrToMember) = uint32(dataValue.Uint()) - - case reflect.Uint64: - *(*uint64)(ptrToMember) = dataValue.Uint() - - case reflect.Int: - *(*int)(ptrToMember) = int(dataValue.Int()) - - case reflect.Int8: - *(*int8)(ptrToMember) = int8(dataValue.Int()) - - case reflect.Int16: - *(*int16)(ptrToMember) = int16(dataValue.Int()) - - case reflect.Int32: - *(*int32)(ptrToMember) = int32(dataValue.Int()) - - case reflect.Int64: - *(*int64)(ptrToMember) = dataValue.Int() - - case reflect.Float32: - *(*float32)(ptrToMember) = float32(dataValue.Float()) - - case reflect.Float64: - *(*float64)(ptrToMember) = dataValue.Float() - - case reflect.Complex64: - *(*complex64)(ptrToMember) = complex64(dataValue.Complex()) - - case reflect.Complex128: - *(*complex128)(ptrToMember) = dataValue.Complex() - - case reflect.String: - *(*string)(ptrToMember) = dataValue.String() - - case reflect.Map, reflect.Chan: - // Exploit the fact that "map" is actually "*runtime.hmap" and force - // overwrite that pointer in the passed struct. - // Same foes for "chan" which is actually "*runtime.hchan". - - // Note: Assigning a map or channel to another variable does NOT copy - // the contents so copying the pointer follows go's standard behavior. - dataAsPtr := unsafe.Pointer(dataValue.Pointer()) - *(**uintptr)(ptrToMember) = (*uintptr)(dataAsPtr) - - case reflect.Interface: - // Interfaces are basically two pointers, see runtime.iface. - // We want to modify exactly that data, which is returned by - // the InterfaceData() method. - - if dataValue.Kind() != reflect.Interface { - // A type reference was passed. In order to overwrite the memory - // Representation of an interface we need to generate it first. - // Reflect does not allow us to do that unless we use the - // InterfaceData method which exposes the internal representation - // of an interface. - interfaceData := reflect.ValueOf(&data).Elem().InterfaceData() - dataValue = reflect.ValueOf(interfaceData) - } - fallthrough - - default: - // Complex types are assigned memcpy style. - // Note: This should not break the garbage collector although we cannot - // be 100% sure on this. - UnsafeCopyValue(member.Addr(), dataValue) - } -} diff --git a/vendor/github.com/trivago/tgo/treflect/typeregistry.go b/vendor/github.com/trivago/tgo/treflect/typeregistry.go deleted file mode 100644 index d3e3d7eff89..00000000000 --- a/vendor/github.com/trivago/tgo/treflect/typeregistry.go +++ /dev/null @@ -1,97 +0,0 @@ -// Copyright 2015-2018 trivago N.V. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -package treflect - -import ( - "fmt" - "reflect" - "strings" -) - -// TypeRegistry is a name to type registry used to create objects by name. -type TypeRegistry struct { - namedType map[string]reflect.Type -} - -// NewTypeRegistry creates a new TypeRegistry. Note that there is a global type -// registry available in the main tgo package (tgo.TypeRegistry). -func NewTypeRegistry() TypeRegistry { - return TypeRegistry{ - namedType: make(map[string]reflect.Type), - } -} - -// Register a plugin to the TypeRegistry by passing an uninitialized object. -func (registry TypeRegistry) Register(typeInstance interface{}) { - registry.RegisterWithDepth(typeInstance, 1) -} - -// RegisterWithDepth to register a plugin to the TypeRegistry by passing an uninitialized object. -func (registry TypeRegistry) RegisterWithDepth(typeInstance interface{}, depth int) { - structType := reflect.TypeOf(typeInstance) - packageName := structType.PkgPath() - typeName := structType.Name() - - pathTokens := strings.Split(packageName, "/") - maxDepth := 3 - if len(pathTokens) < maxDepth { - maxDepth = len(pathTokens) - } - - for n := depth; n <= maxDepth; n++ { - shortTypeName := strings.Join(pathTokens[len(pathTokens)-n:], ".") + "." + typeName - registry.namedType[shortTypeName] = structType - } -} - -// New creates an uninitialized object by class name. -// The class name has to be "package.class" or "package/subpackage.class". -// The gollum package is omitted from the package path. -func (registry TypeRegistry) New(typeName string) (interface{}, error) { - structType, exists := registry.namedType[typeName] - if exists { - return reflect.New(structType).Interface(), nil - } - return nil, fmt.Errorf("Unknown class: %s", typeName) -} - -// GetTypeOf returns only the type asscociated with the given name. -// If the name is not registered, nil is returned. -// The type returned will be a pointer type. -func (registry TypeRegistry) GetTypeOf(typeName string) reflect.Type { - if structType, exists := registry.namedType[typeName]; exists { - return reflect.PtrTo(structType) - } - return nil -} - -// IsTypeRegistered returns true if a type is registered to this registry. -// Note that GetTypeOf can do the same thing by checking for nil but also -// returns the type, so in many cases you will want to call this function. -func (registry TypeRegistry) IsTypeRegistered(typeName string) bool { - _, exists := registry.namedType[typeName] - return exists -} - -// GetRegistered returns the names of all registered types for a given package -func (registry TypeRegistry) GetRegistered(packageName string) []string { - var result []string - for key := range registry.namedType { - if strings.HasPrefix(key, packageName) { - result = append(result, key) - } - } - return result -} diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/LICENSE b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/LICENSE new file mode 100644 index 00000000000..f1aee0f1100 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/LICENSE @@ -0,0 +1,231 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. + +-------------------------------------------------------------------------------- + +Copyright 2009 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. \ No newline at end of file diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/README.md b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/README.md new file mode 100644 index 00000000000..36526400941 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/README.md @@ -0,0 +1,3 @@ +# OTLP Trace HTTP Exporter + +[![PkgGoDev](https://pkg.go.dev/badge/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp)](https://pkg.go.dev/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp) diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/client.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/client.go new file mode 100644 index 00000000000..c7b1a551498 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/client.go @@ -0,0 +1,396 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package otlptracehttp // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp" + +import ( + "bytes" + "compress/gzip" + "context" + "errors" + "fmt" + "io" + "net" + "net/http" + "net/url" + "strconv" + "strings" + "sync" + "time" + + coltracepb "go.opentelemetry.io/proto/otlp/collector/trace/v1" + tracepb "go.opentelemetry.io/proto/otlp/trace/v1" + "google.golang.org/protobuf/proto" + + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/otlpconfig" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/retry" +) + +const contentTypeProto = "application/x-protobuf" + +var gzPool = sync.Pool{ + New: func() any { + w := gzip.NewWriter(io.Discard) + return w + }, +} + +// Keep it in sync with golang's DefaultTransport from net/http! We +// have our own copy to avoid handling a situation where the +// DefaultTransport is overwritten with some different implementation +// of http.RoundTripper or it's modified by other package. +var ourTransport = &http.Transport{ + Proxy: http.ProxyFromEnvironment, + DialContext: (&net.Dialer{ + Timeout: 30 * time.Second, + KeepAlive: 30 * time.Second, + }).DialContext, + ForceAttemptHTTP2: true, + MaxIdleConns: 100, + IdleConnTimeout: 90 * time.Second, + TLSHandshakeTimeout: 10 * time.Second, + ExpectContinueTimeout: 1 * time.Second, +} + +type client struct { + name string + cfg otlpconfig.SignalConfig + generalCfg otlpconfig.Config + requestFunc retry.RequestFunc + client *http.Client + stopCh chan struct{} + stopOnce sync.Once +} + +var _ otlptrace.Client = (*client)(nil) + +// NewClient creates a new HTTP trace client. +func NewClient(opts ...Option) otlptrace.Client { + cfg := otlpconfig.NewHTTPConfig(asHTTPOptions(opts)...) + + httpClient := cfg.Traces.HTTPClient + + if httpClient == nil { + httpClient = &http.Client{ + Transport: ourTransport, + Timeout: cfg.Traces.Timeout, + } + + if cfg.Traces.TLSCfg != nil || cfg.Traces.Proxy != nil { + clonedTransport := ourTransport.Clone() + httpClient.Transport = clonedTransport + + if cfg.Traces.TLSCfg != nil { + clonedTransport.TLSClientConfig = cfg.Traces.TLSCfg + } + if cfg.Traces.Proxy != nil { + clonedTransport.Proxy = cfg.Traces.Proxy + } + } + } + + stopCh := make(chan struct{}) + return &client{ + name: "traces", + cfg: cfg.Traces, + generalCfg: cfg, + requestFunc: cfg.RetryConfig.RequestFunc(evaluate), + stopCh: stopCh, + client: httpClient, + } +} + +// Start does nothing in a HTTP client. +func (*client) Start(ctx context.Context) error { + // nothing to do + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + return nil +} + +// Stop shuts down the client and interrupt any in-flight request. +func (d *client) Stop(ctx context.Context) error { + d.stopOnce.Do(func() { + close(d.stopCh) + }) + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + return nil +} + +// UploadTraces sends a batch of spans to the collector. +func (d *client) UploadTraces(ctx context.Context, protoSpans []*tracepb.ResourceSpans) error { + pbRequest := &coltracepb.ExportTraceServiceRequest{ + ResourceSpans: protoSpans, + } + rawRequest, err := proto.Marshal(pbRequest) + if err != nil { + return err + } + + ctx, cancel := d.contextWithStop(ctx) + defer cancel() + + request, err := d.newRequest(rawRequest) + if err != nil { + return err + } + + return d.requestFunc(ctx, func(ctx context.Context) error { + select { + case <-ctx.Done(): + return ctx.Err() + default: + } + + request.reset(ctx) + resp, err := d.client.Do(request.Request) + var urlErr *url.Error + if errors.As(err, &urlErr) && urlErr.Temporary() { + return newResponseError(http.Header{}, err) + } + if err != nil { + return err + } + + if resp != nil && resp.Body != nil { + defer func() { + if err := resp.Body.Close(); err != nil { + otel.Handle(err) + } + }() + } + + if sc := resp.StatusCode; sc >= 200 && sc <= 299 { + // Success, do not retry. + // Read the partial success message, if any. + var respData bytes.Buffer + if _, err := io.Copy(&respData, resp.Body); err != nil { + return err + } + if respData.Len() == 0 { + return nil + } + + if resp.Header.Get("Content-Type") == "application/x-protobuf" { + var respProto coltracepb.ExportTraceServiceResponse + if err := proto.Unmarshal(respData.Bytes(), &respProto); err != nil { + return err + } + + if respProto.PartialSuccess != nil { + msg := respProto.PartialSuccess.GetErrorMessage() + n := respProto.PartialSuccess.GetRejectedSpans() + if n != 0 || msg != "" { + err := internal.TracePartialSuccessError(n, msg) + otel.Handle(err) + } + } + } + return nil + } + // Error cases. + + // server may return a message with the response + // body, so we read it to include in the error + // message to be returned. It will help in + // debugging the actual issue. + var respData bytes.Buffer + if _, err := io.Copy(&respData, resp.Body); err != nil { + return err + } + respStr := strings.TrimSpace(respData.String()) + if respStr == "" { + respStr = "(empty)" + } + bodyErr := fmt.Errorf("body: %s", respStr) + + switch resp.StatusCode { + case http.StatusTooManyRequests, + http.StatusBadGateway, + http.StatusServiceUnavailable, + http.StatusGatewayTimeout: + // Retryable failure. + return newResponseError(resp.Header, bodyErr) + default: + // Non-retryable failure. + return fmt.Errorf("failed to send to %s: %s (%w)", request.URL, resp.Status, bodyErr) + } + }) +} + +func (d *client) newRequest(body []byte) (request, error) { + u := url.URL{Scheme: d.getScheme(), Host: d.cfg.Endpoint, Path: d.cfg.URLPath} + r, err := http.NewRequest(http.MethodPost, u.String(), http.NoBody) + if err != nil { + return request{Request: r}, err + } + + userAgent := "OTel OTLP Exporter Go/" + otlptrace.Version() + r.Header.Set("User-Agent", userAgent) + + for k, v := range d.cfg.Headers { + r.Header.Set(k, v) + } + r.Header.Set("Content-Type", contentTypeProto) + + req := request{Request: r} + switch Compression(d.cfg.Compression) { + case NoCompression: + r.ContentLength = int64(len(body)) + req.bodyReader = bodyReader(body) + case GzipCompression: + // Ensure the content length is not used. + r.ContentLength = -1 + r.Header.Set("Content-Encoding", "gzip") + + gz := gzPool.Get().(*gzip.Writer) + defer gzPool.Put(gz) + + var b bytes.Buffer + gz.Reset(&b) + + if _, err := gz.Write(body); err != nil { + return req, err + } + // Close needs to be called to ensure body is fully written. + if err := gz.Close(); err != nil { + return req, err + } + + req.bodyReader = bodyReader(b.Bytes()) + } + + return req, nil +} + +// MarshalLog is the marshaling function used by the logging system to represent this Client. +func (d *client) MarshalLog() any { + return struct { + Type string + Endpoint string + Insecure bool + }{ + Type: "otlptracehttp", + Endpoint: d.cfg.Endpoint, + Insecure: d.cfg.Insecure, + } +} + +// bodyReader returns a closure returning a new reader for buf. +func bodyReader(buf []byte) func() io.ReadCloser { + return func() io.ReadCloser { + return io.NopCloser(bytes.NewReader(buf)) + } +} + +// request wraps an http.Request with a resettable body reader. +type request struct { + *http.Request + + // bodyReader allows the same body to be used for multiple requests. + bodyReader func() io.ReadCloser +} + +// reset reinitializes the request Body and uses ctx for the request. +func (r *request) reset(ctx context.Context) { + r.Body = r.bodyReader() + r.Request = r.WithContext(ctx) +} + +// retryableError represents a request failure that can be retried. +type retryableError struct { + throttle int64 + err error +} + +// newResponseError returns a retryableError and will extract any explicit +// throttle delay contained in headers. The returned error wraps wrapped +// if it is not nil. +func newResponseError(header http.Header, wrapped error) error { + var rErr retryableError + if s, ok := header["Retry-After"]; ok { + if t, err := strconv.ParseInt(s[0], 10, 64); err == nil { + rErr.throttle = t + } + } + + rErr.err = wrapped + return rErr +} + +func (e retryableError) Error() string { + if e.err != nil { + return "retry-able request failure: " + e.err.Error() + } + + return "retry-able request failure" +} + +func (e retryableError) Unwrap() error { + return e.err +} + +func (e retryableError) As(target any) bool { + if e.err == nil { + return false + } + + switch v := target.(type) { + case **retryableError: + *v = &e + return true + default: + return false + } +} + +// evaluate returns if err is retry-able. If it is and it includes an explicit +// throttling delay, that delay is also returned. +func evaluate(err error) (bool, time.Duration) { + if err == nil { + return false, 0 + } + + // Do not use errors.As here, this should only be flattened one layer. If + // there are several chained errors, all the errors above it will be + // discarded if errors.As is used instead. + rErr, ok := err.(retryableError) //nolint:errorlint + if !ok { + return false, 0 + } + + return true, time.Duration(rErr.throttle) +} + +func (d *client) getScheme() string { + if d.cfg.Insecure { + return "http" + } + return "https" +} + +func (d *client) contextWithStop(ctx context.Context) (context.Context, context.CancelFunc) { + // Unify the parent context Done signal with the client's stop + // channel. + ctx, cancel := context.WithCancel(ctx) + go func(ctx context.Context, cancel context.CancelFunc) { + select { + case <-ctx.Done(): + // Nothing to do, either cancelled or deadline + // happened. + case <-d.stopCh: + cancel() + } + }(ctx, cancel) + return ctx, cancel +} diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/doc.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/doc.go new file mode 100644 index 00000000000..9fea75ad19c --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/doc.go @@ -0,0 +1,63 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +/* +Package otlptracehttp provides an OTLP span exporter using HTTP with protobuf payloads. +By default the telemetry is sent to https://localhost:4318/v1/traces. + +Exporter should be created using [New]. + +The environment variables described below can be used for configuration. + +OTEL_EXPORTER_OTLP_ENDPOINT (default: "https://localhost:4318") - +target base URL ("/v1/traces" is appended) to which the exporter sends telemetry. +The value must contain a scheme ("http" or "https") and host. +The value may additionally contain a port and a path. +The value should not contain a query string or fragment. +The configuration can be overridden by OTEL_EXPORTER_OTLP_TRACES_ENDPOINT +environment variable and by [WithEndpoint], [WithEndpointURL], [WithInsecure] options. + +OTEL_EXPORTER_OTLP_TRACES_ENDPOINT (default: "https://localhost:4318/v1/traces") - +target URL to which the exporter sends telemetry. +The value must contain a scheme ("http" or "https") and host. +The value may additionally contain a port and a path. +The value should not contain a query string or fragment. +The configuration can be overridden by [WithEndpoint], [WithEndpointURL], [WithInsecure], and [WithURLPath] options. + +OTEL_EXPORTER_OTLP_HEADERS, OTEL_EXPORTER_OTLP_TRACES_HEADERS (default: none) - +key-value pairs used as headers associated with HTTP requests. +The value is expected to be represented in a format matching the [W3C Baggage HTTP Header Content Format], +except that additional semi-colon delimited metadata is not supported. +Example value: "key1=value1,key2=value2". +OTEL_EXPORTER_OTLP_TRACES_HEADERS takes precedence over OTEL_EXPORTER_OTLP_HEADERS. +The configuration can be overridden by [WithHeaders] option. + +OTEL_EXPORTER_OTLP_TIMEOUT, OTEL_EXPORTER_OTLP_TRACES_TIMEOUT (default: "10000") - +maximum time in milliseconds the OTLP exporter waits for each batch export. +OTEL_EXPORTER_OTLP_TRACES_TIMEOUT takes precedence over OTEL_EXPORTER_OTLP_TIMEOUT. +The configuration can be overridden by [WithTimeout] option. + +OTEL_EXPORTER_OTLP_COMPRESSION, OTEL_EXPORTER_OTLP_TRACES_COMPRESSION (default: none) - +the compression strategy the exporter uses to compress the HTTP body. +Supported value: "gzip". +OTEL_EXPORTER_OTLP_TRACES_COMPRESSION takes precedence over OTEL_EXPORTER_OTLP_COMPRESSION. +The configuration can be overridden by [WithCompression] option. + +OTEL_EXPORTER_OTLP_CERTIFICATE, OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE (default: none) - +the filepath to the trusted certificate to use when verifying a server's TLS credentials. +OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE takes precedence over OTEL_EXPORTER_OTLP_CERTIFICATE. +The configuration can be overridden by [WithTLSClientConfig] option. + +OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE, OTEL_EXPORTER_OTLP_TRACES_CLIENT_CERTIFICATE (default: none) - +the filepath to the client certificate/chain trust for client's private key to use in mTLS communication in PEM format. +OTEL_EXPORTER_OTLP_TRACES_CLIENT_CERTIFICATE takes precedence over OTEL_EXPORTER_OTLP_CLIENT_CERTIFICATE. +The configuration can be overridden by [WithTLSClientConfig] option. + +OTEL_EXPORTER_OTLP_CLIENT_KEY, OTEL_EXPORTER_OTLP_TRACES_CLIENT_KEY (default: none) - +the filepath to the client's private key to use in mTLS communication in PEM format. +OTEL_EXPORTER_OTLP_TRACES_CLIENT_KEY takes precedence over OTEL_EXPORTER_OTLP_CLIENT_KEY. +The configuration can be overridden by [WithTLSClientConfig] option. + +[W3C Baggage HTTP Header Content Format]: https://www.w3.org/TR/baggage/#header-content +*/ +package otlptracehttp // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp" diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/exporter.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/exporter.go new file mode 100644 index 00000000000..fae89ea4fe6 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/exporter.go @@ -0,0 +1,20 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package otlptracehttp // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp" + +import ( + "context" + + "go.opentelemetry.io/otel/exporters/otlp/otlptrace" +) + +// New constructs a new Exporter and starts it. +func New(ctx context.Context, opts ...Option) (*otlptrace.Exporter, error) { + return otlptrace.New(ctx, NewClient(opts...)) +} + +// NewUnstarted constructs a new Exporter and does not start it. +func NewUnstarted(opts ...Option) *otlptrace.Exporter { + return otlptrace.NewUnstarted(NewClient(opts...)) +} diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/envconfig/envconfig.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/envconfig/envconfig.go new file mode 100644 index 00000000000..f4385fb4e9e --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/envconfig/envconfig.go @@ -0,0 +1,217 @@ +// Code generated by gotmpl. DO NOT MODIFY. +// source: internal/shared/otlp/envconfig/envconfig.go.tmpl + +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package envconfig provides functionality to parse configuration from +// environment variables. +package envconfig // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/envconfig" + +import ( + "crypto/tls" + "crypto/x509" + "errors" + "fmt" + "net/url" + "strconv" + "strings" + "time" + "unicode" + + "go.opentelemetry.io/otel/internal/global" +) + +// ConfigFn is the generic function used to set a config. +type ConfigFn func(*EnvOptionsReader) + +// EnvOptionsReader reads the required environment variables. +type EnvOptionsReader struct { + GetEnv func(string) string + ReadFile func(string) ([]byte, error) + Namespace string +} + +// Apply runs every ConfigFn. +func (e *EnvOptionsReader) Apply(opts ...ConfigFn) { + for _, o := range opts { + o(e) + } +} + +// GetEnvValue gets an OTLP environment variable value of the specified key +// using the GetEnv function. +// This function prepends the OTLP specified namespace to all key lookups. +func (e *EnvOptionsReader) GetEnvValue(key string) (string, bool) { + v := strings.TrimSpace(e.GetEnv(keyWithNamespace(e.Namespace, key))) + return v, v != "" +} + +// WithString retrieves the specified config and passes it to ConfigFn as a string. +func WithString(n string, fn func(string)) func(e *EnvOptionsReader) { + return func(e *EnvOptionsReader) { + if v, ok := e.GetEnvValue(n); ok { + fn(v) + } + } +} + +// WithBool returns a ConfigFn that reads the environment variable n and if it exists passes its parsed bool value to fn. +func WithBool(n string, fn func(bool)) ConfigFn { + return func(e *EnvOptionsReader) { + if v, ok := e.GetEnvValue(n); ok { + b := strings.ToLower(v) == "true" + fn(b) + } + } +} + +// WithDuration retrieves the specified config and passes it to ConfigFn as a duration. +func WithDuration(n string, fn func(time.Duration)) func(e *EnvOptionsReader) { + return func(e *EnvOptionsReader) { + if v, ok := e.GetEnvValue(n); ok { + d, err := strconv.Atoi(v) + if err != nil { + global.Error(err, "parse duration", "input", v) + return + } + fn(time.Duration(d) * time.Millisecond) + } + } +} + +// WithHeaders retrieves the specified config and passes it to ConfigFn as a map of HTTP headers. +func WithHeaders(n string, fn func(map[string]string)) func(e *EnvOptionsReader) { + return func(e *EnvOptionsReader) { + if v, ok := e.GetEnvValue(n); ok { + fn(stringToHeader(v)) + } + } +} + +// WithURL retrieves the specified config and passes it to ConfigFn as a net/url.URL. +func WithURL(n string, fn func(*url.URL)) func(e *EnvOptionsReader) { + return func(e *EnvOptionsReader) { + if v, ok := e.GetEnvValue(n); ok { + u, err := url.Parse(v) + if err != nil { + global.Error(err, "parse url", "input", v) + return + } + fn(u) + } + } +} + +// WithCertPool returns a ConfigFn that reads the environment variable n as a filepath to a TLS certificate pool. If it exists, it is parsed as a crypto/x509.CertPool and it is passed to fn. +func WithCertPool(n string, fn func(*x509.CertPool)) ConfigFn { + return func(e *EnvOptionsReader) { + if v, ok := e.GetEnvValue(n); ok { + b, err := e.ReadFile(v) + if err != nil { + global.Error(err, "read tls ca cert file", "file", v) + return + } + c, err := createCertPool(b) + if err != nil { + global.Error(err, "create tls cert pool") + return + } + fn(c) + } + } +} + +// WithClientCert returns a ConfigFn that reads the environment variable nc and nk as filepaths to a client certificate and key pair. If they exists, they are parsed as a crypto/tls.Certificate and it is passed to fn. +func WithClientCert(nc, nk string, fn func(tls.Certificate)) ConfigFn { + return func(e *EnvOptionsReader) { + vc, okc := e.GetEnvValue(nc) + vk, okk := e.GetEnvValue(nk) + if !okc || !okk { + return + } + cert, err := e.ReadFile(vc) + if err != nil { + global.Error(err, "read tls client cert", "file", vc) + return + } + key, err := e.ReadFile(vk) + if err != nil { + global.Error(err, "read tls client key", "file", vk) + return + } + crt, err := tls.X509KeyPair(cert, key) + if err != nil { + global.Error(err, "create tls client key pair") + return + } + fn(crt) + } +} + +func keyWithNamespace(ns, key string) string { + if ns == "" { + return key + } + return fmt.Sprintf("%s_%s", ns, key) +} + +func stringToHeader(value string) map[string]string { + headersPairs := strings.Split(value, ",") + headers := make(map[string]string) + + for _, header := range headersPairs { + n, v, found := strings.Cut(header, "=") + if !found { + global.Error(errors.New("missing '="), "parse headers", "input", header) + continue + } + + trimmedName := strings.TrimSpace(n) + + // Validate the key. + if !isValidHeaderKey(trimmedName) { + global.Error(errors.New("invalid header key"), "parse headers", "key", trimmedName) + continue + } + + // Only decode the value. + value, err := url.PathUnescape(v) + if err != nil { + global.Error(err, "escape header value", "value", v) + continue + } + trimmedValue := strings.TrimSpace(value) + + headers[trimmedName] = trimmedValue + } + + return headers +} + +func createCertPool(certBytes []byte) (*x509.CertPool, error) { + cp := x509.NewCertPool() + if ok := cp.AppendCertsFromPEM(certBytes); !ok { + return nil, errors.New("failed to append certificate to the cert pool") + } + return cp, nil +} + +func isValidHeaderKey(key string) bool { + if key == "" { + return false + } + for _, c := range key { + if !isTokenChar(c) { + return false + } + } + return true +} + +func isTokenChar(c rune) bool { + return c <= unicode.MaxASCII && (unicode.IsLetter(c) || + unicode.IsDigit(c) || + c == '!' || c == '#' || c == '$' || c == '%' || c == '&' || c == '\'' || c == '*' || + c == '+' || c == '-' || c == '.' || c == '^' || c == '_' || c == '`' || c == '|' || c == '~') +} diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/gen.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/gen.go new file mode 100644 index 00000000000..3d344dc85ee --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/gen.go @@ -0,0 +1,25 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package internal provides internal functionally for the otlptracehttp package. +package internal // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal" + +//go:generate gotmpl --body=../../../../../internal/shared/otlp/partialsuccess.go.tmpl "--data={}" --out=partialsuccess.go +//go:generate gotmpl --body=../../../../../internal/shared/otlp/partialsuccess_test.go.tmpl "--data={}" --out=partialsuccess_test.go + +//go:generate gotmpl --body=../../../../../internal/shared/otlp/retry/retry.go.tmpl "--data={}" --out=retry/retry.go +//go:generate gotmpl --body=../../../../../internal/shared/otlp/retry/retry_test.go.tmpl "--data={}" --out=retry/retry_test.go + +//go:generate gotmpl --body=../../../../../internal/shared/otlp/envconfig/envconfig.go.tmpl "--data={}" --out=envconfig/envconfig.go +//go:generate gotmpl --body=../../../../../internal/shared/otlp/envconfig/envconfig_test.go.tmpl "--data={}" --out=envconfig/envconfig_test.go + +//go:generate gotmpl --body=../../../../../internal/shared/otlp/otlptrace/otlpconfig/envconfig.go.tmpl "--data={\"envconfigImportPath\": \"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/envconfig\"}" --out=otlpconfig/envconfig.go +//go:generate gotmpl --body=../../../../../internal/shared/otlp/otlptrace/otlpconfig/options.go.tmpl "--data={\"retryImportPath\": \"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/retry\"}" --out=otlpconfig/options.go +//go:generate gotmpl --body=../../../../../internal/shared/otlp/otlptrace/otlpconfig/options_test.go.tmpl "--data={\"envconfigImportPath\": \"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/envconfig\"}" --out=otlpconfig/options_test.go +//go:generate gotmpl --body=../../../../../internal/shared/otlp/otlptrace/otlpconfig/optiontypes.go.tmpl "--data={}" --out=otlpconfig/optiontypes.go +//go:generate gotmpl --body=../../../../../internal/shared/otlp/otlptrace/otlpconfig/tls.go.tmpl "--data={}" --out=otlpconfig/tls.go + +//go:generate gotmpl --body=../../../../../internal/shared/otlp/otlptrace/otlptracetest/client.go.tmpl "--data={}" --out=otlptracetest/client.go +//go:generate gotmpl --body=../../../../../internal/shared/otlp/otlptrace/otlptracetest/collector.go.tmpl "--data={}" --out=otlptracetest/collector.go +//go:generate gotmpl --body=../../../../../internal/shared/otlp/otlptrace/otlptracetest/data.go.tmpl "--data={}" --out=otlptracetest/data.go +//go:generate gotmpl --body=../../../../../internal/shared/otlp/otlptrace/otlptracetest/otlptest.go.tmpl "--data={}" --out=otlptracetest/otlptest.go diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/otlpconfig/envconfig.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/otlpconfig/envconfig.go new file mode 100644 index 00000000000..121b02f5cd3 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/otlpconfig/envconfig.go @@ -0,0 +1,150 @@ +// Code generated by gotmpl. DO NOT MODIFY. +// source: internal/shared/otlp/otlptrace/otlpconfig/envconfig.go.tmpl + +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package otlpconfig // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/otlpconfig" + +import ( + "crypto/tls" + "crypto/x509" + "net/url" + "os" + "path" + "strings" + "time" + + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/envconfig" +) + +// DefaultEnvOptionsReader is the default environments reader. +var DefaultEnvOptionsReader = envconfig.EnvOptionsReader{ + GetEnv: os.Getenv, + ReadFile: os.ReadFile, + Namespace: "OTEL_EXPORTER_OTLP", +} + +// ApplyGRPCEnvConfigs applies the env configurations for gRPC. +func ApplyGRPCEnvConfigs(cfg Config) Config { + opts := getOptionsFromEnv() + for _, opt := range opts { + cfg = opt.ApplyGRPCOption(cfg) + } + return cfg +} + +// ApplyHTTPEnvConfigs applies the env configurations for HTTP. +func ApplyHTTPEnvConfigs(cfg Config) Config { + opts := getOptionsFromEnv() + for _, opt := range opts { + cfg = opt.ApplyHTTPOption(cfg) + } + return cfg +} + +func getOptionsFromEnv() []GenericOption { + opts := []GenericOption{} + + tlsConf := &tls.Config{} + DefaultEnvOptionsReader.Apply( + envconfig.WithURL("ENDPOINT", func(u *url.URL) { + opts = append(opts, withEndpointScheme(u)) + opts = append(opts, newSplitOption(func(cfg Config) Config { + cfg.Traces.Endpoint = u.Host + // For OTLP/HTTP endpoint URLs without a per-signal + // configuration, the passed endpoint is used as a base URL + // and the signals are sent to these paths relative to that. + cfg.Traces.URLPath = path.Join(u.Path, DefaultTracesPath) + return cfg + }, withEndpointForGRPC(u))) + }), + envconfig.WithURL("TRACES_ENDPOINT", func(u *url.URL) { + opts = append(opts, withEndpointScheme(u)) + opts = append(opts, newSplitOption(func(cfg Config) Config { + cfg.Traces.Endpoint = u.Host + // For endpoint URLs for OTLP/HTTP per-signal variables, the + // URL MUST be used as-is without any modification. The only + // exception is that if an URL contains no path part, the root + // path / MUST be used. + path := u.Path + if path == "" { + path = "/" + } + cfg.Traces.URLPath = path + return cfg + }, withEndpointForGRPC(u))) + }), + envconfig.WithCertPool("CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }), + envconfig.WithCertPool("TRACES_CERTIFICATE", func(p *x509.CertPool) { tlsConf.RootCAs = p }), + envconfig.WithClientCert( + "CLIENT_CERTIFICATE", + "CLIENT_KEY", + func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} }, + ), + envconfig.WithClientCert( + "TRACES_CLIENT_CERTIFICATE", + "TRACES_CLIENT_KEY", + func(c tls.Certificate) { tlsConf.Certificates = []tls.Certificate{c} }, + ), + withTLSConfig(tlsConf, func(c *tls.Config) { opts = append(opts, WithTLSClientConfig(c)) }), + envconfig.WithBool("INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }), + envconfig.WithBool("TRACES_INSECURE", func(b bool) { opts = append(opts, withInsecure(b)) }), + envconfig.WithHeaders("HEADERS", func(h map[string]string) { opts = append(opts, WithHeaders(h)) }), + envconfig.WithHeaders("TRACES_HEADERS", func(h map[string]string) { opts = append(opts, WithHeaders(h)) }), + WithEnvCompression("COMPRESSION", func(c Compression) { opts = append(opts, WithCompression(c)) }), + WithEnvCompression("TRACES_COMPRESSION", func(c Compression) { opts = append(opts, WithCompression(c)) }), + envconfig.WithDuration("TIMEOUT", func(d time.Duration) { opts = append(opts, WithTimeout(d)) }), + envconfig.WithDuration("TRACES_TIMEOUT", func(d time.Duration) { opts = append(opts, WithTimeout(d)) }), + ) + + return opts +} + +func withEndpointScheme(u *url.URL) GenericOption { + switch strings.ToLower(u.Scheme) { + case "http", "unix": + return WithInsecure() + default: + return WithSecure() + } +} + +func withEndpointForGRPC(u *url.URL) func(cfg Config) Config { + return func(cfg Config) Config { + // For OTLP/gRPC endpoints, this is the target to which the + // exporter is going to send telemetry. + cfg.Traces.Endpoint = path.Join(u.Host, u.Path) + return cfg + } +} + +// WithEnvCompression retrieves the specified config and passes it to ConfigFn as a Compression. +func WithEnvCompression(n string, fn func(Compression)) func(e *envconfig.EnvOptionsReader) { + return func(e *envconfig.EnvOptionsReader) { + if v, ok := e.GetEnvValue(n); ok { + cp := NoCompression + if v == "gzip" { + cp = GzipCompression + } + + fn(cp) + } + } +} + +// revive:disable-next-line:flag-parameter +func withInsecure(b bool) GenericOption { + if b { + return WithInsecure() + } + return WithSecure() +} + +func withTLSConfig(c *tls.Config, fn func(*tls.Config)) func(e *envconfig.EnvOptionsReader) { + return func(e *envconfig.EnvOptionsReader) { + if c.RootCAs != nil || len(c.Certificates) > 0 { + fn(c) + } + } +} diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/otlpconfig/options.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/otlpconfig/options.go new file mode 100644 index 00000000000..e415feea6eb --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/otlpconfig/options.go @@ -0,0 +1,360 @@ +// Code generated by gotmpl. DO NOT MODIFY. +// source: internal/shared/otlp/otlptrace/otlpconfig/options.go.tmpl + +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package otlpconfig provides configuration for the otlptrace exporters. +package otlpconfig // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/otlpconfig" + +import ( + "crypto/tls" + "fmt" + "net/http" + "net/url" + "path" + "strings" + "time" + + "google.golang.org/grpc" + "google.golang.org/grpc/backoff" + "google.golang.org/grpc/credentials" + "google.golang.org/grpc/credentials/insecure" + "google.golang.org/grpc/encoding/gzip" + + "go.opentelemetry.io/otel/exporters/otlp/otlptrace" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/retry" + "go.opentelemetry.io/otel/internal/global" +) + +const ( + // DefaultTracesPath is a default URL path for endpoint that + // receives spans. + DefaultTracesPath string = "/v1/traces" + // DefaultTimeout is a default max waiting time for the backend to process + // each span batch. + DefaultTimeout time.Duration = 10 * time.Second +) + +type ( + // HTTPTransportProxyFunc is a function that resolves which URL to use as proxy for a given request. + // This type is compatible with `http.Transport.Proxy` and can be used to set a custom proxy function to the OTLP HTTP client. + HTTPTransportProxyFunc func(*http.Request) (*url.URL, error) + + SignalConfig struct { + Endpoint string + Insecure bool + TLSCfg *tls.Config + Headers map[string]string + Compression Compression + Timeout time.Duration + URLPath string + + // gRPC configurations + GRPCCredentials credentials.TransportCredentials + + // HTTP configurations + Proxy HTTPTransportProxyFunc + HTTPClient *http.Client + } + + Config struct { + // Signal specific configurations + Traces SignalConfig + + RetryConfig retry.Config + + // gRPC configurations + ReconnectionPeriod time.Duration + ServiceConfig string + DialOptions []grpc.DialOption + GRPCConn *grpc.ClientConn + } +) + +// NewHTTPConfig returns a new Config with all settings applied from opts and +// any unset setting using the default HTTP config values. +func NewHTTPConfig(opts ...HTTPOption) Config { + cfg := Config{ + Traces: SignalConfig{ + Endpoint: fmt.Sprintf("%s:%d", DefaultCollectorHost, DefaultCollectorHTTPPort), + URLPath: DefaultTracesPath, + Compression: NoCompression, + Timeout: DefaultTimeout, + }, + RetryConfig: retry.DefaultConfig, + } + cfg = ApplyHTTPEnvConfigs(cfg) + for _, opt := range opts { + cfg = opt.ApplyHTTPOption(cfg) + } + cfg.Traces.URLPath = cleanPath(cfg.Traces.URLPath, DefaultTracesPath) + return cfg +} + +// cleanPath returns a path with all spaces trimmed. If urlPath is empty, +// defaultPath is returned instead. +func cleanPath(urlPath string, defaultPath string) string { + tmp := strings.TrimSpace(urlPath) + if tmp == "" || tmp == "." { + return defaultPath + } + if !path.IsAbs(tmp) { + tmp = "/" + tmp + } + return tmp +} + +// NewGRPCConfig returns a new Config with all settings applied from opts and +// any unset setting using the default gRPC config values. +func NewGRPCConfig(opts ...GRPCOption) Config { + userAgent := "OTel OTLP Exporter Go/" + otlptrace.Version() + cfg := Config{ + Traces: SignalConfig{ + Endpoint: fmt.Sprintf("%s:%d", DefaultCollectorHost, DefaultCollectorGRPCPort), + URLPath: DefaultTracesPath, + Compression: NoCompression, + Timeout: DefaultTimeout, + }, + RetryConfig: retry.DefaultConfig, + DialOptions: []grpc.DialOption{grpc.WithUserAgent(userAgent)}, + } + cfg = ApplyGRPCEnvConfigs(cfg) + for _, opt := range opts { + cfg = opt.ApplyGRPCOption(cfg) + } + + if cfg.ServiceConfig != "" { + cfg.DialOptions = append(cfg.DialOptions, grpc.WithDefaultServiceConfig(cfg.ServiceConfig)) + } + // Prioritize GRPCCredentials over Insecure (passing both is an error). + if cfg.Traces.GRPCCredentials != nil { + cfg.DialOptions = append(cfg.DialOptions, grpc.WithTransportCredentials(cfg.Traces.GRPCCredentials)) + } else if cfg.Traces.Insecure { + cfg.DialOptions = append(cfg.DialOptions, grpc.WithTransportCredentials(insecure.NewCredentials())) + } else { + // Default to using the host's root CA. + creds := credentials.NewTLS(nil) + cfg.Traces.GRPCCredentials = creds + cfg.DialOptions = append(cfg.DialOptions, grpc.WithTransportCredentials(creds)) + } + if cfg.Traces.Compression == GzipCompression { + cfg.DialOptions = append(cfg.DialOptions, grpc.WithDefaultCallOptions(grpc.UseCompressor(gzip.Name))) + } + if cfg.ReconnectionPeriod != 0 { + p := grpc.ConnectParams{ + Backoff: backoff.DefaultConfig, + MinConnectTimeout: cfg.ReconnectionPeriod, + } + cfg.DialOptions = append(cfg.DialOptions, grpc.WithConnectParams(p)) + } + + return cfg +} + +type ( + // GenericOption applies an option to the HTTP or gRPC driver. + GenericOption interface { + ApplyHTTPOption(Config) Config + ApplyGRPCOption(Config) Config + + // A private method to prevent users implementing the + // interface and so future additions to it will not + // violate compatibility. + private() + } + + // HTTPOption applies an option to the HTTP driver. + HTTPOption interface { + ApplyHTTPOption(Config) Config + + // A private method to prevent users implementing the + // interface and so future additions to it will not + // violate compatibility. + private() + } + + // GRPCOption applies an option to the gRPC driver. + GRPCOption interface { + ApplyGRPCOption(Config) Config + + // A private method to prevent users implementing the + // interface and so future additions to it will not + // violate compatibility. + private() + } +) + +// genericOption is an option that applies the same logic +// for both gRPC and HTTP. +type genericOption struct { + fn func(Config) Config +} + +func (g *genericOption) ApplyGRPCOption(cfg Config) Config { + return g.fn(cfg) +} + +func (g *genericOption) ApplyHTTPOption(cfg Config) Config { + return g.fn(cfg) +} + +func (genericOption) private() {} + +func newGenericOption(fn func(cfg Config) Config) GenericOption { + return &genericOption{fn: fn} +} + +// splitOption is an option that applies different logics +// for gRPC and HTTP. +type splitOption struct { + httpFn func(Config) Config + grpcFn func(Config) Config +} + +func (g *splitOption) ApplyGRPCOption(cfg Config) Config { + return g.grpcFn(cfg) +} + +func (g *splitOption) ApplyHTTPOption(cfg Config) Config { + return g.httpFn(cfg) +} + +func (splitOption) private() {} + +func newSplitOption(httpFn func(cfg Config) Config, grpcFn func(cfg Config) Config) GenericOption { + return &splitOption{httpFn: httpFn, grpcFn: grpcFn} +} + +// httpOption is an option that is only applied to the HTTP driver. +type httpOption struct { + fn func(Config) Config +} + +func (h *httpOption) ApplyHTTPOption(cfg Config) Config { + return h.fn(cfg) +} + +func (httpOption) private() {} + +func NewHTTPOption(fn func(cfg Config) Config) HTTPOption { + return &httpOption{fn: fn} +} + +// grpcOption is an option that is only applied to the gRPC driver. +type grpcOption struct { + fn func(Config) Config +} + +func (h *grpcOption) ApplyGRPCOption(cfg Config) Config { + return h.fn(cfg) +} + +func (grpcOption) private() {} + +func NewGRPCOption(fn func(cfg Config) Config) GRPCOption { + return &grpcOption{fn: fn} +} + +// Generic Options + +// WithEndpoint configures the trace host and port only; endpoint should +// resemble "example.com" or "localhost:4317". To configure the scheme and path, +// use WithEndpointURL. +func WithEndpoint(endpoint string) GenericOption { + return newGenericOption(func(cfg Config) Config { + cfg.Traces.Endpoint = endpoint + return cfg + }) +} + +// WithEndpointURL configures the trace scheme, host, port, and path; the +// provided value should resemble "https://example.com:4318/v1/traces". +func WithEndpointURL(v string) GenericOption { + return newGenericOption(func(cfg Config) Config { + u, err := url.Parse(v) + if err != nil { + global.Error(err, "otlptrace: parse endpoint url", "url", v) + return cfg + } + + cfg.Traces.Endpoint = u.Host + cfg.Traces.URLPath = u.Path + cfg.Traces.Insecure = u.Scheme != "https" + + return cfg + }) +} + +func WithCompression(compression Compression) GenericOption { + return newGenericOption(func(cfg Config) Config { + cfg.Traces.Compression = compression + return cfg + }) +} + +func WithURLPath(urlPath string) GenericOption { + return newGenericOption(func(cfg Config) Config { + cfg.Traces.URLPath = urlPath + return cfg + }) +} + +func WithRetry(rc retry.Config) GenericOption { + return newGenericOption(func(cfg Config) Config { + cfg.RetryConfig = rc + return cfg + }) +} + +func WithTLSClientConfig(tlsCfg *tls.Config) GenericOption { + return newSplitOption(func(cfg Config) Config { + cfg.Traces.TLSCfg = tlsCfg.Clone() + return cfg + }, func(cfg Config) Config { + cfg.Traces.GRPCCredentials = credentials.NewTLS(tlsCfg) + return cfg + }) +} + +func WithInsecure() GenericOption { + return newGenericOption(func(cfg Config) Config { + cfg.Traces.Insecure = true + return cfg + }) +} + +func WithSecure() GenericOption { + return newGenericOption(func(cfg Config) Config { + cfg.Traces.Insecure = false + return cfg + }) +} + +func WithHeaders(headers map[string]string) GenericOption { + return newGenericOption(func(cfg Config) Config { + cfg.Traces.Headers = headers + return cfg + }) +} + +func WithTimeout(duration time.Duration) GenericOption { + return newGenericOption(func(cfg Config) Config { + cfg.Traces.Timeout = duration + return cfg + }) +} + +func WithProxy(pf HTTPTransportProxyFunc) GenericOption { + return newGenericOption(func(cfg Config) Config { + cfg.Traces.Proxy = pf + return cfg + }) +} + +func WithHTTPClient(c *http.Client) GenericOption { + return newGenericOption(func(cfg Config) Config { + cfg.Traces.HTTPClient = c + return cfg + }) +} diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/otlpconfig/optiontypes.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/otlpconfig/optiontypes.go new file mode 100644 index 00000000000..6a52b58cc0b --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/otlpconfig/optiontypes.go @@ -0,0 +1,40 @@ +// Code generated by gotmpl. DO NOT MODIFY. +// source: internal/shared/otlp/otlptrace/otlpconfig/optiontypes.go.tmpl + +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package otlpconfig // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/otlpconfig" + +const ( + // DefaultCollectorGRPCPort is the default gRPC port of the collector. + DefaultCollectorGRPCPort uint16 = 4317 + // DefaultCollectorHTTPPort is the default HTTP port of the collector. + DefaultCollectorHTTPPort uint16 = 4318 + // DefaultCollectorHost is the host address the Exporter will attempt + // connect to if no collector address is provided. + DefaultCollectorHost string = "localhost" +) + +// Compression describes the compression used for payloads sent to the +// collector. +type Compression int + +const ( + // NoCompression tells the driver to send payloads without + // compression. + NoCompression Compression = iota + // GzipCompression tells the driver to send payloads after + // compressing them with gzip. + GzipCompression +) + +// Marshaler describes the kind of message format sent to the collector. +type Marshaler int + +const ( + // MarshalProto tells the driver to send using the protobuf binary format. + MarshalProto Marshaler = iota + // MarshalJSON tells the driver to send using json format. + MarshalJSON +) diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/otlpconfig/tls.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/otlpconfig/tls.go new file mode 100644 index 00000000000..5b389cb03fa --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/otlpconfig/tls.go @@ -0,0 +1,26 @@ +// Code generated by gotmpl. DO NOT MODIFY. +// source: internal/shared/otlp/otlptrace/otlpconfig/tls.go.tmpl + +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package otlpconfig // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/otlpconfig" + +import ( + "crypto/tls" + "crypto/x509" + "errors" +) + +// CreateTLSConfig creates a tls.Config from a raw certificate bytes +// to verify a server certificate. +func CreateTLSConfig(certBytes []byte) (*tls.Config, error) { + cp := x509.NewCertPool() + if ok := cp.AppendCertsFromPEM(certBytes); !ok { + return nil, errors.New("failed to append certificate to the cert pool") + } + + return &tls.Config{ + RootCAs: cp, + }, nil +} diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/partialsuccess.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/partialsuccess.go new file mode 100644 index 00000000000..418e66428ae --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/partialsuccess.go @@ -0,0 +1,56 @@ +// Code generated by gotmpl. DO NOT MODIFY. +// source: internal/shared/otlp/partialsuccess.go + +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package internal // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal" + +import "fmt" + +// PartialSuccess represents the underlying error for all handling +// OTLP partial success messages. Use `errors.Is(err, +// PartialSuccess{})` to test whether an error passed to the OTel +// error handler belongs to this category. +type PartialSuccess struct { + ErrorMessage string + RejectedItems int64 + RejectedKind string +} + +var _ error = PartialSuccess{} + +// Error implements the error interface. +func (ps PartialSuccess) Error() string { + msg := ps.ErrorMessage + if msg == "" { + msg = "empty message" + } + return fmt.Sprintf("OTLP partial success: %s (%d %s rejected)", msg, ps.RejectedItems, ps.RejectedKind) +} + +// Is supports the errors.Is() interface. +func (ps PartialSuccess) Is(err error) bool { + _, ok := err.(PartialSuccess) + return ok +} + +// TracePartialSuccessError returns an error describing a partial success +// response for the trace signal. +func TracePartialSuccessError(itemsRejected int64, errorMessage string) error { + return PartialSuccess{ + ErrorMessage: errorMessage, + RejectedItems: itemsRejected, + RejectedKind: "spans", + } +} + +// MetricPartialSuccessError returns an error describing a partial success +// response for the metric signal. +func MetricPartialSuccessError(itemsRejected int64, errorMessage string) error { + return PartialSuccess{ + ErrorMessage: errorMessage, + RejectedItems: itemsRejected, + RejectedKind: "metric data points", + } +} diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/retry/retry.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/retry/retry.go new file mode 100644 index 00000000000..107428fa6cf --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/retry/retry.go @@ -0,0 +1,141 @@ +// Code generated by gotmpl. DO NOT MODIFY. +// source: internal/shared/otlp/retry/retry.go.tmpl + +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package retry provides request retry functionality that can perform +// configurable exponential backoff for transient errors and honor any +// explicit throttle responses received. +package retry // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/retry" + +import ( + "context" + "fmt" + "time" + + "github.com/cenkalti/backoff/v5" +) + +// DefaultConfig are the recommended defaults to use. +var DefaultConfig = Config{ + Enabled: true, + InitialInterval: 5 * time.Second, + MaxInterval: 30 * time.Second, + MaxElapsedTime: time.Minute, +} + +// Config defines configuration for retrying batches in case of export failure +// using an exponential backoff. +type Config struct { + // Enabled indicates whether to not retry sending batches in case of + // export failure. + Enabled bool + // InitialInterval the time to wait after the first failure before + // retrying. + InitialInterval time.Duration + // MaxInterval is the upper bound on backoff interval. Once this value is + // reached the delay between consecutive retries will always be + // `MaxInterval`. + MaxInterval time.Duration + // MaxElapsedTime is the maximum amount of time (including retries) spent + // trying to send a request/batch. Once this value is reached, the data + // is discarded. + MaxElapsedTime time.Duration +} + +// RequestFunc wraps a request with retry logic. +type RequestFunc func(context.Context, func(context.Context) error) error + +// EvaluateFunc returns if an error is retry-able and if an explicit throttle +// duration should be honored that was included in the error. +// +// The function must return true if the error argument is retry-able, +// otherwise it must return false for the first return parameter. +// +// The function must return a non-zero time.Duration if the error contains +// explicit throttle duration that should be honored, otherwise it must return +// a zero valued time.Duration. +type EvaluateFunc func(error) (bool, time.Duration) + +// RequestFunc returns a RequestFunc using the evaluate function to determine +// if requests can be retried and based on the exponential backoff +// configuration of c. +func (c Config) RequestFunc(evaluate EvaluateFunc) RequestFunc { + if !c.Enabled { + return func(ctx context.Context, fn func(context.Context) error) error { + return fn(ctx) + } + } + + return func(ctx context.Context, fn func(context.Context) error) error { + // Do not use NewExponentialBackOff since it calls Reset and the code here + // must call Reset after changing the InitialInterval (this saves an + // unnecessary call to Now). + b := &backoff.ExponentialBackOff{ + InitialInterval: c.InitialInterval, + RandomizationFactor: backoff.DefaultRandomizationFactor, + Multiplier: backoff.DefaultMultiplier, + MaxInterval: c.MaxInterval, + } + b.Reset() + + maxElapsedTime := c.MaxElapsedTime + startTime := time.Now() + + for { + err := fn(ctx) + if err == nil { + return nil + } + + retryable, throttle := evaluate(err) + if !retryable { + return err + } + + if maxElapsedTime != 0 && time.Since(startTime) > maxElapsedTime { + return fmt.Errorf("max retry time elapsed: %w", err) + } + + // Wait for the greater of the backoff or throttle delay. + bOff := b.NextBackOff() + delay := max(throttle, bOff) + + elapsed := time.Since(startTime) + if maxElapsedTime != 0 && elapsed+throttle > maxElapsedTime { + return fmt.Errorf("max retry time would elapse: %w", err) + } + + if ctxErr := waitFunc(ctx, delay); ctxErr != nil { + return fmt.Errorf("%w: %w", ctxErr, err) + } + } + } +} + +// Allow override for testing. +var waitFunc = wait + +// wait takes the caller's context, and the amount of time to wait. It will +// return nil if the timer fires before or at the same time as the context's +// deadline. This indicates that the call can be retried. +func wait(ctx context.Context, delay time.Duration) error { + timer := time.NewTimer(delay) + defer timer.Stop() + + select { + case <-ctx.Done(): + // Handle the case where the timer and context deadline end + // simultaneously by prioritizing the timer expiration nil value + // response. + select { + case <-timer.C: + default: + return context.Cause(ctx) + } + case <-timer.C: + } + + return nil +} diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/options.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/options.go new file mode 100644 index 00000000000..cfe21dbfb05 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/options.go @@ -0,0 +1,171 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package otlptracehttp // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp" + +import ( + "crypto/tls" + "net/http" + "net/url" + "time" + + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/otlpconfig" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/retry" +) + +// Compression describes the compression used for payloads sent to the +// collector. +type Compression otlpconfig.Compression + +// HTTPTransportProxyFunc is a function that resolves which URL to use as proxy for a given request. +// This type is compatible with http.Transport.Proxy and can be used to set a custom proxy function +// to the OTLP HTTP client. +type HTTPTransportProxyFunc func(*http.Request) (*url.URL, error) + +const ( + // NoCompression tells the driver to send payloads without + // compression. + NoCompression = Compression(otlpconfig.NoCompression) + // GzipCompression tells the driver to send payloads after + // compressing them with gzip. + GzipCompression = Compression(otlpconfig.GzipCompression) +) + +// Option applies an option to the HTTP client. +type Option interface { + applyHTTPOption(otlpconfig.Config) otlpconfig.Config +} + +func asHTTPOptions(opts []Option) []otlpconfig.HTTPOption { + converted := make([]otlpconfig.HTTPOption, len(opts)) + for i, o := range opts { + converted[i] = otlpconfig.NewHTTPOption(o.applyHTTPOption) + } + return converted +} + +// RetryConfig defines configuration for retrying batches in case of export +// failure using an exponential backoff. +type RetryConfig retry.Config + +type wrappedOption struct { + otlpconfig.HTTPOption +} + +func (w wrappedOption) applyHTTPOption(cfg otlpconfig.Config) otlpconfig.Config { + return w.ApplyHTTPOption(cfg) +} + +// WithEndpoint sets the target endpoint (host and port) the Exporter will +// connect to. The provided endpoint should resemble "example.com:4318" (no +// scheme or path). +// +// If the OTEL_EXPORTER_OTLP_ENDPOINT or OTEL_EXPORTER_OTLP_TRACES_ENDPOINT +// environment variable is set, and this option is not passed, that variable +// value will be used. If both environment variables are set, +// OTEL_EXPORTER_OTLP_TRACES_ENDPOINT will take precedence. If an environment +// variable is set, and this option is passed, this option will take precedence. +// Note, both environment variables include the full +// scheme and path, while WithEndpoint sets only the host and port. +// +// If both this option and WithEndpointURL are used, the last used option will +// take precedence. +// +// By default, if an environment variable is not set, and this option is not +// passed, "localhost:4318" will be used. +// +// This option has no effect if WithGRPCConn is used. +func WithEndpoint(endpoint string) Option { + return wrappedOption{otlpconfig.WithEndpoint(endpoint)} +} + +// WithEndpointURL sets the target endpoint URL (scheme, host, port, path) the +// Exporter will connect to. +// +// If the OTEL_EXPORTER_OTLP_ENDPOINT or OTEL_EXPORTER_OTLP_TRACES_ENDPOINT +// environment variable is set, and this option is not passed, that variable +// value will be used. If both environment variables are set, +// OTEL_EXPORTER_OTLP_TRACES_ENDPOINT will take precedence. If an environment +// variable is set, and this option is passed, this option will take precedence. +// +// If both this option and WithEndpoint are used, the last used option will +// take precedence. +// +// If an invalid URL is provided, the default value will be kept. +// +// By default, if an environment variable is not set, and this option is not +// passed, "localhost:4318" will be used. +// +// This option has no effect if WithGRPCConn is used. +func WithEndpointURL(u string) Option { + return wrappedOption{otlpconfig.WithEndpointURL(u)} +} + +// WithCompression tells the driver to compress the sent data. +func WithCompression(compression Compression) Option { + return wrappedOption{otlpconfig.WithCompression(otlpconfig.Compression(compression))} +} + +// WithURLPath allows one to override the default URL path used +// for sending traces. If unset, default ("/v1/traces") will be used. +func WithURLPath(urlPath string) Option { + return wrappedOption{otlpconfig.WithURLPath(urlPath)} +} + +// WithTLSClientConfig can be used to set up a custom TLS +// configuration for the client used to send payloads to the +// collector. Use it if you want to use a custom certificate. +func WithTLSClientConfig(tlsCfg *tls.Config) Option { + return wrappedOption{otlpconfig.WithTLSClientConfig(tlsCfg)} +} + +// WithInsecure tells the driver to connect to the collector using the +// HTTP scheme, instead of HTTPS. +func WithInsecure() Option { + return wrappedOption{otlpconfig.WithInsecure()} +} + +// WithHeaders allows one to tell the driver to send additional HTTP +// headers with the payloads. Specifying headers like Content-Length, +// Content-Encoding and Content-Type may result in a broken driver. +func WithHeaders(headers map[string]string) Option { + return wrappedOption{otlpconfig.WithHeaders(headers)} +} + +// WithTimeout tells the driver the max waiting time for the backend to process +// each spans batch. If unset, the default will be 10 seconds. +func WithTimeout(duration time.Duration) Option { + return wrappedOption{otlpconfig.WithTimeout(duration)} +} + +// WithRetry configures the retry policy for transient errors that may occurs +// when exporting traces. An exponential back-off algorithm is used to ensure +// endpoints are not overwhelmed with retries. If unset, the default retry +// policy will retry after 5 seconds and increase exponentially after each +// error for a total of 1 minute. +func WithRetry(rc RetryConfig) Option { + return wrappedOption{otlpconfig.WithRetry(retry.Config(rc))} +} + +// WithProxy sets the Proxy function the client will use to determine the +// proxy to use for an HTTP request. If this option is not used, the client +// will use [http.ProxyFromEnvironment]. +func WithProxy(pf HTTPTransportProxyFunc) Option { + return wrappedOption{otlpconfig.WithProxy(otlpconfig.HTTPTransportProxyFunc(pf))} +} + +// WithHTTPClient sets the HTTP client to used by the exporter. +// +// This option will take precedence over [WithProxy], [WithTimeout], +// [WithTLSClientConfig] options as well as OTEL_EXPORTER_OTLP_CERTIFICATE, +// OTEL_EXPORTER_OTLP_TRACES_CERTIFICATE, OTEL_EXPORTER_OTLP_TIMEOUT, +// OTEL_EXPORTER_OTLP_TRACES_TIMEOUT environment variables. +// +// Timeout and all other fields of the passed [http.Client] are left intact. +// +// Be aware that passing an HTTP client with transport like +// [go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp.NewTransport] can +// cause the client to be instrumented twice and cause infinite recursion. +func WithHTTPClient(c *http.Client) Option { + return wrappedOption{otlpconfig.WithHTTPClient(c)} +} diff --git a/vendor/modules.txt b/vendor/modules.txt index cacea5b17bd..b1f6781ad58 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -165,10 +165,7 @@ github.com/andybalholm/brotli/matchfinder # github.com/armon/go-metrics v0.4.1 ## explicit; go 1.12 github.com/armon/go-metrics -# github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 -## explicit; go 1.13 -github.com/asaskevich/govalidator -# github.com/aws/aws-sdk-go-v2 v1.39.6 +# github.com/aws/aws-sdk-go-v2 v1.40.1 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/aws github.com/aws/aws-sdk-go-v2/aws/defaults @@ -195,26 +192,27 @@ github.com/aws/aws-sdk-go-v2/internal/shareddefaults github.com/aws/aws-sdk-go-v2/internal/strings github.com/aws/aws-sdk-go-v2/internal/sync/singleflight github.com/aws/aws-sdk-go-v2/internal/timeconv -# github.com/aws/aws-sdk-go-v2/config v1.31.17 +# github.com/aws/aws-sdk-go-v2/config v1.32.3 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/config -# github.com/aws/aws-sdk-go-v2/credentials v1.18.21 +# github.com/aws/aws-sdk-go-v2/credentials v1.19.3 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/credentials github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds github.com/aws/aws-sdk-go-v2/credentials/endpointcreds github.com/aws/aws-sdk-go-v2/credentials/endpointcreds/internal/client +github.com/aws/aws-sdk-go-v2/credentials/logincreds github.com/aws/aws-sdk-go-v2/credentials/processcreds github.com/aws/aws-sdk-go-v2/credentials/ssocreds github.com/aws/aws-sdk-go-v2/credentials/stscreds -# github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.13 +# github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.15 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/feature/ec2/imds github.com/aws/aws-sdk-go-v2/feature/ec2/imds/internal/config -# github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.13 +# github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.15 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/internal/configsources -# github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.13 +# github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.15 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 # github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 @@ -226,36 +224,41 @@ github.com/aws/aws-sdk-go-v2/service/dynamodb github.com/aws/aws-sdk-go-v2/service/dynamodb/internal/customizations github.com/aws/aws-sdk-go-v2/service/dynamodb/internal/endpoints github.com/aws/aws-sdk-go-v2/service/dynamodb/types -# github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.3 +# github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding # github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.6 ## explicit; go 1.22 github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery -# github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.13 +# github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.15 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/service/internal/presigned-url -# github.com/aws/aws-sdk-go-v2/service/sns v1.38.5 -## explicit; go 1.22 +# github.com/aws/aws-sdk-go-v2/service/signin v1.0.3 +## explicit; go 1.23 +github.com/aws/aws-sdk-go-v2/service/signin +github.com/aws/aws-sdk-go-v2/service/signin/internal/endpoints +github.com/aws/aws-sdk-go-v2/service/signin/types +# github.com/aws/aws-sdk-go-v2/service/sns v1.39.8 +## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/service/sns github.com/aws/aws-sdk-go-v2/service/sns/internal/endpoints github.com/aws/aws-sdk-go-v2/service/sns/types -# github.com/aws/aws-sdk-go-v2/service/sso v1.30.1 +# github.com/aws/aws-sdk-go-v2/service/sso v1.30.6 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/service/sso github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints github.com/aws/aws-sdk-go-v2/service/sso/types -# github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.5 +# github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.11 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/service/ssooidc github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints github.com/aws/aws-sdk-go-v2/service/ssooidc/types -# github.com/aws/aws-sdk-go-v2/service/sts v1.39.1 +# github.com/aws/aws-sdk-go-v2/service/sts v1.41.3 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/service/sts github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints github.com/aws/aws-sdk-go-v2/service/sts/types -# github.com/aws/smithy-go v1.23.2 +# github.com/aws/smithy-go v1.24.0 ## explicit; go 1.23 github.com/aws/smithy-go github.com/aws/smithy-go/auth @@ -318,8 +321,8 @@ github.com/cncf/xds/go/xds/data/orca/v3 github.com/cncf/xds/go/xds/service/orca/v3 github.com/cncf/xds/go/xds/type/matcher/v3 github.com/cncf/xds/go/xds/type/v3 -# github.com/coder/quartz v0.2.1 -## explicit; go 1.21.8 +# github.com/coder/quartz v0.3.0 +## explicit; go 1.23.9 github.com/coder/quartz # github.com/coreos/go-semver v0.3.0 ## explicit @@ -445,7 +448,7 @@ github.com/go-logr/logr/funcr # github.com/go-logr/stdr v1.2.2 ## explicit; go 1.16 github.com/go-logr/stdr -# github.com/go-openapi/analysis v0.24.0 +# github.com/go-openapi/analysis v0.24.1 ## explicit; go 1.24.0 github.com/go-openapi/analysis github.com/go-openapi/analysis/internal/debug @@ -454,20 +457,20 @@ github.com/go-openapi/analysis/internal/flatten/operations github.com/go-openapi/analysis/internal/flatten/replace github.com/go-openapi/analysis/internal/flatten/schutils github.com/go-openapi/analysis/internal/flatten/sortref -# github.com/go-openapi/errors v0.22.3 +# github.com/go-openapi/errors v0.22.4 ## explicit; go 1.24.0 github.com/go-openapi/errors # github.com/go-openapi/jsonpointer v0.22.1 ## explicit; go 1.24.0 github.com/go-openapi/jsonpointer -# github.com/go-openapi/jsonreference v0.21.2 +# github.com/go-openapi/jsonreference v0.21.3 ## explicit; go 1.24.0 github.com/go-openapi/jsonreference github.com/go-openapi/jsonreference/internal -# github.com/go-openapi/loads v0.23.1 +# github.com/go-openapi/loads v0.23.2 ## explicit; go 1.24.0 github.com/go-openapi/loads -# github.com/go-openapi/runtime v0.29.0 +# github.com/go-openapi/runtime v0.29.2 ## explicit; go 1.24.0 github.com/go-openapi/runtime github.com/go-openapi/runtime/client @@ -479,52 +482,52 @@ github.com/go-openapi/runtime/middleware/header github.com/go-openapi/runtime/middleware/untyped github.com/go-openapi/runtime/security github.com/go-openapi/runtime/yamlpc -# github.com/go-openapi/spec v0.22.0 => github.com/go-openapi/spec v0.20.6 +# github.com/go-openapi/spec v0.22.1 => github.com/go-openapi/spec v0.20.6 ## explicit; go 1.13 github.com/go-openapi/spec -# github.com/go-openapi/strfmt v0.24.0 +# github.com/go-openapi/strfmt v0.25.0 ## explicit; go 1.24.0 github.com/go-openapi/strfmt -# github.com/go-openapi/swag v0.25.1 +# github.com/go-openapi/swag v0.25.4 ## explicit; go 1.24.0 github.com/go-openapi/swag -# github.com/go-openapi/swag/cmdutils v0.25.1 +# github.com/go-openapi/swag/cmdutils v0.25.4 ## explicit; go 1.24.0 github.com/go-openapi/swag/cmdutils -# github.com/go-openapi/swag/conv v0.25.1 +# github.com/go-openapi/swag/conv v0.25.4 ## explicit; go 1.24.0 github.com/go-openapi/swag/conv -# github.com/go-openapi/swag/fileutils v0.25.1 +# github.com/go-openapi/swag/fileutils v0.25.4 ## explicit; go 1.24.0 github.com/go-openapi/swag/fileutils -# github.com/go-openapi/swag/jsonname v0.25.1 +# github.com/go-openapi/swag/jsonname v0.25.4 ## explicit; go 1.24.0 github.com/go-openapi/swag/jsonname -# github.com/go-openapi/swag/jsonutils v0.25.1 +# github.com/go-openapi/swag/jsonutils v0.25.4 ## explicit; go 1.24.0 github.com/go-openapi/swag/jsonutils github.com/go-openapi/swag/jsonutils/adapters github.com/go-openapi/swag/jsonutils/adapters/ifaces github.com/go-openapi/swag/jsonutils/adapters/stdlib/json -# github.com/go-openapi/swag/loading v0.25.1 +# github.com/go-openapi/swag/loading v0.25.4 ## explicit; go 1.24.0 github.com/go-openapi/swag/loading -# github.com/go-openapi/swag/mangling v0.25.1 +# github.com/go-openapi/swag/mangling v0.25.4 ## explicit; go 1.24.0 github.com/go-openapi/swag/mangling -# github.com/go-openapi/swag/netutils v0.25.1 +# github.com/go-openapi/swag/netutils v0.25.4 ## explicit; go 1.24.0 github.com/go-openapi/swag/netutils -# github.com/go-openapi/swag/stringutils v0.25.1 +# github.com/go-openapi/swag/stringutils v0.25.4 ## explicit; go 1.24.0 github.com/go-openapi/swag/stringutils -# github.com/go-openapi/swag/typeutils v0.25.1 +# github.com/go-openapi/swag/typeutils v0.25.4 ## explicit; go 1.24.0 github.com/go-openapi/swag/typeutils -# github.com/go-openapi/swag/yamlutils v0.25.1 +# github.com/go-openapi/swag/yamlutils v0.25.4 ## explicit; go 1.24.0 github.com/go-openapi/swag/yamlutils -# github.com/go-openapi/validate v0.25.0 +# github.com/go-openapi/validate v0.25.1 ## explicit; go 1.24.0 github.com/go-openapi/validate # github.com/go-redis/redis/v8 v8.11.5 @@ -551,9 +554,6 @@ github.com/gobwas/glob/syntax/ast github.com/gobwas/glob/syntax/lexer github.com/gobwas/glob/util/runes github.com/gobwas/glob/util/strings -# github.com/gofrs/uuid v4.4.0+incompatible -## explicit -github.com/gofrs/uuid # github.com/gogo/googleapis v1.4.1 ## explicit; go 1.12 github.com/gogo/googleapis/google/rpc @@ -970,7 +970,7 @@ github.com/prometheus-community/parquet-common/util # github.com/prometheus-community/prom-label-proxy v0.11.1 ## explicit; go 1.23.0 github.com/prometheus-community/prom-label-proxy/injectproxy -# github.com/prometheus/alertmanager v0.29.0 +# github.com/prometheus/alertmanager v0.30.1 ## explicit; go 1.24.0 github.com/prometheus/alertmanager/api github.com/prometheus/alertmanager/api/metrics @@ -1026,6 +1026,7 @@ github.com/prometheus/alertmanager/silence/silencepb github.com/prometheus/alertmanager/store github.com/prometheus/alertmanager/template github.com/prometheus/alertmanager/timeinterval +github.com/prometheus/alertmanager/tracing github.com/prometheus/alertmanager/types github.com/prometheus/alertmanager/ui # github.com/prometheus/client_golang v1.23.2 @@ -1302,10 +1303,6 @@ github.com/tinylib/msgp/msgp/setof # github.com/tjhop/slog-gokit v0.1.4 ## explicit; go 1.21 github.com/tjhop/slog-gokit -# github.com/trivago/tgo v1.0.7 -## explicit -github.com/trivago/tgo/tcontainer -github.com/trivago/tgo/treflect # github.com/uber/jaeger-client-go v2.30.0+incompatible ## explicit github.com/uber/jaeger-client-go @@ -1385,7 +1382,7 @@ go.etcd.io/etcd/client/v3 go.etcd.io/etcd/client/v3/credentials go.etcd.io/etcd/client/v3/internal/endpoint go.etcd.io/etcd/client/v3/internal/resolver -# go.mongodb.org/mongo-driver v1.17.4 +# go.mongodb.org/mongo-driver v1.17.6 ## explicit; go 1.18 go.mongodb.org/mongo-driver/bson go.mongodb.org/mongo-driver/bson/bsoncodec @@ -1521,6 +1518,13 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/envconfig go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/otlpconfig go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/retry +# go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 +## explicit; go 1.23.0 +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/envconfig +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/otlpconfig +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/retry # go.opentelemetry.io/otel/metric v1.38.0 ## explicit; go 1.23.0 go.opentelemetry.io/otel/metric From d450447e68a234a967bbcd212bb9e8287b0a3ded Mon Sep 17 00:00:00 2001 From: Friedrich Gonzalez <1517449+friedrichg@users.noreply.github.com> Date: Fri, 16 Jan 2026 12:07:43 -0800 Subject: [PATCH 02/10] block including webhook url file in mattermost Signed-off-by: Friedrich Gonzalez <1517449+friedrichg@users.noreply.github.com> --- pkg/alertmanager/api.go | 14 ++++++++++++++ pkg/alertmanager/api_test.go | 13 +++++++++++++ 2 files changed, 27 insertions(+) diff --git a/pkg/alertmanager/api.go b/pkg/alertmanager/api.go index d486f2230ee..06ab683fdc2 100644 --- a/pkg/alertmanager/api.go +++ b/pkg/alertmanager/api.go @@ -60,6 +60,7 @@ var ( errEmailAuthPasswordFileNotAllowed = errors.New("setting Email auth_password_file is not allowed") errIncidentIOURLFileNotAllowed = errors.New("setting IncidentIO url_file is not allowed") errIncidentIOAlertSourceTokenFileNotAllowed = errors.New("setting IncidentIO alert_source_token_file is not allowed") + errMatterMostWebhookUrlFileNotAllowed = errors.New("setting Mattermost webhook_url_file is not allowed") ) // UserConfig is used to communicate a users alertmanager configs @@ -415,6 +416,10 @@ func validateAlertmanagerConfig(cfg any) error { if err := validateIncidentIOConfig(v.Interface().(config.IncidentioConfig)); err != nil { return err } + case reflect.TypeFor[config.MattermostConfig](): + if err := validateMattermostConfig(v.Interface().(config.MattermostConfig)); err != nil { + return err + } } // If the input config is a struct, recursively iterate on all fields. @@ -614,6 +619,15 @@ func validateDiscordConfig(cfg config.DiscordConfig) error { return nil } +// validateMatterMostConfig validates the Discord Config and returns an error if it contains +// settings not allowed by Cortex. +func validateMattermostConfig(cfg config.MattermostConfig) error { + if cfg.WebhookURLFile != "" { + return errMatterMostWebhookUrlFileNotAllowed + } + return nil +} + // validateEmailConfig validates the Email Config and returns an error if it contains // settings not allowed by Cortex. func validateEmailConfig(cfg config.EmailConfig) error { diff --git a/pkg/alertmanager/api_test.go b/pkg/alertmanager/api_test.go index 21adf4e9dd3..26a058faa4d 100644 --- a/pkg/alertmanager/api_test.go +++ b/pkg/alertmanager/api_test.go @@ -764,6 +764,19 @@ alertmanager_config: | `, err: errors.Wrap(errIncidentIOAlertSourceTokenFileNotAllowed, "error validating Alertmanager config"), }, + { + name: "Should return error if Mattermost webhook_url_file is set", + cfg: ` +alertmanager_config: | + receivers: + - name: default-receiver + mattermost_configs: + - webhook_url_file: /urlFile + route: + receiver: 'default-receiver' +`, + err: errors.Wrap(errMatterMostWebhookUrlFileNotAllowed, "error validating Alertmanager config"), + }, } limits := &mockAlertManagerLimits{} From 0f210f311914e4ddf4b4cc93b7ba0a868695a469 Mon Sep 17 00:00:00 2001 From: Friedrich Gonzalez <1517449+friedrichg@users.noreply.github.com> Date: Fri, 16 Jan 2026 13:38:34 -0800 Subject: [PATCH 03/10] implement request duration metric and ensure firewall tests are working Signed-off-by: Friedrich Gonzalez <1517449+friedrichg@users.noreply.github.com> --- pkg/alertmanager/alertmanager.go | 37 ++- pkg/alertmanager/api.go | 18 +- pkg/alertmanager/multitenant_test.go | 15 + .../notify/mattermost/mattermost.go | 271 ++++++++++++++++++ vendor/modules.txt | 1 + 5 files changed, 324 insertions(+), 18 deletions(-) create mode 100644 vendor/github.com/prometheus/alertmanager/notify/mattermost/mattermost.go diff --git a/pkg/alertmanager/alertmanager.go b/pkg/alertmanager/alertmanager.go index f03b9e25fab..e9412cd49db 100644 --- a/pkg/alertmanager/alertmanager.go +++ b/pkg/alertmanager/alertmanager.go @@ -30,6 +30,7 @@ import ( "github.com/prometheus/alertmanager/notify/email" "github.com/prometheus/alertmanager/notify/incidentio" "github.com/prometheus/alertmanager/notify/jira" + "github.com/prometheus/alertmanager/notify/mattermost" "github.com/prometheus/alertmanager/notify/msteams" "github.com/prometheus/alertmanager/notify/msteamsv2" "github.com/prometheus/alertmanager/notify/opsgenie" @@ -87,14 +88,13 @@ type Config struct { // Tenant-specific local directory where AM can store its state (notifications, silences, templates). When AM is stopped, entire dir is removed. TenantDataDir string - ShardingEnabled bool - ReplicationFactor int - Replicator Replicator - Store alertstore.AlertStore - PersisterConfig PersisterConfig - APIConcurrency int - GCInterval time.Duration - DispatchStartDelay time.Duration + ShardingEnabled bool + ReplicationFactor int + Replicator Replicator + Store alertstore.AlertStore + PersisterConfig PersisterConfig + APIConcurrency int + GCInterval time.Duration } // An Alertmanager manages the alerts for one user. @@ -130,6 +130,8 @@ type Alertmanager struct { configHashMetric prometheus.Gauge rateLimitedNotifications *prometheus.CounterVec + + requestDuration *prometheus.HistogramVec } var ( @@ -184,6 +186,17 @@ func New(cfg *Config, reg *prometheus.Registry) (*Alertmanager, error) { Help: "Number of rate-limited notifications per integration.", }, []string{"integration"}), // "integration" is consistent with other alertmanager metrics. + requestDuration: promauto.With(reg).NewHistogramVec( + prometheus.HistogramOpts{ + Name: "alertmanager_http_request_duration_seconds", + Help: "Histogram of latencies for HTTP requests.", + Buckets: prometheus.DefBuckets, + NativeHistogramBucketFactor: 1.1, + NativeHistogramMaxBucketNumber: 100, + NativeHistogramMinResetDuration: 1 * time.Hour, + }, + []string{"handler", "method", "code"}, + ), } am.registry = reg @@ -292,7 +305,8 @@ func New(cfg *Config, reg *prometheus.Registry) (*Alertmanager, error) { GroupFunc: func(ctx context.Context, f1 func(*dispatch.Route) bool, f2 func(*types.Alert, time.Time) bool) (dispatch.AlertGroups, map[model.Fingerprint][]string, error) { return am.dispatcher.Groups(ctx, f1, f2) }, - Concurrency: am.cfg.APIConcurrency, + Concurrency: am.cfg.APIConcurrency, + RequestDuration: am.requestDuration, }) if err != nil { return nil, fmt.Errorf("failed to create api: %v", err) @@ -612,6 +626,11 @@ func buildReceiverIntegrations(nc config.Receiver, tmpl *template.Template, fire return incidentio.New(c, tmpl, util_log.GoKitLogToSlog(l), httpOps...) }) } + for i, c := range nc.MattermostConfigs { + add("mattermost", i, c, func(l log.Logger) (notify.Notifier, error) { + return mattermost.New(c, tmpl, util_log.GoKitLogToSlog(l), httpOps...) + }) + } // If we add support for more integrations, we need to add them to validation as well. See validation.allowedIntegrationNames field. if errs.Len() > 0 { diff --git a/pkg/alertmanager/api.go b/pkg/alertmanager/api.go index 06ab683fdc2..5e9d765723e 100644 --- a/pkg/alertmanager/api.go +++ b/pkg/alertmanager/api.go @@ -619,15 +619,6 @@ func validateDiscordConfig(cfg config.DiscordConfig) error { return nil } -// validateMatterMostConfig validates the Discord Config and returns an error if it contains -// settings not allowed by Cortex. -func validateMattermostConfig(cfg config.MattermostConfig) error { - if cfg.WebhookURLFile != "" { - return errMatterMostWebhookUrlFileNotAllowed - } - return nil -} - // validateEmailConfig validates the Email Config and returns an error if it contains // settings not allowed by Cortex. func validateEmailConfig(cfg config.EmailConfig) error { @@ -650,3 +641,12 @@ func validateIncidentIOConfig(cfg config.IncidentioConfig) error { return nil } + +// validateMatterMostConfig validates the Mattermost Config and returns an error if it contains +// settings not allowed by Cortex. +func validateMattermostConfig(cfg config.MattermostConfig) error { + if cfg.WebhookURLFile != "" { + return errMatterMostWebhookUrlFileNotAllowed + } + return nil +} diff --git a/pkg/alertmanager/multitenant_test.go b/pkg/alertmanager/multitenant_test.go index 134627fe7c1..de8591b498c 100644 --- a/pkg/alertmanager/multitenant_test.go +++ b/pkg/alertmanager/multitenant_test.go @@ -526,6 +526,21 @@ receivers: - api_url: %s token: token token_id: token-id +`, backendURL) + }, + }, + "mattermost": { + getAlertmanagerConfig: func(backendURL string) string { + return fmt.Sprintf(` +route: + receiver: mattermost + group_wait: 0s + group_interval: 1s + +receivers: + - name: mattermost + mattermost_configs: + - webhook_url: %s `, backendURL) }, }, diff --git a/vendor/github.com/prometheus/alertmanager/notify/mattermost/mattermost.go b/vendor/github.com/prometheus/alertmanager/notify/mattermost/mattermost.go new file mode 100644 index 00000000000..b54c49e6421 --- /dev/null +++ b/vendor/github.com/prometheus/alertmanager/notify/mattermost/mattermost.go @@ -0,0 +1,271 @@ +// Copyright The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package mattermost + +import ( + "bytes" + "context" + "encoding/json" + "errors" + "fmt" + "io" + "log/slog" + "net/http" + "os" + "strings" + + commoncfg "github.com/prometheus/common/config" + + "github.com/prometheus/alertmanager/config" + "github.com/prometheus/alertmanager/notify" + "github.com/prometheus/alertmanager/template" + "github.com/prometheus/alertmanager/types" +) + +// Mattermost supports 16383 chars max. +// https://developers.mattermost.com/integrate/webhooks/incoming/#tips-and-best-practices +const maxTextLenRunes = 16383 + +// Notifier implements a Notifier for Mattermost notifications. +type Notifier struct { + conf *config.MattermostConfig + tmpl *template.Template + logger *slog.Logger + client *http.Client + retrier *notify.Retrier + + postJSONFunc func(ctx context.Context, client *http.Client, url string, body io.Reader) (*http.Response, error) +} + +// New returns a new Mattermost notifier. +func New(c *config.MattermostConfig, t *template.Template, l *slog.Logger, httpOpts ...commoncfg.HTTPClientOption) (*Notifier, error) { + client, err := notify.NewClientWithTracing(*c.HTTPConfig, "mattermost", httpOpts...) + if err != nil { + return nil, err + } + + return &Notifier{ + conf: c, + tmpl: t, + logger: l, + client: client, + retrier: ¬ify.Retrier{}, + postJSONFunc: notify.PostJSON, + }, nil +} + +// request is the request for sending a Mattermost notification. +// https://developers.mattermost.com/integrate/webhooks/incoming/#parameters +type request struct { + Text string `json:"text"` + Channel string `json:"channel,omitempty"` + Username string `json:"username,omitempty"` + IconURL string `json:"icon_url,omitempty"` + IconEmoji string `json:"icon_emoji,omitempty"` + Attachments []attachment `json:"attachments,omitempty"` + Type string `json:"type,omitempty"` + Props *config.MattermostProps `json:"props,omitempty"` + Priority *config.MattermostPriority `json:"priority,omitempty"` +} + +// attachment is used to display a richly-formatted message block for compatibility with Slack. +// https://developers.mattermost.com/integrate/reference/message-attachments/ +type attachment struct { + Fallback string `json:"fallback,omitempty"` + Color string `json:"color,omitempty"` + Pretext string `json:"pretext,omitempty"` + Text string `json:"text,omitempty"` + AuthorName string `json:"author_name,omitempty"` + AuthorLink string `json:"author_link,omitempty"` + AuthorIcon string `json:"author_icon,omitempty"` + Title string `json:"title,omitempty"` + TitleLink string `json:"title_link,omitempty"` + Fields []config.MattermostField `json:"fields,omitempty"` + ThumbURL string `json:"thumb_url,omitempty"` + Footer string `json:"footer,omitempty"` + FooterIcon string `json:"footer_icon,omitempty"` + ImageURL string `json:"image_url,omitempty"` +} + +// Notify implements the Notifier interface. +func (n *Notifier) Notify(ctx context.Context, alert ...*types.Alert) (bool, error) { + var ( + err error + url string + data = notify.GetTemplateData(ctx, n.tmpl, alert, n.logger) + ) + + if n.conf.WebhookURL != nil { + url = n.conf.WebhookURL.String() + } else { + content, err := os.ReadFile(n.conf.WebhookURLFile) + if err != nil { + return false, err + } + url = strings.TrimSpace(string(content)) + } + if url == "" { + return false, errors.New("webhook url missing") + } + + req := n.createRequest(notify.TmplText(n.tmpl, data, &err)) + if err != nil { + return false, err + } + err = n.sanitizeRequest(ctx, req) + if err != nil { + return false, err + } + + var buf bytes.Buffer + if err := json.NewEncoder(&buf).Encode(req); err != nil { + return false, err + } + + resp, err := n.postJSONFunc(ctx, n.client, url, &buf) + if err != nil { + return true, notify.RedactURL(err) + } + defer notify.Drain(resp) + + // Use a retrier to generate an error message for non-200 responses and + // classify them as retriable or not. + retry, err := n.retrier.Check(resp.StatusCode, resp.Body) + if err != nil { + err = fmt.Errorf("channel %q: %w", req.Channel, err) + return retry, notify.NewErrorWithReason(notify.GetFailureReasonFromStatusCode(resp.StatusCode), err) + } + n.logger.Debug("Message sent to Mattermost successfully", + "status", resp.StatusCode) + + return false, nil +} + +func (n *Notifier) createRequest(tmpl func(string) string) *request { + req := &request{ + Text: tmpl(n.conf.Text), + Channel: tmpl(n.conf.Channel), + Username: tmpl(n.conf.Username), + IconURL: tmpl(n.conf.IconURL), + IconEmoji: tmpl(n.conf.IconEmoji), + Type: tmpl(n.conf.Type), + } + + if n.conf.Priority != nil && n.conf.Priority.Priority != "" { + req.Priority = &config.MattermostPriority{ + Priority: tmpl(n.conf.Priority.Priority), + RequestedAck: n.conf.Priority.RequestedAck, + PersistentNotifications: n.conf.Priority.PersistentNotifications, + } + } + + if n.conf.Props != nil && n.conf.Props.Card != "" { + req.Props = &config.MattermostProps{ + Card: tmpl(n.conf.Props.Card), + } + } + + lenAtt := len(n.conf.Attachments) + if lenAtt > 0 { + req.Attachments = make([]attachment, lenAtt) + for idxAtt, cfgAtt := range n.conf.Attachments { + att := attachment{ + Fallback: tmpl(cfgAtt.Fallback), + Color: tmpl(cfgAtt.Color), + Pretext: tmpl(cfgAtt.Pretext), + Text: tmpl(cfgAtt.Text), + AuthorName: tmpl(cfgAtt.AuthorName), + AuthorLink: tmpl(cfgAtt.AuthorLink), + AuthorIcon: tmpl(cfgAtt.AuthorIcon), + Title: tmpl(cfgAtt.Title), + TitleLink: tmpl(cfgAtt.TitleLink), + ThumbURL: tmpl(cfgAtt.ThumbURL), + Footer: tmpl(cfgAtt.Footer), + FooterIcon: tmpl(cfgAtt.FooterIcon), + ImageURL: tmpl(cfgAtt.ImageURL), + } + + lenFields := len(cfgAtt.Fields) + if lenFields > 0 { + att.Fields = make([]config.MattermostField, lenFields) + for idxField, field := range cfgAtt.Fields { + att.Fields[idxField] = config.MattermostField{ + Title: tmpl(field.Title), + Value: tmpl(field.Value), + Short: field.Short, + } + } + } + + req.Attachments[idxAtt] = att + } + } + + return req +} + +func (n *Notifier) sanitizeRequest(ctx context.Context, r *request) error { + key, err := notify.ExtractGroupKey(ctx) + if err != nil { + return err + } + + // Truncate the text if it's too long. + text, truncated := notify.TruncateInRunes(r.Text, maxTextLenRunes) + if truncated { + n.logger.Warn("Truncated text", + "key", key, + "max_runes", maxTextLenRunes) + r.Text = text + } + + if r.Priority == nil { + return nil + } + + // Check priority + const ( + priorityUrgent = "urgent" + priorityImportant = "important" + priorityStandard = "standard" + ) + + switch strings.ToLower(r.Priority.Priority) { + case priorityUrgent, priorityImportant, priorityStandard: + r.Priority.Priority = strings.ToLower(r.Priority.Priority) + default: + n.logger.Warn("Priority is set to standard due to invalid value", + "key", key, + "priority", r.Priority.Priority) + r.Priority.Priority = priorityStandard + } + + // Check RequestedAck flag + if r.Priority.RequestedAck && r.Priority.Priority == priorityStandard { + n.logger.Warn("RequestedAck is set to false due to priority is standard", + "key", key, + ) + r.Priority.RequestedAck = false + } + + // Check PersistentNotifications flag + if r.Priority.PersistentNotifications && r.Priority.Priority != priorityUrgent { + n.logger.Warn("PersistentNotifications is set to false due to priority is not urgent", + "key", key, + ) + r.Priority.PersistentNotifications = false + } + + return nil +} diff --git a/vendor/modules.txt b/vendor/modules.txt index b1f6781ad58..e1e5405fdd6 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1005,6 +1005,7 @@ github.com/prometheus/alertmanager/notify/discord github.com/prometheus/alertmanager/notify/email github.com/prometheus/alertmanager/notify/incidentio github.com/prometheus/alertmanager/notify/jira +github.com/prometheus/alertmanager/notify/mattermost github.com/prometheus/alertmanager/notify/msteams github.com/prometheus/alertmanager/notify/msteamsv2 github.com/prometheus/alertmanager/notify/opsgenie From 731fb8d022deefa3b2f5036b491ab70584071f98 Mon Sep 17 00:00:00 2001 From: Friedrich Gonzalez <1517449+friedrichg@users.noreply.github.com> Date: Fri, 16 Jan 2026 13:57:32 -0800 Subject: [PATCH 04/10] Update changelog Signed-off-by: Friedrich Gonzalez <1517449+friedrichg@users.noreply.github.com> --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 16b1d37b5ed..de36d019e94 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,6 +14,7 @@ * [FEATURE] Distributor: Add a per-tenant flag `-distributor.enable-type-and-unit-labels` that enables adding `__unit__` and `__type__` labels for remote write v2 and OTLP requests. This is a breaking change; the `-distributor.otlp.enable-type-and-unit-labels` flag is now deprecated, operates as a no-op, and has been consolidated into this new flag. #7077 * [FEATURE] Querier: Add experimental projection pushdown support in Parquet Queryable. #7152 * [FEATURE] Ingester: Add experimental active series queried metric. #7173 +* [FEATURE] Update prometheus Alertmanager version to v0.30.1 and add new integration to mattermost. #7221 * [ENHANCEMENT] Distributor: Add `cortex_distributor_push_requests_total` metric to track the number of push requests by type. #7239 * [ENHANCEMENT] Querier: Add `-querier.store-gateway-series-batch-size` flag to configure the maximum number of series to be batched in a single gRPC response message from Store Gateways. #7203 * [ENHANCEMENT] HATracker: Add `-distributor.ha-tracker.enable-startup-sync` flag. If enabled, the ha-tracker fetches all tracked keys on startup to populate the local cache. #7213 From d3c815a08c056a4a967a3caa53708bc4cde8f8d2 Mon Sep 17 00:00:00 2001 From: Friedrich Gonzalez <1517449+friedrichg@users.noreply.github.com> Date: Sat, 14 Feb 2026 08:29:22 -0800 Subject: [PATCH 05/10] Upgrade to v0.31.1 Signed-off-by: Friedrich Gonzalez <1517449+friedrichg@users.noreply.github.com> --- CHANGELOG.md | 2 +- go.mod | 86 +-- go.sum | 164 ++--- .../aws-sdk-go-v2/aws/go_module_metadata.go | 2 +- .../aws/transport/http/client.go | 2 + .../aws/aws-sdk-go-v2/config/CHANGELOG.md | 16 + .../config/go_module_metadata.go | 2 +- .../aws-sdk-go-v2/credentials/CHANGELOG.md | 16 + .../credentials/go_module_metadata.go | 2 +- .../feature/ec2/imds/CHANGELOG.md | 8 + .../feature/ec2/imds/go_module_metadata.go | 2 +- .../internal/configsources/CHANGELOG.md | 8 + .../configsources/go_module_metadata.go | 2 +- .../internal/endpoints/v2/CHANGELOG.md | 8 + .../endpoints/v2/go_module_metadata.go | 2 +- .../internal/presigned-url/CHANGELOG.md | 8 + .../presigned-url/go_module_metadata.go | 2 +- .../aws-sdk-go-v2/service/signin/CHANGELOG.md | 8 + .../service/signin/go_module_metadata.go | 2 +- .../aws-sdk-go-v2/service/sns/CHANGELOG.md | 12 + .../service/sns/go_module_metadata.go | 2 +- .../sns/internal/endpoints/endpoints.go | 5 + .../aws-sdk-go-v2/service/sso/CHANGELOG.md | 12 + .../service/sso/go_module_metadata.go | 2 +- .../sso/internal/endpoints/endpoints.go | 3 + .../service/ssooidc/CHANGELOG.md | 8 + .../service/ssooidc/go_module_metadata.go | 2 +- .../aws-sdk-go-v2/service/sts/CHANGELOG.md | 12 + .../service/sts/go_module_metadata.go | 2 +- .../sts/internal/endpoints/endpoints.go | 5 + .../go-openapi/analysis/.cliff.toml | 181 +++++ .../go-openapi/analysis/.editorconfig | 26 + .../go-openapi/analysis/.golangci.yml | 34 +- .../go-openapi/analysis/CONTRIBUTORS.md | 26 + .../github.com/go-openapi/analysis/README.md | 103 ++- .../go-openapi/analysis/SECURITY.md | 19 + .../go-openapi/analysis/analyzer.go | 68 +- .../github.com/go-openapi/analysis/debug.go | 2 +- .../github.com/go-openapi/analysis/flatten.go | 8 +- .../go-openapi/analysis/flatten_name.go | 8 +- .../go-openapi/analysis/flatten_options.go | 4 +- .../analysis/internal/debug/debug.go | 6 +- .../internal/flatten/normalize/normalize.go | 4 +- .../internal/flatten/operations/operations.go | 12 +- .../internal/flatten/replace/errors.go | 2 +- .../internal/flatten/replace/replace.go | 42 +- .../flatten/schutils/flatten_schema.go | 4 +- .../analysis/internal/flatten/sortref/keys.go | 42 +- .../internal/flatten/sortref/sort_ref.go | 22 +- .../github.com/go-openapi/analysis/schema.go | 6 +- .../github.com/go-openapi/errors/.cliff.toml | 181 +++++ .../go-openapi/errors/.editorconfig | 26 + .../github.com/go-openapi/errors/.gitignore | 3 +- .../go-openapi/errors/.golangci.yml | 31 +- .../go-openapi/errors/CONTRIBUTORS.md | 24 + vendor/github.com/go-openapi/errors/README.md | 121 +++- .../github.com/go-openapi/errors/SECURITY.md | 19 + vendor/github.com/go-openapi/errors/api.go | 110 +-- vendor/github.com/go-openapi/errors/auth.go | 2 +- .../github.com/go-openapi/errors/headers.go | 16 +- .../go-openapi/errors/middleware.go | 3 +- .../github.com/go-openapi/errors/parsing.go | 9 +- vendor/github.com/go-openapi/errors/schema.go | 91 ++- .../go-openapi/jsonpointer/.cliff.toml | 181 +++++ .../go-openapi/jsonpointer/.gitignore | 5 +- .../go-openapi/jsonpointer/.golangci.yml | 29 +- .../go-openapi/jsonpointer/CONTRIBUTORS.md | 24 + .../github.com/go-openapi/jsonpointer/LICENSE | 1 - .../github.com/go-openapi/jsonpointer/NOTICE | 39 ++ .../go-openapi/jsonpointer/README.md | 147 +++- .../go-openapi/jsonpointer/SECURITY.md | 19 + .../go-openapi/jsonpointer/errors.go | 23 +- .../go-openapi/jsonpointer/pointer.go | 358 +++++----- .../go-openapi/jsonreference/.cliff.toml | 181 +++++ .../go-openapi/jsonreference/.editorconfig | 26 + .../go-openapi/jsonreference/.golangci.yml | 29 +- .../go-openapi/jsonreference/CONTRIBUTORS.md | 21 + .../go-openapi/jsonreference/NOTICE | 5 +- .../go-openapi/jsonreference/README.md | 87 ++- .../go-openapi/jsonreference/SECURITY.md | 19 + .../jsonreference/internal/normalize_url.go | 8 +- .../go-openapi/jsonreference/reference.go | 20 +- .../grpc-gateway/v2/runtime/BUILD.bazel | 1 + .../grpc-gateway/v2/runtime/context.go | 6 +- .../grpc-gateway/v2/runtime/marshal_jsonpb.go | 6 +- .../grpc-gateway/v2/runtime/mux.go | 16 +- .../prometheus/alertmanager/api/api.go | 2 +- .../v2/client/alert/get_alerts_parameters.go | 8 +- .../alertgroup/get_alert_groups_parameters.go | 8 +- .../alertmanager/api/v2/openapi.yaml | 16 +- .../api/v2/restapi/embedded_spec.go | 32 +- .../operations/alert/get_alerts_parameters.go | 8 +- .../alertgroup/get_alert_groups_parameters.go | 8 +- .../alertmanager/asset/assets_vfsdata.go | 34 +- .../prometheus/alertmanager/config/config.go | 306 +++++---- .../alertmanager/config/notifiers.go | 67 +- .../featurecontrol/featurecontrol.go | 19 + .../prometheus/alertmanager/limit/bucket.go | 160 +++++ .../prometheus/alertmanager/nflog/nflog.go | 102 ++- .../alertmanager/nflog/nflogpb/nflog.pb.go | 631 ++++++++++++++++-- .../alertmanager/nflog/nflogpb/nflog.proto | 10 + .../alertmanager/notify/email/email.go | 30 +- .../alertmanager/notify/jira/jira.go | 20 +- .../alertmanager/notify/jira/types.go | 95 ++- .../prometheus/alertmanager/notify/notify.go | 39 +- .../alertmanager/notify/slack/slack.go | 2 + .../alertmanager/notify/telegram/telegram.go | 23 +- .../alertmanager/notify/webhook/webhook.go | 18 +- .../alertmanager/notify/wechat/wechat.go | 19 +- .../alertmanager/provider/mem/mem.go | 112 +++- .../alertmanager/silence/silence.go | 10 +- .../prometheus/alertmanager/store/store.go | 73 +- vendor/github.com/prometheus/sigv4/sigv4.go | 10 +- .../prometheus/sigv4/sigv4_config.go | 4 + .../otelhttptrace/internal/semconv/client.go | 305 +++++++++ .../otelhttptrace/internal/semconv/env.go | 248 ------- .../otelhttptrace/internal/semconv/gen.go | 8 +- .../internal/semconv/httpconv.go | 517 -------------- .../otelhttptrace/internal/semconv/server.go | 403 +++++++++++ .../http/httptrace/otelhttptrace/version.go | 2 +- .../net/http/otelhttp/client.go | 15 + .../net/http/otelhttp/config.go | 19 +- .../instrumentation/net/http/otelhttp/doc.go | 3 +- .../net/http/otelhttp/handler.go | 7 +- .../http/otelhttp/internal/semconv/client.go | 305 +++++++++ .../net/http/otelhttp/internal/semconv/env.go | 248 ------- .../net/http/otelhttp/internal/semconv/gen.go | 8 +- .../otelhttp/internal/semconv/httpconv.go | 517 -------------- .../http/otelhttp/internal/semconv/server.go | 403 +++++++++++ .../net/http/otelhttp/version.go | 2 +- .../go.opentelemetry.io/otel/.codespellignore | 1 + vendor/go.opentelemetry.io/otel/.golangci.yml | 3 + vendor/go.opentelemetry.io/otel/.lycheeignore | 6 +- vendor/go.opentelemetry.io/otel/CHANGELOG.md | 72 +- .../go.opentelemetry.io/otel/CONTRIBUTING.md | 458 ++++++++++++- vendor/go.opentelemetry.io/otel/Makefile | 3 +- vendor/go.opentelemetry.io/otel/README.md | 11 +- vendor/go.opentelemetry.io/otel/RELEASING.md | 54 +- vendor/go.opentelemetry.io/otel/VERSIONING.md | 2 +- .../otel/attribute/encoder.go | 2 +- .../otel/attribute/hash.go | 92 +++ .../otel/attribute/internal/xxhash/xxhash.go | 64 ++ .../go.opentelemetry.io/otel/attribute/set.go | 145 ++-- .../otel/attribute/type_string.go | 5 +- .../otel/baggage/baggage.go | 12 +- .../otel/dependencies.Dockerfile | 2 +- .../otlptrace/internal/tracetransform/span.go | 16 +- .../otlp/otlptrace/otlptracegrpc/client.go | 39 +- .../otlptracegrpc/internal/counter/counter.go | 31 + .../otlptrace/otlptracegrpc/internal/gen.go | 9 + .../otlptracegrpc/internal/observ/doc.go | 6 + .../internal/observ/instrumentation.go | 341 ++++++++++ .../otlptracegrpc/internal/observ/target.go | 143 ++++ .../otlptracegrpc/internal/partialsuccess.go | 11 + .../otlptracegrpc/internal/retry/retry.go | 5 + .../otlptracegrpc/internal/version.go | 8 + .../otlptracegrpc}/internal/x/README.md | 23 +- .../otlptracegrpc/internal/x/observ.go | 22 + .../otlptrace/otlptracegrpc}/internal/x/x.go | 45 +- .../otlp/otlptrace/otlptracehttp/client.go | 44 +- .../otlptracehttp/internal/counter/counter.go | 31 + .../otlptrace/otlptracehttp/internal/gen.go | 6 + .../internal/observ/instrumentation.go | 397 +++++++++++ .../otlptracehttp/internal/partialsuccess.go | 11 + .../otlptracehttp/internal/retry/retry.go | 5 + .../otlptracehttp/internal/version.go | 8 + .../otlptracehttp/internal/x/observ.go | 22 + .../otlptrace/otlptracehttp/internal/x/x.go | 58 ++ .../otel/exporters/otlp/otlptrace/version.go | 2 +- .../otel/internal/global/meter.go | 2 +- vendor/go.opentelemetry.io/otel/metric.go | 2 +- .../go.opentelemetry.io/otel/metric/config.go | 38 +- .../otel/propagation/trace_context.go | 2 +- .../otel/sdk/internal/x/features.go | 39 ++ .../otel/sdk/internal/x/x.go | 46 +- .../otel/sdk/metric/doc.go | 16 + .../metric/exemplar/fixed_size_reservoir.go | 22 +- .../metric/exemplar/histogram_reservoir.go | 27 +- .../otel/sdk/metric/exemplar/storage.go | 14 +- .../otel/sdk/metric/instrumentkind_string.go | 5 +- .../metric/internal/aggregate/aggregate.go | 7 +- .../sdk/metric/internal/aggregate/atomic.go | 184 +++++ .../aggregate/exponential_histogram.go | 21 +- .../internal/aggregate/filtered_reservoir.go | 28 +- .../metric/internal/aggregate/histogram.go | 71 +- .../metric/internal/aggregate/lastvalue.go | 16 +- .../sdk/metric/internal/aggregate/limit.go | 2 +- .../otel/sdk/metric/internal/aggregate/sum.go | 239 ++++--- .../metric/internal/observ/instrumentation.go | 168 +++++ .../internal/reservoir/concurrent_safe.go | 11 + .../otel/sdk/metric/internal/reservoir/doc.go | 6 + .../otel/sdk/metric/manual_reader.go | 41 +- .../metric/metricdata/temporality_string.go | 5 +- .../otel/sdk/metric/periodic_reader.go | 34 +- .../otel/sdk/metric/reader.go | 32 +- .../otel/sdk/metric/version.go | 2 +- .../otel/sdk/resource/host_id_bsd.go | 1 - .../otel/sdk/resource/host_id_linux.go | 1 - .../otel/sdk/resource/host_id_unsupported.go | 1 - .../otel/sdk/resource/host_id_windows.go | 1 - .../otel/sdk/resource/os_release_unix.go | 1 - .../otel/sdk/resource/os_unix.go | 1 - .../otel/sdk/resource/os_unsupported.go | 1 - .../otel/sdk/trace/batch_span_processor.go | 107 +-- .../go.opentelemetry.io/otel/sdk/trace/doc.go | 2 +- .../otel/sdk/{ => trace}/internal/env/env.go | 2 +- .../internal/observ/batch_span_processor.go | 119 ++++ .../otel/sdk/trace/internal/observ/doc.go | 6 + .../internal/observ/simple_span_processor.go | 97 +++ .../otel/sdk/trace/internal/observ/tracer.go | 223 +++++++ .../otel/sdk/trace/provider.go | 48 +- .../otel/sdk/trace/simple_span_processor.go | 31 +- .../otel/sdk/trace/span.go | 27 +- .../otel/sdk/trace/span_limits.go | 2 +- .../otel/sdk/trace/tracer.go | 134 +--- .../go.opentelemetry.io/otel/sdk/version.go | 2 +- .../otel/semconv/v1.37.0/error_type.go | 47 +- .../otel/semconv/v1.37.0/httpconv/metric.go | 189 ++++-- .../otel/semconv/v1.37.0/otelconv/metric.go | 312 ++++++--- .../go.opentelemetry.io/otel/trace/config.go | 45 +- vendor/go.opentelemetry.io/otel/trace/span.go | 4 + vendor/go.opentelemetry.io/otel/version.go | 2 +- vendor/go.opentelemetry.io/otel/versions.yaml | 27 +- .../proto/otlp/common/v1/common.pb.go | 23 +- .../proto/otlp/resource/v1/resource.pb.go | 3 +- .../proto/otlp/trace/v1/trace.pb.go | 36 +- .../chacha20poly1305/chacha20poly1305.go | 3 + .../chacha20poly1305/fips140only_compat.go | 9 + .../chacha20poly1305/fips140only_go1.26.go | 11 + .../chacha20poly1305/xchacha20poly1305.go | 3 + .../net/http2/writesched_priority_rfc9218.go | 15 + vendor/golang.org/x/sys/cpu/cpu_x86.go | 174 +++-- vendor/golang.org/x/time/rate/rate.go | 2 +- .../x/tools/go/ast/inspector/cursor.go | 10 + .../x/tools/go/packages/packages.go | 41 +- .../x/tools/go/types/typeutil/callee.go | 1 + .../x/tools/internal/event/core/export.go | 15 +- .../x/tools/internal/event/label/label.go | 12 +- .../x/tools/internal/stdlib/deps.go | 630 ++++++++--------- .../x/tools/internal/stdlib/manifest.go | 615 ++++++++++++++++- .../x/tools/internal/stdlib/stdlib.go | 2 +- .../internal/typesinternal/classify_call.go | 2 +- .../x/tools/internal/typesinternal/types.go | 4 +- .../x/tools/internal/versions/features.go | 1 + vendor/modules.txt | 129 ++-- 245 files changed, 10384 insertions(+), 3874 deletions(-) create mode 100644 vendor/github.com/go-openapi/analysis/.cliff.toml create mode 100644 vendor/github.com/go-openapi/analysis/.editorconfig create mode 100644 vendor/github.com/go-openapi/analysis/CONTRIBUTORS.md create mode 100644 vendor/github.com/go-openapi/analysis/SECURITY.md create mode 100644 vendor/github.com/go-openapi/errors/.cliff.toml create mode 100644 vendor/github.com/go-openapi/errors/.editorconfig create mode 100644 vendor/github.com/go-openapi/errors/CONTRIBUTORS.md create mode 100644 vendor/github.com/go-openapi/errors/SECURITY.md create mode 100644 vendor/github.com/go-openapi/jsonpointer/.cliff.toml create mode 100644 vendor/github.com/go-openapi/jsonpointer/CONTRIBUTORS.md create mode 100644 vendor/github.com/go-openapi/jsonpointer/NOTICE create mode 100644 vendor/github.com/go-openapi/jsonpointer/SECURITY.md create mode 100644 vendor/github.com/go-openapi/jsonreference/.cliff.toml create mode 100644 vendor/github.com/go-openapi/jsonreference/.editorconfig create mode 100644 vendor/github.com/go-openapi/jsonreference/CONTRIBUTORS.md create mode 100644 vendor/github.com/go-openapi/jsonreference/SECURITY.md create mode 100644 vendor/github.com/prometheus/alertmanager/limit/bucket.go create mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/internal/semconv/client.go delete mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/internal/semconv/env.go delete mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/internal/semconv/httpconv.go create mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/internal/semconv/server.go create mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/client.go delete mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/env.go delete mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/httpconv.go create mode 100644 vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/server.go create mode 100644 vendor/go.opentelemetry.io/otel/attribute/hash.go create mode 100644 vendor/go.opentelemetry.io/otel/attribute/internal/xxhash/xxhash.go create mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/counter/counter.go create mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/observ/doc.go create mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/observ/instrumentation.go create mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/observ/target.go create mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/version.go rename vendor/go.opentelemetry.io/otel/{sdk/trace => exporters/otlp/otlptrace/otlptracegrpc}/internal/x/README.md (54%) create mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/x/observ.go rename vendor/go.opentelemetry.io/otel/{sdk/trace => exporters/otlp/otlptrace/otlptracegrpc}/internal/x/x.go (55%) create mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/counter/counter.go create mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/observ/instrumentation.go create mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/version.go create mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/x/observ.go create mode 100644 vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/x/x.go create mode 100644 vendor/go.opentelemetry.io/otel/sdk/internal/x/features.go create mode 100644 vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/atomic.go create mode 100644 vendor/go.opentelemetry.io/otel/sdk/metric/internal/observ/instrumentation.go create mode 100644 vendor/go.opentelemetry.io/otel/sdk/metric/internal/reservoir/concurrent_safe.go create mode 100644 vendor/go.opentelemetry.io/otel/sdk/metric/internal/reservoir/doc.go rename vendor/go.opentelemetry.io/otel/sdk/{ => trace}/internal/env/env.go (98%) create mode 100644 vendor/go.opentelemetry.io/otel/sdk/trace/internal/observ/batch_span_processor.go create mode 100644 vendor/go.opentelemetry.io/otel/sdk/trace/internal/observ/doc.go create mode 100644 vendor/go.opentelemetry.io/otel/sdk/trace/internal/observ/simple_span_processor.go create mode 100644 vendor/go.opentelemetry.io/otel/sdk/trace/internal/observ/tracer.go create mode 100644 vendor/golang.org/x/crypto/chacha20poly1305/fips140only_compat.go create mode 100644 vendor/golang.org/x/crypto/chacha20poly1305/fips140only_go1.26.go diff --git a/CHANGELOG.md b/CHANGELOG.md index de36d019e94..da8b678fea1 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -14,7 +14,7 @@ * [FEATURE] Distributor: Add a per-tenant flag `-distributor.enable-type-and-unit-labels` that enables adding `__unit__` and `__type__` labels for remote write v2 and OTLP requests. This is a breaking change; the `-distributor.otlp.enable-type-and-unit-labels` flag is now deprecated, operates as a no-op, and has been consolidated into this new flag. #7077 * [FEATURE] Querier: Add experimental projection pushdown support in Parquet Queryable. #7152 * [FEATURE] Ingester: Add experimental active series queried metric. #7173 -* [FEATURE] Update prometheus Alertmanager version to v0.30.1 and add new integration to mattermost. #7221 +* [FEATURE] Update prometheus Alertmanager version to v0.31.1 and add new integration to mattermost. #7267 * [ENHANCEMENT] Distributor: Add `cortex_distributor_push_requests_total` metric to track the number of push requests by type. #7239 * [ENHANCEMENT] Querier: Add `-querier.store-gateway-series-batch-size` flag to configure the maximum number of series to be batched in a single gRPC response message from Store Gateways. #7203 * [ENHANCEMENT] HATracker: Add `-distributor.ha-tracker.enable-startup-sync` flag. If enabled, the ha-tracker fetches all tracked keys on startup to populate the local cache. #7213 diff --git a/go.mod b/go.mod index 781104978b1..f349810f22f 100644 --- a/go.mod +++ b/go.mod @@ -28,7 +28,7 @@ require ( github.com/hashicorp/go-cleanhttp v0.5.2 github.com/hashicorp/go-metrics v0.5.4 github.com/hashicorp/go-sockaddr v1.0.7 - github.com/hashicorp/memberlist v0.5.3 + github.com/hashicorp/memberlist v0.5.4 github.com/json-iterator/go v1.1.12 github.com/klauspost/compress v1.18.2 github.com/lib/pq v1.10.9 @@ -39,7 +39,7 @@ require ( github.com/opentracing-contrib/go-stdlib v1.1.1 github.com/opentracing/opentracing-go v1.2.0 github.com/pkg/errors v0.9.1 - github.com/prometheus/alertmanager v0.30.1 + github.com/prometheus/alertmanager v0.31.1 github.com/prometheus/client_golang v1.23.2 github.com/prometheus/client_model v0.6.2 github.com/prometheus/common v0.67.5 @@ -58,25 +58,25 @@ require ( go.etcd.io/etcd/client/pkg/v3 v3.5.17 go.etcd.io/etcd/client/v3 v3.5.17 go.opentelemetry.io/contrib/propagators/aws v1.36.0 - go.opentelemetry.io/otel v1.38.0 + go.opentelemetry.io/otel v1.39.0 go.opentelemetry.io/otel/bridge/opentracing v1.36.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 - go.opentelemetry.io/otel/sdk v1.38.0 - go.opentelemetry.io/otel/trace v1.38.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0 + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.39.0 + go.opentelemetry.io/otel/sdk v1.39.0 + go.opentelemetry.io/otel/trace v1.39.0 go.uber.org/atomic v1.11.0 - golang.org/x/net v0.48.0 + golang.org/x/net v0.49.0 golang.org/x/sync v0.19.0 - golang.org/x/time v0.13.0 - google.golang.org/grpc v1.76.0 + golang.org/x/time v0.14.0 + google.golang.org/grpc v1.78.0 gopkg.in/yaml.v2 v2.4.0 gopkg.in/yaml.v3 v3.0.1 ) require ( github.com/VictoriaMetrics/fastcache v1.12.2 - github.com/aws/aws-sdk-go-v2 v1.40.1 - github.com/aws/aws-sdk-go-v2/config v1.32.3 + github.com/aws/aws-sdk-go-v2 v1.41.1 + github.com/aws/aws-sdk-go-v2/config v1.32.7 github.com/aws/aws-sdk-go-v2/service/dynamodb v1.50.1 github.com/axiomhq/hyperloglog v0.2.6 github.com/bboreham/go-loser v0.0.0-20230920113527-fcc2c21820a3 @@ -120,19 +120,19 @@ require ( github.com/alecthomas/kingpin/v2 v2.4.0 // indirect github.com/andybalholm/brotli v1.1.1 // indirect github.com/armon/go-metrics v0.4.1 // indirect - github.com/aws/aws-sdk-go-v2/credentials v1.19.3 // indirect - github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.15 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.15 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.15 // indirect + github.com/aws/aws-sdk-go-v2/credentials v1.19.7 // indirect + github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.17 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.17 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 // indirect github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.6 // indirect - github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.15 // indirect - github.com/aws/aws-sdk-go-v2/service/signin v1.0.3 // indirect - github.com/aws/aws-sdk-go-v2/service/sns v1.39.8 // indirect - github.com/aws/aws-sdk-go-v2/service/sso v1.30.6 // indirect - github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.11 // indirect - github.com/aws/aws-sdk-go-v2/service/sts v1.41.3 // indirect + github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.17 // indirect + github.com/aws/aws-sdk-go-v2/service/signin v1.0.5 // indirect + github.com/aws/aws-sdk-go-v2/service/sns v1.39.11 // indirect + github.com/aws/aws-sdk-go-v2/service/sso v1.30.9 // indirect + github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.13 // indirect + github.com/aws/aws-sdk-go-v2/service/sts v1.41.6 // indirect github.com/aws/smithy-go v1.24.0 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect @@ -160,13 +160,13 @@ require ( github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-logr/logr v1.4.3 // indirect github.com/go-logr/stdr v1.2.2 // indirect - github.com/go-openapi/analysis v0.24.1 // indirect - github.com/go-openapi/errors v0.22.4 // indirect - github.com/go-openapi/jsonpointer v0.22.1 // indirect - github.com/go-openapi/jsonreference v0.21.3 // indirect + github.com/go-openapi/analysis v0.24.2 // indirect + github.com/go-openapi/errors v0.22.6 // indirect + github.com/go-openapi/jsonpointer v0.22.4 // indirect + github.com/go-openapi/jsonreference v0.21.4 // indirect github.com/go-openapi/loads v0.23.2 // indirect github.com/go-openapi/runtime v0.29.2 // indirect - github.com/go-openapi/spec v0.22.1 // indirect + github.com/go-openapi/spec v0.22.3 // indirect github.com/go-openapi/swag/cmdutils v0.25.4 // indirect github.com/go-openapi/swag/conv v0.25.4 // indirect github.com/go-openapi/swag/fileutils v0.25.4 // indirect @@ -189,7 +189,7 @@ require ( github.com/googleapis/enterprise-certificate-proxy v0.3.6 // indirect github.com/googleapis/gax-go/v2 v2.15.0 // indirect github.com/grpc-ecosystem/go-grpc-middleware/v2 v2.3.2 // indirect - github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 // indirect + github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 // indirect github.com/hashicorp/errwrap v1.1.0 // indirect github.com/hashicorp/go-hclog v1.6.3 // indirect github.com/hashicorp/go-immutable-radix v1.3.1 // indirect @@ -241,9 +241,9 @@ require ( github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus-community/prom-label-proxy v0.11.1 // indirect - github.com/prometheus/exporter-toolkit v0.15.0 // indirect + github.com/prometheus/exporter-toolkit v0.15.1 // indirect github.com/prometheus/otlptranslator v1.0.0 // indirect - github.com/prometheus/sigv4 v0.3.0 // indirect + github.com/prometheus/sigv4 v0.4.0 // indirect github.com/puzpuzpuz/xsync/v3 v3.5.1 // indirect github.com/rantav/go-grpc-channelz v0.0.4 // indirect github.com/redis/rueidis v1.0.61 // indirect @@ -275,16 +275,16 @@ require ( go.opentelemetry.io/collector/semconv v0.128.0 // indirect go.opentelemetry.io/contrib/detectors/gcp v1.38.0 // indirect go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.61.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.63.0 // indirect - go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.64.0 // indirect + go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.64.0 // indirect go.opentelemetry.io/contrib/propagators/autoprop v0.61.0 // indirect go.opentelemetry.io/contrib/propagators/b3 v1.36.0 // indirect go.opentelemetry.io/contrib/propagators/jaeger v1.36.0 // indirect go.opentelemetry.io/contrib/propagators/ot v1.36.0 // indirect - go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 // indirect - go.opentelemetry.io/otel/metric v1.38.0 // indirect - go.opentelemetry.io/otel/sdk/metric v1.38.0 // indirect - go.opentelemetry.io/proto/otlp v1.7.1 // indirect + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0 // indirect + go.opentelemetry.io/otel/metric v1.39.0 // indirect + go.opentelemetry.io/otel/sdk/metric v1.39.0 // indirect + go.opentelemetry.io/proto/otlp v1.9.0 // indirect go.uber.org/goleak v1.3.0 // indirect go.uber.org/multierr v1.11.0 // indirect go.uber.org/zap v1.27.0 // indirect @@ -292,18 +292,18 @@ require ( go.yaml.in/yaml/v3 v3.0.4 // indirect go4.org/intern v0.0.0-20230525184215-6c62f75575cb // indirect go4.org/unsafe/assume-no-moving-gc v0.0.0-20231121144256-b99613f794b6 // indirect - golang.org/x/crypto v0.46.0 // indirect + golang.org/x/crypto v0.47.0 // indirect golang.org/x/exp v0.0.0-20250808145144-a408d31f581a // indirect - golang.org/x/mod v0.30.0 // indirect + golang.org/x/mod v0.32.0 // indirect golang.org/x/oauth2 v0.34.0 // indirect - golang.org/x/sys v0.39.0 // indirect - golang.org/x/text v0.32.0 // indirect - golang.org/x/tools v0.39.0 // indirect + golang.org/x/sys v0.40.0 // indirect + golang.org/x/text v0.33.0 // indirect + golang.org/x/tools v0.41.0 // indirect gonum.org/v1/gonum v0.16.0 // indirect google.golang.org/api v0.252.0 // indirect google.golang.org/genproto v0.0.0-20250603155806-513f23925822 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20251029180050-ab9386a59fda // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20251029180050-ab9386a59fda // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 // indirect gopkg.in/telebot.v3 v3.3.8 // indirect k8s.io/apimachinery v0.34.1 // indirect k8s.io/client-go v0.34.1 // indirect diff --git a/go.sum b/go.sum index 4f764d68b0d..cd7b0267785 100644 --- a/go.sum +++ b/go.sum @@ -863,18 +863,18 @@ github.com/armon/go-metrics v0.4.1 h1:hR91U9KYmb6bLBYLQjyM+3j+rcd/UhE+G78SFnF8gJ github.com/armon/go-metrics v0.4.1/go.mod h1:E6amYzXo6aW1tqzoZGT755KkbgrJsSdpwZ+3JqfkOG4= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= -github.com/aws/aws-sdk-go-v2 v1.40.1 h1:difXb4maDZkRH0x//Qkwcfpdg1XQVXEAEs2DdXldFFc= -github.com/aws/aws-sdk-go-v2 v1.40.1/go.mod h1:MayyLB8y+buD9hZqkCW3kX1AKq07Y5pXxtgB+rRFhz0= -github.com/aws/aws-sdk-go-v2/config v1.32.3 h1:cpz7H2uMNTDa0h/5CYL5dLUEzPSLo2g0NkbxTRJtSSU= -github.com/aws/aws-sdk-go-v2/config v1.32.3/go.mod h1:srtPKaJJe3McW6T/+GMBZyIPc+SeqJsNPJsd4mOYZ6s= -github.com/aws/aws-sdk-go-v2/credentials v1.19.3 h1:01Ym72hK43hjwDeJUfi1l2oYLXBAOR8gNSZNmXmvuas= -github.com/aws/aws-sdk-go-v2/credentials v1.19.3/go.mod h1:55nWF/Sr9Zvls0bGnWkRxUdhzKqj9uRNlPvgV1vgxKc= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.15 h1:utxLraaifrSBkeyII9mIbVwXXWrZdlPO7FIKmyLCEcY= -github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.15/go.mod h1:hW6zjYUDQwfz3icf4g2O41PHi77u10oAzJ84iSzR/lo= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.15 h1:Y5YXgygXwDI5P4RkteB5yF7v35neH7LfJKBG+hzIons= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.15/go.mod h1:K+/1EpG42dFSY7CBj+Fruzm8PsCGWTXJ3jdeJ659oGQ= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.15 h1:AvltKnW9ewxX2hFmQS0FyJH93aSvJVUEFvXfU+HWtSE= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.15/go.mod h1:3I4oCdZdmgrREhU74qS1dK9yZ62yumob+58AbFR4cQA= +github.com/aws/aws-sdk-go-v2 v1.41.1 h1:ABlyEARCDLN034NhxlRUSZr4l71mh+T5KAeGh6cerhU= +github.com/aws/aws-sdk-go-v2 v1.41.1/go.mod h1:MayyLB8y+buD9hZqkCW3kX1AKq07Y5pXxtgB+rRFhz0= +github.com/aws/aws-sdk-go-v2/config v1.32.7 h1:vxUyWGUwmkQ2g19n7JY/9YL8MfAIl7bTesIUykECXmY= +github.com/aws/aws-sdk-go-v2/config v1.32.7/go.mod h1:2/Qm5vKUU/r7Y+zUk/Ptt2MDAEKAfUtKc1+3U1Mo3oY= +github.com/aws/aws-sdk-go-v2/credentials v1.19.7 h1:tHK47VqqtJxOymRrNtUXN5SP/zUTvZKeLx4tH6PGQc8= +github.com/aws/aws-sdk-go-v2/credentials v1.19.7/go.mod h1:qOZk8sPDrxhf+4Wf4oT2urYJrYt3RejHSzgAquYeppw= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.17 h1:I0GyV8wiYrP8XpA70g1HBcQO1JlQxCMTW9npl5UbDHY= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.17/go.mod h1:tyw7BOl5bBe/oqvoIeECFJjMdzXoa/dfVz3QQ5lgHGA= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.17 h1:xOLELNKGp2vsiteLsvLPwxC+mYmO6OZ8PYgiuPJzF8U= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.17/go.mod h1:5M5CI3D12dNOtH3/mk6minaRwI2/37ifCURZISxA/IQ= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.17 h1:WWLqlh79iO48yLkj1v3ISRNiv+3KdQoZ6JWyfcsyQik= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.17/go.mod h1:EhG22vHRrvF8oXSTYStZhJc1aUgKtnJe+aOiFEV90cM= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 h1:WKuaxf++XKWlHWu9ECbMlha8WOEGm0OUEZqm4K/Gcfk= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4/go.mod h1:ZWy7j6v1vWGmPReu0iSGvRiise4YI5SkR3OHKTZ6Wuc= github.com/aws/aws-sdk-go-v2/service/dynamodb v1.50.1 h1:MXUnj1TKjwQvotPPHFMfynlUljcpl5UccMrkiauKdWI= @@ -887,20 +887,20 @@ github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4 h1:0ryTNEd github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.4/go.mod h1:HQ4qwNZh32C3CBeO6iJLQlgtMzqeG17ziAA/3KDJFow= github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.6 h1:34ojKW9OV123FZ6Q8Nua3Uwy6yVTcshZ+gLE4gpMDEs= github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.6/go.mod h1:sXXWh1G9LKKkNbuR0f0ZPd/IvDXlMGiag40opt4XEgY= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.15 h1:3/u/4yZOffg5jdNk1sDpOQ4Y+R6Xbh+GzpDrSZjuy3U= -github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.15/go.mod h1:4Zkjq0FKjE78NKjabuM4tRXKFzUJWXgP0ItEZK8l7JU= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.17 h1:RuNSMoozM8oXlgLG/n6WLaFGoea7/CddrCfIiSA+xdY= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.17/go.mod h1:F2xxQ9TZz5gDWsclCtPQscGpP0VUOc8RqgFM3vDENmU= github.com/aws/aws-sdk-go-v2/service/lightsail v1.50.4 h1:/1o2AYwHJojUDeMvQNyJiKZwcWCc3e4kQuTXqRLuThc= github.com/aws/aws-sdk-go-v2/service/lightsail v1.50.4/go.mod h1:Nn2xx6HojGuNMtUFxxz/nyNLSS+tHMRsMhe3+W3wB5k= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.3 h1:d/6xOGIllc/XW1lzG9a4AUBMmpLA9PXcQnVPTuHHcik= -github.com/aws/aws-sdk-go-v2/service/signin v1.0.3/go.mod h1:fQ7E7Qj9GiW8y0ClD7cUJk3Bz5Iw8wZkWDHsTe8vDKs= -github.com/aws/aws-sdk-go-v2/service/sns v1.39.8 h1:s2QY81HBbJ+zbafTcWQmMaHj0C18VoJON/gDY1ibrEg= -github.com/aws/aws-sdk-go-v2/service/sns v1.39.8/go.mod h1:3aOzyhwa/mXPZYLwGaALfl88GFRXHQKXdyQSq2L/Y4g= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.6 h1:8sTTiw+9yuNXcfWeqKF2x01GqCF49CpP4Z9nKrrk/ts= -github.com/aws/aws-sdk-go-v2/service/sso v1.30.6/go.mod h1:8WYg+Y40Sn3X2hioaaWAAIngndR8n1XFdRPPX+7QBaM= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.11 h1:E+KqWoVsSrj1tJ6I/fjDIu5xoS2Zacuu1zT+H7KtiIk= -github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.11/go.mod h1:qyWHz+4lvkXcr3+PoGlGHEI+3DLLiU6/GdrFfMaAhB0= -github.com/aws/aws-sdk-go-v2/service/sts v1.41.3 h1:tzMkjh0yTChUqJDgGkcDdxvZDSrJ/WB6R6ymI5ehqJI= -github.com/aws/aws-sdk-go-v2/service/sts v1.41.3/go.mod h1:T270C0R5sZNLbWUe8ueiAF42XSZxxPocTaGSgs5c/60= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.5 h1:VrhDvQib/i0lxvr3zqlUwLwJP4fpmpyD9wYG1vfSu+Y= +github.com/aws/aws-sdk-go-v2/service/signin v1.0.5/go.mod h1:k029+U8SY30/3/ras4G/Fnv/b88N4mAfliNn08Dem4M= +github.com/aws/aws-sdk-go-v2/service/sns v1.39.11 h1:Ke7RS0NuP9Xwk31prXYcFGA1Qfn8QmNWcxyjKPcXZdc= +github.com/aws/aws-sdk-go-v2/service/sns v1.39.11/go.mod h1:hdZDKzao0PBfJJygT7T92x2uVcWc/htqlhrjFIjnHDM= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.9 h1:v6EiMvhEYBoHABfbGB4alOYmCIrcgyPPiBE1wZAEbqk= +github.com/aws/aws-sdk-go-v2/service/sso v1.30.9/go.mod h1:yifAsgBxgJWn3ggx70A3urX2AN49Y5sJTD1UQFlfqBw= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.13 h1:gd84Omyu9JLriJVCbGApcLzVR3XtmC4ZDPcAI6Ftvds= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.13/go.mod h1:sTGThjphYE4Ohw8vJiRStAcu3rbjtXRsdNB0TvZ5wwo= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.6 h1:5fFjR/ToSOzB2OQ/XqWpZBmNvmP/pJ1jOWYlFDJTjRQ= +github.com/aws/aws-sdk-go-v2/service/sts v1.41.6/go.mod h1:qgFDZQSD/Kys7nJnVqYlWKnh0SSdMjAi0uSwON4wgYQ= github.com/aws/smithy-go v1.24.0 h1:LpilSUItNPFr1eY85RYgTIg5eIEPtvFbskaFcmmIUnk= github.com/aws/smithy-go v1.24.0/go.mod h1:LEj2LM3rBRQJxPZTB4KuzZkaZYnZPnvgIhb4pu07mx0= github.com/axiomhq/hyperloglog v0.2.6 h1:sRhvvF3RIXWQgAXaTphLp4yJiX4S0IN3MWTaAgZoRJw= @@ -1093,17 +1093,17 @@ 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-openapi/analysis v0.24.1 h1:Xp+7Yn/KOnVWYG8d+hPksOYnCYImE3TieBa7rBOesYM= -github.com/go-openapi/analysis v0.24.1/go.mod h1:dU+qxX7QGU1rl7IYhBC8bIfmWQdX4Buoea4TGtxXY84= -github.com/go-openapi/errors v0.22.4 h1:oi2K9mHTOb5DPW2Zjdzs/NIvwi2N3fARKaTJLdNabaM= -github.com/go-openapi/errors v0.22.4/go.mod h1:z9S8ASTUqx7+CP1Q8dD8ewGH/1JWFFLX/2PmAYNQLgk= +github.com/go-openapi/analysis v0.24.2 h1:6p7WXEuKy1llDgOH8FooVeO+Uq2za9qoAOq4ZN08B50= +github.com/go-openapi/analysis v0.24.2/go.mod h1:x27OOHKANE0lutg2ml4kzYLoHGMKgRm1Cj2ijVOjJuE= +github.com/go-openapi/errors v0.22.6 h1:eDxcf89O8odEnohIXwEjY1IB4ph5vmbUsBMsFNwXWPo= +github.com/go-openapi/errors v0.22.6/go.mod h1:z9S8ASTUqx7+CP1Q8dD8ewGH/1JWFFLX/2PmAYNQLgk= 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.22.1 h1:sHYI1He3b9NqJ4wXLoJDKmUmHkWy/L7rtEo92JUxBNk= -github.com/go-openapi/jsonpointer v0.22.1/go.mod h1:pQT9OsLkfz1yWoMgYFy4x3U5GY5nUlsOn1qSBH5MkCM= +github.com/go-openapi/jsonpointer v0.22.4 h1:dZtK82WlNpVLDW2jlA1YCiVJFVqkED1MegOUy9kR5T4= +github.com/go-openapi/jsonpointer v0.22.4/go.mod h1:elX9+UgznpFhgBuaMQ7iu4lvvX1nvNsesQ3oxmYTw80= github.com/go-openapi/jsonreference v0.20.0/go.mod h1:Ag74Ico3lPc+zR+qjn4XBUmXymS4zJbYVCZmcgkasdo= -github.com/go-openapi/jsonreference v0.21.3 h1:96Dn+MRPa0nYAR8DR1E03SblB5FJvh7W6krPI0Z7qMc= -github.com/go-openapi/jsonreference v0.21.3/go.mod h1:RqkUP0MrLf37HqxZxrIAtTWW4ZJIK1VzduhXYBEeGc4= +github.com/go-openapi/jsonreference v0.21.4 h1:24qaE2y9bx/q3uRK/qN+TDwbok1NhbSmGjjySRCHtC8= +github.com/go-openapi/jsonreference v0.21.4/go.mod h1:rIENPTjDbLpzQmQWCj5kKj3ZlmEh+EFVbz3RTUh30/4= github.com/go-openapi/loads v0.23.2 h1:rJXAcP7g1+lWyBHC7iTY+WAF0rprtM+pm8Jxv1uQJp4= github.com/go-openapi/loads v0.23.2/go.mod h1:IEVw1GfRt/P2Pplkelxzj9BYFajiWOtY2nHZNj4UnWY= github.com/go-openapi/runtime v0.29.2 h1:UmwSGWNmWQqKm1c2MGgXVpC2FTGwPDQeUsBMufc5Yj0= @@ -1336,8 +1336,8 @@ github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFb 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.2 h1:8Tjv8EJ+pM1xP8mK6egEbD1OgnVTyacbefKhmbLhIhU= -github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2/go.mod h1:pkJQ2tZHJ0aFOVEEot6oZmaVEZcRme73eIFmhiVuRWs= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 h1:NmZ1PKzSTQbuGHw9DGPFomqkkLWMC+vZCkfs+FHv1Vg= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3/go.mod h1:zQrxl1YP88HQlA6i9c63DSVPFklWpGX4OWAc9bFuaH4= github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= github.com/hashicorp/consul/api v1.32.0 h1:5wp5u780Gri7c4OedGEPzmlUEzi0g2KyiPphSr6zjVg= github.com/hashicorp/consul/api v1.32.0/go.mod h1:Z8YgY0eVPukT/17ejW+l+C7zJmKwgPHtjU1q16v/Y40= @@ -1654,8 +1654,8 @@ github.com/prometheus-community/parquet-common v0.0.0-20251211092633-65ebeae24e9 github.com/prometheus-community/parquet-common v0.0.0-20251211092633-65ebeae24e94/go.mod h1:gewN7ZuOXJh0X2I57iGHyDLbLvL891P2Ynko2QM5axY= github.com/prometheus-community/prom-label-proxy v0.11.1 h1:jX+m+BQCNM0z3/P6V6jVxbiDKgugvk91SaICD6bVhT4= github.com/prometheus-community/prom-label-proxy v0.11.1/go.mod h1:uTeQW+wZ/VPV1LL3IPfvUE++wR2nPLex+Y4RE38Cpis= -github.com/prometheus/alertmanager v0.30.1 h1:427prmCHuy1rMmV7fl/TVQFh5A/78XQ/Mp+TsswZNGM= -github.com/prometheus/alertmanager v0.30.1/go.mod h1:93PBumcTLr/gNtNtM0m7BcCffbvYP5bKuLBWiOnISaA= +github.com/prometheus/alertmanager v0.31.1 h1:eAmIC42lzbWslHkMt693T36qdxfyZULswiHr681YS3Q= +github.com/prometheus/alertmanager v0.31.1/go.mod h1:zWPQwhbLt2ybee8rL921UONeQ59Oncash+m/hGP17tU= github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= @@ -1681,8 +1681,8 @@ github.com/prometheus/common v0.10.0/go.mod h1:Tlit/dnDKsSWFlCLTWaA1cyBgKHSMdTB8 github.com/prometheus/common v0.26.0/go.mod h1:M7rCNAaPfAosfx8veZJCuw84e35h3Cfd9VFqTh1DIvc= github.com/prometheus/common v0.67.5 h1:pIgK94WWlQt1WLwAC5j2ynLaBRDiinoAb86HZHTUGI4= github.com/prometheus/common v0.67.5/go.mod h1:SjE/0MzDEEAyrdr5Gqc6G+sXI67maCxzaT3A2+HqjUw= -github.com/prometheus/exporter-toolkit v0.15.0 h1:Pcle5sSViwR1x0gdPd0wtYrPQENBieQAM7TmT0qtb2U= -github.com/prometheus/exporter-toolkit v0.15.0/go.mod h1:OyRWd2iTo6Xge9Kedvv0IhCrJSBu36JCfJ2yVniRIYk= +github.com/prometheus/exporter-toolkit v0.15.1 h1:XrGGr/qWl8Gd+pqJqTkNLww9eG8vR/CoRk0FubOKfLE= +github.com/prometheus/exporter-toolkit v0.15.1/go.mod h1:P/NR9qFRGbCFgpklyhix9F6v6fFr/VQB/CVsrMDGKo4= github.com/prometheus/otlptranslator v1.0.0 h1:s0LJW/iN9dkIH+EnhiD3BlkkP5QVIUVEoIwkU+A6qos= github.com/prometheus/otlptranslator v1.0.0/go.mod h1:vRYWnXvI6aWGpsdY/mOT/cbeVRBlPWtBNDb7kGR3uKM= github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= @@ -1694,8 +1694,8 @@ github.com/prometheus/procfs v0.16.1 h1:hZ15bTNuirocR6u0JZ6BAHHmwS1p8B4P6MRqxtzM github.com/prometheus/procfs v0.16.1/go.mod h1:teAbpZRB1iIAJYREa1LsoWUXykVXA1KlTmWl8x/U+Is= github.com/prometheus/prometheus v0.308.1 h1:ApMNI/3/es3Ze90Z7CMb+wwU2BsSYur0m5VKeqHj7h4= github.com/prometheus/prometheus v0.308.1/go.mod h1:aHjYCDz9zKRyoUXvMWvu13K9XHOkBB12XrEqibs3e0A= -github.com/prometheus/sigv4 v0.3.0 h1:QIG7nTbu0JTnNidGI1Uwl5AGVIChWUACxn2B/BQ1kms= -github.com/prometheus/sigv4 v0.3.0/go.mod h1:fKtFYDus2M43CWKMNtGvFNHGXnAJJEGZbiYCmVp/F8I= +github.com/prometheus/sigv4 v0.4.0 h1:s8oiq+S4ORkpjftnBvzObLrz5Hw49YwEhumNGBdfg4M= +github.com/prometheus/sigv4 v0.4.0/go.mod h1:D6dQeKEsDyUWzoNGjby5HgXshiOAbsz7vuApHTCmOxA= github.com/puzpuzpuz/xsync/v3 v3.5.1 h1:GJYJZwO6IdxN/IKbneznS6yPkVC+c3zyY/j19c++5Fg= github.com/puzpuzpuz/xsync/v3 v3.5.1/go.mod h1:VjzYrABPabuM4KyBh1Ftq6u8nhwY5tBPKP9jpmh0nnA= github.com/rantav/go-grpc-channelz v0.0.4 h1:8GvqhA6siQVBsZYzal3yHhyJ9YiHEJx7RtSH2Jvm9Co= @@ -1888,10 +1888,10 @@ go.opentelemetry.io/contrib/detectors/gcp v1.38.0 h1:ZoYbqX7OaA/TAikspPl3ozPI6iY go.opentelemetry.io/contrib/detectors/gcp v1.38.0/go.mod h1:SU+iU7nu5ud4oCb3LQOhIZ3nRLj6FNVrKgtflbaf2ts= 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/httptrace/otelhttptrace v0.63.0 h1:2pn7OzMewmYRiNtv1doZnLo3gONcnMHlFnmOR8Vgt+8= -go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.63.0/go.mod h1:rjbQTDEPQymPE0YnRQp9/NuPwwtL0sesz/fnqRW/v84= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 h1:RbKq8BG0FI8OiXhBfcRtqqHcZcka+gU3cskNuf05R18= -go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0/go.mod h1:h06DGIukJOevXaj/xrNjhi/2098RZzcLTbc0jDAUbsg= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.64.0 h1:OXSUzgmIFkcC4An+mv+lqqZSndTffXpjAyoR+1f8k/A= +go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.64.0/go.mod h1:1A4GVLFIm54HFqVdOpWmukap7rgb0frrE3zWXohLPdM= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.64.0 h1:ssfIgGNANqpVFCndZvcuyKbl0g+UAVcbBcqGkG28H0Y= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.64.0/go.mod h1:GQ/474YrbE4Jx8gZ4q5I4hrhUzM6UPzyrqJYV2AqPoQ= go.opentelemetry.io/contrib/propagators/autoprop v0.61.0 h1:cxOVDJ30qfzV27G5p9WMtJUB/3cXC0iL+u9EV1fSOws= go.opentelemetry.io/contrib/propagators/autoprop v0.61.0/go.mod h1:Y+xiUbWetg65vAroDZcIzJ5wyPNWRH32EoIV9rIaa0g= go.opentelemetry.io/contrib/propagators/aws v1.36.0 h1:Txhy/1LZIbbnutftc5pdU8Y9vOQuAkuIOFXuLsdDejs= @@ -1904,38 +1904,38 @@ go.opentelemetry.io/contrib/propagators/ot v1.36.0 h1:UBoZjbx483GslNKYK2YpfvePTJ go.opentelemetry.io/contrib/propagators/ot v1.36.0/go.mod h1:adDDRry19/n9WoA7mSCMjoVJcmzK/bZYzX9SR+g2+W4= go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= go.opentelemetry.io/otel v1.34.0/go.mod h1:OWFPOQ+h4G8xpyjgqo4SxJYdDQ/qmRH+wivy7zzx9oI= -go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8= -go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM= +go.opentelemetry.io/otel v1.39.0 h1:8yPrr/S0ND9QEfTfdP9V+SiwT4E0G7Y5MO7p85nis48= +go.opentelemetry.io/otel v1.39.0/go.mod h1:kLlFTywNWrFyEdH0oj2xK0bFYZtHRYUdv1NklR/tgc8= go.opentelemetry.io/otel/bridge/opentracing v1.36.0 h1:GWGmcYhMCu6+K/Yz5KWSETU/esd/mkVGx+77uKtLjpk= go.opentelemetry.io/otel/bridge/opentracing v1.36.0/go.mod h1:bW7xTHgtWSNqY8QjhqXzloXBkw3iQIa8uBqCF/0EUbc= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 h1:GqRJVj7UmLjCVyVJ3ZFLdPRmhDUp2zFmQe3RHIOsw24= -go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0/go.mod h1:ri3aaHSmCTVYu2AWv44YMauwAQc0aqI9gHKIcSbI1pU= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 h1:lwI4Dc5leUqENgGuQImwLo4WnuXFPetmPpkLi2IrX54= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0/go.mod h1:Kz/oCE7z5wuyhPxsXDuaPteSWqjSBD5YaSdbxZYGbGk= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 h1:aTL7F04bJHUlztTsNGJ2l+6he8c+y/b//eR0jjjemT4= -go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0/go.mod h1:kldtb7jDTeol0l3ewcmd8SDvx3EmIE7lyvqbasU3QC4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0 h1:f0cb2XPmrqn4XMy9PNliTgRKJgS5WcL/u0/WRYGz4t0= +go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0/go.mod h1:vnakAaFckOMiMtOIhFI2MNH4FYrZzXCYxmb1LlhoGz8= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.39.0 h1:in9O8ESIOlwJAEGTkkf34DesGRAc/Pn8qJ7k3r/42LM= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.39.0/go.mod h1:Rp0EXBm5tfnv0WL+ARyO/PHBEaEAT8UUHQ6AGJcSq6c= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0 h1:Ckwye2FpXkYgiHX7fyVrN1uA/UYd9ounqqTuSNAv0k4= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0/go.mod h1:teIFJh5pW2y+AN7riv6IBPX2DuesS3HgP39mwOspKwU= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0 h1:WDdP9acbMYjbKIyJUhTvtzj601sVJOqgWdUxSdR/Ysc= go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0/go.mod h1:BLbf7zbNIONBLPwvFnwNHGj4zge8uTCM/UPIVW1Mq2I= go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= go.opentelemetry.io/otel/metric v1.34.0/go.mod h1:CEDrp0fy2D0MvkXE+dPV7cMi8tWZwX3dmaIhwPOaqHE= -go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA= -go.opentelemetry.io/otel/metric v1.38.0/go.mod h1:kB5n/QoRM8YwmUahxvI3bO34eVtQf2i4utNVLr9gEmI= +go.opentelemetry.io/otel/metric v1.39.0 h1:d1UzonvEZriVfpNKEVmHXbdf909uGTOQjA0HF0Ls5Q0= +go.opentelemetry.io/otel/metric v1.39.0/go.mod h1:jrZSWL33sD7bBxg1xjrqyDjnuzTUB0x1nBERXd7Ftcs= go.opentelemetry.io/otel/sdk v1.34.0/go.mod h1:0e/pNiaMAqaykJGKbi+tSjWfNNHMTxoC9qANsCzbyxU= -go.opentelemetry.io/otel/sdk v1.38.0 h1:l48sr5YbNf2hpCUj/FoGhW9yDkl+Ma+LrVl8qaM5b+E= -go.opentelemetry.io/otel/sdk v1.38.0/go.mod h1:ghmNdGlVemJI3+ZB5iDEuk4bWA3GkTpW+DOoZMYBVVg= +go.opentelemetry.io/otel/sdk v1.39.0 h1:nMLYcjVsvdui1B/4FRkwjzoRVsMK8uL/cj0OyhKzt18= +go.opentelemetry.io/otel/sdk v1.39.0/go.mod h1:vDojkC4/jsTJsE+kh+LXYQlbL8CgrEcwmt1ENZszdJE= go.opentelemetry.io/otel/sdk/metric v1.34.0/go.mod h1:jQ/r8Ze28zRKoNRdkjCZxfs6YvBTG1+YIqyFVFYec5w= -go.opentelemetry.io/otel/sdk/metric v1.38.0 h1:aSH66iL0aZqo//xXzQLYozmWrXxyFkBJ6qT5wthqPoM= -go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689CbtrUp0wMMs9iPcgT9EZA= +go.opentelemetry.io/otel/sdk/metric v1.39.0 h1:cXMVVFVgsIf2YL6QkRF4Urbr/aMInf+2WKg+sEJTtB8= +go.opentelemetry.io/otel/sdk/metric v1.39.0/go.mod h1:xq9HEVH7qeX69/JnwEfp6fVq5wosJsY1mt4lLfYdVew= go.opentelemetry.io/otel/trace v1.32.0/go.mod h1:+i4rkvCraA+tG6AzwloGaCtkx53Fa+L+V8e9a7YvhT8= go.opentelemetry.io/otel/trace v1.34.0/go.mod h1:Svm7lSjQD7kG7KJ/MUHPVXSDGz2OX4h0M2jHBhmSfRE= -go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE= -go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs= +go.opentelemetry.io/otel/trace v1.39.0 h1:2d2vfpEDmCJ5zVYz7ijaJdOF59xLomrvj7bjt6/qCJI= +go.opentelemetry.io/otel/trace v1.39.0/go.mod h1:88w4/PnZSazkGzz/w84VHpQafiU4EtqqlVdxWy+rNOA= 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.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4= -go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE= +go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A= +go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4= go.opentelemetry.io/proto/slim/otlp v1.8.0 h1:afcLwp2XOeCbGrjufT1qWyruFt+6C9g5SOuymrSPUXQ= go.opentelemetry.io/proto/slim/otlp v1.8.0/go.mod h1:Yaa5fjYm1SMCq0hG0x/87wV1MP9H5xDuG/1+AhvBcsI= go.opentelemetry.io/proto/slim/otlp/collector/profiles/v1development v0.1.0 h1:Uc+elixz922LHx5colXGi1ORbsW8DTIGM+gg+D9V7HE= @@ -1992,8 +1992,8 @@ golang.org/x/crypto v0.24.0/go.mod h1:Z1PMYSOR5nyMcyAVAIQSKCDwalqy85Aqn1x3Ws4L5D golang.org/x/crypto v0.26.0/go.mod h1:GY7jblb9wI+FOo5y8/S2oY4zWP07AkOJ4+jxCqdqn54= golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk= golang.org/x/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= -golang.org/x/crypto v0.46.0 h1:cKRW/pmt1pKAfetfu+RCEvjvZkA9RimPbh7bhFjGVBU= -golang.org/x/crypto v0.46.0/go.mod h1:Evb/oLKmMraqjZ2iQTwDwvCtJkczlDuTmdJXoZVzqU0= +golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8= +golang.org/x/crypto v0.47.0/go.mod h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A= 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/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -2057,8 +2057,8 @@ golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= 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.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk= -golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc= +golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c= +golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/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-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -2132,8 +2132,8 @@ golang.org/x/net v0.26.0/go.mod h1:5YKkiSynbBIh3p6iOc/vibscux0x38BZDkn8sCUPxHE= golang.org/x/net v0.28.0/go.mod h1:yqtgsTWOOnlGLG9GFRrK3++bGOUEkNBoHZc8MEDWPNg= golang.org/x/net v0.33.0/go.mod h1:HXLR5J+9DxmrqMwG9qjGCxZ+zKXxBru04zlTvWlWuN4= golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= -golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU= -golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY= +golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o= +golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8= 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= @@ -2301,8 +2301,8 @@ golang.org/x/sys v0.24.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.25.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.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk= -golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= +golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ= +golang.org/x/sys v0.40.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= @@ -2323,8 +2323,8 @@ golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/term v0.23.0/go.mod h1:DgV24QBUrK6jhZXl+20l6UWznPlwAHm1Q1mGHtydmSk= golang.org/x/term v0.27.0/go.mod h1:iMsnZpn0cago0GOrHO2+Y7u7JPn5AylBrcoWkElMTSM= golang.org/x/term v0.28.0/go.mod h1:Sw/lC2IAUZ92udQNf3WodGtn4k/XoLyZoh8v/8uiwek= -golang.org/x/term v0.38.0 h1:PQ5pkm/rLO6HnxFR7N2lJHOZX6Kez5Y1gDSJla6jo7Q= -golang.org/x/term v0.38.0/go.mod h1:bSEAKrOT1W+VSu9TSCMtoGEOUcKxOKgl3LE5QEF/xVg= +golang.org/x/term v0.39.0 h1:RclSuaJf32jOqZz74CkPA9qFuVTX7vhLlpfj/IGWlqY= +golang.org/x/term v0.39.0/go.mod h1:yxzUCTP/U+FzoxfdKmLaA0RV1WgE0VY7hXBwKtY/4ww= 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= @@ -2347,16 +2347,16 @@ 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.17.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ= -golang.org/x/text v0.32.0 h1:ZD01bjUt1FQ9WJ0ClOL5vxgxOI/sVCNgX1YtKwcY0mU= -golang.org/x/text v0.32.0/go.mod h1:o/rUWzghvpD5TXrTIBuJU77MTaN0ljMWE47kxGJQ7jY= +golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE= +golang.org/x/text v0.33.0/go.mod h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8= 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.13.0 h1:eUlYslOIt32DgYD6utsuUeHs4d7AsEYLuIAdg7FlYgI= -golang.org/x/time v0.13.0/go.mod h1:eL/Oa2bBBK0TkX57Fyni+NgnyQQN4LitPmob2Hjnqw4= +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-20180525024113-a5b4c53f6e8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= @@ -2425,8 +2425,8 @@ golang.org/x/tools v0.9.1/go.mod h1:owI94Op576fPu3cIGQeHs3joujW/2Oc6MtlxbF5dfNc= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= 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.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ= -golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ= +golang.org/x/tools v0.41.0 h1:a9b8iMweWG+S0OBnlU36rzLp20z1Rp10w+IY2czHTQc= +golang.org/x/tools v0.41.0/go.mod h1:XSY6eDqxVNiYgezAVqqCeihT4j1U2CCsqvH3WhQpnlg= golang.org/x/tools/godoc v0.1.0-deprecated h1:o+aZ1BOj6Hsx/GBdJO/s815sqftjSnrZZwyYTHODvtk= golang.org/x/tools/godoc v0.1.0-deprecated/go.mod h1:qM63CriJ961IHWmnWa9CjZnBndniPt4a3CK0PVB9bIg= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= @@ -2676,8 +2676,8 @@ google.golang.org/genproto/googleapis/api v0.0.0-20230822172742-b8732ec3820d/go. google.golang.org/genproto/googleapis/api v0.0.0-20240814211410-ddb44dafa142/go.mod h1:d6be+8HhtEtucleCbxpPW9PA9XwISACu8nvpPqF0BVo= google.golang.org/genproto/googleapis/api v0.0.0-20241202173237-19429a94021a/go.mod h1:jehYqy3+AhJU9ve55aNOaSml7wUXjF9x6z2LcCfpAhY= google.golang.org/genproto/googleapis/api v0.0.0-20250106144421-5f5ef82da422/go.mod h1:b6h1vNKhxaSoEI+5jc3PJUCustfli/mRab7295pY7rw= -google.golang.org/genproto/googleapis/api v0.0.0-20251029180050-ab9386a59fda h1:+2XxjfsAu6vqFxwGBRcHiMaDCuZiqXGDUDVWVtrFAnE= -google.golang.org/genproto/googleapis/api v0.0.0-20251029180050-ab9386a59fda/go.mod h1:fDMmzKV90WSg1NbozdqrE64fkuTv6mlq2zxo9ad+3yo= +google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 h1:fCvbg86sFXwdrl5LgVcTEvNC+2txB5mgROGmRL5mrls= +google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:+rXWjjaukWZun3mLfjmVnQi18E1AsFbDN9QdJ5YXLto= google.golang.org/genproto/googleapis/bytestream v0.0.0-20230530153820-e85fd2cbaebc/go.mod h1:ylj+BE99M198VPbBh6A8d9n3w8fChvyLK3wwBOjXBFA= 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= @@ -2696,8 +2696,8 @@ google.golang.org/genproto/googleapis/rpc v0.0.0-20241118233622-e639e219e697/go. google.golang.org/genproto/googleapis/rpc v0.0.0-20241202173237-19429a94021a/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU= google.golang.org/genproto/googleapis/rpc v0.0.0-20250102185135-69823020774d/go.mod h1:3ENsm/5D1mzDyhpzeRi1NR784I0BcofWBoSc5QqqMK4= google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f/go.mod h1:+2Yz8+CLJbIfL9z73EW45avw8Lmge3xVElCP9zEKi50= -google.golang.org/genproto/googleapis/rpc v0.0.0-20251029180050-ab9386a59fda h1:i/Q+bfisr7gq6feoJnS/DlpdwEL4ihp41fvRiM3Ork0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20251029180050-ab9386a59fda/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 h1:gRkg/vSppuSQoDjxyiGfN4Upv/h/DQmIR10ZU8dh4Ww= +google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk= google.golang.org/grpc v1.71.2 h1:KnzCueW4s+8ojAPZ+NnyZAELjsIMJGteKjKejieEC7M= google.golang.org/grpc v1.71.2/go.mod h1:H0GRtasmQOh9LkFoCPDu3ZrwUtD1YGE+b2vYBYd/8Ec= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= diff --git a/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go index 0e2e96d5009..0e6fb65a1ee 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/aws/go_module_metadata.go @@ -3,4 +3,4 @@ package aws // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.40.1" +const goModuleVersion = "1.41.1" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/client.go b/vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/client.go index 8d7c35a9ec8..c7ef0acc4d2 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/client.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/aws/transport/http/client.go @@ -18,6 +18,7 @@ var ( // Default connection pool options DefaultHTTPTransportMaxIdleConns = 100 DefaultHTTPTransportMaxIdleConnsPerHost = 10 + DefaultHTTPTransportMaxConnsPerHost = 2048 // Default connection timeouts DefaultHTTPTransportIdleConnTimeout = 90 * time.Second @@ -186,6 +187,7 @@ func defaultHTTPTransport() *http.Transport { TLSHandshakeTimeout: DefaultHTTPTransportTLSHandleshakeTimeout, MaxIdleConns: DefaultHTTPTransportMaxIdleConns, MaxIdleConnsPerHost: DefaultHTTPTransportMaxIdleConnsPerHost, + MaxConnsPerHost: DefaultHTTPTransportMaxConnsPerHost, IdleConnTimeout: DefaultHTTPTransportIdleConnTimeout, ExpectContinueTimeout: DefaultHTTPTransportExpectContinueTimeout, ForceAttemptHTTP2: true, diff --git a/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md index 96241169ab1..9f8511f7eb8 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/config/CHANGELOG.md @@ -1,3 +1,19 @@ +# v1.32.7 (2026-01-09) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.32.6 (2025-12-16) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.32.5 (2025-12-09) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.32.4 (2025-12-08) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.32.3 (2025-12-02) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go index f746b903844..79f570a68ea 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/config/go_module_metadata.go @@ -3,4 +3,4 @@ package config // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.32.3" +const goModuleVersion = "1.32.7" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md index d9cf2f26b76..daca9241cb0 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/credentials/CHANGELOG.md @@ -1,3 +1,19 @@ +# v1.19.7 (2026-01-09) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.19.6 (2025-12-16) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.19.5 (2025-12-09) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.19.4 (2025-12-08) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.19.3 (2025-12-02) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go index 84c1d0298ff..5439cb44bd1 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/credentials/go_module_metadata.go @@ -3,4 +3,4 @@ package credentials // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.19.3" +const goModuleVersion = "1.19.7" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md index a7a537774c7..27d5e4d613c 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/CHANGELOG.md @@ -1,3 +1,11 @@ +# v1.18.17 (2026-01-09) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.18.16 (2025-12-08) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.18.15 (2025-12-02) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go index 8ad9afa8f84..0bb72d7b57c 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/feature/ec2/imds/go_module_metadata.go @@ -3,4 +3,4 @@ package imds // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.18.15" +const goModuleVersion = "1.18.17" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md index f4a5edd69aa..552fb90a8b3 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/CHANGELOG.md @@ -1,3 +1,11 @@ +# v1.4.17 (2026-01-09) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.4.16 (2025-12-08) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.4.15 (2025-12-02) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go index f9790cb5dc9..59dbd389b81 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/configsources/go_module_metadata.go @@ -3,4 +3,4 @@ package configsources // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.4.15" +const goModuleVersion = "1.4.17" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md index f5d88c32d01..cdf46e69d87 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/CHANGELOG.md @@ -1,3 +1,11 @@ +# v2.7.17 (2026-01-09) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v2.7.16 (2025-12-08) + +* **Dependency Update**: Updated to the latest SDK module versions + # v2.7.15 (2025-12-02) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go index d9929521e55..3d6ed9c6a6e 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/internal/endpoints/v2/go_module_metadata.go @@ -3,4 +3,4 @@ package endpoints // goModuleVersion is the tagged release for this module -const goModuleVersion = "2.7.15" +const goModuleVersion = "2.7.17" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md index 402a4e7d20d..81fbac09c12 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/CHANGELOG.md @@ -1,3 +1,11 @@ +# v1.13.17 (2026-01-09) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.13.16 (2025-12-08) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.13.15 (2025-12-02) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go index 148feaf9591..d7c886c139d 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/internal/presigned-url/go_module_metadata.go @@ -3,4 +3,4 @@ package presignedurl // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.13.15" +const goModuleVersion = "1.13.17" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/CHANGELOG.md index 39a8a2cd75e..38c6edd4a8c 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/CHANGELOG.md @@ -1,3 +1,11 @@ +# v1.0.5 (2026-01-09) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.0.4 (2025-12-08) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.0.3 (2025-12-02) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/go_module_metadata.go index 2510f960050..b10ad4354ce 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/signin/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/signin/go_module_metadata.go @@ -3,4 +3,4 @@ package signin // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.0.3" +const goModuleVersion = "1.0.5" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/CHANGELOG.md index 63691fc57ed..099b5fecf78 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/CHANGELOG.md @@ -1,3 +1,15 @@ +# v1.39.11 (2026-01-09) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.39.10 (2025-12-09) + +* No change notes available for this release. + +# v1.39.9 (2025-12-08) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.39.8 (2025-12-02) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/go_module_metadata.go index 5082ab4a594..bf57895afee 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/go_module_metadata.go @@ -3,4 +3,4 @@ package sns // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.39.8" +const goModuleVersion = "1.39.11" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/internal/endpoints/endpoints.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/internal/endpoints/endpoints.go index 76361706c8d..b2817d2c7d0 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sns/internal/endpoints/endpoints.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sns/internal/endpoints/endpoints.go @@ -601,6 +601,11 @@ var defaultPartitions = endpoints.Partitions{ }, RegionRegex: partitionRegexp.AwsEusc, IsRegionalized: true, + Endpoints: endpoints.Endpoints{ + endpoints.EndpointKey{ + Region: "eusc-de-east-1", + }: endpoints.Endpoint{}, + }, }, { ID: "aws-iso", diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md index f108ccc8c42..2954b8f28d1 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/CHANGELOG.md @@ -1,3 +1,15 @@ +# v1.30.9 (2026-01-09) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.30.8 (2025-12-16) + +* No change notes available for this release. + +# v1.30.7 (2025-12-08) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.30.6 (2025-12-02) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go index 747cb9e8221..427f36a52e7 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/go_module_metadata.go @@ -3,4 +3,4 @@ package sso // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.30.6" +const goModuleVersion = "1.30.9" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go index bbac359645d..182423b4e6c 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints/endpoints.go @@ -157,6 +157,9 @@ var defaultPartitions = endpoints.Partitions{ Region: "ap-east-1", }, }, + endpoints.EndpointKey{ + Region: "ap-east-2", + }: endpoints.Endpoint{}, endpoints.EndpointKey{ Region: "ap-northeast-1", }: endpoints.Endpoint{ diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md index e70dd5ea76a..a6f58761156 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/CHANGELOG.md @@ -1,3 +1,11 @@ +# v1.35.13 (2026-01-09) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.35.12 (2025-12-08) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.35.11 (2025-12-02) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go index 32d58763d43..50d95e9008e 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/ssooidc/go_module_metadata.go @@ -3,4 +3,4 @@ package ssooidc // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.35.11" +const goModuleVersion = "1.35.13" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md index 9b70885cc4d..8f96faa386c 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/CHANGELOG.md @@ -1,3 +1,15 @@ +# v1.41.6 (2026-01-09) + +* **Dependency Update**: Updated to the latest SDK module versions + +# v1.41.5 (2025-12-09) + +* No change notes available for this release. + +# v1.41.4 (2025-12-08) + +* **Dependency Update**: Updated to the latest SDK module versions + # v1.41.3 (2025-12-02) * **Dependency Update**: Updated to the latest SDK module versions diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go index 22d9a94a02c..6f29ba1fbf9 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/go_module_metadata.go @@ -3,4 +3,4 @@ package sts // goModuleVersion is the tagged release for this module -const goModuleVersion = "1.41.3" +const goModuleVersion = "1.41.6" diff --git a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints/endpoints.go b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints/endpoints.go index b2b933c566a..be72d93dccd 100644 --- a/vendor/github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints/endpoints.go +++ b/vendor/github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints/endpoints.go @@ -390,6 +390,11 @@ var defaultPartitions = endpoints.Partitions{ }, RegionRegex: partitionRegexp.AwsEusc, IsRegionalized: true, + Endpoints: endpoints.Endpoints{ + endpoints.EndpointKey{ + Region: "eusc-de-east-1", + }: endpoints.Endpoint{}, + }, }, { ID: "aws-iso", diff --git a/vendor/github.com/go-openapi/analysis/.cliff.toml b/vendor/github.com/go-openapi/analysis/.cliff.toml new file mode 100644 index 00000000000..702629f5dc3 --- /dev/null +++ b/vendor/github.com/go-openapi/analysis/.cliff.toml @@ -0,0 +1,181 @@ +# git-cliff ~ configuration file +# https://git-cliff.org/docs/configuration + +[changelog] +header = """ +""" + +footer = """ + +----- + +**[{{ remote.github.repo }}]({{ self::remote_url() }}) license terms** + +[![License][license-badge]][license-url] + +[license-badge]: http://img.shields.io/badge/license-Apache%20v2-orange.svg +[license-url]: {{ self::remote_url() }}/?tab=Apache-2.0-1-ov-file#readme + +{%- macro remote_url() -%} + https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }} +{%- endmacro -%} +""" + +body = """ +{%- if version %} +## [{{ version | trim_start_matches(pat="v") }}]({{ self::remote_url() }}/tree/{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }} +{%- else %} +## [unreleased] +{%- endif %} +{%- if message %} + {%- raw %}\n{% endraw %} +{{ message }} + {%- raw %}\n{% endraw %} +{%- endif %} +{%- if version %} + {%- if previous.version %} + +**Full Changelog**: <{{ self::remote_url() }}/compare/{{ previous.version }}...{{ version }}> + {%- endif %} +{%- else %} + {%- raw %}\n{% endraw %} +{%- endif %} + +{%- if statistics %}{% if statistics.commit_count %} + {%- raw %}\n{% endraw %} +{{ statistics.commit_count }} commits in this release. + {%- raw %}\n{% endraw %} +{%- endif %}{% endif %} +----- + +{%- for group, commits in commits | group_by(attribute="group") %} + {%- raw %}\n{% endraw %} +### {{ group | upper_first }} + {%- raw %}\n{% endraw %} + {%- for commit in commits %} + {%- if commit.remote.pr_title %} + {%- set commit_message = commit.remote.pr_title %} + {%- else %} + {%- set commit_message = commit.message %} + {%- endif %} +* {{ commit_message | split(pat="\n") | first | trim }} + {%- if commit.remote.username %} +{%- raw %} {% endraw %}by [@{{ commit.remote.username }}](https://github.com/{{ commit.remote.username }}) + {%- endif %} + {%- if commit.remote.pr_number %} +{%- raw %} {% endraw %}in [#{{ commit.remote.pr_number }}]({{ self::remote_url() }}/pull/{{ commit.remote.pr_number }}) + {%- endif %} +{%- raw %} {% endraw %}[...]({{ self::remote_url() }}/commit/{{ commit.id }}) + {%- endfor %} +{%- endfor %} + +{%- if github %} +{%- raw %}\n{% endraw -%} + {%- set all_contributors = github.contributors | length %} + {%- if github.contributors | filter(attribute="username", value="dependabot[bot]") | length < all_contributors %} +----- + +### People who contributed to this release + {% endif %} + {%- for contributor in github.contributors | filter(attribute="username") | sort(attribute="username") %} + {%- if contributor.username != "dependabot[bot]" and contributor.username != "github-actions[bot]" %} +* [@{{ contributor.username }}](https://github.com/{{ contributor.username }}) + {%- endif %} + {%- endfor %} + + {% if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} +----- + {%- raw %}\n{% endraw %} + +### New Contributors + {%- endif %} + + {%- for contributor in github.contributors | filter(attribute="is_first_time", value=true) %} + {%- if contributor.username != "dependabot[bot]" and contributor.username != "github-actions[bot]" %} +* @{{ contributor.username }} made their first contribution + {%- if contributor.pr_number %} + in [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \ + {%- endif %} + {%- endif %} + {%- endfor %} +{%- endif %} + +{%- raw %}\n{% endraw %} + +{%- macro remote_url() -%} + https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }} +{%- endmacro -%} +""" +# Remove leading and trailing whitespaces from the changelog's body. +trim = true +# Render body even when there are no releases to process. +render_always = true +# An array of regex based postprocessors to modify the changelog. +postprocessors = [ + # Replace the placeholder with a URL. + #{ pattern = '', replace = "https://github.com/orhun/git-cliff" }, +] +# output file path +# output = "test.md" + +[git] +# Parse commits according to the conventional commits specification. +# See https://www.conventionalcommits.org +conventional_commits = false +# Exclude commits that do not match the conventional commits specification. +filter_unconventional = false +# Require all commits to be conventional. +# Takes precedence over filter_unconventional. +require_conventional = false +# Split commits on newlines, treating each line as an individual commit. +split_commits = false +# An array of regex based parsers to modify commit messages prior to further processing. +commit_preprocessors = [ + # Replace issue numbers with link templates to be updated in `changelog.postprocessors`. + #{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](/issues/${2}))"}, + # Check spelling of the commit message using https://github.com/crate-ci/typos. + # If the spelling is incorrect, it will be fixed automatically. + #{ pattern = '.*', replace_command = 'typos --write-changes -' } +] +# Prevent commits that are breaking from being excluded by commit parsers. +protect_breaking_commits = false +# An array of regex based parsers for extracting data from the commit message. +# Assigns commits to groups. +# Optionally sets the commit's scope and can decide to exclude commits from further processing. +commit_parsers = [ + { message = "^[Cc]hore\\([Rr]elease\\): prepare for", skip = true }, + { message = "(^[Mm]erge)|([Mm]erge conflict)", skip = true }, + { field = "author.name", pattern = "dependabot*", group = "Updates" }, + { message = "([Ss]ecurity)|([Vv]uln)", group = "Security" }, + { body = "(.*[Ss]ecurity)|([Vv]uln)", group = "Security" }, + { message = "([Cc]hore\\(lint\\))|(style)|(lint)|(codeql)|(golangci)", group = "Code quality" }, + { message = "(^[Dd]oc)|((?i)readme)|(badge)|(typo)|(documentation)", group = "Documentation" }, + { message = "(^[Ff]eat)|(^[Ee]nhancement)", group = "Implemented enhancements" }, + { message = "(^ci)|(\\(ci\\))|(fixup\\s+ci)|(fix\\s+ci)|(license)|(example)", group = "Miscellaneous tasks" }, + { message = "^test", group = "Testing" }, + { message = "(^fix)|(panic)", group = "Fixed bugs" }, + { message = "(^refact)|(rework)", group = "Refactor" }, + { message = "(^[Pp]erf)|(performance)", group = "Performance" }, + { message = "(^[Cc]hore)", group = "Miscellaneous tasks" }, + { message = "^[Rr]evert", group = "Reverted changes" }, + { message = "(upgrade.*?go)|(go\\s+version)", group = "Updates" }, + { message = ".*", group = "Other" }, +] +# Exclude commits that are not matched by any commit parser. +filter_commits = false +# An array of link parsers for extracting external references, and turning them into URLs, using regex. +link_parsers = [] +# Include only the tags that belong to the current branch. +use_branch_tags = false +# Order releases topologically instead of chronologically. +topo_order = false +# Order releases topologically instead of chronologically. +topo_order_commits = true +# Order of commits in each group/release within the changelog. +# Allowed values: newest, oldest +sort_commits = "newest" +# Process submodules commits +recurse_submodules = false + +#[remote.github] +#owner = "go-openapi" diff --git a/vendor/github.com/go-openapi/analysis/.editorconfig b/vendor/github.com/go-openapi/analysis/.editorconfig new file mode 100644 index 00000000000..3152da69a5d --- /dev/null +++ b/vendor/github.com/go-openapi/analysis/.editorconfig @@ -0,0 +1,26 @@ +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true + +# Set default charset +[*.{js,py,go,scala,rb,java,html,css,less,sass,md}] +charset = utf-8 + +# Tab indentation (no size specified) +[*.go] +indent_style = tab + +[*.md] +trim_trailing_whitespace = false + +# Matches the exact files either package.json or .travis.yml +[{package.json,.travis.yml}] +indent_style = space +indent_size = 2 diff --git a/vendor/github.com/go-openapi/analysis/.golangci.yml b/vendor/github.com/go-openapi/analysis/.golangci.yml index 06190ac055f..05808d52a68 100644 --- a/vendor/github.com/go-openapi/analysis/.golangci.yml +++ b/vendor/github.com/go-openapi/analysis/.golangci.yml @@ -2,34 +2,18 @@ version: "2" linters: default: all disable: - - cyclop - depguard - - errchkjson - - errorlint - - exhaustruct - - forcetypeassert - funlen - - gochecknoglobals - - gochecknoinits - - gocognit - - godot - godox - - gosmopolitan - - inamedparam - - intrange - - ireturn - - lll - - musttag - - nestif + - exhaustruct - nlreturn - - noinlineerr - nonamedreturns + - noinlineerr - paralleltest - recvcheck - testpackage - - thelper + - thelper # investigate how to parameterize / fix. Temporarily disabled. - tparallel - - unparam - varnamelen - whitespace - wrapcheck @@ -41,8 +25,17 @@ linters: goconst: min-len: 2 min-occurrences: 3 + cyclop: + max-complexity: 25 gocyclo: - min-complexity: 45 + min-complexity: 25 + gocognit: + min-complexity: 35 + exhaustive: + default-signifies-exhaustive: true + default-case-required: true + lll: + line-length: 180 exclusions: generated: lax presets: @@ -58,6 +51,7 @@ formatters: enable: - gofmt - goimports + - gofumpt exclusions: generated: lax paths: diff --git a/vendor/github.com/go-openapi/analysis/CONTRIBUTORS.md b/vendor/github.com/go-openapi/analysis/CONTRIBUTORS.md new file mode 100644 index 00000000000..03d3defe3be --- /dev/null +++ b/vendor/github.com/go-openapi/analysis/CONTRIBUTORS.md @@ -0,0 +1,26 @@ +# Contributors + +- Repository: ['go-openapi/analysis'] + +| Total Contributors | Total Contributions | +| --- | --- | +| 14 | 192 | + +| Username | All Time Contribution Count | All Commits | +| --- | --- | --- | +| @fredbi | 90 | https://github.com/go-openapi/analysis/commits?author=fredbi | +| @casualjim | 70 | https://github.com/go-openapi/analysis/commits?author=casualjim | +| @keramix | 9 | https://github.com/go-openapi/analysis/commits?author=keramix | +| @youyuanwu | 8 | https://github.com/go-openapi/analysis/commits?author=youyuanwu | +| @msample | 3 | https://github.com/go-openapi/analysis/commits?author=msample | +| @kul-amr | 3 | https://github.com/go-openapi/analysis/commits?author=kul-amr | +| @mbohlool | 2 | https://github.com/go-openapi/analysis/commits?author=mbohlool | +| @danielfbm | 1 | https://github.com/go-openapi/analysis/commits?author=danielfbm | +| @gregmarr | 1 | https://github.com/go-openapi/analysis/commits?author=gregmarr | +| @guillemj | 1 | https://github.com/go-openapi/analysis/commits?author=guillemj | +| @knweiss | 1 | https://github.com/go-openapi/analysis/commits?author=knweiss | +| @tklauser | 1 | https://github.com/go-openapi/analysis/commits?author=tklauser | +| @cuishuang | 1 | https://github.com/go-openapi/analysis/commits?author=cuishuang | +| @ujjwalsh | 1 | https://github.com/go-openapi/analysis/commits?author=ujjwalsh | + + _this file was generated by the [Contributors GitHub Action](https://github.com/github/contributors)_ diff --git a/vendor/github.com/go-openapi/analysis/README.md b/vendor/github.com/go-openapi/analysis/README.md index e005d4b37b7..69e2f4b1df4 100644 --- a/vendor/github.com/go-openapi/analysis/README.md +++ b/vendor/github.com/go-openapi/analysis/README.md @@ -1,13 +1,30 @@ -# OpenAPI analysis [![Build Status](https://github.com/go-openapi/analysis/actions/workflows/go-test.yml/badge.svg)](https://github.com/go-openapi/analysis/actions?query=workflow%3A"go+test") [![codecov](https://codecov.io/gh/go-openapi/analysis/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/analysis) +# analysis -[![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io) -[![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/analysis/master/LICENSE) -[![Go Reference](https://pkg.go.dev/badge/github.com/go-openapi/analysis.svg)](https://pkg.go.dev/github.com/go-openapi/analysis) -[![Go Report Card](https://goreportcard.com/badge/github.com/go-openapi/analysis)](https://goreportcard.com/report/github.com/go-openapi/analysis) + +[![Tests][test-badge]][test-url] [![Coverage][cov-badge]][cov-url] [![CI vuln scan][vuln-scan-badge]][vuln-scan-url] [![CodeQL][codeql-badge]][codeql-url] + + + +[![Release][release-badge]][release-url] [![Go Report Card][gocard-badge]][gocard-url] [![CodeFactor Grade][codefactor-badge]][codefactor-url] [![License][license-badge]][license-url] + + +[![GoDoc][godoc-badge]][godoc-url] [![Slack Channel][slack-logo]![slack-badge]][slack-url] [![go version][goversion-badge]][goversion-url] ![Top language][top-badge] ![Commits since latest release][commits-badge] +--- A foundational library to analyze an OAI specification document for easier reasoning about the content. + +## Status + +API is stable. + +## Import this library in your project + +```cmd +go get github.com/go-openapi/analysis +``` + ## What's inside? * An analyzer providing methods to walk the functional content of a specification @@ -15,13 +32,83 @@ A foundational library to analyze an OAI specification document for easier reaso * A spec merger ("mixin") to merge several spec documents into a primary spec * A spec "fixer" ensuring that response descriptions are non empty -[Documentation](https://pkg.go.dev/github.com/go-openapi/analysis) - ## FAQ * Does this library support OpenAPI 3? - > No. > This package currently only supports OpenAPI 2.0 (aka Swagger 2.0). > There is no plan to make it evolve toward supporting OpenAPI 3.x. > This [discussion thread](https://github.com/go-openapi/spec/issues/21) relates the full story. + +## Change log + +See + + + +## Licensing + +This library ships under the [SPDX-License-Identifier: Apache-2.0](./LICENSE). + + + + + +## Other documentation + +* [All-time contributors](./CONTRIBUTORS.md) +* [Contributing guidelines](.github/CONTRIBUTING.md) +* [Maintainers documentation](docs/MAINTAINERS.md) +* [Code style](docs/STYLE.md) + +## Cutting a new release + +Maintainers can cut a new release by either: + +* running [this workflow](https://github.com/go-openapi/analysis/actions/workflows/bump-release.yml) +* or pushing a semver tag + * signed tags are preferred + * The tag message is prepended to release notes + + +[test-badge]: https://github.com/go-openapi/analysis/actions/workflows/go-test.yml/badge.svg +[test-url]: https://github.com/go-openapi/analysis/actions/workflows/go-test.yml +[cov-badge]: https://codecov.io/gh/go-openapi/analysis/branch/master/graph/badge.svg +[cov-url]: https://codecov.io/gh/go-openapi/analysis +[vuln-scan-badge]: https://github.com/go-openapi/analysis/actions/workflows/scanner.yml/badge.svg +[vuln-scan-url]: https://github.com/go-openapi/analysis/actions/workflows/scanner.yml +[codeql-badge]: https://github.com/go-openapi/analysis/actions/workflows/codeql.yml/badge.svg +[codeql-url]: https://github.com/go-openapi/analysis/actions/workflows/codeql.yml + +[release-badge]: https://badge.fury.io/gh/go-openapi%2Fanalysis.svg +[release-url]: https://badge.fury.io/gh/go-openapi%2Fanalysis +[gomod-badge]: https://badge.fury.io/go/github.com%2Fgo-openapi%2Fanalysis.svg +[gomod-url]: https://badge.fury.io/go/github.com%2Fgo-openapi%2Fanalysis + +[gocard-badge]: https://goreportcard.com/badge/github.com/go-openapi/analysis +[gocard-url]: https://goreportcard.com/report/github.com/go-openapi/analysis +[codefactor-badge]: https://img.shields.io/codefactor/grade/github/go-openapi/analysis +[codefactor-url]: https://www.codefactor.io/repository/github/go-openapi/analysis + +[doc-badge]: https://img.shields.io/badge/doc-site-blue?link=https%3A%2F%2Fgoswagger.io%2Fgo-openapi%2F +[doc-url]: https://goswagger.io/go-openapi +[godoc-badge]: https://pkg.go.dev/badge/github.com/go-openapi/analysis +[godoc-url]: http://pkg.go.dev/github.com/go-openapi/analysis +[slack-logo]: https://a.slack-edge.com/e6a93c1/img/icons/favicon-32.png +[slack-badge]: https://img.shields.io/badge/slack-blue?link=https%3A%2F%2Fgoswagger.slack.com%2Farchives%2FC04R30YM +[slack-url]: https://goswagger.slack.com/archives/C04R30YMU + +[license-badge]: http://img.shields.io/badge/license-Apache%20v2-orange.svg +[license-url]: https://github.com/go-openapi/analysis/?tab=Apache-2.0-1-ov-file#readme + +[goversion-badge]: https://img.shields.io/github/go-mod/go-version/go-openapi/analysis +[goversion-url]: https://github.com/go-openapi/analysis/blob/master/go.mod +[top-badge]: https://img.shields.io/github/languages/top/go-openapi/analysis +[commits-badge]: https://img.shields.io/github/commits-since/go-openapi/analysis/latest diff --git a/vendor/github.com/go-openapi/analysis/SECURITY.md b/vendor/github.com/go-openapi/analysis/SECURITY.md new file mode 100644 index 00000000000..f60adcd9e24 --- /dev/null +++ b/vendor/github.com/go-openapi/analysis/SECURITY.md @@ -0,0 +1,19 @@ +# Security Policy + +This policy outlines the commitment and practices of the go-openapi maintainers regarding security. + +## Supported Versions + +| Version | Supported | +| ------- | ------------------ | +| 0.24.x | :white_check_mark: | + +## Reporting a vulnerability + +If you become aware of a security vulnerability that affects the current repository, +please report it privately to the maintainers. + +Please follow the instructions provided by github to +[Privately report a security vulnerability](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing-information-about-vulnerabilities/privately-reporting-a-security-vulnerability#privately-reporting-a-security-vulnerability). + +TL;DR: on Github, navigate to the project's "Security" tab then click on "Report a vulnerability". diff --git a/vendor/github.com/go-openapi/analysis/analyzer.go b/vendor/github.com/go-openapi/analysis/analyzer.go index 4870ad07beb..af50a6fdfdb 100644 --- a/vendor/github.com/go-openapi/analysis/analyzer.go +++ b/vendor/github.com/go-openapi/analysis/analyzer.go @@ -164,13 +164,13 @@ func New(doc *spec.Swagger) *Spec { return a } -// SecurityRequirement is a representation of a security requirement for an operation +// SecurityRequirement is a representation of a security requirement for an operation. type SecurityRequirement struct { Name string Scopes []string } -// SecurityRequirementsFor gets the security requirements for the operation +// SecurityRequirementsFor gets the security requirements for the operation. func (s *Spec) SecurityRequirementsFor(operation *spec.Operation) [][]SecurityRequirement { if s.spec.Security == nil && operation.Security == nil { return nil @@ -204,7 +204,7 @@ func (s *Spec) SecurityRequirementsFor(operation *spec.Operation) [][]SecurityRe return result } -// SecurityDefinitionsForRequirements gets the matching security definitions for a set of requirements +// SecurityDefinitionsForRequirements gets the matching security definitions for a set of requirements. func (s *Spec) SecurityDefinitionsForRequirements(requirements []SecurityRequirement) map[string]spec.SecurityScheme { result := make(map[string]spec.SecurityScheme) @@ -219,7 +219,7 @@ func (s *Spec) SecurityDefinitionsForRequirements(requirements []SecurityRequire return result } -// SecurityDefinitionsFor gets the matching security definitions for a set of requirements +// SecurityDefinitionsFor gets the matching security definitions for a set of requirements. func (s *Spec) SecurityDefinitionsFor(operation *spec.Operation) map[string]spec.SecurityScheme { requirements := s.SecurityRequirementsFor(operation) if len(requirements) == 0 { @@ -250,7 +250,7 @@ func (s *Spec) SecurityDefinitionsFor(operation *spec.Operation) map[string]spec return result } -// ConsumesFor gets the mediatypes for the operation +// ConsumesFor gets the mediatypes for the operation. func (s *Spec) ConsumesFor(operation *spec.Operation) []string { if len(operation.Consumes) == 0 { cons := make(map[string]struct{}, len(s.spec.Consumes)) @@ -269,7 +269,7 @@ func (s *Spec) ConsumesFor(operation *spec.Operation) []string { return s.structMapKeys(cons) } -// ProducesFor gets the mediatypes for the operation +// ProducesFor gets the mediatypes for the operation. func (s *Spec) ProducesFor(operation *spec.Operation) []string { if len(operation.Produces) == 0 { prod := make(map[string]struct{}, len(s.spec.Produces)) @@ -400,7 +400,7 @@ func (s *Spec) SafeParamsFor(method, path string, callmeOnError ErrorOnParamFunc return res } -// OperationForName gets the operation for the given id +// OperationForName gets the operation for the given id. func (s *Spec) OperationForName(operationID string) (string, string, *spec.Operation, bool) { for method, pathItem := range s.operations { for path, op := range pathItem { @@ -413,7 +413,7 @@ func (s *Spec) OperationForName(operationID string) (string, string, *spec.Opera return "", "", nil, false } -// OperationFor the given method and path +// OperationFor the given method and path. func (s *Spec) OperationFor(method, path string) (*spec.Operation, bool) { if mp, ok := s.operations[strings.ToUpper(method)]; ok { op, fn := mp[path] @@ -424,12 +424,12 @@ func (s *Spec) OperationFor(method, path string) (*spec.Operation, bool) { return nil, false } -// Operations gathers all the operations specified in the spec document +// Operations gathers all the operations specified in the spec document. func (s *Spec) Operations() map[string]map[string]*spec.Operation { return s.operations } -// AllPaths returns all the paths in the swagger spec +// AllPaths returns all the paths in the swagger spec. func (s *Spec) AllPaths() map[string]spec.PathItem { if s.spec == nil || s.spec.Paths == nil { return nil @@ -438,7 +438,7 @@ func (s *Spec) AllPaths() map[string]spec.PathItem { return s.spec.Paths.Paths } -// OperationIDs gets all the operation ids based on method an dpath +// OperationIDs gets all the operation ids based on method an dpath. func (s *Spec) OperationIDs() []string { if len(s.operations) == 0 { return nil @@ -458,7 +458,7 @@ func (s *Spec) OperationIDs() []string { return result } -// OperationMethodPaths gets all the operation ids based on method an dpath +// OperationMethodPaths gets all the operation ids based on method an dpath. func (s *Spec) OperationMethodPaths() []string { if len(s.operations) == 0 { return nil @@ -474,22 +474,22 @@ func (s *Spec) OperationMethodPaths() []string { return result } -// RequiredConsumes gets all the distinct consumes that are specified in the specification document +// RequiredConsumes gets all the distinct consumes that are specified in the specification document. func (s *Spec) RequiredConsumes() []string { return s.structMapKeys(s.consumes) } -// RequiredProduces gets all the distinct produces that are specified in the specification document +// RequiredProduces gets all the distinct produces that are specified in the specification document. func (s *Spec) RequiredProduces() []string { return s.structMapKeys(s.produces) } -// RequiredSecuritySchemes gets all the distinct security schemes that are specified in the swagger spec +// RequiredSecuritySchemes gets all the distinct security schemes that are specified in the swagger spec. func (s *Spec) RequiredSecuritySchemes() []string { return s.structMapKeys(s.authSchemes) } -// SchemaRef is a reference to a schema +// SchemaRef is a reference to a schema. type SchemaRef struct { Name string Ref spec.Ref @@ -498,7 +498,7 @@ type SchemaRef struct { } // SchemasWithAllOf returns schema references to all schemas that are defined -// with an allOf key +// with an allOf key. func (s *Spec) SchemasWithAllOf() (result []SchemaRef) { for _, v := range s.allOfs { result = append(result, v) @@ -507,7 +507,7 @@ func (s *Spec) SchemasWithAllOf() (result []SchemaRef) { return } -// AllDefinitions returns schema references for all the definitions that were discovered +// AllDefinitions returns schema references for all the definitions that were discovered. func (s *Spec) AllDefinitions() (result []SchemaRef) { for _, v := range s.allSchemas { result = append(result, v) @@ -516,7 +516,7 @@ func (s *Spec) AllDefinitions() (result []SchemaRef) { return } -// AllDefinitionReferences returns json refs for all the discovered schemas +// AllDefinitionReferences returns json refs for all the discovered schemas. func (s *Spec) AllDefinitionReferences() (result []string) { for _, v := range s.references.schemas { result = append(result, v.String()) @@ -525,7 +525,7 @@ func (s *Spec) AllDefinitionReferences() (result []string) { return } -// AllParameterReferences returns json refs for all the discovered parameters +// AllParameterReferences returns json refs for all the discovered parameters. func (s *Spec) AllParameterReferences() (result []string) { for _, v := range s.references.parameters { result = append(result, v.String()) @@ -534,7 +534,7 @@ func (s *Spec) AllParameterReferences() (result []string) { return } -// AllResponseReferences returns json refs for all the discovered responses +// AllResponseReferences returns json refs for all the discovered responses. func (s *Spec) AllResponseReferences() (result []string) { for _, v := range s.references.responses { result = append(result, v.String()) @@ -543,7 +543,7 @@ func (s *Spec) AllResponseReferences() (result []string) { return } -// AllPathItemReferences returns the references for all the items +// AllPathItemReferences returns the references for all the items. func (s *Spec) AllPathItemReferences() (result []string) { for _, v := range s.references.pathItems { result = append(result, v.String()) @@ -564,7 +564,7 @@ func (s *Spec) AllItemsReferences() (result []string) { return } -// AllReferences returns all the references found in the document, with possible duplicates +// AllReferences returns all the references found in the document, with possible duplicates. func (s *Spec) AllReferences() (result []string) { for _, v := range s.references.allRefs { result = append(result, v.String()) @@ -573,7 +573,7 @@ func (s *Spec) AllReferences() (result []string) { return } -// AllRefs returns all the unique references found in the document +// AllRefs returns all the unique references found in the document. func (s *Spec) AllRefs() (result []spec.Ref) { set := make(map[string]struct{}) for _, v := range s.references.allRefs { @@ -592,61 +592,61 @@ func (s *Spec) AllRefs() (result []spec.Ref) { } // ParameterPatterns returns all the patterns found in parameters -// the map is cloned to avoid accidental changes +// the map is cloned to avoid accidental changes. func (s *Spec) ParameterPatterns() map[string]string { return cloneStringMap(s.patterns.parameters) } // HeaderPatterns returns all the patterns found in response headers -// the map is cloned to avoid accidental changes +// the map is cloned to avoid accidental changes. func (s *Spec) HeaderPatterns() map[string]string { return cloneStringMap(s.patterns.headers) } // ItemsPatterns returns all the patterns found in simple array items -// the map is cloned to avoid accidental changes +// the map is cloned to avoid accidental changes. func (s *Spec) ItemsPatterns() map[string]string { return cloneStringMap(s.patterns.items) } // SchemaPatterns returns all the patterns found in schemas -// the map is cloned to avoid accidental changes +// the map is cloned to avoid accidental changes. func (s *Spec) SchemaPatterns() map[string]string { return cloneStringMap(s.patterns.schemas) } // AllPatterns returns all the patterns found in the spec -// the map is cloned to avoid accidental changes +// the map is cloned to avoid accidental changes. func (s *Spec) AllPatterns() map[string]string { return cloneStringMap(s.patterns.allPatterns) } // ParameterEnums returns all the enums found in parameters -// the map is cloned to avoid accidental changes +// the map is cloned to avoid accidental changes. func (s *Spec) ParameterEnums() map[string][]any { return cloneEnumMap(s.enums.parameters) } // HeaderEnums returns all the enums found in response headers -// the map is cloned to avoid accidental changes +// the map is cloned to avoid accidental changes. func (s *Spec) HeaderEnums() map[string][]any { return cloneEnumMap(s.enums.headers) } // ItemsEnums returns all the enums found in simple array items -// the map is cloned to avoid accidental changes +// the map is cloned to avoid accidental changes. func (s *Spec) ItemsEnums() map[string][]any { return cloneEnumMap(s.enums.items) } // SchemaEnums returns all the enums found in schemas -// the map is cloned to avoid accidental changes +// the map is cloned to avoid accidental changes. func (s *Spec) SchemaEnums() map[string][]any { return cloneEnumMap(s.enums.schemas) } // AllEnums returns all the enums found in the spec -// the map is cloned to avoid accidental changes +// the map is cloned to avoid accidental changes. func (s *Spec) AllEnums() map[string][]any { return cloneEnumMap(s.enums.allEnums) } diff --git a/vendor/github.com/go-openapi/analysis/debug.go b/vendor/github.com/go-openapi/analysis/debug.go index d490eab6063..8e777c432aa 100644 --- a/vendor/github.com/go-openapi/analysis/debug.go +++ b/vendor/github.com/go-openapi/analysis/debug.go @@ -9,4 +9,4 @@ import ( "github.com/go-openapi/analysis/internal/debug" ) -var debugLog = debug.GetLogger("analysis", os.Getenv("SWAGGER_DEBUG") != "") +var debugLog = debug.GetLogger("analysis", os.Getenv("SWAGGER_DEBUG") != "") //nolint:gochecknoglobals // it's okay to use a private global for logging diff --git a/vendor/github.com/go-openapi/analysis/flatten.go b/vendor/github.com/go-openapi/analysis/flatten.go index 1c7a49c034f..e225b71a2b1 100644 --- a/vendor/github.com/go-openapi/analysis/flatten.go +++ b/vendor/github.com/go-openapi/analysis/flatten.go @@ -21,7 +21,7 @@ import ( const definitionsPath = "#/definitions" -// newRef stores information about refs created during the flattening process +// newRef stores information about refs created during the flattening process. type newRef struct { key string newName string @@ -32,7 +32,7 @@ type newRef struct { parents []string } -// context stores intermediary results from flatten +// context stores intermediary results from flatten. type context struct { newRefs map[string]*newRef warnings []string @@ -169,7 +169,7 @@ func expand(opts *FlattenOpts) error { } // normalizeRef strips the current file from any absolute file $ref. This works around issue go-openapi/spec#76: -// leading absolute file in $ref is stripped +// leading absolute file in $ref is stripped. func normalizeRef(opts *FlattenOpts) error { debugLog("normalizeRef") @@ -521,7 +521,7 @@ func stripOAIGen(opts *FlattenOpts) (bool, error) { return replacedWithComplex, nil } -// updateRefParents updates all parents of an updated $ref +// updateRefParents updates all parents of an updated $ref. func updateRefParents(allRefs map[string]spec.Ref, r *newRef) { if !r.isOAIGen || r.resolved { // bail on already resolved entries (avoid looping) return diff --git a/vendor/github.com/go-openapi/analysis/flatten_name.go b/vendor/github.com/go-openapi/analysis/flatten_name.go index 475b33c4136..922cae55c5e 100644 --- a/vendor/github.com/go-openapi/analysis/flatten_name.go +++ b/vendor/github.com/go-openapi/analysis/flatten_name.go @@ -17,7 +17,7 @@ import ( "github.com/go-openapi/swag/mangling" ) -// InlineSchemaNamer finds a new name for an inlined type +// InlineSchemaNamer finds a new name for an inlined type. type InlineSchemaNamer struct { Spec *spec.Swagger Operations map[string]operations.OpRef @@ -25,7 +25,7 @@ type InlineSchemaNamer struct { opts *FlattenOpts } -// Name yields a new name for the inline schema +// Name yields a new name for the inline schema. func (isn *InlineSchemaNamer) Name(key string, schema *spec.Schema, aschema *AnalyzedSchema) error { debugLog("naming inlined schema at %s", key) @@ -108,7 +108,7 @@ func (isn *InlineSchemaNamer) Name(key string, schema *spec.Schema, aschema *Ana return nil } -// uniqifyName yields a unique name for a definition +// uniqifyName yields a unique name for a definition. func uniqifyName(definitions spec.Definitions, name string) (string, bool) { isOAIGen := false if name == "" { @@ -244,7 +244,7 @@ func namesForDefinition(parts sortref.SplitKey) ([][]string, int) { return [][]string{}, 0 } -// partAdder knows how to interpret a schema when it comes to build a name from parts +// partAdder knows how to interpret a schema when it comes to build a name from parts. func partAdder(aschema *AnalyzedSchema) sortref.PartAdder { return func(part string) []string { segments := make([]string, 0, minSegments) diff --git a/vendor/github.com/go-openapi/analysis/flatten_options.go b/vendor/github.com/go-openapi/analysis/flatten_options.go index d8fc25cf586..a9e54a85ac6 100644 --- a/vendor/github.com/go-openapi/analysis/flatten_options.go +++ b/vendor/github.com/go-openapi/analysis/flatten_options.go @@ -44,13 +44,13 @@ func (f *FlattenOpts) ExpandOpts(skipSchemas bool) *spec.ExpandOptions { } } -// Swagger gets the swagger specification for this flatten operation +// Swagger gets the swagger specification for this flatten operation. func (f *FlattenOpts) Swagger() *spec.Swagger { return f.Spec.spec } // croak logs notifications and warnings about valid, but possibly unwanted constructs resulting -// from flattening a spec +// from flattening a spec. func (f *FlattenOpts) croak() { if !f.Verbose { return diff --git a/vendor/github.com/go-openapi/analysis/internal/debug/debug.go b/vendor/github.com/go-openapi/analysis/internal/debug/debug.go index 03e0d32e9ea..d3fa08d3ba3 100644 --- a/vendor/github.com/go-openapi/analysis/internal/debug/debug.go +++ b/vendor/github.com/go-openapi/analysis/internal/debug/debug.go @@ -11,11 +11,9 @@ import ( "runtime" ) -var ( - output = os.Stdout -) +var output = os.Stdout //nolint:gochecknoglobals // this is on purpose to be overridable during tests -// GetLogger provides a prefix debug logger +// GetLogger provides a prefix debug logger. func GetLogger(prefix string, debug bool) func(string, ...any) { if debug { logger := log.New(output, prefix+":", log.LstdFlags) diff --git a/vendor/github.com/go-openapi/analysis/internal/flatten/normalize/normalize.go b/vendor/github.com/go-openapi/analysis/internal/flatten/normalize/normalize.go index 320a50bff85..c04b6b4e74d 100644 --- a/vendor/github.com/go-openapi/analysis/internal/flatten/normalize/normalize.go +++ b/vendor/github.com/go-openapi/analysis/internal/flatten/normalize/normalize.go @@ -18,7 +18,7 @@ import ( // // NOTE(windows): // * refs are assumed to have been normalized with drive letter lower cased (from go-openapi/spec) -// * "/ in paths may appear as escape sequences +// * "/ in paths may appear as escape sequences. func RebaseRef(baseRef string, ref string) string { baseRef, _ = url.PathUnescape(baseRef) ref, _ = url.PathUnescape(ref) @@ -70,7 +70,7 @@ func RebaseRef(baseRef string, ref string) string { // // NOTE(windows): // * refs are assumed to have been normalized with drive letter lower cased (from go-openapi/spec) -// * "/ in paths may appear as escape sequences +// * "/ in paths may appear as escape sequences. func Path(ref spec.Ref, basePath string) string { uri, _ := url.PathUnescape(ref.String()) if ref.HasFragmentOnly || filepath.IsAbs(uri) { diff --git a/vendor/github.com/go-openapi/analysis/internal/flatten/operations/operations.go b/vendor/github.com/go-openapi/analysis/internal/flatten/operations/operations.go index 940c46a9256..325e2751f83 100644 --- a/vendor/github.com/go-openapi/analysis/internal/flatten/operations/operations.go +++ b/vendor/github.com/go-openapi/analysis/internal/flatten/operations/operations.go @@ -14,12 +14,12 @@ import ( "github.com/go-openapi/swag/mangling" ) -// AllOpRefsByRef returns an index of sortable operations +// AllOpRefsByRef returns an index of sortable operations. func AllOpRefsByRef(specDoc Provider, operationIDs []string) map[string]OpRef { return OpRefsByRef(GatherOperations(specDoc, operationIDs)) } -// OpRefsByRef indexes a map of sortable operations +// OpRefsByRef indexes a map of sortable operations. func OpRefsByRef(oprefs map[string]OpRef) map[string]OpRef { result := make(map[string]OpRef, len(oprefs)) for _, v := range oprefs { @@ -29,7 +29,7 @@ func OpRefsByRef(oprefs map[string]OpRef) map[string]OpRef { return result } -// OpRef is an indexable, sortable operation +// OpRef is an indexable, sortable operation. type OpRef struct { Method string Path string @@ -39,19 +39,19 @@ type OpRef struct { Ref spec.Ref } -// OpRefs is a sortable collection of operations +// OpRefs is a sortable collection of operations. type OpRefs []OpRef func (o OpRefs) Len() int { return len(o) } func (o OpRefs) Swap(i, j int) { o[i], o[j] = o[j], o[i] } func (o OpRefs) Less(i, j int) bool { return o[i].Key < o[j].Key } -// Provider knows how to collect operations from a spec +// Provider knows how to collect operations from a spec. type Provider interface { Operations() map[string]map[string]*spec.Operation } -// GatherOperations builds a map of sorted operations from a spec +// GatherOperations builds a map of sorted operations from a spec. func GatherOperations(specDoc Provider, operationIDs []string) map[string]OpRef { var oprefs OpRefs mangler := mangling.NewNameMangler() diff --git a/vendor/github.com/go-openapi/analysis/internal/flatten/replace/errors.go b/vendor/github.com/go-openapi/analysis/internal/flatten/replace/errors.go index d7c28b88571..b2a8a93ba67 100644 --- a/vendor/github.com/go-openapi/analysis/internal/flatten/replace/errors.go +++ b/vendor/github.com/go-openapi/analysis/internal/flatten/replace/errors.go @@ -58,7 +58,7 @@ func ErrCyclicChain(key string) error { } func ErrInvalidPointerType(key string, value any, err error) error { - return fmt.Errorf("invalid type for resolved JSON pointer %s. Expected a schema a, got: %T (%v): %w", + return fmt.Errorf("invalid type for resolved JSON pointer %s. Expected a schema a, got: %T (%w): %w", key, value, err, ErrReplace, ) } diff --git a/vendor/github.com/go-openapi/analysis/internal/flatten/replace/replace.go b/vendor/github.com/go-openapi/analysis/internal/flatten/replace/replace.go index 61c13f7ebaa..e8365f3333d 100644 --- a/vendor/github.com/go-openapi/analysis/internal/flatten/replace/replace.go +++ b/vendor/github.com/go-openapi/analysis/internal/flatten/replace/replace.go @@ -22,9 +22,10 @@ const ( allocMediumMap = 64 ) +//nolint:gochecknoglobals // it's okay to use a private global for logging var debugLog = debug.GetLogger("analysis/flatten/replace", os.Getenv("SWAGGER_DEBUG") != "") -// RewriteSchemaToRef replaces a schema with a Ref +// RewriteSchemaToRef replaces a schema with a Ref. func RewriteSchemaToRef(sp *spec.Swagger, key string, ref spec.Ref) error { debugLog("rewriting schema to ref for %s with %s", key, ref.String()) _, value, err := getPointerFromKey(sp, key) @@ -142,7 +143,7 @@ func rewriteParentRef(sp *spec.Swagger, key string, ref spec.Ref) error { return nil } -// getPointerFromKey retrieves the content of the JSON pointer "key" +// getPointerFromKey retrieves the content of the JSON pointer "key". func getPointerFromKey(sp any, key string) (string, any, error) { switch sp.(type) { case *spec.Schema: @@ -154,7 +155,10 @@ func getPointerFromKey(sp any, key string) (string, any, error) { return "", sp, nil } // unescape chars in key, e.g. "{}" from path params - pth, _ := url.PathUnescape(key[1:]) + pth, err := url.PathUnescape(key[1:]) + if err != nil { + return "", nil, errors.Join(err, ErrReplace) + } ptr, err := jsonpointer.New(pth) if err != nil { return "", nil, errors.Join(err, ErrReplace) @@ -170,7 +174,7 @@ func getPointerFromKey(sp any, key string) (string, any, error) { return pth, value, nil } -// getParentFromKey retrieves the container of the JSON pointer "key" +// getParentFromKey retrieves the container of the JSON pointer "key". func getParentFromKey(sp any, key string) (string, string, any, error) { switch sp.(type) { case *spec.Schema: @@ -196,7 +200,7 @@ func getParentFromKey(sp any, key string) (string, string, any, error) { return parent, entry, pvalue, nil } -// UpdateRef replaces a ref by another one +// UpdateRef replaces a ref by another one. func UpdateRef(sp any, key string, ref spec.Ref) error { switch sp.(type) { case *spec.Schema: @@ -265,7 +269,7 @@ func UpdateRef(sp any, key string, ref spec.Ref) error { return nil } -// UpdateRefWithSchema replaces a ref with a schema (i.e. re-inline schema) +// UpdateRefWithSchema replaces a ref with a schema (i.e. re-inline schema). func UpdateRefWithSchema(sp *spec.Swagger, key string, sch *spec.Schema) error { debugLog("updating ref for %s with schema", key) pth, value, err := getPointerFromKey(sp, key) @@ -324,7 +328,7 @@ func UpdateRefWithSchema(sp *spec.Swagger, key string, sch *spec.Schema) error { return nil } -// DeepestRefResult holds the results from DeepestRef analysis +// DeepestRefResult holds the results from DeepestRef analysis. type DeepestRefResult struct { Ref spec.Ref Schema *spec.Schema @@ -336,6 +340,8 @@ type DeepestRefResult struct { // - pointers to external files are expanded // // NOTE: all external $ref's are assumed to be already expanded at this stage. +// +//nolint:gocognit,cyclop,gocyclo // this is the most complex method in this package and we'll have to break it down some day func DeepestRef(sp *spec.Swagger, opts *spec.ExpandOptions, ref spec.Ref) (*DeepestRefResult, error) { if !ref.HasFragmentOnly { // we found an external $ref, which is odd at this stage: @@ -392,11 +398,13 @@ DOWNREF: case spec.Response: // a pointer points to a schema initially marshalled in responses section... // Attempt to convert this to a schema. If this fails, the spec is invalid - asJSON, _ := refable.MarshalJSON() + asJSON, err := refable.MarshalJSON() + if err != nil { + return nil, ErrInvalidPointerType(currentRef.String(), value, err) + } var asSchema spec.Schema - err := asSchema.UnmarshalJSON(asJSON) - if err != nil { + if err = asSchema.UnmarshalJSON(asJSON); err != nil { return nil, ErrInvalidPointerType(currentRef.String(), value, err) } warnings = append(warnings, fmt.Sprintf("found $ref %q (response) interpreted as schema", currentRef.String())) @@ -409,9 +417,12 @@ DOWNREF: case spec.Parameter: // a pointer points to a schema initially marshalled in parameters section... // Attempt to convert this to a schema. If this fails, the spec is invalid - asJSON, _ := refable.MarshalJSON() + asJSON, err := refable.MarshalJSON() + if err != nil { + return nil, ErrInvalidPointerType(currentRef.String(), value, err) + } var asSchema spec.Schema - if err := asSchema.UnmarshalJSON(asJSON); err != nil { + if err = asSchema.UnmarshalJSON(asJSON); err != nil { return nil, ErrInvalidPointerType(currentRef.String(), value, err) } @@ -428,9 +439,12 @@ DOWNREF: break DOWNREF } - asJSON, _ := json.Marshal(refable) + asJSON, err := json.Marshal(refable) + if err != nil { + return nil, ErrInvalidPointerType(currentRef.String(), value, err) + } var asSchema spec.Schema - if err := asSchema.UnmarshalJSON(asJSON); err != nil { + if err = asSchema.UnmarshalJSON(asJSON); err != nil { return nil, ErrInvalidPointerType(currentRef.String(), value, err) } warnings = append(warnings, fmt.Sprintf("found $ref %q (%T) interpreted as schema", currentRef.String(), refable)) diff --git a/vendor/github.com/go-openapi/analysis/internal/flatten/schutils/flatten_schema.go b/vendor/github.com/go-openapi/analysis/internal/flatten/schutils/flatten_schema.go index 7e9fb9f0a5f..59855ef0727 100644 --- a/vendor/github.com/go-openapi/analysis/internal/flatten/schutils/flatten_schema.go +++ b/vendor/github.com/go-openapi/analysis/internal/flatten/schutils/flatten_schema.go @@ -12,7 +12,7 @@ import ( const allocLargeMap = 150 -// Save registers a schema as an entry in spec #/definitions +// Save registers a schema as an entry in spec #/definitions. func Save(sp *spec.Swagger, name string, schema *spec.Schema) { if schema == nil { return @@ -25,7 +25,7 @@ func Save(sp *spec.Swagger, name string, schema *spec.Schema) { sp.Definitions[name] = *schema } -// Clone deep-clones a schema +// Clone deep-clones a schema. func Clone(schema *spec.Schema) *spec.Schema { var sch spec.Schema _ = jsonutils.FromDynamicJSON(schema, &sch) diff --git a/vendor/github.com/go-openapi/analysis/internal/flatten/sortref/keys.go b/vendor/github.com/go-openapi/analysis/internal/flatten/sortref/keys.go index a5db0249ecc..7ab8e4ea573 100644 --- a/vendor/github.com/go-openapi/analysis/internal/flatten/sortref/keys.go +++ b/vendor/github.com/go-openapi/analysis/internal/flatten/sortref/keys.go @@ -20,12 +20,8 @@ const ( definitions = "definitions" ) +//nolint:gochecknoglobals // it's okay to store small indexes like this as private globals var ( - ignoredKeys map[string]struct{} - validMethods map[string]struct{} -) - -func init() { ignoredKeys = map[string]struct{}{ "schema": {}, "properties": {}, @@ -43,15 +39,15 @@ func init() { "PUT": {}, "DELETE": {}, } -} +) -// Key represent a key item constructed from /-separated segments +// Key represent a key item constructed from /-separated segments. type Key struct { Segments int Key string } -// Keys is a sortable collable collection of Keys +// Keys is a sortable collable collection of Keys. type Keys []Key func (k Keys) Len() int { return len(k) } @@ -75,12 +71,12 @@ func KeyParts(key string) SplitKey { // SplitKey holds of the parts of a /-separated key, so that their location may be determined. type SplitKey []string -// IsDefinition is true when the split key is in the #/definitions section of a spec +// IsDefinition is true when the split key is in the #/definitions section of a spec. func (s SplitKey) IsDefinition() bool { return len(s) > 1 && s[0] == definitions } -// DefinitionName yields the name of the definition +// DefinitionName yields the name of the definition. func (s SplitKey) DefinitionName() string { if !s.IsDefinition() { return "" @@ -89,10 +85,10 @@ func (s SplitKey) DefinitionName() string { return s[1] } -// PartAdder know how to construct the components of a new name +// PartAdder know how to construct the components of a new name. type PartAdder func(string) []string -// BuildName builds a name from segments +// BuildName builds a name from segments. func (s SplitKey) BuildName(segments []string, startIndex int, adder PartAdder) string { for i, part := range s[startIndex:] { if _, ignored := ignoredKeys[part]; !ignored || s.isKeyName(startIndex+i) { @@ -103,42 +99,42 @@ func (s SplitKey) BuildName(segments []string, startIndex int, adder PartAdder) return strings.Join(segments, " ") } -// IsOperation is true when the split key is in the operations section +// IsOperation is true when the split key is in the operations section. func (s SplitKey) IsOperation() bool { return len(s) > 1 && s[0] == paths } -// IsSharedOperationParam is true when the split key is in the parameters section of a path +// IsSharedOperationParam is true when the split key is in the parameters section of a path. func (s SplitKey) IsSharedOperationParam() bool { return len(s) > 2 && s[0] == paths && s[2] == parameters } -// IsSharedParam is true when the split key is in the #/parameters section of a spec +// IsSharedParam is true when the split key is in the #/parameters section of a spec. func (s SplitKey) IsSharedParam() bool { return len(s) > 1 && s[0] == parameters } -// IsOperationParam is true when the split key is in the parameters section of an operation +// IsOperationParam is true when the split key is in the parameters section of an operation. func (s SplitKey) IsOperationParam() bool { return len(s) > 3 && s[0] == paths && s[3] == parameters } -// IsOperationResponse is true when the split key is in the responses section of an operation +// IsOperationResponse is true when the split key is in the responses section of an operation. func (s SplitKey) IsOperationResponse() bool { return len(s) > 3 && s[0] == paths && s[3] == responses } -// IsSharedResponse is true when the split key is in the #/responses section of a spec +// IsSharedResponse is true when the split key is in the #/responses section of a spec. func (s SplitKey) IsSharedResponse() bool { return len(s) > 1 && s[0] == responses } -// IsDefaultResponse is true when the split key is the default response for an operation +// IsDefaultResponse is true when the split key is the default response for an operation. func (s SplitKey) IsDefaultResponse() bool { return len(s) > 4 && s[0] == paths && s[3] == responses && s[4] == "default" } -// IsStatusCodeResponse is true when the split key is an operation response with a status code +// IsStatusCodeResponse is true when the split key is an operation response with a status code. func (s SplitKey) IsStatusCodeResponse() bool { isInt := func() bool { _, err := strconv.Atoi(s[4]) @@ -149,7 +145,7 @@ func (s SplitKey) IsStatusCodeResponse() bool { return len(s) > 4 && s[0] == paths && s[3] == responses && isInt() } -// ResponseName yields either the status code or "Default" for a response +// ResponseName yields either the status code or "Default" for a response. func (s SplitKey) ResponseName() string { if s.IsStatusCodeResponse() { code, _ := strconv.Atoi(s[4]) @@ -164,7 +160,7 @@ func (s SplitKey) ResponseName() string { return "" } -// PathItemRef constructs a $ref object from a split key of the form /{path}/{method} +// PathItemRef constructs a $ref object from a split key of the form /{path}/{method}. func (s SplitKey) PathItemRef() spec.Ref { const minValidPathItems = 3 if len(s) < minValidPathItems { @@ -179,7 +175,7 @@ func (s SplitKey) PathItemRef() spec.Ref { return spec.MustCreateRef("#" + path.Join("/", paths, jsonpointer.Escape(pth), strings.ToUpper(method))) } -// PathRef constructs a $ref object from a split key of the form /paths/{reference} +// PathRef constructs a $ref object from a split key of the form /paths/{reference}. func (s SplitKey) PathRef() spec.Ref { if !s.IsOperation() { return spec.Ref{} diff --git a/vendor/github.com/go-openapi/analysis/internal/flatten/sortref/sort_ref.go b/vendor/github.com/go-openapi/analysis/internal/flatten/sortref/sort_ref.go index ceac7137728..e4ad07b0960 100644 --- a/vendor/github.com/go-openapi/analysis/internal/flatten/sortref/sort_ref.go +++ b/vendor/github.com/go-openapi/analysis/internal/flatten/sortref/sort_ref.go @@ -4,7 +4,9 @@ package sortref import ( + "iter" "reflect" + "slices" "sort" "strings" @@ -12,10 +14,6 @@ import ( "github.com/go-openapi/spec" ) -var depthGroupOrder = []string{ - "sharedParam", "sharedResponse", "sharedOpParam", "opParam", "codeResponse", "defaultResponse", "definition", -} - type mapIterator struct { len int mapIter *reflect.MapIter @@ -42,7 +40,7 @@ func mustMapIterator(anyMap any) *mapIterator { // DepthFirst sorts a map of anything. It groups keys by category // (shared params, op param, statuscode response, default response, definitions) // sort groups internally by number of parts in the key and lexical names -// flatten groups into a single list of keys +// flatten groups into a single list of keys. func DepthFirst(in any) []string { iterator := mustMapIterator(in) sorted := make([]string, 0, iterator.Len()) @@ -77,7 +75,7 @@ func DepthFirst(in any) []string { grouped[pk] = append(grouped[pk], Key{Segments: len(split), Key: k}) } - for _, pk := range depthGroupOrder { + for pk := range depthGroupOrder() { res := grouped[pk] sort.Sort(res) @@ -89,6 +87,12 @@ func DepthFirst(in any) []string { return sorted } +func depthGroupOrder() iter.Seq[string] { + return slices.Values([]string{ + "sharedParam", "sharedResponse", "sharedOpParam", "opParam", "codeResponse", "defaultResponse", "definition", + }) +} + // topMostRefs is able to sort refs by hierarchical then lexicographic order, // yielding refs ordered breadth-first. type topmostRefs []string @@ -104,7 +108,7 @@ func (k topmostRefs) Less(i, j int) bool { return li < lj } -// TopmostFirst sorts references by depth +// TopmostFirst sorts references by depth. func TopmostFirst(refs []string) []string { res := topmostRefs(refs) sort.Sort(res) @@ -112,13 +116,13 @@ func TopmostFirst(refs []string) []string { return res } -// RefRevIdx is a reverse index for references +// RefRevIdx is a reverse index for references. type RefRevIdx struct { Ref spec.Ref Keys []string } -// ReverseIndex builds a reverse index for references in schemas +// ReverseIndex builds a reverse index for references in schemas. func ReverseIndex(schemas map[string]spec.Ref, basePath string) map[string]RefRevIdx { collected := make(map[string]RefRevIdx) for key, schRef := range schemas { diff --git a/vendor/github.com/go-openapi/analysis/schema.go b/vendor/github.com/go-openapi/analysis/schema.go index 039dac15661..bedea652acf 100644 --- a/vendor/github.com/go-openapi/analysis/schema.go +++ b/vendor/github.com/go-openapi/analysis/schema.go @@ -8,7 +8,7 @@ import ( "github.com/go-openapi/strfmt" ) -// SchemaOpts configures the schema analyzer +// SchemaOpts configures the schema analyzer. type SchemaOpts struct { Schema *spec.Schema Root any @@ -52,7 +52,7 @@ func Schema(opts SchemaOpts) (*AnalyzedSchema, error) { return a, nil } -// AnalyzedSchema indicates what the schema represents +// AnalyzedSchema indicates what the schema represents. type AnalyzedSchema struct { schema *spec.Schema root any @@ -78,7 +78,7 @@ type AnalyzedSchema struct { IsEnum bool } -// Inherits copies value fields from other onto this schema +// Inherits copies value fields from other onto this schema. func (a *AnalyzedSchema) inherits(other *AnalyzedSchema) { if other == nil { return diff --git a/vendor/github.com/go-openapi/errors/.cliff.toml b/vendor/github.com/go-openapi/errors/.cliff.toml new file mode 100644 index 00000000000..702629f5dc3 --- /dev/null +++ b/vendor/github.com/go-openapi/errors/.cliff.toml @@ -0,0 +1,181 @@ +# git-cliff ~ configuration file +# https://git-cliff.org/docs/configuration + +[changelog] +header = """ +""" + +footer = """ + +----- + +**[{{ remote.github.repo }}]({{ self::remote_url() }}) license terms** + +[![License][license-badge]][license-url] + +[license-badge]: http://img.shields.io/badge/license-Apache%20v2-orange.svg +[license-url]: {{ self::remote_url() }}/?tab=Apache-2.0-1-ov-file#readme + +{%- macro remote_url() -%} + https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }} +{%- endmacro -%} +""" + +body = """ +{%- if version %} +## [{{ version | trim_start_matches(pat="v") }}]({{ self::remote_url() }}/tree/{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }} +{%- else %} +## [unreleased] +{%- endif %} +{%- if message %} + {%- raw %}\n{% endraw %} +{{ message }} + {%- raw %}\n{% endraw %} +{%- endif %} +{%- if version %} + {%- if previous.version %} + +**Full Changelog**: <{{ self::remote_url() }}/compare/{{ previous.version }}...{{ version }}> + {%- endif %} +{%- else %} + {%- raw %}\n{% endraw %} +{%- endif %} + +{%- if statistics %}{% if statistics.commit_count %} + {%- raw %}\n{% endraw %} +{{ statistics.commit_count }} commits in this release. + {%- raw %}\n{% endraw %} +{%- endif %}{% endif %} +----- + +{%- for group, commits in commits | group_by(attribute="group") %} + {%- raw %}\n{% endraw %} +### {{ group | upper_first }} + {%- raw %}\n{% endraw %} + {%- for commit in commits %} + {%- if commit.remote.pr_title %} + {%- set commit_message = commit.remote.pr_title %} + {%- else %} + {%- set commit_message = commit.message %} + {%- endif %} +* {{ commit_message | split(pat="\n") | first | trim }} + {%- if commit.remote.username %} +{%- raw %} {% endraw %}by [@{{ commit.remote.username }}](https://github.com/{{ commit.remote.username }}) + {%- endif %} + {%- if commit.remote.pr_number %} +{%- raw %} {% endraw %}in [#{{ commit.remote.pr_number }}]({{ self::remote_url() }}/pull/{{ commit.remote.pr_number }}) + {%- endif %} +{%- raw %} {% endraw %}[...]({{ self::remote_url() }}/commit/{{ commit.id }}) + {%- endfor %} +{%- endfor %} + +{%- if github %} +{%- raw %}\n{% endraw -%} + {%- set all_contributors = github.contributors | length %} + {%- if github.contributors | filter(attribute="username", value="dependabot[bot]") | length < all_contributors %} +----- + +### People who contributed to this release + {% endif %} + {%- for contributor in github.contributors | filter(attribute="username") | sort(attribute="username") %} + {%- if contributor.username != "dependabot[bot]" and contributor.username != "github-actions[bot]" %} +* [@{{ contributor.username }}](https://github.com/{{ contributor.username }}) + {%- endif %} + {%- endfor %} + + {% if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} +----- + {%- raw %}\n{% endraw %} + +### New Contributors + {%- endif %} + + {%- for contributor in github.contributors | filter(attribute="is_first_time", value=true) %} + {%- if contributor.username != "dependabot[bot]" and contributor.username != "github-actions[bot]" %} +* @{{ contributor.username }} made their first contribution + {%- if contributor.pr_number %} + in [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \ + {%- endif %} + {%- endif %} + {%- endfor %} +{%- endif %} + +{%- raw %}\n{% endraw %} + +{%- macro remote_url() -%} + https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }} +{%- endmacro -%} +""" +# Remove leading and trailing whitespaces from the changelog's body. +trim = true +# Render body even when there are no releases to process. +render_always = true +# An array of regex based postprocessors to modify the changelog. +postprocessors = [ + # Replace the placeholder with a URL. + #{ pattern = '', replace = "https://github.com/orhun/git-cliff" }, +] +# output file path +# output = "test.md" + +[git] +# Parse commits according to the conventional commits specification. +# See https://www.conventionalcommits.org +conventional_commits = false +# Exclude commits that do not match the conventional commits specification. +filter_unconventional = false +# Require all commits to be conventional. +# Takes precedence over filter_unconventional. +require_conventional = false +# Split commits on newlines, treating each line as an individual commit. +split_commits = false +# An array of regex based parsers to modify commit messages prior to further processing. +commit_preprocessors = [ + # Replace issue numbers with link templates to be updated in `changelog.postprocessors`. + #{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](/issues/${2}))"}, + # Check spelling of the commit message using https://github.com/crate-ci/typos. + # If the spelling is incorrect, it will be fixed automatically. + #{ pattern = '.*', replace_command = 'typos --write-changes -' } +] +# Prevent commits that are breaking from being excluded by commit parsers. +protect_breaking_commits = false +# An array of regex based parsers for extracting data from the commit message. +# Assigns commits to groups. +# Optionally sets the commit's scope and can decide to exclude commits from further processing. +commit_parsers = [ + { message = "^[Cc]hore\\([Rr]elease\\): prepare for", skip = true }, + { message = "(^[Mm]erge)|([Mm]erge conflict)", skip = true }, + { field = "author.name", pattern = "dependabot*", group = "Updates" }, + { message = "([Ss]ecurity)|([Vv]uln)", group = "Security" }, + { body = "(.*[Ss]ecurity)|([Vv]uln)", group = "Security" }, + { message = "([Cc]hore\\(lint\\))|(style)|(lint)|(codeql)|(golangci)", group = "Code quality" }, + { message = "(^[Dd]oc)|((?i)readme)|(badge)|(typo)|(documentation)", group = "Documentation" }, + { message = "(^[Ff]eat)|(^[Ee]nhancement)", group = "Implemented enhancements" }, + { message = "(^ci)|(\\(ci\\))|(fixup\\s+ci)|(fix\\s+ci)|(license)|(example)", group = "Miscellaneous tasks" }, + { message = "^test", group = "Testing" }, + { message = "(^fix)|(panic)", group = "Fixed bugs" }, + { message = "(^refact)|(rework)", group = "Refactor" }, + { message = "(^[Pp]erf)|(performance)", group = "Performance" }, + { message = "(^[Cc]hore)", group = "Miscellaneous tasks" }, + { message = "^[Rr]evert", group = "Reverted changes" }, + { message = "(upgrade.*?go)|(go\\s+version)", group = "Updates" }, + { message = ".*", group = "Other" }, +] +# Exclude commits that are not matched by any commit parser. +filter_commits = false +# An array of link parsers for extracting external references, and turning them into URLs, using regex. +link_parsers = [] +# Include only the tags that belong to the current branch. +use_branch_tags = false +# Order releases topologically instead of chronologically. +topo_order = false +# Order releases topologically instead of chronologically. +topo_order_commits = true +# Order of commits in each group/release within the changelog. +# Allowed values: newest, oldest +sort_commits = "newest" +# Process submodules commits +recurse_submodules = false + +#[remote.github] +#owner = "go-openapi" diff --git a/vendor/github.com/go-openapi/errors/.editorconfig b/vendor/github.com/go-openapi/errors/.editorconfig new file mode 100644 index 00000000000..3152da69a5d --- /dev/null +++ b/vendor/github.com/go-openapi/errors/.editorconfig @@ -0,0 +1,26 @@ +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true + +# Set default charset +[*.{js,py,go,scala,rb,java,html,css,less,sass,md}] +charset = utf-8 + +# Tab indentation (no size specified) +[*.go] +indent_style = tab + +[*.md] +trim_trailing_whitespace = false + +# Matches the exact files either package.json or .travis.yml +[{package.json,.travis.yml}] +indent_style = space +indent_size = 2 diff --git a/vendor/github.com/go-openapi/errors/.gitignore b/vendor/github.com/go-openapi/errors/.gitignore index dd91ed6a04e..9a8da7e5064 100644 --- a/vendor/github.com/go-openapi/errors/.gitignore +++ b/vendor/github.com/go-openapi/errors/.gitignore @@ -1,2 +1,3 @@ secrets.yml -coverage.out +*.out +settings.local.json diff --git a/vendor/github.com/go-openapi/errors/.golangci.yml b/vendor/github.com/go-openapi/errors/.golangci.yml index 5609b4fea9c..fdae591bce7 100644 --- a/vendor/github.com/go-openapi/errors/.golangci.yml +++ b/vendor/github.com/go-openapi/errors/.golangci.yml @@ -2,34 +2,17 @@ version: "2" linters: default: all disable: - - cyclop - depguard - - errchkjson - - errorlint - - exhaustruct - - forcetypeassert - funlen - - gochecknoglobals - - gochecknoinits - - gocognit - - godot - godox - - gosmopolitan - - inamedparam - #- intrange # disabled while < go1.22 - - ireturn - - lll - - musttag - - nestif + - exhaustruct - nlreturn - - noinlineerr - nonamedreturns + - noinlineerr - paralleltest - recvcheck - testpackage - - thelper - tparallel - - unparam - varnamelen - whitespace - wrapcheck @@ -41,8 +24,15 @@ linters: goconst: min-len: 2 min-occurrences: 3 + cyclop: + max-complexity: 20 gocyclo: - min-complexity: 45 + min-complexity: 20 + exhaustive: + default-signifies-exhaustive: true + default-case-required: true + lll: + line-length: 180 exclusions: generated: lax presets: @@ -58,6 +48,7 @@ formatters: enable: - gofmt - goimports + - gofumpt exclusions: generated: lax paths: diff --git a/vendor/github.com/go-openapi/errors/CONTRIBUTORS.md b/vendor/github.com/go-openapi/errors/CONTRIBUTORS.md new file mode 100644 index 00000000000..eb018f8aaff --- /dev/null +++ b/vendor/github.com/go-openapi/errors/CONTRIBUTORS.md @@ -0,0 +1,24 @@ +# Contributors + +- Repository: ['go-openapi/errors'] + +| Total Contributors | Total Contributions | +| --- | --- | +| 12 | 105 | + +| Username | All Time Contribution Count | All Commits | +| --- | --- | --- | +| @casualjim | 58 | https://github.com/go-openapi/errors/commits?author=casualjim | +| @fredbi | 32 | https://github.com/go-openapi/errors/commits?author=fredbi | +| @youyuanwu | 5 | https://github.com/go-openapi/errors/commits?author=youyuanwu | +| @alexandear | 2 | https://github.com/go-openapi/errors/commits?author=alexandear | +| @fiorix | 1 | https://github.com/go-openapi/errors/commits?author=fiorix | +| @ligustah | 1 | https://github.com/go-openapi/errors/commits?author=ligustah | +| @artemseleznev | 1 | https://github.com/go-openapi/errors/commits?author=artemseleznev | +| @gautierdelorme | 1 | https://github.com/go-openapi/errors/commits?author=gautierdelorme | +| @guillemj | 1 | https://github.com/go-openapi/errors/commits?author=guillemj | +| @maxatome | 1 | https://github.com/go-openapi/errors/commits?author=maxatome | +| @Simon-Li | 1 | https://github.com/go-openapi/errors/commits?author=Simon-Li | +| @ujjwalsh | 1 | https://github.com/go-openapi/errors/commits?author=ujjwalsh | + + _this file was generated by the [Contributors GitHub Action](https://github.com/github/contributors)_ diff --git a/vendor/github.com/go-openapi/errors/README.md b/vendor/github.com/go-openapi/errors/README.md index d7e3a18bcf5..6102c6b5277 100644 --- a/vendor/github.com/go-openapi/errors/README.md +++ b/vendor/github.com/go-openapi/errors/README.md @@ -1,12 +1,123 @@ -# OpenAPI errors [![Build Status](https://github.com/go-openapi/errors/actions/workflows/go-test.yml/badge.svg)](https://github.com/go-openapi/errors/actions?query=workflow%3A"go+test") [![codecov](https://codecov.io/gh/go-openapi/errors/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/errors) +# errors -[![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io) -[![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/errors/master/LICENSE) -[![Go Reference](https://pkg.go.dev/badge/github.com/go-openapi/errors.svg)](https://pkg.go.dev/github.com/go-openapi/errors) -[![Go Report Card](https://goreportcard.com/badge/github.com/go-openapi/errors)](https://goreportcard.com/report/github.com/go-openapi/errors) + +[![Tests][test-badge]][test-url] [![Coverage][cov-badge]][cov-url] [![CI vuln scan][vuln-scan-badge]][vuln-scan-url] [![CodeQL][codeql-badge]][codeql-url] + + + +[![Release][release-badge]][release-url] [![Go Report Card][gocard-badge]][gocard-url] [![CodeFactor Grade][codefactor-badge]][codefactor-url] [![License][license-badge]][license-url] + + +[![GoDoc][godoc-badge]][godoc-url] [![Discord Channel][discord-badge]][discord-url] [![go version][goversion-badge]][goversion-url] ![Top language][top-badge] ![Commits since latest release][commits-badge] + +--- Shared errors and error interface used throughout the various libraries found in the go-openapi toolkit. +## Announcements + +* **2025-12-19** : new community chat on discord + * a new discord community channel is available to be notified of changes and support users + * our venerable Slack channel remains open, and will be eventually discontinued on **2026-03-31** + +You may join the discord community by clicking the invite link on the discord badge (also above). [![Discord Channel][discord-badge]][discord-url] + +Or join our Slack channel: [![Slack Channel][slack-logo]![slack-badge]][slack-url] + +## Status + +API is stable. + +## Import this library in your project + +```cmd +go get github.com/go-openapi/errors +``` + +## Basic usage + +```go +const url = "https://www.example.com/#" + +errGeneric := New(401,"onvalid argument: %s", url) + +errNotFound := NotFound("resource not found: %s", url) + +errNotImplemented := NotImplemented("method: %s", url) +``` + +## Change log + +See + + + ## Licensing This library ships under the [SPDX-License-Identifier: Apache-2.0](./LICENSE). + + + + + +## Other documentation + +* [All-time contributors](./CONTRIBUTORS.md) +* [Contributing guidelines](.github/CONTRIBUTING.md) +* [Maintainers documentation](docs/MAINTAINERS.md) +* [Code style](docs/STYLE.md) + +## Cutting a new release + +Maintainers can cut a new release by either: + +* running [this workflow](https://github.com/go-openapi/errors/actions/workflows/bump-release.yml) +* or pushing a semver tag + * signed tags are preferred + * The tag message is prepended to release notes + + +[test-badge]: https://github.com/go-openapi/errors/actions/workflows/go-test.yml/badge.svg +[test-url]: https://github.com/go-openapi/errors/actions/workflows/go-test.yml +[cov-badge]: https://codecov.io/gh/go-openapi/errors/branch/master/graph/badge.svg +[cov-url]: https://codecov.io/gh/go-openapi/errors +[vuln-scan-badge]: https://github.com/go-openapi/errors/actions/workflows/scanner.yml/badge.svg +[vuln-scan-url]: https://github.com/go-openapi/errors/actions/workflows/scanner.yml +[codeql-badge]: https://github.com/go-openapi/errors/actions/workflows/codeql.yml/badge.svg +[codeql-url]: https://github.com/go-openapi/errors/actions/workflows/codeql.yml + +[release-badge]: https://badge.fury.io/gh/go-openapi%2Ferrors.svg +[release-url]: https://badge.fury.io/gh/go-openapi%2Ferrors +[gomod-badge]: https://badge.fury.io/go/github.com%2Fgo-openapi%2Ferrors.svg +[gomod-url]: https://badge.fury.io/go/github.com%2Fgo-openapi%2Ferrors + +[gocard-badge]: https://goreportcard.com/badge/github.com/go-openapi/errors +[gocard-url]: https://goreportcard.com/report/github.com/go-openapi/errors +[codefactor-badge]: https://img.shields.io/codefactor/grade/github/go-openapi/errors +[codefactor-url]: https://www.codefactor.io/repository/github/go-openapi/errors + +[doc-badge]: https://img.shields.io/badge/doc-site-blue?link=https%3A%2F%2Fgoswagger.io%2Fgo-openapi%2F +[doc-url]: https://goswagger.io/go-openapi +[godoc-badge]: https://pkg.go.dev/badge/github.com/go-openapi/errors +[godoc-url]: http://pkg.go.dev/github.com/go-openapi/errors +[slack-logo]: https://a.slack-edge.com/e6a93c1/img/icons/favicon-32.png +[slack-badge]: https://img.shields.io/badge/slack-blue?link=https%3A%2F%2Fgoswagger.slack.com%2Farchives%2FC04R30YM +[slack-url]: https://goswagger.slack.com/archives/C04R30YMU +[discord-badge]: https://img.shields.io/discord/1446918742398341256?logo=discord&label=discord&color=blue +[discord-url]: https://discord.gg/DrafRmZx + + +[license-badge]: http://img.shields.io/badge/license-Apache%20v2-orange.svg +[license-url]: https://github.com/go-openapi/errors/?tab=Apache-2.0-1-ov-file#readme + +[goversion-badge]: https://img.shields.io/github/go-mod/go-version/go-openapi/errors +[goversion-url]: https://github.com/go-openapi/errors/blob/master/go.mod +[top-badge]: https://img.shields.io/github/languages/top/go-openapi/errors +[commits-badge]: https://img.shields.io/github/commits-since/go-openapi/errors/latest diff --git a/vendor/github.com/go-openapi/errors/SECURITY.md b/vendor/github.com/go-openapi/errors/SECURITY.md new file mode 100644 index 00000000000..2a7b6f0910d --- /dev/null +++ b/vendor/github.com/go-openapi/errors/SECURITY.md @@ -0,0 +1,19 @@ +# Security Policy + +This policy outlines the commitment and practices of the go-openapi maintainers regarding security. + +## Supported Versions + +| Version | Supported | +| ------- | ------------------ | +| 0.22.x | :white_check_mark: | + +## Reporting a vulnerability + +If you become aware of a security vulnerability that affects the current repository, +please report it privately to the maintainers. + +Please follow the instructions provided by github to +[Privately report a security vulnerability](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing-information-about-vulnerabilities/privately-reporting-a-security-vulnerability#privately-reporting-a-security-vulnerability). + +TL;DR: on Github, navigate to the project's "Security" tab then click on "Report a vulnerability". diff --git a/vendor/github.com/go-openapi/errors/api.go b/vendor/github.com/go-openapi/errors/api.go index d39233bafe4..cb139416af8 100644 --- a/vendor/github.com/go-openapi/errors/api.go +++ b/vendor/github.com/go-openapi/errors/api.go @@ -5,6 +5,7 @@ package errors import ( "encoding/json" + "errors" "fmt" "net/http" "reflect" @@ -12,9 +13,11 @@ import ( ) // DefaultHTTPCode is used when the error Code cannot be used as an HTTP code. +// +//nolint:gochecknoglobals // it should have been a constant in the first place, but now it is mutable so we have to leave it here or introduce a breaking change. var DefaultHTTPCode = http.StatusUnprocessableEntity -// Error represents a error interface all swagger framework errors implement +// Error represents a error interface all swagger framework errors implement. type Error interface { error Code() int32 @@ -25,15 +28,17 @@ type apiError struct { message string } +// Error implements the standard error interface. func (a *apiError) Error() string { return a.message } +// Code returns the HTTP status code associated with this error. func (a *apiError) Code() int32 { return a.code } -// MarshalJSON implements the JSON encoding interface +// MarshalJSON implements the JSON encoding interface. func (a apiError) MarshalJSON() ([]byte, error) { return json.Marshal(map[string]any{ "code": a.code, @@ -41,7 +46,7 @@ func (a apiError) MarshalJSON() ([]byte, error) { }) } -// New creates a new API error with a code and a message +// New creates a new API error with a code and a message. func New(code int32, message string, args ...any) Error { if len(args) > 0 { return &apiError{ @@ -55,7 +60,7 @@ func New(code int32, message string, args ...any) Error { } } -// NotFound creates a new not found error +// NotFound creates a new not found error. func NotFound(message string, args ...any) Error { if message == "" { message = "Not found" @@ -63,28 +68,29 @@ func NotFound(message string, args ...any) Error { return New(http.StatusNotFound, message, args...) } -// NotImplemented creates a new not implemented error +// NotImplemented creates a new not implemented error. func NotImplemented(message string) Error { return New(http.StatusNotImplemented, "%s", message) } -// MethodNotAllowedError represents an error for when the path matches but the method doesn't +// MethodNotAllowedError represents an error for when the path matches but the method doesn't. type MethodNotAllowedError struct { code int32 Allowed []string message string } +// Error implements the standard error interface. func (m *MethodNotAllowedError) Error() string { return m.message } -// Code the error code +// Code returns 405 (Method Not Allowed) as the HTTP status code. func (m *MethodNotAllowedError) Code() int32 { return m.code } -// MarshalJSON implements the JSON encoding interface +// MarshalJSON implements the JSON encoding interface. func (m MethodNotAllowedError) MarshalJSON() ([]byte, error) { return json.Marshal(map[string]any{ "code": m.code, @@ -104,25 +110,33 @@ func errorAsJSON(err Error) []byte { func flattenComposite(errs *CompositeError) *CompositeError { var res []error - for _, er := range errs.Errors { - switch e := er.(type) { - case *CompositeError: - if e != nil && len(e.Errors) > 0 { - flat := flattenComposite(e) - if len(flat.Errors) > 0 { - res = append(res, flat.Errors...) - } - } - default: - if e != nil { - res = append(res, e) - } + + for _, err := range errs.Errors { + if err == nil { + continue + } + + e := &CompositeError{} + if !errors.As(err, &e) { + res = append(res, err) + + continue + } + + if len(e.Errors) == 0 { + res = append(res, e) + + continue } + + flat := flattenComposite(e) + res = append(res, flat.Errors...) } + return CompositeValidationError(res...) } -// MethodNotAllowed creates a new method not allowed error +// MethodNotAllowed creates a new method not allowed error. func MethodNotAllowed(requested string, allow []string) Error { msg := fmt.Sprintf("method %s is not allowed, but [%s] are", requested, strings.Join(allow, ",")) return &MethodNotAllowedError{ @@ -132,39 +146,55 @@ func MethodNotAllowed(requested string, allow []string) Error { } } -// ServeError implements the http error handler interface +// ServeError implements the http error handler interface. func ServeError(rw http.ResponseWriter, r *http.Request, err error) { rw.Header().Set("Content-Type", "application/json") - switch e := err.(type) { - case *CompositeError: - er := flattenComposite(e) + + if err == nil { + rw.WriteHeader(http.StatusInternalServerError) + _, _ = rw.Write(errorAsJSON(New(http.StatusInternalServerError, "Unknown error"))) + + return + } + + errComposite := &CompositeError{} + errMethodNotAllowed := &MethodNotAllowedError{} + var errError Error + + switch { + case errors.As(err, &errComposite): + er := flattenComposite(errComposite) // strips composite errors to first element only if len(er.Errors) > 0 { ServeError(rw, r, er.Errors[0]) - } else { - // guard against empty CompositeError (invalid construct) - ServeError(rw, r, nil) + + return } - case *MethodNotAllowedError: - rw.Header().Add("Allow", strings.Join(e.Allowed, ",")) - rw.WriteHeader(asHTTPCode(int(e.Code()))) + + // guard against empty CompositeError (invalid construct) + ServeError(rw, r, nil) + + case errors.As(err, &errMethodNotAllowed): + rw.Header().Add("Allow", strings.Join(errMethodNotAllowed.Allowed, ",")) + rw.WriteHeader(asHTTPCode(int(errMethodNotAllowed.Code()))) if r == nil || r.Method != http.MethodHead { - _, _ = rw.Write(errorAsJSON(e)) + _, _ = rw.Write(errorAsJSON(errMethodNotAllowed)) } - case Error: - value := reflect.ValueOf(e) + + case errors.As(err, &errError): + value := reflect.ValueOf(errError) if value.Kind() == reflect.Ptr && value.IsNil() { rw.WriteHeader(http.StatusInternalServerError) _, _ = rw.Write(errorAsJSON(New(http.StatusInternalServerError, "Unknown error"))) + return } - rw.WriteHeader(asHTTPCode(int(e.Code()))) + + rw.WriteHeader(asHTTPCode(int(errError.Code()))) if r == nil || r.Method != http.MethodHead { - _, _ = rw.Write(errorAsJSON(e)) + _, _ = rw.Write(errorAsJSON(errError)) } - case nil: - rw.WriteHeader(http.StatusInternalServerError) - _, _ = rw.Write(errorAsJSON(New(http.StatusInternalServerError, "Unknown error"))) + default: rw.WriteHeader(http.StatusInternalServerError) if r == nil || r.Method != http.MethodHead { diff --git a/vendor/github.com/go-openapi/errors/auth.go b/vendor/github.com/go-openapi/errors/auth.go index 08de582e5db..1173b5642cc 100644 --- a/vendor/github.com/go-openapi/errors/auth.go +++ b/vendor/github.com/go-openapi/errors/auth.go @@ -5,7 +5,7 @@ package errors import "net/http" -// Unauthenticated returns an unauthenticated error +// Unauthenticated returns an unauthenticated error. func Unauthenticated(scheme string) Error { return New(http.StatusUnauthorized, "unauthenticated for %s", scheme) } diff --git a/vendor/github.com/go-openapi/errors/headers.go b/vendor/github.com/go-openapi/errors/headers.go index 2d837c34ac4..717a51ac434 100644 --- a/vendor/github.com/go-openapi/errors/headers.go +++ b/vendor/github.com/go-openapi/errors/headers.go @@ -9,8 +9,8 @@ import ( "net/http" ) -// Validation represents a failure of a precondition -type Validation struct { //nolint: errname +// Validation represents a failure of a precondition. +type Validation struct { //nolint: errname // changing the name to abide by the naming rule would bring a breaking change. code int32 Name string In string @@ -19,16 +19,18 @@ type Validation struct { //nolint: errname Values []any } +// Error implements the standard error interface. func (e *Validation) Error() string { return e.message } -// Code the error code +// Code returns the HTTP status code for this validation error. +// Returns 422 (Unprocessable Entity) by default. func (e *Validation) Code() int32 { return e.code } -// MarshalJSON implements the JSON encoding interface +// MarshalJSON implements the JSON encoding interface. func (e Validation) MarshalJSON() ([]byte, error) { return json.Marshal(map[string]any{ "code": e.code, @@ -40,7 +42,7 @@ func (e Validation) MarshalJSON() ([]byte, error) { }) } -// ValidateName sets the name for a validation or updates it for a nested property +// ValidateName sets the name for a validation or updates it for a nested property. func (e *Validation) ValidateName(name string) *Validation { if name != "" { if e.Name == "" { @@ -59,7 +61,7 @@ const ( responseFormatFail = `unsupported media type requested, only %v are available` ) -// InvalidContentType error for an invalid content type +// InvalidContentType error for an invalid content type. func InvalidContentType(value string, allowed []string) *Validation { values := make([]any, 0, len(allowed)) for _, v := range allowed { @@ -75,7 +77,7 @@ func InvalidContentType(value string, allowed []string) *Validation { } } -// InvalidResponseFormat error for an unacceptable response format request +// InvalidResponseFormat error for an unacceptable response format request. func InvalidResponseFormat(value string, allowed []string) *Validation { values := make([]any, 0, len(allowed)) for _, v := range allowed { diff --git a/vendor/github.com/go-openapi/errors/middleware.go b/vendor/github.com/go-openapi/errors/middleware.go index c434e59a6fa..f89275f9c1d 100644 --- a/vendor/github.com/go-openapi/errors/middleware.go +++ b/vendor/github.com/go-openapi/errors/middleware.go @@ -10,13 +10,14 @@ import ( ) // APIVerificationFailed is an error that contains all the missing info for a mismatched section -// between the api registrations and the api spec +// between the api registrations and the api spec. type APIVerificationFailed struct { //nolint: errname Section string `json:"section,omitempty"` MissingSpecification []string `json:"missingSpecification,omitempty"` MissingRegistration []string `json:"missingRegistration,omitempty"` } +// Error implements the standard error interface. func (v *APIVerificationFailed) Error() string { buf := bytes.NewBuffer(nil) diff --git a/vendor/github.com/go-openapi/errors/parsing.go b/vendor/github.com/go-openapi/errors/parsing.go index ea2a7c60377..46e6612cdfa 100644 --- a/vendor/github.com/go-openapi/errors/parsing.go +++ b/vendor/github.com/go-openapi/errors/parsing.go @@ -9,7 +9,7 @@ import ( "net/http" ) -// ParseError represents a parsing error +// ParseError represents a parsing error. type ParseError struct { code int32 Name string @@ -19,7 +19,7 @@ type ParseError struct { message string } -// NewParseError creates a new parse error +// NewParseError creates a new parse error. func NewParseError(name, in, value string, reason error) *ParseError { var msg string if in == "" { @@ -37,16 +37,17 @@ func NewParseError(name, in, value string, reason error) *ParseError { } } +// Error implements the standard error interface. func (e *ParseError) Error() string { return e.message } -// Code returns the http status code for this error +// Code returns 400 (Bad Request) as the HTTP status code for parsing errors. func (e *ParseError) Code() int32 { return e.code } -// MarshalJSON implements the JSON encoding interface +// MarshalJSON implements the JSON encoding interface. func (e ParseError) MarshalJSON() ([]byte, error) { var reason string if e.Reason != nil { diff --git a/vendor/github.com/go-openapi/errors/schema.go b/vendor/github.com/go-openapi/errors/schema.go index e59ca4f863f..2378bae67f3 100644 --- a/vendor/github.com/go-openapi/errors/schema.go +++ b/vendor/github.com/go-openapi/errors/schema.go @@ -5,6 +5,7 @@ package errors import ( "encoding/json" + "errors" "fmt" "net/http" "strings" @@ -62,14 +63,15 @@ const ( const maximumValidHTTPCode = 600 // All code responses can be used to differentiate errors for different handling -// by the consuming program +// by the consuming program. const ( // CompositeErrorCode remains 422 for backwards-compatibility - // and to separate it from validation errors with cause + // and to separate it from validation errors with cause. CompositeErrorCode = http.StatusUnprocessableEntity - // InvalidTypeCode is used for any subclass of invalid types + // InvalidTypeCode is used for any subclass of invalid types. InvalidTypeCode = maximumValidHTTPCode + iota + // RequiredFailCode indicates a required field is missing. RequiredFailCode TooLongFailCode TooShortFailCode @@ -90,22 +92,26 @@ const ( ReadOnlyFailCode ) -// CompositeError is an error that groups several errors together +// CompositeError is an error that groups several errors together. type CompositeError struct { Errors []error code int32 message string } -// Code for this error +// Code returns the HTTP status code for this composite error. func (c *CompositeError) Code() int32 { return c.code } +// Error implements the standard error interface. func (c *CompositeError) Error() string { if len(c.Errors) > 0 { msgs := []string{c.message + ":"} for _, e := range c.Errors { + if e == nil { + continue + } msgs = append(msgs, e.Error()) } return strings.Join(msgs, "\n") @@ -113,11 +119,12 @@ func (c *CompositeError) Error() string { return c.message } +// Unwrap implements the [errors.Unwrap] interface. func (c *CompositeError) Unwrap() []error { return c.Errors } -// MarshalJSON implements the JSON encoding interface +// MarshalJSON implements the JSON encoding interface. func (c CompositeError) MarshalJSON() ([]byte, error) { return json.Marshal(map[string]any{ "code": c.code, @@ -126,7 +133,7 @@ func (c CompositeError) MarshalJSON() ([]byte, error) { }) } -// CompositeValidationError an error to wrap a bunch of other errors +// CompositeValidationError an error to wrap a bunch of other errors. func CompositeValidationError(errors ...error) *CompositeError { return &CompositeError{ code: CompositeErrorCode, @@ -135,20 +142,33 @@ func CompositeValidationError(errors ...error) *CompositeError { } } -// ValidateName recursively sets the name for all validations or updates them for nested properties +// ValidateName recursively sets the name for all validations or updates them for nested properties. func (c *CompositeError) ValidateName(name string) *CompositeError { for i, e := range c.Errors { - if ve, ok := e.(*Validation); ok { - c.Errors[i] = ve.ValidateName(name) - } else if ce, ok := e.(*CompositeError); ok { + if e == nil { + continue + } + + ce := &CompositeError{} + if errors.As(e, &ce) { c.Errors[i] = ce.ValidateName(name) + + continue + } + + ve := &Validation{} + if errors.As(e, &ve) { + c.Errors[i] = ve.ValidateName(name) + + continue } + } return c } -// FailedAllPatternProperties an error for when the property doesn't match a pattern +// FailedAllPatternProperties an error for when the property doesn't match a pattern. func FailedAllPatternProperties(name, in, key string) *Validation { msg := fmt.Sprintf(failedAllPatternProps, name, key, in) if in == "" { @@ -163,7 +183,7 @@ func FailedAllPatternProperties(name, in, key string) *Validation { } } -// PropertyNotAllowed an error for when the property doesn't match a pattern +// PropertyNotAllowed an error for when the property doesn't match a pattern. func PropertyNotAllowed(name, in, key string) *Validation { msg := fmt.Sprintf(unallowedProperty, name, key, in) if in == "" { @@ -178,7 +198,7 @@ func PropertyNotAllowed(name, in, key string) *Validation { } } -// TooFewProperties an error for an object with too few properties +// TooFewProperties an error for an object with too few properties. func TooFewProperties(name, in string, n int64) *Validation { msg := fmt.Sprintf(tooFewProperties, name, in, n) if in == "" { @@ -193,7 +213,7 @@ func TooFewProperties(name, in string, n int64) *Validation { } } -// TooManyProperties an error for an object with too many properties +// TooManyProperties an error for an object with too many properties. func TooManyProperties(name, in string, n int64) *Validation { msg := fmt.Sprintf(tooManyProperties, name, in, n) if in == "" { @@ -208,7 +228,7 @@ func TooManyProperties(name, in string, n int64) *Validation { } } -// AdditionalItemsNotAllowed an error for invalid additional items +// AdditionalItemsNotAllowed an error for invalid additional items. func AdditionalItemsNotAllowed(name, in string) *Validation { msg := fmt.Sprintf(noAdditionalItems, name, in) if in == "" { @@ -222,7 +242,7 @@ func AdditionalItemsNotAllowed(name, in string) *Validation { } } -// InvalidCollectionFormat another flavor of invalid type error +// InvalidCollectionFormat another flavor of invalid type error. func InvalidCollectionFormat(name, in, format string) *Validation { return &Validation{ code: InvalidTypeCode, @@ -233,7 +253,7 @@ func InvalidCollectionFormat(name, in, format string) *Validation { } } -// InvalidTypeName an error for when the type is invalid +// InvalidTypeName an error for when the type is invalid. func InvalidTypeName(typeName string) *Validation { return &Validation{ code: InvalidTypeCode, @@ -242,7 +262,7 @@ func InvalidTypeName(typeName string) *Validation { } } -// InvalidType creates an error for when the type is invalid +// InvalidType creates an error for when the type is invalid. func InvalidType(name, in, typeName string, value any) *Validation { var message string @@ -273,10 +293,9 @@ func InvalidType(name, in, typeName string, value any) *Validation { Value: value, message: message, } - } -// DuplicateItems error for when an array contains duplicates +// DuplicateItems error for when an array contains duplicates. func DuplicateItems(name, in string) *Validation { msg := fmt.Sprintf(uniqueFail, name, in) if in == "" { @@ -290,7 +309,7 @@ func DuplicateItems(name, in string) *Validation { } } -// TooManyItems error for when an array contains too many items +// TooManyItems error for when an array contains too many items. func TooManyItems(name, in string, maximum int64, value any) *Validation { msg := fmt.Sprintf(maximumItemsFail, name, in, maximum) if in == "" { @@ -306,7 +325,7 @@ func TooManyItems(name, in string, maximum int64, value any) *Validation { } } -// TooFewItems error for when an array contains too few items +// TooFewItems error for when an array contains too few items. func TooFewItems(name, in string, minimum int64, value any) *Validation { msg := fmt.Sprintf(minItemsFail, name, in, minimum) if in == "" { @@ -321,7 +340,7 @@ func TooFewItems(name, in string, minimum int64, value any) *Validation { } } -// ExceedsMaximumInt error for when maximumimum validation fails +// ExceedsMaximumInt error for when maximum validation fails. func ExceedsMaximumInt(name, in string, maximum int64, exclusive bool, value any) *Validation { var message string if in == "" { @@ -346,7 +365,7 @@ func ExceedsMaximumInt(name, in string, maximum int64, exclusive bool, value any } } -// ExceedsMaximumUint error for when maximumimum validation fails +// ExceedsMaximumUint error for when maximum validation fails. func ExceedsMaximumUint(name, in string, maximum uint64, exclusive bool, value any) *Validation { var message string if in == "" { @@ -371,7 +390,7 @@ func ExceedsMaximumUint(name, in string, maximum uint64, exclusive bool, value a } } -// ExceedsMaximum error for when maximumimum validation fails +// ExceedsMaximum error for when maximum validation fails. func ExceedsMaximum(name, in string, maximum float64, exclusive bool, value any) *Validation { var message string if in == "" { @@ -396,7 +415,7 @@ func ExceedsMaximum(name, in string, maximum float64, exclusive bool, value any) } } -// ExceedsMinimumInt error for when minimum validation fails +// ExceedsMinimumInt error for when minimum validation fails. func ExceedsMinimumInt(name, in string, minimum int64, exclusive bool, value any) *Validation { var message string if in == "" { @@ -421,7 +440,7 @@ func ExceedsMinimumInt(name, in string, minimum int64, exclusive bool, value any } } -// ExceedsMinimumUint error for when minimum validation fails +// ExceedsMinimumUint error for when minimum validation fails. func ExceedsMinimumUint(name, in string, minimum uint64, exclusive bool, value any) *Validation { var message string if in == "" { @@ -446,7 +465,7 @@ func ExceedsMinimumUint(name, in string, minimum uint64, exclusive bool, value a } } -// ExceedsMinimum error for when minimum validation fails +// ExceedsMinimum error for when minimum validation fails. func ExceedsMinimum(name, in string, minimum float64, exclusive bool, value any) *Validation { var message string if in == "" { @@ -471,7 +490,7 @@ func ExceedsMinimum(name, in string, minimum float64, exclusive bool, value any) } } -// NotMultipleOf error for when multiple of validation fails +// NotMultipleOf error for when multiple of validation fails. func NotMultipleOf(name, in string, multiple, value any) *Validation { var msg string if in == "" { @@ -488,7 +507,7 @@ func NotMultipleOf(name, in string, multiple, value any) *Validation { } } -// EnumFail error for when an enum validation fails +// EnumFail error for when an enum validation fails. func EnumFail(name, in string, value any, values []any) *Validation { var msg string if in == "" { @@ -507,7 +526,7 @@ func EnumFail(name, in string, value any, values []any) *Validation { } } -// Required error for when a value is missing +// Required error for when a value is missing. func Required(name, in string, value any) *Validation { var msg string if in == "" { @@ -524,7 +543,7 @@ func Required(name, in string, value any) *Validation { } } -// ReadOnly error for when a value is present in request +// ReadOnly error for when a value is present in request. func ReadOnly(name, in string, value any) *Validation { var msg string if in == "" { @@ -541,7 +560,7 @@ func ReadOnly(name, in string, value any) *Validation { } } -// TooLong error for when a string is too long +// TooLong error for when a string is too long. func TooLong(name, in string, maximum int64, value any) *Validation { var msg string if in == "" { @@ -558,7 +577,7 @@ func TooLong(name, in string, maximum int64, value any) *Validation { } } -// TooShort error for when a string is too short +// TooShort error for when a string is too short. func TooShort(name, in string, minimum int64, value any) *Validation { var msg string if in == "" { @@ -596,7 +615,7 @@ func FailedPattern(name, in, pattern string, value any) *Validation { } // MultipleOfMustBePositive error for when a -// multipleOf factor is negative +// multipleOf factor is negative. func MultipleOfMustBePositive(name, in string, factor any) *Validation { return &Validation{ code: MultipleOfMustBePositiveCode, diff --git a/vendor/github.com/go-openapi/jsonpointer/.cliff.toml b/vendor/github.com/go-openapi/jsonpointer/.cliff.toml new file mode 100644 index 00000000000..702629f5dc3 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonpointer/.cliff.toml @@ -0,0 +1,181 @@ +# git-cliff ~ configuration file +# https://git-cliff.org/docs/configuration + +[changelog] +header = """ +""" + +footer = """ + +----- + +**[{{ remote.github.repo }}]({{ self::remote_url() }}) license terms** + +[![License][license-badge]][license-url] + +[license-badge]: http://img.shields.io/badge/license-Apache%20v2-orange.svg +[license-url]: {{ self::remote_url() }}/?tab=Apache-2.0-1-ov-file#readme + +{%- macro remote_url() -%} + https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }} +{%- endmacro -%} +""" + +body = """ +{%- if version %} +## [{{ version | trim_start_matches(pat="v") }}]({{ self::remote_url() }}/tree/{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }} +{%- else %} +## [unreleased] +{%- endif %} +{%- if message %} + {%- raw %}\n{% endraw %} +{{ message }} + {%- raw %}\n{% endraw %} +{%- endif %} +{%- if version %} + {%- if previous.version %} + +**Full Changelog**: <{{ self::remote_url() }}/compare/{{ previous.version }}...{{ version }}> + {%- endif %} +{%- else %} + {%- raw %}\n{% endraw %} +{%- endif %} + +{%- if statistics %}{% if statistics.commit_count %} + {%- raw %}\n{% endraw %} +{{ statistics.commit_count }} commits in this release. + {%- raw %}\n{% endraw %} +{%- endif %}{% endif %} +----- + +{%- for group, commits in commits | group_by(attribute="group") %} + {%- raw %}\n{% endraw %} +### {{ group | upper_first }} + {%- raw %}\n{% endraw %} + {%- for commit in commits %} + {%- if commit.remote.pr_title %} + {%- set commit_message = commit.remote.pr_title %} + {%- else %} + {%- set commit_message = commit.message %} + {%- endif %} +* {{ commit_message | split(pat="\n") | first | trim }} + {%- if commit.remote.username %} +{%- raw %} {% endraw %}by [@{{ commit.remote.username }}](https://github.com/{{ commit.remote.username }}) + {%- endif %} + {%- if commit.remote.pr_number %} +{%- raw %} {% endraw %}in [#{{ commit.remote.pr_number }}]({{ self::remote_url() }}/pull/{{ commit.remote.pr_number }}) + {%- endif %} +{%- raw %} {% endraw %}[...]({{ self::remote_url() }}/commit/{{ commit.id }}) + {%- endfor %} +{%- endfor %} + +{%- if github %} +{%- raw %}\n{% endraw -%} + {%- set all_contributors = github.contributors | length %} + {%- if github.contributors | filter(attribute="username", value="dependabot[bot]") | length < all_contributors %} +----- + +### People who contributed to this release + {% endif %} + {%- for contributor in github.contributors | filter(attribute="username") | sort(attribute="username") %} + {%- if contributor.username != "dependabot[bot]" and contributor.username != "github-actions[bot]" %} +* [@{{ contributor.username }}](https://github.com/{{ contributor.username }}) + {%- endif %} + {%- endfor %} + + {% if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} +----- + {%- raw %}\n{% endraw %} + +### New Contributors + {%- endif %} + + {%- for contributor in github.contributors | filter(attribute="is_first_time", value=true) %} + {%- if contributor.username != "dependabot[bot]" and contributor.username != "github-actions[bot]" %} +* @{{ contributor.username }} made their first contribution + {%- if contributor.pr_number %} + in [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \ + {%- endif %} + {%- endif %} + {%- endfor %} +{%- endif %} + +{%- raw %}\n{% endraw %} + +{%- macro remote_url() -%} + https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }} +{%- endmacro -%} +""" +# Remove leading and trailing whitespaces from the changelog's body. +trim = true +# Render body even when there are no releases to process. +render_always = true +# An array of regex based postprocessors to modify the changelog. +postprocessors = [ + # Replace the placeholder with a URL. + #{ pattern = '', replace = "https://github.com/orhun/git-cliff" }, +] +# output file path +# output = "test.md" + +[git] +# Parse commits according to the conventional commits specification. +# See https://www.conventionalcommits.org +conventional_commits = false +# Exclude commits that do not match the conventional commits specification. +filter_unconventional = false +# Require all commits to be conventional. +# Takes precedence over filter_unconventional. +require_conventional = false +# Split commits on newlines, treating each line as an individual commit. +split_commits = false +# An array of regex based parsers to modify commit messages prior to further processing. +commit_preprocessors = [ + # Replace issue numbers with link templates to be updated in `changelog.postprocessors`. + #{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](/issues/${2}))"}, + # Check spelling of the commit message using https://github.com/crate-ci/typos. + # If the spelling is incorrect, it will be fixed automatically. + #{ pattern = '.*', replace_command = 'typos --write-changes -' } +] +# Prevent commits that are breaking from being excluded by commit parsers. +protect_breaking_commits = false +# An array of regex based parsers for extracting data from the commit message. +# Assigns commits to groups. +# Optionally sets the commit's scope and can decide to exclude commits from further processing. +commit_parsers = [ + { message = "^[Cc]hore\\([Rr]elease\\): prepare for", skip = true }, + { message = "(^[Mm]erge)|([Mm]erge conflict)", skip = true }, + { field = "author.name", pattern = "dependabot*", group = "Updates" }, + { message = "([Ss]ecurity)|([Vv]uln)", group = "Security" }, + { body = "(.*[Ss]ecurity)|([Vv]uln)", group = "Security" }, + { message = "([Cc]hore\\(lint\\))|(style)|(lint)|(codeql)|(golangci)", group = "Code quality" }, + { message = "(^[Dd]oc)|((?i)readme)|(badge)|(typo)|(documentation)", group = "Documentation" }, + { message = "(^[Ff]eat)|(^[Ee]nhancement)", group = "Implemented enhancements" }, + { message = "(^ci)|(\\(ci\\))|(fixup\\s+ci)|(fix\\s+ci)|(license)|(example)", group = "Miscellaneous tasks" }, + { message = "^test", group = "Testing" }, + { message = "(^fix)|(panic)", group = "Fixed bugs" }, + { message = "(^refact)|(rework)", group = "Refactor" }, + { message = "(^[Pp]erf)|(performance)", group = "Performance" }, + { message = "(^[Cc]hore)", group = "Miscellaneous tasks" }, + { message = "^[Rr]evert", group = "Reverted changes" }, + { message = "(upgrade.*?go)|(go\\s+version)", group = "Updates" }, + { message = ".*", group = "Other" }, +] +# Exclude commits that are not matched by any commit parser. +filter_commits = false +# An array of link parsers for extracting external references, and turning them into URLs, using regex. +link_parsers = [] +# Include only the tags that belong to the current branch. +use_branch_tags = false +# Order releases topologically instead of chronologically. +topo_order = false +# Order releases topologically instead of chronologically. +topo_order_commits = true +# Order of commits in each group/release within the changelog. +# Allowed values: newest, oldest +sort_commits = "newest" +# Process submodules commits +recurse_submodules = false + +#[remote.github] +#owner = "go-openapi" diff --git a/vendor/github.com/go-openapi/jsonpointer/.gitignore b/vendor/github.com/go-openapi/jsonpointer/.gitignore index 769c244007b..59cd2948915 100644 --- a/vendor/github.com/go-openapi/jsonpointer/.gitignore +++ b/vendor/github.com/go-openapi/jsonpointer/.gitignore @@ -1 +1,4 @@ -secrets.yml +*.out +*.cov +.idea +.env diff --git a/vendor/github.com/go-openapi/jsonpointer/.golangci.yml b/vendor/github.com/go-openapi/jsonpointer/.golangci.yml index 7cea1af8b52..fdae591bce7 100644 --- a/vendor/github.com/go-openapi/jsonpointer/.golangci.yml +++ b/vendor/github.com/go-openapi/jsonpointer/.golangci.yml @@ -2,34 +2,17 @@ version: "2" linters: default: all disable: - - cyclop - depguard - - errchkjson - - errorlint - - exhaustruct - - forcetypeassert - funlen - - gochecknoglobals - - gochecknoinits - - gocognit - - godot - godox - - gosmopolitan - - inamedparam - #- intrange # disabled while < go1.22 - - ireturn - - lll - - musttag - - nestif + - exhaustruct - nlreturn - nonamedreturns - noinlineerr - paralleltest - recvcheck - testpackage - - thelper - tparallel - - unparam - varnamelen - whitespace - wrapcheck @@ -41,8 +24,15 @@ linters: goconst: min-len: 2 min-occurrences: 3 + cyclop: + max-complexity: 20 gocyclo: - min-complexity: 45 + min-complexity: 20 + exhaustive: + default-signifies-exhaustive: true + default-case-required: true + lll: + line-length: 180 exclusions: generated: lax presets: @@ -58,6 +48,7 @@ formatters: enable: - gofmt - goimports + - gofumpt exclusions: generated: lax paths: diff --git a/vendor/github.com/go-openapi/jsonpointer/CONTRIBUTORS.md b/vendor/github.com/go-openapi/jsonpointer/CONTRIBUTORS.md new file mode 100644 index 00000000000..03c098316d4 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonpointer/CONTRIBUTORS.md @@ -0,0 +1,24 @@ +# Contributors + +- Repository: ['go-openapi/jsonpointer'] + +| Total Contributors | Total Contributions | +| --- | --- | +| 12 | 95 | + +| Username | All Time Contribution Count | All Commits | +| --- | --- | --- | +| @fredbi | 48 | https://github.com/go-openapi/jsonpointer/commits?author=fredbi | +| @casualjim | 33 | https://github.com/go-openapi/jsonpointer/commits?author=casualjim | +| @magodo | 3 | https://github.com/go-openapi/jsonpointer/commits?author=magodo | +| @youyuanwu | 3 | https://github.com/go-openapi/jsonpointer/commits?author=youyuanwu | +| @gaiaz-iusipov | 1 | https://github.com/go-openapi/jsonpointer/commits?author=gaiaz-iusipov | +| @gbjk | 1 | https://github.com/go-openapi/jsonpointer/commits?author=gbjk | +| @gordallott | 1 | https://github.com/go-openapi/jsonpointer/commits?author=gordallott | +| @ianlancetaylor | 1 | https://github.com/go-openapi/jsonpointer/commits?author=ianlancetaylor | +| @mfleader | 1 | https://github.com/go-openapi/jsonpointer/commits?author=mfleader | +| @Neo2308 | 1 | https://github.com/go-openapi/jsonpointer/commits?author=Neo2308 | +| @olivierlemasle | 1 | https://github.com/go-openapi/jsonpointer/commits?author=olivierlemasle | +| @testwill | 1 | https://github.com/go-openapi/jsonpointer/commits?author=testwill | + + _this file was generated by the [Contributors GitHub Action](https://github.com/github/contributors)_ diff --git a/vendor/github.com/go-openapi/jsonpointer/LICENSE b/vendor/github.com/go-openapi/jsonpointer/LICENSE index d6456956733..261eeb9e9f8 100644 --- a/vendor/github.com/go-openapi/jsonpointer/LICENSE +++ b/vendor/github.com/go-openapi/jsonpointer/LICENSE @@ -1,4 +1,3 @@ - Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ diff --git a/vendor/github.com/go-openapi/jsonpointer/NOTICE b/vendor/github.com/go-openapi/jsonpointer/NOTICE new file mode 100644 index 00000000000..f3b51939a95 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonpointer/NOTICE @@ -0,0 +1,39 @@ +Copyright 2015-2025 go-swagger maintainers + +// SPDX-FileCopyrightText: Copyright 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + +This software library, github.com/go-openapi/jsonpointer, includes software developed +by the go-swagger and go-openapi maintainers ("go-swagger maintainers"). + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this software except in compliance with the License. + +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0. + +This software is copied from, derived from, and inspired by other original software products. +It ships with copies of other software which license terms are recalled below. + +The original software was authored on 25-02-2013 by sigu-399 (https://github.com/sigu-399, sigu.399@gmail.com). + +github.com/sigh-399/jsonpointer +=========================== + +// SPDX-FileCopyrightText: Copyright 2013 sigu-399 ( https://github.com/sigu-399 ) +// SPDX-License-Identifier: Apache-2.0 + +Copyright 2013 sigu-399 ( https://github.com/sigu-399 ) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. diff --git a/vendor/github.com/go-openapi/jsonpointer/README.md b/vendor/github.com/go-openapi/jsonpointer/README.md index 45bd31b14fc..b61b63fd9af 100644 --- a/vendor/github.com/go-openapi/jsonpointer/README.md +++ b/vendor/github.com/go-openapi/jsonpointer/README.md @@ -1,16 +1,78 @@ -# gojsonpointer [![Build Status](https://github.com/go-openapi/jsonpointer/actions/workflows/go-test.yml/badge.svg)](https://github.com/go-openapi/jsonpointer/actions?query=workflow%3A"go+test") [![codecov](https://codecov.io/gh/go-openapi/jsonpointer/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/jsonpointer) +# jsonpointer -[![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io) -[![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/jsonpointer/master/LICENSE) -[![Go Reference](https://pkg.go.dev/badge/github.com/go-openapi/jsonpointer.svg)](https://pkg.go.dev/github.com/go-openapi/jsonpointer) -[![Go Report Card](https://goreportcard.com/badge/github.com/go-openapi/jsonpointer)](https://goreportcard.com/report/github.com/go-openapi/jsonpointer) + +[![Tests][test-badge]][test-url] [![Coverage][cov-badge]][cov-url] [![CI vuln scan][vuln-scan-badge]][vuln-scan-url] [![CodeQL][codeql-badge]][codeql-url] + + + +[![Release][release-badge]][release-url] [![Go Report Card][gocard-badge]][gocard-url] [![CodeFactor Grade][codefactor-badge]][codefactor-url] [![License][license-badge]][license-url] + + +[![GoDoc][godoc-badge]][godoc-url] [![Slack Channel][slack-logo]![slack-badge]][slack-url] [![go version][goversion-badge]][goversion-url] ![Top language][top-badge] ![Commits since latest release][commits-badge] -An implementation of JSON Pointer - Go language +--- + +An implementation of JSON Pointer for golang, which supports go `struct`. ## Status -Completed YES -Tested YES +API is stable. + +## Import this library in your project + +```cmd +go get github.com/go-openapi/jsonpointer +``` + +## Basic usage + +See also some [examples](./examples_test.go) + +### Retrieving a value + +```go + import ( + "github.com/go-openapi/jsonpointer" + ) + + + var doc any + + ... + + pointer, err := jsonpointer.New("/foo/1") + if err != nil { + ... // error: e.g. invalid JSON pointer specification + } + + value, kind, err := pointer.Get(doc) + if err != nil { + ... // error: e.g. key not found, index out of bounds, etc. + } + + ... +``` + +### Setting a value + +```go + ... + var doc any + ... + pointer, err := jsonpointer.New("/foo/1") + if err != nil { + ... // error: e.g. invalid JSON pointer specification + } + + doc, err = p.Set(doc, "value") + if err != nil { + ... // error: e.g. key not found, index out of bounds, etc. + } +``` + +## Change log + +See ## References @@ -18,9 +80,70 @@ Tested YES also known as [RFC6901](https://www.rfc-editor.org/rfc/rfc6901) -### Note +## Licensing + +This library ships under the [SPDX-License-Identifier: Apache-2.0](./LICENSE). + +See the license [NOTICE](./NOTICE), which recalls the licensing terms of all the pieces of software +on top of which it has been built. + +## Limitations + +The 4.Evaluation part of the previous reference, starting with 'If the currently referenced value is a JSON array, +the reference token MUST contain either...' is not implemented. + +That is because our implementation of the JSON pointer only supports explicit references to array elements: +the provision in the spec to resolve non-existent members as "the last element in the array", +using the special trailing character "-" is not implemented. + +## Other documentation + +* [All-time contributors](./CONTRIBUTORS.md) +* [Contributing guidelines](.github/CONTRIBUTING.md) +* [Maintainers documentation](docs/MAINTAINERS.md) +* [Code style](docs/STYLE.md) + +## Cutting a new release + +Maintainers can cut a new release by either: -The 4.Evaluation part of the previous reference, starting with 'If the currently referenced value is a JSON array, the reference token MUST contain either...' is not implemented. +* running [this workflow](https://github.com/go-openapi/jsonpointer/actions/workflows/bump-release.yml) +* or pushing a semver tag + * signed tags are preferred + * The tag message is prepended to release notes -That is because our implementation of the JSON pointer only supports explicit references to array elements: the provision in the spec -to resolve non-existent members as "the last element in the array", using the special trailing character "-". + +[test-badge]: https://github.com/go-openapi/jsonpointer/actions/workflows/go-test.yml/badge.svg +[test-url]: https://github.com/go-openapi/jsonpointer/actions/workflows/go-test.yml +[cov-badge]: https://codecov.io/gh/go-openapi/jsonpointer/branch/master/graph/badge.svg +[cov-url]: https://codecov.io/gh/go-openapi/jsonpointer +[vuln-scan-badge]: https://github.com/go-openapi/jsonpointer/actions/workflows/scanner.yml/badge.svg +[vuln-scan-url]: https://github.com/go-openapi/jsonpointer/actions/workflows/scanner.yml +[codeql-badge]: https://github.com/go-openapi/jsonpointer/actions/workflows/codeql.yml/badge.svg +[codeql-url]: https://github.com/go-openapi/jsonpointer/actions/workflows/codeql.yml + +[release-badge]: https://badge.fury.io/gh/go-openapi%2Fjsonpointer.svg +[release-url]: https://badge.fury.io/gh/go-openapi%2Fjsonpointer +[gomod-badge]: https://badge.fury.io/go/github.com%2Fgo-openapi%2Fjsonpointer.svg +[gomod-url]: https://badge.fury.io/go/github.com%2Fgo-openapi%2Fjsonpointer + +[gocard-badge]: https://goreportcard.com/badge/github.com/go-openapi/jsonpointer +[gocard-url]: https://goreportcard.com/report/github.com/go-openapi/jsonpointer +[codefactor-badge]: https://img.shields.io/codefactor/grade/github/go-openapi/jsonpointer +[codefactor-url]: https://www.codefactor.io/repository/github/go-openapi/jsonpointer + +[doc-badge]: https://img.shields.io/badge/doc-site-blue?link=https%3A%2F%2Fgoswagger.io%2Fgo-openapi%2F +[doc-url]: https://goswagger.io/go-openapi +[godoc-badge]: https://pkg.go.dev/badge/github.com/go-openapi/jsonpointer +[godoc-url]: http://pkg.go.dev/github.com/go-openapi/jsonpointer +[slack-logo]: https://a.slack-edge.com/e6a93c1/img/icons/favicon-32.png +[slack-badge]: https://img.shields.io/badge/slack-blue?link=https%3A%2F%2Fgoswagger.slack.com%2Farchives%2FC04R30YM +[slack-url]: https://goswagger.slack.com/archives/C04R30YMU + +[license-badge]: http://img.shields.io/badge/license-Apache%20v2-orange.svg +[license-url]: https://github.com/go-openapi/jsonpointer/?tab=Apache-2.0-1-ov-file#readme + +[goversion-badge]: https://img.shields.io/github/go-mod/go-version/go-openapi/jsonpointer +[goversion-url]: https://github.com/go-openapi/jsonpointer/blob/master/go.mod +[top-badge]: https://img.shields.io/github/languages/top/go-openapi/jsonpointer +[commits-badge]: https://img.shields.io/github/commits-since/go-openapi/jsonpointer/latest diff --git a/vendor/github.com/go-openapi/jsonpointer/SECURITY.md b/vendor/github.com/go-openapi/jsonpointer/SECURITY.md new file mode 100644 index 00000000000..2a7b6f0910d --- /dev/null +++ b/vendor/github.com/go-openapi/jsonpointer/SECURITY.md @@ -0,0 +1,19 @@ +# Security Policy + +This policy outlines the commitment and practices of the go-openapi maintainers regarding security. + +## Supported Versions + +| Version | Supported | +| ------- | ------------------ | +| 0.22.x | :white_check_mark: | + +## Reporting a vulnerability + +If you become aware of a security vulnerability that affects the current repository, +please report it privately to the maintainers. + +Please follow the instructions provided by github to +[Privately report a security vulnerability](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing-information-about-vulnerabilities/privately-reporting-a-security-vulnerability#privately-reporting-a-security-vulnerability). + +TL;DR: on Github, navigate to the project's "Security" tab then click on "Report a vulnerability". diff --git a/vendor/github.com/go-openapi/jsonpointer/errors.go b/vendor/github.com/go-openapi/jsonpointer/errors.go index b84343d9d74..8c50dde8bcf 100644 --- a/vendor/github.com/go-openapi/jsonpointer/errors.go +++ b/vendor/github.com/go-openapi/jsonpointer/errors.go @@ -1,5 +1,10 @@ +// SPDX-FileCopyrightText: Copyright (c) 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 + package jsonpointer +import "fmt" + type pointerError string func (e pointerError) Error() string { @@ -7,12 +12,24 @@ func (e pointerError) Error() string { } const ( - // ErrPointer is an error raised by the jsonpointer package + // ErrPointer is a sentinel error raised by all errors from this package. ErrPointer pointerError = "JSON pointer error" - // ErrInvalidStart states that a JSON pointer must start with a separator ("/") + // ErrInvalidStart states that a JSON pointer must start with a separator ("/"). ErrInvalidStart pointerError = `JSON pointer must be empty or start with a "` + pointerSeparator - // ErrUnsupportedValueType indicates that a value of the wrong type is being set + // ErrUnsupportedValueType indicates that a value of the wrong type is being set. ErrUnsupportedValueType pointerError = "only structs, pointers, maps and slices are supported for setting values" ) + +func errNoKey(key string) error { + return fmt.Errorf("object has no key %q: %w", key, ErrPointer) +} + +func errOutOfBounds(length, idx int) error { + return fmt.Errorf("index out of bounds array[0,%d] index '%d': %w", length-1, idx, ErrPointer) +} + +func errInvalidReference(token string) error { + return fmt.Errorf("invalid token reference %q: %w", token, ErrPointer) +} diff --git a/vendor/github.com/go-openapi/jsonpointer/pointer.go b/vendor/github.com/go-openapi/jsonpointer/pointer.go index 7513c4763ba..7df49af3b96 100644 --- a/vendor/github.com/go-openapi/jsonpointer/pointer.go +++ b/vendor/github.com/go-openapi/jsonpointer/pointer.go @@ -1,28 +1,7 @@ -// Copyright 2013 sigu-399 ( https://github.com/sigu-399 ) -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// author sigu-399 -// author-github https://github.com/sigu-399 -// author-mail sigu.399@gmail.com -// -// repository-name jsonpointer -// repository-desc An implementation of JSON Pointer - Go language -// -// description Main and unique file. -// -// created 25-02-2013 +// SPDX-FileCopyrightText: Copyright (c) 2015-2025 go-swagger maintainers +// SPDX-License-Identifier: Apache-2.0 +// Package jsonpointer provides a golang implementation for json pointers. package jsonpointer import ( @@ -41,29 +20,47 @@ const ( pointerSeparator = `/` ) -var ( - jsonPointableType = reflect.TypeOf(new(JSONPointable)).Elem() - jsonSetableType = reflect.TypeOf(new(JSONSetable)).Elem() -) - -// JSONPointable is an interface for structs to implement when they need to customize the -// json pointer process +// JSONPointable is an interface for structs to implement, +// when they need to customize the json pointer process or want to avoid the use of reflection. type JSONPointable interface { - JSONLookup(string) (any, error) + // JSONLookup returns a value pointed at this (unescaped) key. + JSONLookup(key string) (any, error) } -// JSONSetable is an interface for structs to implement when they need to customize the -// json pointer process +// JSONSetable is an interface for structs to implement, +// when they need to customize the json pointer process or want to avoid the use of reflection. type JSONSetable interface { - JSONSet(string, any) error + // JSONSet sets the value pointed at the (unescaped) key. + JSONSet(key string, value any) error } -// Pointer is a representation of a json pointer +// Pointer is a representation of a json pointer. +// +// Use [Pointer.Get] to retrieve a value or [Pointer.Set] to set a value. +// +// It works with any go type interpreted as a JSON document, which means: +// +// - if a type implements [JSONPointable], its [JSONPointable.JSONLookup] method is used to resolve [Pointer.Get] +// - if a type implements [JSONSetable], its [JSONPointable.JSONSet] method is used to resolve [Pointer.Set] +// - a go map[K]V is interpreted as an object, with type K assignable to a string +// - a go slice []T is interpreted as an array +// - a go struct is interpreted as an object, with exported fields interpreted as keys +// - promoted fields from an embedded struct are traversed +// - scalars (e.g. int, float64 ...), channels, functions and go arrays cannot be traversed +// +// For struct s resolved by reflection, key mappings honor the conventional struct tag `json`. +// +// Fields that do not specify a `json` tag, or specify an empty one, or are tagged as `json:"-"` are ignored. +// +// # Limitations +// +// - Unlike go standard marshaling, untagged fields do not default to the go field name and are ignored. +// - anonymous fields are not traversed if untagged type Pointer struct { referenceTokens []string } -// New creates a new json pointer for the given string +// New creates a new json pointer from its string representation. func New(jsonPointerString string) (Pointer, error) { var p Pointer err := p.parse(jsonPointerString) @@ -71,34 +68,40 @@ func New(jsonPointerString string) (Pointer, error) { return p, err } -// Get uses the pointer to retrieve a value from a JSON document +// Get uses the pointer to retrieve a value from a JSON document. +// +// It returns the value with its type as a [reflect.Kind] or an error. func (p *Pointer) Get(document any) (any, reflect.Kind, error) { return p.get(document, jsonname.DefaultJSONNameProvider) } -// Set uses the pointer to set a value from a JSON document +// Set uses the pointer to set a value from a data type +// that represent a JSON document. +// +// It returns the updated document. func (p *Pointer) Set(document any, value any) (any, error) { return document, p.set(document, value, jsonname.DefaultJSONNameProvider) } -// DecodedTokens returns the decoded tokens of this JSON pointer +// DecodedTokens returns the decoded (unescaped) tokens of this JSON pointer. func (p *Pointer) DecodedTokens() []string { result := make([]string, 0, len(p.referenceTokens)) - for _, t := range p.referenceTokens { - result = append(result, Unescape(t)) + for _, token := range p.referenceTokens { + result = append(result, Unescape(token)) } + return result } -// IsEmpty returns true if this is an empty json pointer -// this indicates that it points to the root document +// IsEmpty returns true if this is an empty json pointer. +// +// This indicates that it points to the root document. func (p *Pointer) IsEmpty() bool { return len(p.referenceTokens) == 0 } -// Pointer to string representation function +// String representation of a pointer. func (p *Pointer) String() string { - if len(p.referenceTokens) == 0 { return emptyPointer } @@ -137,20 +140,21 @@ func (p *Pointer) Offset(document string) (int64, error) { return offset, nil } -// "Constructor", parses the given string JSON pointer +// "Constructor", parses the given string JSON pointer. func (p *Pointer) parse(jsonPointerString string) error { - var err error - - if jsonPointerString != emptyPointer { - if !strings.HasPrefix(jsonPointerString, pointerSeparator) { - err = errors.Join(ErrInvalidStart, ErrPointer) - } else { - referenceTokens := strings.Split(jsonPointerString, pointerSeparator) - p.referenceTokens = append(p.referenceTokens, referenceTokens[1:]...) - } + if jsonPointerString == emptyPointer { + return nil + } + + if !strings.HasPrefix(jsonPointerString, pointerSeparator) { + // non empty pointer must start with "/" + return errors.Join(ErrInvalidStart, ErrPointer) } - return err + referenceTokens := strings.Split(jsonPointerString, pointerSeparator) + p.referenceTokens = append(p.referenceTokens, referenceTokens[1:]...) + + return nil } func (p *Pointer) get(node any, nameProvider *jsonname.NameProvider) (any, reflect.Kind, error) { @@ -160,7 +164,7 @@ func (p *Pointer) get(node any, nameProvider *jsonname.NameProvider) (any, refle kind := reflect.Invalid - // Full document when empty + // full document when empty if len(p.referenceTokens) == 0 { return node, kind, nil } @@ -186,101 +190,103 @@ func (p *Pointer) set(node, data any, nameProvider *jsonname.NameProvider) error if knd != reflect.Pointer && knd != reflect.Struct && knd != reflect.Map && knd != reflect.Slice && knd != reflect.Array { return errors.Join( + fmt.Errorf("unexpected type: %T", node), //nolint:err113 // err wrapping is carried out by errors.Join, not fmt.Errorf. ErrUnsupportedValueType, ErrPointer, ) } + l := len(p.referenceTokens) + + // full document when empty + if l == 0 { + return nil + } + if nameProvider == nil { nameProvider = jsonname.DefaultJSONNameProvider } - // Full document when empty - if len(p.referenceTokens) == 0 { - return nil + var decodedToken string + lastIndex := l - 1 + + if lastIndex > 0 { // skip if we only have one token in pointer + for _, token := range p.referenceTokens[:lastIndex] { + decodedToken = Unescape(token) + next, err := p.resolveNodeForToken(node, decodedToken, nameProvider) + if err != nil { + return err + } + + node = next + } } - lastI := len(p.referenceTokens) - 1 - for i, token := range p.referenceTokens { - isLastToken := i == lastI - decodedToken := Unescape(token) + // last token + decodedToken = Unescape(p.referenceTokens[lastIndex]) - if isLastToken { + return setSingleImpl(node, data, decodedToken, nameProvider) +} - return setSingleImpl(node, data, decodedToken, nameProvider) +func (p *Pointer) resolveNodeForToken(node any, decodedToken string, nameProvider *jsonname.NameProvider) (next any, err error) { + // check for nil during traversal + if isNil(node) { + return nil, fmt.Errorf("cannot traverse through nil value at %q: %w", decodedToken, ErrPointer) + } + + pointable, ok := node.(JSONPointable) + if ok { + r, err := pointable.JSONLookup(decodedToken) + if err != nil { + return nil, err } - // Check for nil during traversal - if isNil(node) { - return fmt.Errorf("cannot traverse through nil value at %q: %w", decodedToken, ErrPointer) + fld := reflect.ValueOf(r) + if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Pointer { + return fld.Addr().Interface(), nil } - rValue := reflect.Indirect(reflect.ValueOf(node)) - kind := rValue.Kind() + return r, nil + } - if rValue.Type().Implements(jsonPointableType) { - r, err := node.(JSONPointable).JSONLookup(decodedToken) - if err != nil { - return err - } - fld := reflect.ValueOf(r) - if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Pointer { - node = fld.Addr().Interface() - continue - } - node = r - continue + rValue := reflect.Indirect(reflect.ValueOf(node)) + kind := rValue.Kind() + + switch kind { + case reflect.Struct: + nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) + if !ok { + return nil, fmt.Errorf("object has no field %q: %w", decodedToken, ErrPointer) } - switch kind { //nolint:exhaustive - case reflect.Struct: - nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) - if !ok { - return fmt.Errorf("object has no field %q: %w", decodedToken, ErrPointer) - } - fld := rValue.FieldByName(nm) - if fld.CanAddr() && fld.Kind() != reflect.Interface && fld.Kind() != reflect.Map && fld.Kind() != reflect.Slice && fld.Kind() != reflect.Pointer { - node = fld.Addr().Interface() - continue - } - node = fld.Interface() + return typeFromValue(rValue.FieldByName(nm)), nil - case reflect.Map: - kv := reflect.ValueOf(decodedToken) - mv := rValue.MapIndex(kv) + case reflect.Map: + kv := reflect.ValueOf(decodedToken) + mv := rValue.MapIndex(kv) - if !mv.IsValid() { - return fmt.Errorf("object has no key %q: %w", decodedToken, ErrPointer) - } - if mv.CanAddr() && mv.Kind() != reflect.Interface && mv.Kind() != reflect.Map && mv.Kind() != reflect.Slice && mv.Kind() != reflect.Pointer { - node = mv.Addr().Interface() - continue - } - node = mv.Interface() + if !mv.IsValid() { + return nil, errNoKey(decodedToken) + } - case reflect.Slice: - tokenIndex, err := strconv.Atoi(decodedToken) - if err != nil { - return err - } - sLength := rValue.Len() - if tokenIndex < 0 || tokenIndex >= sLength { - return fmt.Errorf("index out of bounds array[0,%d] index '%d': %w", sLength, tokenIndex, ErrPointer) - } + return typeFromValue(mv), nil - elem := rValue.Index(tokenIndex) - if elem.CanAddr() && elem.Kind() != reflect.Interface && elem.Kind() != reflect.Map && elem.Kind() != reflect.Slice && elem.Kind() != reflect.Pointer { - node = elem.Addr().Interface() - continue - } - node = elem.Interface() + case reflect.Slice: + tokenIndex, err := strconv.Atoi(decodedToken) + if err != nil { + return nil, errors.Join(err, ErrPointer) + } - default: - return fmt.Errorf("invalid token reference %q: %w", decodedToken, ErrPointer) + sLength := rValue.Len() + if tokenIndex < 0 || tokenIndex >= sLength { + return nil, errOutOfBounds(sLength, tokenIndex) } - } - return nil + return typeFromValue(rValue.Index(tokenIndex)), nil + + default: + return nil, errInvalidReference(decodedToken) + } } func isNil(input any) bool { @@ -289,7 +295,7 @@ func isNil(input any) bool { } kind := reflect.TypeOf(input).Kind() - switch kind { //nolint:exhaustive + switch kind { case reflect.Pointer, reflect.Map, reflect.Slice, reflect.Chan: return reflect.ValueOf(input).IsNil() default: @@ -297,12 +303,20 @@ func isNil(input any) bool { } } -// GetForToken gets a value for a json pointer token 1 level deep +func typeFromValue(v reflect.Value) any { + if v.CanAddr() && v.Kind() != reflect.Interface && v.Kind() != reflect.Map && v.Kind() != reflect.Slice && v.Kind() != reflect.Pointer { + return v.Addr().Interface() + } + + return v.Interface() +} + +// GetForToken gets a value for a json pointer token 1 level deep. func GetForToken(document any, decodedToken string) (any, reflect.Kind, error) { return getSingleImpl(document, decodedToken, jsonname.DefaultJSONNameProvider) } -// SetForToken gets a value for a json pointer token 1 level deep +// SetForToken sets a value for a json pointer token 1 level deep. func SetForToken(document any, decodedToken string, value any) (any, error) { return document, setSingleImpl(document, value, decodedToken, jsonname.DefaultJSONNameProvider) } @@ -325,13 +339,15 @@ func getSingleImpl(node any, decodedToken string, nameProvider *jsonname.NamePro return getSingleImpl(*typed, decodedToken, nameProvider) } - switch kind { //nolint:exhaustive + switch kind { case reflect.Struct: nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) if !ok { return nil, kind, fmt.Errorf("object has no field %q: %w", decodedToken, ErrPointer) } + fld := rValue.FieldByName(nm) + return fld.Interface(), kind, nil case reflect.Map: @@ -341,78 +357,99 @@ func getSingleImpl(node any, decodedToken string, nameProvider *jsonname.NamePro if mv.IsValid() { return mv.Interface(), kind, nil } - return nil, kind, fmt.Errorf("object has no key %q: %w", decodedToken, ErrPointer) + + return nil, kind, errNoKey(decodedToken) case reflect.Slice: tokenIndex, err := strconv.Atoi(decodedToken) if err != nil { - return nil, kind, err + return nil, kind, errors.Join(err, ErrPointer) } sLength := rValue.Len() if tokenIndex < 0 || tokenIndex >= sLength { - return nil, kind, fmt.Errorf("index out of bounds array[0,%d] index '%d': %w", sLength-1, tokenIndex, ErrPointer) + return nil, kind, errOutOfBounds(sLength, tokenIndex) } elem := rValue.Index(tokenIndex) return elem.Interface(), kind, nil default: - return nil, kind, fmt.Errorf("invalid token reference %q: %w", decodedToken, ErrPointer) + return nil, kind, errInvalidReference(decodedToken) } } func setSingleImpl(node, data any, decodedToken string, nameProvider *jsonname.NameProvider) error { - rValue := reflect.Indirect(reflect.ValueOf(node)) - - // Check for nil to prevent panic when calling rValue.Type() + // check for nil to prevent panic when calling rValue.Type() if isNil(node) { return fmt.Errorf("cannot set field %q on nil value: %w", decodedToken, ErrPointer) } - if ns, ok := node.(JSONSetable); ok { // pointer impl + if ns, ok := node.(JSONSetable); ok { return ns.JSONSet(decodedToken, data) } - if rValue.Type().Implements(jsonSetableType) { - return node.(JSONSetable).JSONSet(decodedToken, data) - } + rValue := reflect.Indirect(reflect.ValueOf(node)) - switch rValue.Kind() { //nolint:exhaustive + switch rValue.Kind() { case reflect.Struct: nm, ok := nameProvider.GetGoNameForType(rValue.Type(), decodedToken) if !ok { return fmt.Errorf("object has no field %q: %w", decodedToken, ErrPointer) } + fld := rValue.FieldByName(nm) - if fld.IsValid() { - fld.Set(reflect.ValueOf(data)) + if !fld.CanSet() { + return fmt.Errorf("can't set struct field %s to %v: %w", nm, data, ErrPointer) + } + + value := reflect.ValueOf(data) + valueType := value.Type() + assignedType := fld.Type() + + if !valueType.AssignableTo(assignedType) { + return fmt.Errorf("can't set value with type %T to field %s with type %v: %w", data, nm, assignedType, ErrPointer) } + + fld.Set(value) + return nil case reflect.Map: kv := reflect.ValueOf(decodedToken) rValue.SetMapIndex(kv, reflect.ValueOf(data)) + return nil case reflect.Slice: tokenIndex, err := strconv.Atoi(decodedToken) if err != nil { - return err + return errors.Join(err, ErrPointer) } + sLength := rValue.Len() if tokenIndex < 0 || tokenIndex >= sLength { - return fmt.Errorf("index out of bounds array[0,%d] index '%d': %w", sLength, tokenIndex, ErrPointer) + return errOutOfBounds(sLength, tokenIndex) } elem := rValue.Index(tokenIndex) if !elem.CanSet() { return fmt.Errorf("can't set slice index %s to %v: %w", decodedToken, data, ErrPointer) } - elem.Set(reflect.ValueOf(data)) + + value := reflect.ValueOf(data) + valueType := value.Type() + assignedType := elem.Type() + + if !valueType.AssignableTo(assignedType) { + return fmt.Errorf("can't set value with type %T to slice element %d with type %v: %w", data, tokenIndex, assignedType, ErrPointer) + } + + elem.Set(value) + return nil default: - return fmt.Errorf("invalid token reference %q: %w", decodedToken, ErrPointer) + return errInvalidReference(decodedToken) } } @@ -443,13 +480,14 @@ func offsetSingleObject(dec *json.Decoder, decodedToken string) (int64, error) { return 0, fmt.Errorf("invalid token %#v: %w", tk, ErrPointer) } } + return 0, fmt.Errorf("token reference %q not found: %w", decodedToken, ErrPointer) } func offsetSingleArray(dec *json.Decoder, decodedToken string) (int64, error) { idx, err := strconv.Atoi(decodedToken) if err != nil { - return 0, fmt.Errorf("token reference %q is not a number: %v: %w", decodedToken, err, ErrPointer) + return 0, fmt.Errorf("token reference %q is not a number: %w: %w", decodedToken, err, ErrPointer) } var i int for i = 0; i < idx && dec.More(); i++ { @@ -475,10 +513,12 @@ func offsetSingleArray(dec *json.Decoder, decodedToken string) (int64, error) { if !dec.More() { return 0, fmt.Errorf("token reference %q not found: %w", decodedToken, ErrPointer) } + return dec.InputOffset(), nil } // drainSingle drains a single level of object or array. +// // The decoder has to guarantee the beginning delim (i.e. '{' or '[') has been consumed. func drainSingle(dec *json.Decoder) error { for dec.More() { @@ -500,14 +540,15 @@ func drainSingle(dec *json.Decoder) error { } } - // Consumes the ending delim + // consumes the ending delim if _, err := dec.Token(); err != nil { return err } + return nil } -// Specific JSON pointer encoding here +// JSON pointer encoding: // ~0 => ~ // ~1 => / // ... and vice versa @@ -520,16 +561,23 @@ const ( ) var ( - encRefTokReplacer = strings.NewReplacer(encRefTok1, decRefTok1, encRefTok0, decRefTok0) - decRefTokReplacer = strings.NewReplacer(decRefTok1, encRefTok1, decRefTok0, encRefTok0) + encRefTokReplacer = strings.NewReplacer(encRefTok1, decRefTok1, encRefTok0, decRefTok0) //nolint:gochecknoglobals // it's okay to declare a replacer as a private global + decRefTokReplacer = strings.NewReplacer(decRefTok1, encRefTok1, decRefTok0, encRefTok0) //nolint:gochecknoglobals // it's okay to declare a replacer as a private global ) -// Unescape unescapes a json pointer reference token string to the original representation +// Unescape unescapes a json pointer reference token string to the original representation. func Unescape(token string) string { return encRefTokReplacer.Replace(token) } -// Escape escapes a pointer reference token string +// Escape escapes a pointer reference token string. +// +// The JSONPointer specification defines "/" as a separator and "~" as an escape prefix. +// +// Keys containing such characters are escaped with the following rules: +// +// - "~" is escaped as "~0" +// - "/" is escaped as "~1" func Escape(token string) string { return decRefTokReplacer.Replace(token) } diff --git a/vendor/github.com/go-openapi/jsonreference/.cliff.toml b/vendor/github.com/go-openapi/jsonreference/.cliff.toml new file mode 100644 index 00000000000..702629f5dc3 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonreference/.cliff.toml @@ -0,0 +1,181 @@ +# git-cliff ~ configuration file +# https://git-cliff.org/docs/configuration + +[changelog] +header = """ +""" + +footer = """ + +----- + +**[{{ remote.github.repo }}]({{ self::remote_url() }}) license terms** + +[![License][license-badge]][license-url] + +[license-badge]: http://img.shields.io/badge/license-Apache%20v2-orange.svg +[license-url]: {{ self::remote_url() }}/?tab=Apache-2.0-1-ov-file#readme + +{%- macro remote_url() -%} + https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }} +{%- endmacro -%} +""" + +body = """ +{%- if version %} +## [{{ version | trim_start_matches(pat="v") }}]({{ self::remote_url() }}/tree/{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }} +{%- else %} +## [unreleased] +{%- endif %} +{%- if message %} + {%- raw %}\n{% endraw %} +{{ message }} + {%- raw %}\n{% endraw %} +{%- endif %} +{%- if version %} + {%- if previous.version %} + +**Full Changelog**: <{{ self::remote_url() }}/compare/{{ previous.version }}...{{ version }}> + {%- endif %} +{%- else %} + {%- raw %}\n{% endraw %} +{%- endif %} + +{%- if statistics %}{% if statistics.commit_count %} + {%- raw %}\n{% endraw %} +{{ statistics.commit_count }} commits in this release. + {%- raw %}\n{% endraw %} +{%- endif %}{% endif %} +----- + +{%- for group, commits in commits | group_by(attribute="group") %} + {%- raw %}\n{% endraw %} +### {{ group | upper_first }} + {%- raw %}\n{% endraw %} + {%- for commit in commits %} + {%- if commit.remote.pr_title %} + {%- set commit_message = commit.remote.pr_title %} + {%- else %} + {%- set commit_message = commit.message %} + {%- endif %} +* {{ commit_message | split(pat="\n") | first | trim }} + {%- if commit.remote.username %} +{%- raw %} {% endraw %}by [@{{ commit.remote.username }}](https://github.com/{{ commit.remote.username }}) + {%- endif %} + {%- if commit.remote.pr_number %} +{%- raw %} {% endraw %}in [#{{ commit.remote.pr_number }}]({{ self::remote_url() }}/pull/{{ commit.remote.pr_number }}) + {%- endif %} +{%- raw %} {% endraw %}[...]({{ self::remote_url() }}/commit/{{ commit.id }}) + {%- endfor %} +{%- endfor %} + +{%- if github %} +{%- raw %}\n{% endraw -%} + {%- set all_contributors = github.contributors | length %} + {%- if github.contributors | filter(attribute="username", value="dependabot[bot]") | length < all_contributors %} +----- + +### People who contributed to this release + {% endif %} + {%- for contributor in github.contributors | filter(attribute="username") | sort(attribute="username") %} + {%- if contributor.username != "dependabot[bot]" and contributor.username != "github-actions[bot]" %} +* [@{{ contributor.username }}](https://github.com/{{ contributor.username }}) + {%- endif %} + {%- endfor %} + + {% if github.contributors | filter(attribute="is_first_time", value=true) | length != 0 %} +----- + {%- raw %}\n{% endraw %} + +### New Contributors + {%- endif %} + + {%- for contributor in github.contributors | filter(attribute="is_first_time", value=true) %} + {%- if contributor.username != "dependabot[bot]" and contributor.username != "github-actions[bot]" %} +* @{{ contributor.username }} made their first contribution + {%- if contributor.pr_number %} + in [#{{ contributor.pr_number }}]({{ self::remote_url() }}/pull/{{ contributor.pr_number }}) \ + {%- endif %} + {%- endif %} + {%- endfor %} +{%- endif %} + +{%- raw %}\n{% endraw %} + +{%- macro remote_url() -%} + https://github.com/{{ remote.github.owner }}/{{ remote.github.repo }} +{%- endmacro -%} +""" +# Remove leading and trailing whitespaces from the changelog's body. +trim = true +# Render body even when there are no releases to process. +render_always = true +# An array of regex based postprocessors to modify the changelog. +postprocessors = [ + # Replace the placeholder with a URL. + #{ pattern = '', replace = "https://github.com/orhun/git-cliff" }, +] +# output file path +# output = "test.md" + +[git] +# Parse commits according to the conventional commits specification. +# See https://www.conventionalcommits.org +conventional_commits = false +# Exclude commits that do not match the conventional commits specification. +filter_unconventional = false +# Require all commits to be conventional. +# Takes precedence over filter_unconventional. +require_conventional = false +# Split commits on newlines, treating each line as an individual commit. +split_commits = false +# An array of regex based parsers to modify commit messages prior to further processing. +commit_preprocessors = [ + # Replace issue numbers with link templates to be updated in `changelog.postprocessors`. + #{ pattern = '\((\w+\s)?#([0-9]+)\)', replace = "([#${2}](/issues/${2}))"}, + # Check spelling of the commit message using https://github.com/crate-ci/typos. + # If the spelling is incorrect, it will be fixed automatically. + #{ pattern = '.*', replace_command = 'typos --write-changes -' } +] +# Prevent commits that are breaking from being excluded by commit parsers. +protect_breaking_commits = false +# An array of regex based parsers for extracting data from the commit message. +# Assigns commits to groups. +# Optionally sets the commit's scope and can decide to exclude commits from further processing. +commit_parsers = [ + { message = "^[Cc]hore\\([Rr]elease\\): prepare for", skip = true }, + { message = "(^[Mm]erge)|([Mm]erge conflict)", skip = true }, + { field = "author.name", pattern = "dependabot*", group = "Updates" }, + { message = "([Ss]ecurity)|([Vv]uln)", group = "Security" }, + { body = "(.*[Ss]ecurity)|([Vv]uln)", group = "Security" }, + { message = "([Cc]hore\\(lint\\))|(style)|(lint)|(codeql)|(golangci)", group = "Code quality" }, + { message = "(^[Dd]oc)|((?i)readme)|(badge)|(typo)|(documentation)", group = "Documentation" }, + { message = "(^[Ff]eat)|(^[Ee]nhancement)", group = "Implemented enhancements" }, + { message = "(^ci)|(\\(ci\\))|(fixup\\s+ci)|(fix\\s+ci)|(license)|(example)", group = "Miscellaneous tasks" }, + { message = "^test", group = "Testing" }, + { message = "(^fix)|(panic)", group = "Fixed bugs" }, + { message = "(^refact)|(rework)", group = "Refactor" }, + { message = "(^[Pp]erf)|(performance)", group = "Performance" }, + { message = "(^[Cc]hore)", group = "Miscellaneous tasks" }, + { message = "^[Rr]evert", group = "Reverted changes" }, + { message = "(upgrade.*?go)|(go\\s+version)", group = "Updates" }, + { message = ".*", group = "Other" }, +] +# Exclude commits that are not matched by any commit parser. +filter_commits = false +# An array of link parsers for extracting external references, and turning them into URLs, using regex. +link_parsers = [] +# Include only the tags that belong to the current branch. +use_branch_tags = false +# Order releases topologically instead of chronologically. +topo_order = false +# Order releases topologically instead of chronologically. +topo_order_commits = true +# Order of commits in each group/release within the changelog. +# Allowed values: newest, oldest +sort_commits = "newest" +# Process submodules commits +recurse_submodules = false + +#[remote.github] +#owner = "go-openapi" diff --git a/vendor/github.com/go-openapi/jsonreference/.editorconfig b/vendor/github.com/go-openapi/jsonreference/.editorconfig new file mode 100644 index 00000000000..3152da69a5d --- /dev/null +++ b/vendor/github.com/go-openapi/jsonreference/.editorconfig @@ -0,0 +1,26 @@ +# top-most EditorConfig file +root = true + +# Unix-style newlines with a newline ending every file +[*] +end_of_line = lf +insert_final_newline = true +indent_style = space +indent_size = 2 +trim_trailing_whitespace = true + +# Set default charset +[*.{js,py,go,scala,rb,java,html,css,less,sass,md}] +charset = utf-8 + +# Tab indentation (no size specified) +[*.go] +indent_style = tab + +[*.md] +trim_trailing_whitespace = false + +# Matches the exact files either package.json or .travis.yml +[{package.json,.travis.yml}] +indent_style = space +indent_size = 2 diff --git a/vendor/github.com/go-openapi/jsonreference/.golangci.yml b/vendor/github.com/go-openapi/jsonreference/.golangci.yml index 7cea1af8b52..fdae591bce7 100644 --- a/vendor/github.com/go-openapi/jsonreference/.golangci.yml +++ b/vendor/github.com/go-openapi/jsonreference/.golangci.yml @@ -2,34 +2,17 @@ version: "2" linters: default: all disable: - - cyclop - depguard - - errchkjson - - errorlint - - exhaustruct - - forcetypeassert - funlen - - gochecknoglobals - - gochecknoinits - - gocognit - - godot - godox - - gosmopolitan - - inamedparam - #- intrange # disabled while < go1.22 - - ireturn - - lll - - musttag - - nestif + - exhaustruct - nlreturn - nonamedreturns - noinlineerr - paralleltest - recvcheck - testpackage - - thelper - tparallel - - unparam - varnamelen - whitespace - wrapcheck @@ -41,8 +24,15 @@ linters: goconst: min-len: 2 min-occurrences: 3 + cyclop: + max-complexity: 20 gocyclo: - min-complexity: 45 + min-complexity: 20 + exhaustive: + default-signifies-exhaustive: true + default-case-required: true + lll: + line-length: 180 exclusions: generated: lax presets: @@ -58,6 +48,7 @@ formatters: enable: - gofmt - goimports + - gofumpt exclusions: generated: lax paths: diff --git a/vendor/github.com/go-openapi/jsonreference/CONTRIBUTORS.md b/vendor/github.com/go-openapi/jsonreference/CONTRIBUTORS.md new file mode 100644 index 00000000000..9907d5d2124 --- /dev/null +++ b/vendor/github.com/go-openapi/jsonreference/CONTRIBUTORS.md @@ -0,0 +1,21 @@ +# Contributors + +- Repository: ['go-openapi/jsonreference'] + +| Total Contributors | Total Contributions | +| --- | --- | +| 9 | 68 | + +| Username | All Time Contribution Count | All Commits | +| --- | --- | --- | +| @fredbi | 31 | https://github.com/go-openapi/jsonreference/commits?author=fredbi | +| @casualjim | 25 | https://github.com/go-openapi/jsonreference/commits?author=casualjim | +| @youyuanwu | 5 | https://github.com/go-openapi/jsonreference/commits?author=youyuanwu | +| @olivierlemasle | 2 | https://github.com/go-openapi/jsonreference/commits?author=olivierlemasle | +| @apelisse | 1 | https://github.com/go-openapi/jsonreference/commits?author=apelisse | +| @gbjk | 1 | https://github.com/go-openapi/jsonreference/commits?author=gbjk | +| @honza | 1 | https://github.com/go-openapi/jsonreference/commits?author=honza | +| @Neo2308 | 1 | https://github.com/go-openapi/jsonreference/commits?author=Neo2308 | +| @erraggy | 1 | https://github.com/go-openapi/jsonreference/commits?author=erraggy | + + _this file was generated by the [Contributors GitHub Action](https://github.com/github/contributors)_ diff --git a/vendor/github.com/go-openapi/jsonreference/NOTICE b/vendor/github.com/go-openapi/jsonreference/NOTICE index f9ad7e0f7a0..f3b51939a95 100644 --- a/vendor/github.com/go-openapi/jsonreference/NOTICE +++ b/vendor/github.com/go-openapi/jsonreference/NOTICE @@ -8,12 +8,15 @@ by the go-swagger and go-openapi maintainers ("go-swagger maintainers"). Licensed under the Apache License, Version 2.0 (the "License"); you may not use this software except in compliance with the License. + You may obtain a copy of the License at + http://www.apache.org/licenses/LICENSE-2.0. + This software is copied from, derived from, and inspired by other original software products. It ships with copies of other software which license terms are recalled below. -The original sofware was authored on 25-02-2013 by sigu-399 (https://github.com/sigu-399, sigu.399@gmail.com). +The original software was authored on 25-02-2013 by sigu-399 (https://github.com/sigu-399, sigu.399@gmail.com). github.com/sigh-399/jsonpointer =========================== diff --git a/vendor/github.com/go-openapi/jsonreference/README.md b/vendor/github.com/go-openapi/jsonreference/README.md index 2274a4b78fc..d479dbdc731 100644 --- a/vendor/github.com/go-openapi/jsonreference/README.md +++ b/vendor/github.com/go-openapi/jsonreference/README.md @@ -1,18 +1,39 @@ -# gojsonreference [![Build Status](https://github.com/go-openapi/jsonreference/actions/workflows/go-test.yml/badge.svg)](https://github.com/go-openapi/jsonreference/actions?query=workflow%3A"go+test") [![codecov](https://codecov.io/gh/go-openapi/jsonreference/branch/master/graph/badge.svg)](https://codecov.io/gh/go-openapi/jsonreference) +# jsonreference -[![Slack Status](https://slackin.goswagger.io/badge.svg)](https://slackin.goswagger.io) -[![license](http://img.shields.io/badge/license-Apache%20v2-orange.svg)](https://raw.githubusercontent.com/go-openapi/jsonreference/master/LICENSE) -[![Go Reference](https://pkg.go.dev/badge/github.com/go-openapi/jsonreference.svg)](https://pkg.go.dev/github.com/go-openapi/jsonreference) -[![Go Report Card](https://goreportcard.com/badge/github.com/go-openapi/jsonreference)](https://goreportcard.com/report/github.com/go-openapi/jsonreference) + +[![Tests][test-badge]][test-url] [![Coverage][cov-badge]][cov-url] [![CI vuln scan][vuln-scan-badge]][vuln-scan-url] [![CodeQL][codeql-badge]][codeql-url] + + + +[![Release][release-badge]][release-url] [![Go Report Card][gocard-badge]][gocard-url] [![CodeFactor Grade][codefactor-badge]][codefactor-url] [![License][license-badge]][license-url] + + +[![GoDoc][godoc-badge]][godoc-url] [![Slack Channel][slack-logo]![slack-badge]][slack-url] [![go version][goversion-badge]][goversion-url] ![Top language][top-badge] ![Commits since latest release][commits-badge] -An implementation of JSON Reference - Go language +--- + +An implementation of JSON Reference for golang. ## Status -Feature complete. Stable API + +API is stable. + +## Import this library in your project + +```cmd +go get github.com/go-openapi/jsonreference +``` ## Dependencies + * https://github.com/go-openapi/jsonpointer +## Basic usage + +## Change log + +See + ## References * http://tools.ietf.org/html/draft-ietf-appsawg-json-pointer-07 @@ -24,3 +45,55 @@ This library ships under the [SPDX-License-Identifier: Apache-2.0](./LICENSE). See the license [NOTICE](./NOTICE), which recalls the licensing terms of all the pieces of software on top of which it has been built. + +## Other documentation + +* [All-time contributors](./CONTRIBUTORS.md) +* [Contributing guidelines](.github/CONTRIBUTING.md) +* [Maintainers documentation](docs/MAINTAINERS.md) +* [Code style](docs/STYLE.md) + +## Cutting a new release + +Maintainers can cut a new release by either: + +* running [this workflow](https://github.com/go-openapi/jsonreference/actions/workflows/bump-release.yml) +* or pushing a semver tag + * signed tags are preferred + * The tag message is prepended to release notes + + +[test-badge]: https://github.com/go-openapi/jsonreference/actions/workflows/go-test.yml/badge.svg +[test-url]: https://github.com/go-openapi/jsonreference/actions/workflows/go-test.yml +[cov-badge]: https://codecov.io/gh/go-openapi/jsonreference/branch/master/graph/badge.svg +[cov-url]: https://codecov.io/gh/go-openapi/jsonreference +[vuln-scan-badge]: https://github.com/go-openapi/jsonreference/actions/workflows/scanner.yml/badge.svg +[vuln-scan-url]: https://github.com/go-openapi/jsonreference/actions/workflows/scanner.yml +[codeql-badge]: https://github.com/go-openapi/jsonreference/actions/workflows/codeql.yml/badge.svg +[codeql-url]: https://github.com/go-openapi/jsonreference/actions/workflows/codeql.yml + +[release-badge]: https://badge.fury.io/gh/go-openapi%2Fjsonreference.svg +[release-url]: https://badge.fury.io/gh/go-openapi%2Fjsonreference +[gomod-badge]: https://badge.fury.io/go/github.com%2Fgo-openapi%2Fjsonreference.svg +[gomod-url]: https://badge.fury.io/go/github.com%2Fgo-openapi%2Fjsonreference + +[gocard-badge]: https://goreportcard.com/badge/github.com/go-openapi/jsonreference +[gocard-url]: https://goreportcard.com/report/github.com/go-openapi/jsonreference +[codefactor-badge]: https://img.shields.io/codefactor/grade/github/go-openapi/jsonreference +[codefactor-url]: https://www.codefactor.io/repository/github/go-openapi/jsonreference + +[doc-badge]: https://img.shields.io/badge/doc-site-blue?link=https%3A%2F%2Fgoswagger.io%2Fgo-openapi%2F +[doc-url]: https://goswagger.io/go-openapi +[godoc-badge]: https://pkg.go.dev/badge/github.com/go-openapi/jsonreference +[godoc-url]: http://pkg.go.dev/github.com/go-openapi/jsonreference +[slack-logo]: https://a.slack-edge.com/e6a93c1/img/icons/favicon-32.png +[slack-badge]: https://img.shields.io/badge/slack-blue?link=https%3A%2F%2Fgoswagger.slack.com%2Farchives%2FC04R30YM +[slack-url]: https://goswagger.slack.com/archives/C04R30YMU + +[license-badge]: http://img.shields.io/badge/license-Apache%20v2-orange.svg +[license-url]: https://github.com/go-openapi/jsonreference/?tab=Apache-2.0-1-ov-file#readme + +[goversion-badge]: https://img.shields.io/github/go-mod/go-version/go-openapi/jsonreference +[goversion-url]: https://github.com/go-openapi/jsonreference/blob/master/go.mod +[top-badge]: https://img.shields.io/github/languages/top/go-openapi/jsonreference +[commits-badge]: https://img.shields.io/github/commits-since/go-openapi/jsonreference/latest diff --git a/vendor/github.com/go-openapi/jsonreference/SECURITY.md b/vendor/github.com/go-openapi/jsonreference/SECURITY.md new file mode 100644 index 00000000000..2a7b6f0910d --- /dev/null +++ b/vendor/github.com/go-openapi/jsonreference/SECURITY.md @@ -0,0 +1,19 @@ +# Security Policy + +This policy outlines the commitment and practices of the go-openapi maintainers regarding security. + +## Supported Versions + +| Version | Supported | +| ------- | ------------------ | +| 0.22.x | :white_check_mark: | + +## Reporting a vulnerability + +If you become aware of a security vulnerability that affects the current repository, +please report it privately to the maintainers. + +Please follow the instructions provided by github to +[Privately report a security vulnerability](https://docs.github.com/en/code-security/security-advisories/guidance-on-reporting-and-writing-information-about-vulnerabilities/privately-reporting-a-security-vulnerability#privately-reporting-a-security-vulnerability). + +TL;DR: on Github, navigate to the project's "Security" tab then click on "Report a vulnerability". diff --git a/vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go b/vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go index ca79391dcf3..a08b47320e7 100644 --- a/vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go +++ b/vendor/github.com/go-openapi/jsonreference/internal/normalize_url.go @@ -14,9 +14,11 @@ const ( defaultHTTPSPort = ":443" ) -// Regular expressions used by the normalizations -var rxPort = regexp.MustCompile(`(:\d+)/?$`) -var rxDupSlashes = regexp.MustCompile(`/{2,}`) +// Regular expressions used by the normalizations. +var ( + rxPort = regexp.MustCompile(`(:\d+)/?$`) + rxDupSlashes = regexp.MustCompile(`/{2,}`) +) // NormalizeURL will normalize the specified URL // This was added to replace a previous call to the no longer maintained purell library: diff --git a/vendor/github.com/go-openapi/jsonreference/reference.go b/vendor/github.com/go-openapi/jsonreference/reference.go index 33d4798cad3..6e3ae499515 100644 --- a/vendor/github.com/go-openapi/jsonreference/reference.go +++ b/vendor/github.com/go-openapi/jsonreference/reference.go @@ -18,7 +18,7 @@ const ( var ErrChildURL = errors.New("child url is nil") -// Ref represents a json reference object +// Ref represents a json reference object. type Ref struct { referenceURL *url.URL referencePointer jsonpointer.Pointer @@ -30,7 +30,7 @@ type Ref struct { HasFullFilePath bool } -// New creates a new reference for the given string +// New creates a new reference for the given string. func New(jsonReferenceString string) (Ref, error) { var r Ref err := r.parse(jsonReferenceString) @@ -38,7 +38,7 @@ func New(jsonReferenceString string) (Ref, error) { } // MustCreateRef parses the ref string and panics when it's invalid. -// Use the New method for a version that returns an error +// Use the New method for a version that returns an error. func MustCreateRef(ref string) Ref { r, err := New(ref) if err != nil { @@ -48,17 +48,17 @@ func MustCreateRef(ref string) Ref { return r } -// GetURL gets the URL for this reference +// GetURL gets the URL for this reference. func (r *Ref) GetURL() *url.URL { return r.referenceURL } -// GetPointer gets the json pointer for this reference +// GetPointer gets the json pointer for this reference. func (r *Ref) GetPointer() *jsonpointer.Pointer { return &r.referencePointer } -// String returns the best version of the url for this reference +// String returns the best version of the url for this reference. func (r *Ref) String() string { if r.referenceURL != nil { return r.referenceURL.String() @@ -71,7 +71,7 @@ func (r *Ref) String() string { return r.referencePointer.String() } -// IsRoot returns true if this reference is a root document +// IsRoot returns true if this reference is a root document. func (r *Ref) IsRoot() bool { return r.referenceURL != nil && !r.IsCanonical() && @@ -79,13 +79,13 @@ func (r *Ref) IsRoot() bool { r.referenceURL.Fragment == "" } -// IsCanonical returns true when this pointer starts with http(s):// or file:// +// IsCanonical returns true when this pointer starts with http(s):// or file://. func (r *Ref) IsCanonical() bool { return (r.HasFileScheme && r.HasFullFilePath) || (!r.HasFileScheme && r.HasFullURL) } // Inherits creates a new reference from a parent and a child -// If the child cannot inherit from the parent, an error is returned +// If the child cannot inherit from the parent, an error is returned. func (r *Ref) Inherits(child Ref) (*Ref, error) { childURL := child.GetURL() parentURL := r.GetURL() @@ -103,7 +103,7 @@ func (r *Ref) Inherits(child Ref) (*Ref, error) { return &ref, nil } -// "Constructor", parses the given string JSON reference +// "Constructor", parses the given string JSON reference. func (r *Ref) parse(jsonReferenceString string) error { parsed, err := url.Parse(jsonReferenceString) if err != nil { diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/BUILD.bazel b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/BUILD.bazel index a65d88eb865..04b4bebf3d5 100644 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/BUILD.bazel +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/BUILD.bazel @@ -27,6 +27,7 @@ go_library( "//internal/httprule", "//utilities", "@org_golang_google_genproto_googleapis_api//httpbody", + "@org_golang_google_grpc//:grpc", "@org_golang_google_grpc//codes", "@org_golang_google_grpc//grpclog", "@org_golang_google_grpc//health/grpc_health_v1", diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/context.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/context.go index 2f2b342431d..00b2228a1de 100644 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/context.go +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/context.go @@ -201,13 +201,13 @@ func annotateContext(ctx context.Context, mux *ServeMux, req *http.Request, rpcM if timeout != 0 { ctx, _ = context.WithTimeout(ctx, timeout) } - if len(pairs) == 0 { - return ctx, nil, nil - } md := metadata.Pairs(pairs...) for _, mda := range mux.metadataAnnotators { md = metadata.Join(md, mda(ctx, req)) } + if len(md) == 0 { + return ctx, nil, nil + } return ctx, md, nil } diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/marshal_jsonpb.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/marshal_jsonpb.go index 8376d1e0efd..3d07063007d 100644 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/marshal_jsonpb.go +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/marshal_jsonpb.go @@ -66,7 +66,7 @@ func (j *JSONPb) marshalTo(w io.Writer, v interface{}) error { var ( // protoMessageType is stored to prevent constant lookup of the same type at runtime. - protoMessageType = reflect.TypeOf((*proto.Message)(nil)).Elem() + protoMessageType = reflect.TypeFor[proto.Message]() ) // marshalNonProto marshals a non-message field of a protobuf message. @@ -325,9 +325,9 @@ type protoEnum interface { EnumDescriptor() ([]byte, []int) } -var typeProtoEnum = reflect.TypeOf((*protoEnum)(nil)).Elem() +var typeProtoEnum = reflect.TypeFor[protoEnum]() -var typeProtoMessage = reflect.TypeOf((*proto.Message)(nil)).Elem() +var typeProtoMessage = reflect.TypeFor[proto.Message]() // Delimiter for newline encoded JSON streams. func (j *JSONPb) Delimiter() []byte { diff --git a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/mux.go b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/mux.go index 19255ec441e..3eb16167173 100644 --- a/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/mux.go +++ b/vendor/github.com/grpc-ecosystem/grpc-gateway/v2/runtime/mux.go @@ -10,6 +10,7 @@ import ( "strings" "github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule" + "google.golang.org/grpc" "google.golang.org/grpc/codes" "google.golang.org/grpc/grpclog" "google.golang.org/grpc/health/grpc_health_v1" @@ -281,12 +282,19 @@ func WithHealthEndpointAt(healthCheckClient grpc_health_v1.HealthClient, endpoin http.MethodGet, endpointPath, func(w http.ResponseWriter, r *http.Request, _ map[string]string, ) { _, outboundMarshaler := MarshalerForRequest(s, r) + annotatedContext, err := AnnotateContext(r.Context(), s, r, grpc_health_v1.Health_Check_FullMethodName, WithHTTPPathPattern(endpointPath)) + if err != nil { + s.errorHandler(r.Context(), s, outboundMarshaler, w, r, err) + return + } - resp, err := healthCheckClient.Check(r.Context(), &grpc_health_v1.HealthCheckRequest{ + var md ServerMetadata + resp, err := healthCheckClient.Check(annotatedContext, &grpc_health_v1.HealthCheckRequest{ Service: r.URL.Query().Get("service"), - }) + }, grpc.Header(&md.HeaderMD), grpc.Trailer(&md.TrailerMD)) + annotatedContext = NewServerMetadataContext(annotatedContext, md) if err != nil { - s.errorHandler(r.Context(), s, outboundMarshaler, w, r, err) + s.errorHandler(annotatedContext, s, outboundMarshaler, w, r, err) return } @@ -300,7 +308,7 @@ func WithHealthEndpointAt(healthCheckClient grpc_health_v1.HealthClient, endpoin err = status.Error(codes.NotFound, resp.String()) } - s.errorHandler(r.Context(), s, outboundMarshaler, w, r, err) + s.errorHandler(annotatedContext, s, outboundMarshaler, w, r, err) return } diff --git a/vendor/github.com/prometheus/alertmanager/api/api.go b/vendor/github.com/prometheus/alertmanager/api/api.go index 7c2a7c35861..2bb41095220 100644 --- a/vendor/github.com/prometheus/alertmanager/api/api.go +++ b/vendor/github.com/prometheus/alertmanager/api/api.go @@ -243,7 +243,7 @@ func (api *API) instrumentHandler(prefix string, h http.Handler) http.Handler { } promhttp.InstrumentHandlerDuration( api.requestDuration.MustCurryWith(prometheus.Labels{"handler": path}), - otelhttp.WithRouteTag(path, h), + otelhttp.NewHandler(h, path), ).ServeHTTP(w, r) }) } diff --git a/vendor/github.com/prometheus/alertmanager/api/v2/client/alert/get_alerts_parameters.go b/vendor/github.com/prometheus/alertmanager/api/v2/client/alert/get_alerts_parameters.go index b5fdac356f0..c574dec4232 100644 --- a/vendor/github.com/prometheus/alertmanager/api/v2/client/alert/get_alerts_parameters.go +++ b/vendor/github.com/prometheus/alertmanager/api/v2/client/alert/get_alerts_parameters.go @@ -78,7 +78,7 @@ type GetAlertsParams struct { /* Active. - Show active alerts + Include active alerts in results. If false, excludes active alerts and returns only suppressed (silenced or inhibited) alerts. Default: true */ @@ -92,7 +92,7 @@ type GetAlertsParams struct { /* Inhibited. - Show inhibited alerts + Include inhibited alerts in results. If false, excludes inhibited alerts. Note that true (default) shows both inhibited and non-inhibited alerts. Default: true */ @@ -106,7 +106,7 @@ type GetAlertsParams struct { /* Silenced. - Show silenced alerts + Include silenced alerts in results. If false, excludes silenced alerts. Note that true (default) shows both silenced and non-silenced alerts. Default: true */ @@ -114,7 +114,7 @@ type GetAlertsParams struct { /* Unprocessed. - Show unprocessed alerts + Include unprocessed alerts in results. If false, excludes unprocessed alerts. Note that true (default) shows both processed and unprocessed alerts. Default: true */ diff --git a/vendor/github.com/prometheus/alertmanager/api/v2/client/alertgroup/get_alert_groups_parameters.go b/vendor/github.com/prometheus/alertmanager/api/v2/client/alertgroup/get_alert_groups_parameters.go index 1c96b29cfa4..06bd5b7d457 100644 --- a/vendor/github.com/prometheus/alertmanager/api/v2/client/alertgroup/get_alert_groups_parameters.go +++ b/vendor/github.com/prometheus/alertmanager/api/v2/client/alertgroup/get_alert_groups_parameters.go @@ -78,7 +78,7 @@ type GetAlertGroupsParams struct { /* Active. - Show active alerts + Include active alerts within the returned groups. If false, excludes active alerts from groups and only shows suppressed (silenced or inhibited) alerts. Default: true */ @@ -92,7 +92,7 @@ type GetAlertGroupsParams struct { /* Inhibited. - Show inhibited alerts + Include inhibited alerts within the returned groups. If false, excludes inhibited alerts from groups. Note that true (default) shows both inhibited and non-inhibited alerts. Default: true */ @@ -100,7 +100,7 @@ type GetAlertGroupsParams struct { /* Muted. - Show muted alerts + Include muted (silenced or inhibited) alert groups in results. If false, excludes entire groups where all alerts are muted. Default: true */ @@ -114,7 +114,7 @@ type GetAlertGroupsParams struct { /* Silenced. - Show silenced alerts + Include silenced alerts within the returned groups. If false, excludes silenced alerts from groups. Note that true (default) shows both silenced and non-silenced alerts. Default: true */ diff --git a/vendor/github.com/prometheus/alertmanager/api/v2/openapi.yaml b/vendor/github.com/prometheus/alertmanager/api/v2/openapi.yaml index c40f009b25f..f77e2fa2202 100644 --- a/vendor/github.com/prometheus/alertmanager/api/v2/openapi.yaml +++ b/vendor/github.com/prometheus/alertmanager/api/v2/openapi.yaml @@ -143,22 +143,22 @@ paths: - in: query name: active type: boolean - description: Show active alerts + description: Include active alerts in results. If false, excludes active alerts and returns only suppressed (silenced or inhibited) alerts. default: true - in: query name: silenced type: boolean - description: Show silenced alerts + description: Include silenced alerts in results. If false, excludes silenced alerts. Note that true (default) shows both silenced and non-silenced alerts. default: true - in: query name: inhibited type: boolean - description: Show inhibited alerts + description: Include inhibited alerts in results. If false, excludes inhibited alerts. Note that true (default) shows both inhibited and non-inhibited alerts. default: true - in: query name: unprocessed type: boolean - description: Show unprocessed alerts + description: Include unprocessed alerts in results. If false, excludes unprocessed alerts. Note that true (default) shows both processed and unprocessed alerts. default: true - name: filter in: query @@ -211,22 +211,22 @@ paths: - in: query name: active type: boolean - description: Show active alerts + description: Include active alerts within the returned groups. If false, excludes active alerts from groups and only shows suppressed (silenced or inhibited) alerts. default: true - in: query name: silenced type: boolean - description: Show silenced alerts + description: Include silenced alerts within the returned groups. If false, excludes silenced alerts from groups. Note that true (default) shows both silenced and non-silenced alerts. default: true - in: query name: inhibited type: boolean - description: Show inhibited alerts + description: Include inhibited alerts within the returned groups. If false, excludes inhibited alerts from groups. Note that true (default) shows both inhibited and non-inhibited alerts. default: true - in: query name: muted type: boolean - description: Show muted alerts + description: Include muted (silenced or inhibited) alert groups in results. If false, excludes entire groups where all alerts are muted. default: true - name: filter in: query diff --git a/vendor/github.com/prometheus/alertmanager/api/v2/restapi/embedded_spec.go b/vendor/github.com/prometheus/alertmanager/api/v2/restapi/embedded_spec.go index 09605d2d815..2d1fb9f2696 100644 --- a/vendor/github.com/prometheus/alertmanager/api/v2/restapi/embedded_spec.go +++ b/vendor/github.com/prometheus/alertmanager/api/v2/restapi/embedded_spec.go @@ -61,28 +61,28 @@ func init() { { "type": "boolean", "default": true, - "description": "Show active alerts", + "description": "Include active alerts in results. If false, excludes active alerts and returns only suppressed (silenced or inhibited) alerts.", "name": "active", "in": "query" }, { "type": "boolean", "default": true, - "description": "Show silenced alerts", + "description": "Include silenced alerts in results. If false, excludes silenced alerts. Note that true (default) shows both silenced and non-silenced alerts.", "name": "silenced", "in": "query" }, { "type": "boolean", "default": true, - "description": "Show inhibited alerts", + "description": "Include inhibited alerts in results. If false, excludes inhibited alerts. Note that true (default) shows both inhibited and non-inhibited alerts.", "name": "inhibited", "in": "query" }, { "type": "boolean", "default": true, - "description": "Show unprocessed alerts", + "description": "Include unprocessed alerts in results. If false, excludes unprocessed alerts. Note that true (default) shows both processed and unprocessed alerts.", "name": "unprocessed", "in": "query" }, @@ -159,28 +159,28 @@ func init() { { "type": "boolean", "default": true, - "description": "Show active alerts", + "description": "Include active alerts within the returned groups. If false, excludes active alerts from groups and only shows suppressed (silenced or inhibited) alerts.", "name": "active", "in": "query" }, { "type": "boolean", "default": true, - "description": "Show silenced alerts", + "description": "Include silenced alerts within the returned groups. If false, excludes silenced alerts from groups. Note that true (default) shows both silenced and non-silenced alerts.", "name": "silenced", "in": "query" }, { "type": "boolean", "default": true, - "description": "Show inhibited alerts", + "description": "Include inhibited alerts within the returned groups. If false, excludes inhibited alerts from groups. Note that true (default) shows both inhibited and non-inhibited alerts.", "name": "inhibited", "in": "query" }, { "type": "boolean", "default": true, - "description": "Show muted alerts", + "description": "Include muted (silenced or inhibited) alert groups in results. If false, excludes entire groups where all alerts are muted.", "name": "muted", "in": "query" }, @@ -865,28 +865,28 @@ func init() { { "type": "boolean", "default": true, - "description": "Show active alerts", + "description": "Include active alerts in results. If false, excludes active alerts and returns only suppressed (silenced or inhibited) alerts.", "name": "active", "in": "query" }, { "type": "boolean", "default": true, - "description": "Show silenced alerts", + "description": "Include silenced alerts in results. If false, excludes silenced alerts. Note that true (default) shows both silenced and non-silenced alerts.", "name": "silenced", "in": "query" }, { "type": "boolean", "default": true, - "description": "Show inhibited alerts", + "description": "Include inhibited alerts in results. If false, excludes inhibited alerts. Note that true (default) shows both inhibited and non-inhibited alerts.", "name": "inhibited", "in": "query" }, { "type": "boolean", "default": true, - "description": "Show unprocessed alerts", + "description": "Include unprocessed alerts in results. If false, excludes unprocessed alerts. Note that true (default) shows both processed and unprocessed alerts.", "name": "unprocessed", "in": "query" }, @@ -975,28 +975,28 @@ func init() { { "type": "boolean", "default": true, - "description": "Show active alerts", + "description": "Include active alerts within the returned groups. If false, excludes active alerts from groups and only shows suppressed (silenced or inhibited) alerts.", "name": "active", "in": "query" }, { "type": "boolean", "default": true, - "description": "Show silenced alerts", + "description": "Include silenced alerts within the returned groups. If false, excludes silenced alerts from groups. Note that true (default) shows both silenced and non-silenced alerts.", "name": "silenced", "in": "query" }, { "type": "boolean", "default": true, - "description": "Show inhibited alerts", + "description": "Include inhibited alerts within the returned groups. If false, excludes inhibited alerts from groups. Note that true (default) shows both inhibited and non-inhibited alerts.", "name": "inhibited", "in": "query" }, { "type": "boolean", "default": true, - "description": "Show muted alerts", + "description": "Include muted (silenced or inhibited) alert groups in results. If false, excludes entire groups where all alerts are muted.", "name": "muted", "in": "query" }, diff --git a/vendor/github.com/prometheus/alertmanager/api/v2/restapi/operations/alert/get_alerts_parameters.go b/vendor/github.com/prometheus/alertmanager/api/v2/restapi/operations/alert/get_alerts_parameters.go index e26761dd658..3c335fa160b 100644 --- a/vendor/github.com/prometheus/alertmanager/api/v2/restapi/operations/alert/get_alerts_parameters.go +++ b/vendor/github.com/prometheus/alertmanager/api/v2/restapi/operations/alert/get_alerts_parameters.go @@ -64,7 +64,7 @@ type GetAlertsParams struct { // HTTP Request Object HTTPRequest *http.Request `json:"-"` - /*Show active alerts + /*Include active alerts in results. If false, excludes active alerts and returns only suppressed (silenced or inhibited) alerts. In: query Default: true */ @@ -74,7 +74,7 @@ type GetAlertsParams struct { Collection Format: multi */ Filter []string - /*Show inhibited alerts + /*Include inhibited alerts in results. If false, excludes inhibited alerts. Note that true (default) shows both inhibited and non-inhibited alerts. In: query Default: true */ @@ -83,12 +83,12 @@ type GetAlertsParams struct { In: query */ Receiver *string - /*Show silenced alerts + /*Include silenced alerts in results. If false, excludes silenced alerts. Note that true (default) shows both silenced and non-silenced alerts. In: query Default: true */ Silenced *bool - /*Show unprocessed alerts + /*Include unprocessed alerts in results. If false, excludes unprocessed alerts. Note that true (default) shows both processed and unprocessed alerts. In: query Default: true */ diff --git a/vendor/github.com/prometheus/alertmanager/api/v2/restapi/operations/alertgroup/get_alert_groups_parameters.go b/vendor/github.com/prometheus/alertmanager/api/v2/restapi/operations/alertgroup/get_alert_groups_parameters.go index 4523167bb8e..0fb18bc602b 100644 --- a/vendor/github.com/prometheus/alertmanager/api/v2/restapi/operations/alertgroup/get_alert_groups_parameters.go +++ b/vendor/github.com/prometheus/alertmanager/api/v2/restapi/operations/alertgroup/get_alert_groups_parameters.go @@ -64,7 +64,7 @@ type GetAlertGroupsParams struct { // HTTP Request Object HTTPRequest *http.Request `json:"-"` - /*Show active alerts + /*Include active alerts within the returned groups. If false, excludes active alerts from groups and only shows suppressed (silenced or inhibited) alerts. In: query Default: true */ @@ -74,12 +74,12 @@ type GetAlertGroupsParams struct { Collection Format: multi */ Filter []string - /*Show inhibited alerts + /*Include inhibited alerts within the returned groups. If false, excludes inhibited alerts from groups. Note that true (default) shows both inhibited and non-inhibited alerts. In: query Default: true */ Inhibited *bool - /*Show muted alerts + /*Include muted (silenced or inhibited) alert groups in results. If false, excludes entire groups where all alerts are muted. In: query Default: true */ @@ -88,7 +88,7 @@ type GetAlertGroupsParams struct { In: query */ Receiver *string - /*Show silenced alerts + /*Include silenced alerts within the returned groups. If false, excludes silenced alerts from groups. Note that true (default) shows both silenced and non-silenced alerts. In: query Default: true */ diff --git a/vendor/github.com/prometheus/alertmanager/asset/assets_vfsdata.go b/vendor/github.com/prometheus/alertmanager/asset/assets_vfsdata.go index 85ce36dd3b6..1ae501d4ca6 100644 --- a/vendor/github.com/prometheus/alertmanager/asset/assets_vfsdata.go +++ b/vendor/github.com/prometheus/alertmanager/asset/assets_vfsdata.go @@ -44,27 +44,27 @@ var Assets = func() http.FileSystem { name: "lib", modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), }, - "/static/lib/bootstrap-4.0.0-alpha.6-dist": &vfsgen۰DirInfo{ - name: "bootstrap-4.0.0-alpha.6-dist", + "/static/lib/bootstrap-4.6.2-dist": &vfsgen۰DirInfo{ + name: "bootstrap-4.6.2-dist", modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), }, - "/static/lib/bootstrap-4.0.0-alpha.6-dist/css": &vfsgen۰DirInfo{ + "/static/lib/bootstrap-4.6.2-dist/css": &vfsgen۰DirInfo{ name: "css", modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), }, - "/static/lib/bootstrap-4.0.0-alpha.6-dist/css/bootstrap.min.css": &vfsgen۰CompressedFileInfo{ + "/static/lib/bootstrap-4.6.2-dist/css/bootstrap.min.css": &vfsgen۰CompressedFileInfo{ name: "bootstrap.min.css", modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), - uncompressedSize: 150996, + uncompressedSize: 162264, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xec\xbd\x5b\x93\xe3\xb8\x91\x30\xfa\x7e\x7e\x05\xb7\x1d\x1d\x3d\x3d\x23\xb2\x49\xea\x56\x92\x62\x26\xbc\x76\xec\x17\x9f\x23\x66\xfc\xb0\xde\x3d\x2f\xf3\xf5\x03\x25\x42\x12\xdd\xbc\x7d\x24\x55\xc5\x1a\xad\xce\x6f\x3f\x41\x00\x24\x71\x49\x5c\x54\x5d\x17\xf5\x78\xd6\x6b\xb7\x0a\x48\x64\x26\x12\x89\x44\x22\x09\x24\x3e\x7d\xff\x6f\xff\x8f\xf3\xbd\xf3\x97\xa2\x68\xea\xa6\x8a\x4a\xe7\x7e\xe6\xf9\x9e\xef\x46\x69\x79\x8c\xbc\x85\xf3\xdd\xb1\x69\xca\x7a\xfd\xe9\xd3\x01\x35\xdb\x1e\xc8\xdb\x15\xd9\xc7\xae\xd9\x5f\x8b\xf2\xb1\x4a\x0e\xc7\xc6\x09\xfd\x20\x70\x43\x3f\x58\x3a\xff\x75\x44\x0c\xba\x7f\x3f\x35\xc7\xa2\xaa\x95\xc0\x0f\x49\xd3\xa0\x6a\xe2\xfc\x2d\xdf\x79\x1d\xd0\xcf\xc9\x0e\xe5\x35\x8a\x9d\x53\x1e\xa3\xca\xf9\xe5\x6f\xff\xc5\xb0\x90\x34\xc7\xd3\xb6\x23\xfe\xa9\x79\xd8\xd6\x9f\x06\x7e\x3e\x6d\xd3\x62\xfb\x29\x8b\xea\x06\x55\x9f\x7e\xfe\xdb\x5f\xff\xe3\xef\xff\xf8\x8f\x8e\xbf\x4f\x9f\xbe\xff\x37\x27\x2f\xaa\x2c\x4a\x93\xdf\x90\xb7\xab\x6b\xe7\x7e\xde\x75\xcf\xf9\x1f\x8c\x99\x12\x73\xfe\xc7\x61\x50\xe7\x68\x57\xa4\x51\xfd\x89\x6f\xf7\xfd\xa7\x63\x93\xa5\xe7\x7d\x91\x37\xee\x3e\xca\x92\xf4\x71\x5d\x47\x79\xed\xd6\xa8\x4a\xf6\x9b\x34\xc9\x91\x7b\x44\x5d\xe7\xd6\x81\x17\xcc\x37\x6e\x56\xbb\x0d\x6a\x1b\xb7\x4e\x7e\x43\x6e\x14\xff\xf3\x54\x37\xeb\xc0\xf7\xdf\x6f\xdc\x07\xb4\xfd\x92\x34\x70\xed\x65\x5b\xc4\x8f\xe7\x2c\xaa\x0e\x49\xbe\xf6\x2f\x51\xd5\x24\xbb\x14\x4d\xa2\x3a\x89\xd1\x64\x5f\x14\x9d\xa8\x8e\x28\x8a\x51\x35\xc9\xa3\xfb\x49\x8d\x76\x4d\x52\xe4\xe7\x38\xa9\xcb\x34\x7a\x5c\x6f\xd3\x62\xf7\xe5\x72\x0c\x08\x9b\x1d\xf2\x75\x88\xb2\x0d\xc5\xe7\x2d\x96\x28\x73\xfc\xcb\x3e\x39\xec\xa2\xb2\x6b\x38\xd9\x27\x87\x53\x85\x26\x59\x94\x88\x48\x48\x4d\xcf\x4a\x80\x32\x67\xe6\x97\xed\xe5\x58\x9d\xfb\x0e\x6c\x8b\xb6\x23\x91\xe4\x87\xf5\xae\xc8\x1b\x94\xe3\xa2\x8d\xa2\x98\x0a\xc7\xdf\x14\xf7\xa8\xda\xa7\xc5\xc3\xfa\x3e\xa9\x93\x6d\x8a\x2e\x65\x85\x38\xb1\x66\x45\x5e\xd4\x65\xb4\x43\x93\xe1\xd7\x66\xec\x4f\x80\xb2\x4b\x74\xde\x46\xbb\x2f\x87\xaa\x38\xe5\xb1\xbb\x2b\xd2\xa2\x5a\x37\x55\x94\xd7\x65\x54\xa1\xbc\xe1\x25\x1c\xa3\x5d\x51\x45\x5d\x67\xdd\xfa\x4b\x52\xae\x8b\xed\x3f\xd1\xae\xa9\x2f\xd1\x3a\xda\x35\xc9\x3d\x9a\x44\xeb\x63\xc7\xd2\xb9\x38\x35\x78\x14\x1f\x92\xb8\x39\x76\xb2\xdf\x6e\xab\x5f\x9b\xa4\x49\xd1\xe7\xf3\xb6\xa8\x62\x54\xb9\xdb\xa2\x69\x8a\x6c\x9d\x17\x39\xda\x08\xc8\xd7\x58\x5d\x3b\x04\xea\x1a\x27\x2e\x9a\x06\xc5\x97\xed\xa4\x6e\xaa\x22\x3f\x90\x5e\x3f\x10\xc1\x24\xf9\x11\x55\x49\x03\x57\x6e\x8b\x34\x46\xd5\x65\x57\xc4\x68\xf2\x65\x1b\x4f\xea\x28\x2b\xaf\x94\x59\xbc\xcf\xa9\x56\x34\x8f\x29\x5a\x27\x4d\x94\x26\xbb\x4b\x16\x55\x5f\x64\x61\xfe\x69\xbf\xf7\x37\xf4\xa7\xef\xfb\x97\x3a\x8b\xd2\x94\xd1\xa9\x3b\xff\xfd\xa5\x3e\x6d\x27\xf5\xa9\x64\x4a\x97\xf3\xf7\xdc\x3c\xf0\x37\x65\x51\x27\x58\x04\x15\x4a\xa3\x4e\xd8\x9b\x7b\xd4\x69\x74\x94\xba\x51\x9a\x1c\xf2\xf5\x36\xaa\x51\xd7\xa4\xc3\x76\xa6\xd2\x75\xbd\x70\x8e\xb2\x4b\x87\xbb\x29\xca\xb5\xeb\x75\x7f\x45\xa7\x38\x29\x26\xf7\x49\x8c\x8a\x41\x4f\x93\x1c\x53\x23\xea\x8a\x01\xd6\x79\xd1\x7c\xf7\x6b\xa7\x75\x55\x91\xd6\x9f\x3f\x0e\xa0\x78\xc4\x7a\xb6\x2e\x49\x76\xe8\x47\x94\x08\xa3\xab\xbe\xd4\xf7\x07\xdc\x7e\x5d\x15\x45\xf3\xf1\x3c\xa8\xe9\x31\x89\x63\x94\x5f\xb6\xa7\xa6\x29\xf2\x49\x92\x97\xa7\x66\x52\x94\x4d\x27\xb0\x72\x52\xa3\x14\xed\x9a\x49\x37\xe4\x51\x85\x22\x95\x79\x60\x86\xa2\x33\x01\x92\xb5\x18\x26\x3c\x4b\xe5\x2c\xcd\x14\x5a\x4b\x88\x9e\xb1\x9e\x61\xbd\xdf\x17\x15\xd1\xca\xcb\xaf\xcd\x63\x89\x7e\xac\x50\x8d\x9a\xcf\x13\xf2\x47\x7d\xda\x66\x49\xf3\x79\x42\x1b\x77\x56\xcc\x21\x35\xa4\xe4\xf3\x30\xa1\xa3\xb2\x44\x51\x15\xe5\x3b\xb4\x26\x55\x17\x0e\x6e\xbd\x76\xb3\xe2\x37\x77\x5f\xec\x4e\xb5\x9b\xe4\x39\xaa\x26\x2c\x39\x65\x35\x65\x00\xa8\x27\x88\xe5\x0a\x79\x74\x36\x65\x14\xc7\x9d\x49\xf1\x05\x9e\xc6\xa6\x55\x92\x1f\x78\x86\xc0\xba\x9e\x1b\xa1\x92\xb2\xc2\x97\xf6\x36\x61\x1d\x94\x2d\x9d\xbc\xce\x5f\x30\xe0\x7f\xa1\xb6\xb9\xec\x13\x94\xc6\x35\x6a\x28\xbb\x18\xaa\x2e\xd2\x24\x76\xea\x24\xbd\x47\xd5\x30\xac\x4e\x58\xb6\x43\x0f\xbc\xe9\x1c\x65\x8e\xb7\x08\xf1\x3f\xcb\x4e\xbb\x53\x74\x40\x79\x0c\x19\xd6\xc1\xf0\x70\x76\x95\x29\x25\xb3\x94\x1a\x8f\x4d\xaf\xef\x4d\xb4\x4d\xd1\x26\x8b\x5a\x6a\xcd\xb0\xd6\x0d\x22\xdc\x3c\x1c\x93\x06\xb9\xd8\x4a\xac\xc9\x2a\x77\x29\xab\xe2\x50\xa1\xba\x06\x67\x97\x72\xda\x0e\x7a\x3f\xa8\x6a\x74\x6a\x0a\x3a\x44\xbb\x23\xda\x7d\xd9\x16\x6d\xaf\x88\x55\x14\x27\xc5\xe7\x27\xf5\x52\x1c\xfd\xfc\x94\x6d\x51\xd5\xa9\x14\x45\x86\xd5\xc6\xad\xcb\x24\x77\xa9\x9e\x2b\x00\x8b\x53\xc3\x03\x9e\xe9\x3c\x64\x18\xaf\x51\x54\xed\x8e\xe0\xbc\xe8\x3a\x8c\x87\x7d\xd3\x2f\x17\xc5\x7e\x5f\xa3\x66\xed\x86\x65\xcb\x37\x1f\x69\x92\x02\x77\xd7\x61\x48\x79\xfe\x54\xb0\xe3\xf2\x01\x71\x81\xa7\xfa\xd8\x66\x9f\xa4\xc8\x3d\x95\x69\x11\xc5\x7d\xa7\x94\x53\x1a\x9b\xa2\x61\xb1\x89\x51\x13\x25\x69\x3d\xc9\x50\x7e\x12\xd6\xff\xfa\x94\x65\x51\xf5\x38\x94\xa6\x49\xdd\xb8\x49\x83\xb2\xcb\x2e\xca\xef\x23\x58\x51\x2e\x0d\xca\xca\x34\x6a\x10\x67\x79\x2f\xbf\x12\x1b\xfa\x99\x2f\xfd\x73\x86\xe2\x24\x72\xca\x2a\xc9\x9b\xf3\xf7\x93\xf5\x3a\xda\x77\xee\xcd\x7a\xbd\x45\xfb\xa2\x42\x13\x8c\xf1\xff\x9e\x8a\x06\xad\xd7\xfb\xa4\xaa\x1b\x37\x45\xd8\x57\x04\x2a\x92\x1c\x4d\xe2\xe4\x5e\x00\x64\x4b\x3a\x88\x34\x11\x00\x98\x82\xae\xbe\x14\xaa\x4b\xb6\x96\xd8\xdb\xfa\x18\xc5\xc5\x03\xee\xc0\xbf\x25\x59\x59\x54\x4d\xc4\x78\x1c\x58\x7b\x41\x08\x65\xcd\x25\x9a\x44\xd8\xc0\x37\x28\x3e\x2b\x5d\x07\xd6\x1b\xa1\x82\x3a\x53\xef\x6a\xfd\xce\xf9\xee\x9d\x13\x35\x4d\xf5\x1d\xae\xff\xe8\xbc\xfb\xf8\x0e\x3b\x55\xec\x34\x2f\x2b\xe4\x3e\x54\x51\xc9\x10\x1e\xc5\x38\xe9\xa0\x25\x23\xf6\xa7\xd5\x6a\xb5\x29\xa3\x03\x72\xb7\x15\x8a\xbe\xb8\x49\xde\x79\xa1\xeb\xe8\xbe\x48\xe2\x4b\xd3\x79\xa1\x67\xce\xde\xb8\xc4\x31\x75\xf1\xca\xd8\x2d\xb2\x93\xa6\x3a\xab\xda\x1f\xc3\xc9\x71\x3a\x29\xcf\x45\x55\x1e\xa3\xbc\x5e\x4f\x37\x0f\x49\x5c\x3c\xd4\xeb\x29\xa9\x62\x1b\xe2\xee\xd2\x76\x5e\x1e\xdd\x6f\xa3\x8a\xd7\x24\x6f\x1b\xc5\x07\xa8\x07\x9d\xf3\xe2\x61\xe6\xfa\x25\x65\x57\xa4\x69\x54\xd6\x68\xdd\xff\x60\x04\x42\x20\x9d\x26\x9e\xf4\xbf\x8e\xa0\x6f\xb4\x97\xda\xb8\x04\x3b\x8a\xc7\xc6\x4c\xd1\x11\xe0\x2c\x8e\x63\x06\xcb\x05\xef\x2d\x9e\x60\x19\x2f\xf2\xbc\x81\xd0\xf4\xeb\x83\x5c\x74\xf9\x73\xb7\x53\xb9\x4f\xd0\x43\xc7\xcb\x99\x2c\x17\x31\xba\x4f\x76\xd4\x13\xa6\xac\x65\xb5\xdb\xdb\x78\xba\x2c\xd7\xbb\xaa\x48\xd3\x6d\x54\x8d\xfe\x76\x54\xba\xc7\xe4\x70\x4c\x3b\x83\x2a\xfb\xe5\x64\x6f\xc3\x7a\x48\x9d\x79\x4a\x91\x5b\x3f\xd6\x0d\xca\x26\xe4\x1f\xf7\x94\x4c\xfe\x92\x26\xf9\x97\x5f\xa2\xdd\x3f\x70\xc9\xff\x2a\xf2\x66\xf2\xee\x1f\xe8\x50\x20\xe7\xbf\xff\xf6\x6e\xf2\x9f\xc5\xb6\x68\x8a\xc9\xbb\xff\x8d\xd2\x7b\xd4\x2d\x4b\xce\xdf\xd1\x09\xbd\x9b\xfc\x7b\x95\x44\xe9\x04\xf6\xba\x2a\x94\x6d\x58\x87\x7a\xe6\xfb\x82\x17\x36\xef\x1d\xde\x70\x15\x6e\xc3\xdd\x06\x1c\xf8\xcb\xaf\x4d\xb4\x4d\xf2\x18\xb5\x3f\xbe\x73\x83\x77\x9f\xd7\xd8\x55\x18\xdc\x04\x9f\x19\xd2\x63\x30\x21\x3a\x7e\x9c\x4d\x8e\xf3\xc9\x71\x41\xb7\x52\x6e\xe7\xd4\xfa\xd4\x35\xe8\x77\x14\xde\xbc\x42\xd9\xa5\xd4\x81\x74\x5d\x20\x56\x20\x8e\x9a\xc8\x2d\xaa\xe4\x90\xe4\x51\xea\x12\x9b\x30\x61\x77\x2b\xbb\x53\x55\x17\xd5\xfa\x88\xd2\xf2\x12\xc5\x31\x5e\xd6\x65\x64\x1b\x66\x37\x40\x9c\x00\x4e\x22\xc3\x12\x91\x4e\x8a\x74\x72\x4a\x8d\xbc\x15\xa9\x53\x74\xb0\xce\xa9\x03\x77\x70\x23\x67\x6c\x47\x41\xfd\x4b\xdc\x70\x5b\x9b\xa5\xef\x5f\xe2\xf8\x0c\xc8\xa3\x27\x92\xa2\x7d\xe7\xb5\x8f\xe6\x6a\xd8\x1f\x3b\xbe\x43\xc4\x72\xee\x37\x2b\xe1\x72\x1e\xdf\x49\x3b\x30\x6c\x24\x22\x32\x58\xc3\x7e\xaf\x6f\x12\xcc\x76\x77\xbb\x8d\xc6\xf2\x92\x5d\xc5\xb1\x42\xfb\xcf\x1f\xc9\xef\x5e\x09\x3e\x7f\x3c\xf3\xfe\x97\x82\xb0\x06\xc1\xc0\x94\x0e\x86\x65\xf8\x6b\x49\x8d\xca\x8a\xd7\x08\xc3\xa8\x6e\x78\xc7\x8e\x0f\x0a\x0c\xf2\xef\x36\x54\x82\x8b\x98\x25\x71\x9c\xa2\xcb\xaf\x55\x91\x8e\x1b\x0d\xaa\x98\x65\x91\xe4\x0d\xaa\xf8\xca\x49\x34\xe9\x3c\xc9\x09\xb7\xcf\x4a\xa3\x2d\x4a\xfb\x4d\x16\xf5\x48\xc6\xcd\x16\x8e\xb1\x14\xa7\xdd\xd1\x8d\x70\x18\x64\x9d\x45\x79\x52\x9e\x52\x2c\x90\x8d\xb2\xe6\xa2\x5f\x10\x36\xba\xd8\xc2\x85\x06\x4e\xce\xd4\x23\xc5\x82\xf3\x96\x58\x5d\xfb\xa2\x5e\x87\x49\x29\x55\xb3\xc5\x74\xb1\x5b\x86\x64\xd4\x88\x84\x3a\xb5\xde\x50\x74\x2e\x5e\x19\x49\xc3\x4b\x73\x3c\x0b\x60\x17\x2c\x07\xd8\x35\x87\x0c\x09\xdd\xcc\xf0\xe3\x3d\xee\x61\x7a\xdf\x75\x3d\x2f\x5b\xa7\x1b\x57\x67\xf0\x24\xf1\x1e\xac\xdb\xfa\x90\xae\xf3\xbb\x5e\x71\xb3\x0b\x99\x0b\x0c\x29\xf8\xff\xeb\x38\xa9\x3b\x91\xc7\x13\xa6\x96\xec\x06\x86\xaa\x5e\x37\xf2\xa2\xeb\x78\x5a\x3c\xa0\x98\xc5\x15\x47\x0d\xfa\xcc\x36\x6f\x92\x8c\x2f\xe8\x20\xba\x42\x37\x2d\x76\x51\xca\x55\x65\x45\xde\xc0\xee\x7c\xe7\xd4\x76\xab\xe8\xd0\xa5\x0a\xe1\xf5\xa2\x57\xe6\x71\x8b\x97\x25\x79\x1f\x19\x62\x36\x52\xfd\x44\xd8\xd0\x05\xde\xef\xb7\x72\x9c\x2f\xbd\x01\x37\x61\x90\xc5\x63\x56\x2c\x52\x60\x10\xb1\x66\xa7\x82\xed\x41\x71\x6a\xca\x53\x03\xbb\xea\xa0\x53\xce\x7a\x36\xc7\x60\xe2\x1d\xc3\x89\x77\x9c\x4e\xbc\xe3\x6c\xe2\x1d\xe7\x13\xef\xb8\x98\x28\x17\x36\xb9\x27\x74\x99\xef\x4d\x16\x6b\xf6\xe7\xd2\x02\x1c\xf0\x7b\x59\x4c\x9f\x8f\x64\x12\xe5\xee\x78\x3a\x86\x6c\x39\x29\x9d\x76\x5e\x23\x2b\xc0\x25\x05\x9f\x4d\x8e\xb3\xb3\x28\xd9\x4b\xd7\x9d\xe3\x9c\x2b\x0f\x69\xc5\xa2\xeb\x14\xef\x3c\x5c\xbc\xb4\xf3\x77\x25\x68\xae\x4f\xd3\xce\xdb\xa4\xd2\x74\x59\xce\x17\x00\xa4\xd8\xfb\xb1\x25\xdb\xb7\xb9\x37\xbf\xaa\x2d\x2b\x81\xd9\x95\x6d\x59\x21\x4d\xed\xda\x1e\x2b\x76\x01\x09\x98\x45\x9b\x5d\x43\xfa\xc9\x41\x7f\x10\xd8\xc1\x15\xae\x0e\xdb\xe8\x3b\x7f\xd2\xfd\xc7\x0b\x3e\x5e\x3c\x1c\x6c\x9c\x00\x21\x47\xd1\x81\xbb\x78\x59\x54\x7d\x99\xe0\x10\xe6\x10\x5c\x09\x3b\x7a\xb2\xeb\xb6\xdb\xdf\xa1\xe9\xc5\xc3\x9b\xd8\x53\x8e\x9d\x9e\x78\xb0\xe1\xc4\xc1\xd8\xe0\x4a\x26\x20\x48\xa0\xc9\x9c\xb9\x06\x16\xef\x92\xe1\x39\x27\x81\x91\x88\x63\x1a\xd5\x8d\xbb\x3b\x26\x69\xfc\xb1\x97\x67\x45\x66\x49\xd9\x5e\xbc\x24\x4f\x9a\x24\x4a\x93\x3a\x63\xe4\xb1\xf2\xdf\x6f\x84\x00\xe0\xa9\x2c\x51\xb5\x8b\xea\x6e\x3f\x34\xfa\x4a\x83\x64\xba\x01\x75\x54\x43\x24\x2b\x36\x1d\x2b\xdc\x5f\x52\xd4\x6f\x5d\xd0\x0e\x21\xb4\x67\x89\xb8\xe4\xcb\x84\x60\xf5\xf8\xc1\xe3\xd6\x41\xa0\xf1\xb0\x7d\x19\xb6\xb5\xff\x27\xf4\x83\x99\xf3\x7f\x7c\xff\xdf\xfd\x77\x5c\x83\x0a\xdd\xa3\xaa\x1e\xc7\x84\xc8\x2a\x60\xd7\x60\x3a\x4c\xcc\x3a\x8a\x81\xfa\x5e\x91\x16\x50\xb7\xb8\x7e\xfb\x10\x59\xc7\x86\xf7\x77\xd6\x2d\x85\xbd\x3c\xee\xae\x83\xbb\xfe\xee\xe2\x25\xd9\xc1\xdd\xa7\xa7\xa4\xf3\x8f\xb9\x58\x1e\x1b\xb4\xc2\x50\xcd\xf1\x94\x6d\xf3\x28\x49\x99\xa9\x40\xc6\x11\xda\xc7\x6c\xc0\x0d\xe9\x20\x9d\x28\x4e\x4e\x75\x8f\x60\xd8\xdd\x75\x8a\x46\xc2\xf9\x51\x9a\x3a\x5e\x58\x3b\x28\xaa\x91\x9b\xe4\x6e\x71\x6a\x36\x6e\x61\x82\x30\x54\xeb\x7a\x48\xfd\x4e\x78\x4e\x91\x4a\xb7\x73\x42\xa1\x95\x88\xb3\x59\x03\x74\xef\xc7\xf1\x33\x8a\x57\xd2\xe1\x73\x4b\x59\x21\xf9\x93\xcb\x2f\x28\x4f\x8b\xc9\x2f\x45\x1e\xed\x8a\xc9\x5f\x8b\xbc\x2e\xd2\xa8\x9e\xbc\xfb\x39\xd9\x22\xe2\x92\x3b\xbf\x14\x79\xf1\x6e\xf2\xee\xaf\xc5\xa9\x4a\x50\xe5\xfc\x1d\x3d\xbc\x1b\x3f\xcf\x60\xec\xcc\x60\x75\x9a\xe8\xcd\xf8\xb9\xc8\xb0\xb4\x8d\x67\xc1\x6c\x09\x8d\xe6\x72\xbf\xdc\xaf\xc0\xa1\xbb\x44\x3f\x71\x44\x7c\x21\x5a\x2c\x21\xeb\x97\xde\x2f\xdb\xd8\x9e\x33\xac\x4e\x12\x5b\xfd\x2e\x5a\x60\xab\xe3\xea\xcb\x36\x76\x58\x0a\xbe\xf8\x79\x44\xdc\x1e\x96\xcc\xd0\x73\x4e\xaf\x72\xd7\x02\x32\x4a\x58\xea\xb0\x39\x82\x58\x46\xf0\x5e\x34\x06\x41\xb1\x5f\x1b\xf9\x2e\xfa\x17\xaf\xac\x90\x4b\x82\x23\x78\x9f\xd1\xe9\x35\x55\xbf\xe9\xcc\x2f\xdb\x61\x4b\xe5\x3e\xd2\x18\xca\xc5\xeb\xa6\x7f\x94\xe4\xa8\x3a\xcb\x9f\xcc\xd8\x5d\x70\x37\x1b\x36\xdc\x0a\x81\x4b\x04\x43\x38\x1f\xbf\x36\x90\x66\x5d\x49\x1f\x6e\xfd\x6e\xf4\x64\xe7\xcb\x45\xd9\x7e\x3c\xb3\xd4\x6d\x10\x01\x98\x96\x8b\xbb\x67\xc2\xb4\x5a\x85\xcf\x84\x29\x08\x7d\xff\x99\x50\xc9\x82\xa2\xe5\x78\x3c\x79\xc3\x65\x27\x1e\x5a\x1e\xda\xb5\x97\x85\x42\xcb\x17\x76\xed\x01\x51\xd0\x8a\x00\xec\xc1\x08\x47\x57\x9f\x37\xd5\xca\x9e\x87\xe7\xd2\xcd\xaf\xc4\x27\x0d\xc6\x57\xe2\x93\x07\xe7\x2a\x84\x5e\x55\x3c\x0c\xd6\x91\x09\xfd\x6e\xc4\xb2\x7d\x8a\x98\xc2\xac\xc6\x05\x2c\x20\x06\x60\xa1\xf1\x07\x83\x75\xf7\x3f\x9b\x1e\x9e\x29\x12\xfe\xe4\xc6\xdf\xc5\xdc\xb2\x3a\xe2\x1a\x46\xbb\xeb\x85\x15\x0a\xcd\x08\x7f\x0d\x8e\x7e\x54\xbf\x06\xc7\x30\x92\xf6\x48\xbc\xbc\x70\x0f\xa7\xa6\x41\x55\xcd\xb7\xf0\x85\xe8\x27\x03\xf8\x93\xb7\x2b\xd2\x09\x5b\xf0\xeb\x2e\x8d\xea\xfa\xfb\x1f\x77\x45\xea\x7e\x16\xf4\xc6\x17\x7c\xe2\x0b\x69\xdd\x81\x06\xf4\x1f\x9f\xfe\xdb\xff\x1d\x92\x7f\xe9\x3f\x53\xf2\xcf\x8c\xfc\x33\x27\xff\x2c\xc8\x3f\x4b\xf2\xcf\x1d\xf9\x67\x45\xfe\x49\x0f\xfd\xbf\x3d\x85\xee\x97\x3f\xfe\x64\x4a\xc3\xe1\xe7\xf8\x6b\x3a\xfc\x9a\x0d\xbf\xe6\xc3\xaf\xc5\xf0\x6b\x39\xfc\xba\x1b\x7e\x51\x16\xb2\xb8\xff\xb7\x67\xa1\xfb\xe5\x8f\x3f\x99\xd2\x70\xf8\x39\xfe\x9a\x0e\xbf\x66\xc3\xaf\xf9\xf0\x6b\x31\xfc\x5a\x0e\xbf\xee\x86\x5f\x94\x85\x3a\xeb\xff\xed\x59\xe8\x7e\xf9\xe3\x4f\xa6\x34\x1c\x7e\x8e\xbf\xa6\xc3\xaf\xd9\xf0\x6b\x3e\xfc\x5a\x0c\xbf\x96\xc3\xaf\xbb\xe1\x17\x65\xa1\x4d\xfb\x7f\x7b\x16\xda\x71\xb4\xdb\x71\xc0\xdb\x71\xcc\xdb\x61\xd8\xdb\x61\xe4\xdb\x61\xf0\xdb\x61\xfc\xdb\x41\x05\xda\x41\x0b\xda\x41\x11\xda\xd4\x5d\x01\x6b\x06\xe3\xdd\x77\x93\xa6\xf7\xc9\x19\xbb\xf6\xe4\xa5\xe2\x0f\x8d\xfe\x43\xa3\x5f\x5e\xa3\xbf\xda\x03\xf9\x43\x4d\xff\x50\xd3\x9b\x55\xd3\xd1\xb1\xfd\x43\x4d\xff\x50\xd3\x9b\x55\x53\x66\xbf\xf4\x87\x9e\xfe\xa1\xa7\x37\xa2\xa7\x1d\xfc\x99\xdb\x3c\x6f\xa3\x3a\xa9\xd7\xfe\xb8\x75\x2e\x2b\xb4\x47\x55\x85\x62\x12\x6a\xf4\x37\x3c\x18\x73\x6a\xab\xab\x58\x07\xfc\x5e\xfc\x50\x15\x0f\x5d\xd9\x80\x0d\xbb\xd7\xf7\x68\x1d\x6c\xd8\x7a\x21\x94\x83\xbb\x11\x9d\x9a\xe2\x2c\xe1\xf7\x39\xfc\xf8\x30\x07\x0e\xdb\xf4\x14\xc6\x12\xfe\x2f\x82\x9d\xc4\xe5\xf1\x34\xb3\x42\x7d\xe7\x4d\xf1\xff\xbd\xe7\xf1\x8f\xc5\x40\xd1\xd8\x97\xa1\x8c\x90\x0c\xad\x48\x06\x0b\x6f\xd1\xfd\xdf\x52\xa0\xc9\x94\x43\x65\x8c\x04\x87\x42\x42\x76\x6a\x45\x36\x9c\x0b\xf4\xba\x02\xee\x8f\x91\x42\x38\xa7\xa8\x67\x56\xa8\xa7\x53\x58\x8a\x4c\x39\x54\x36\xd2\x1b\x0b\x09\xd9\xb9\x15\xd9\x59\x00\x0b\x92\x29\x87\xca\x46\xb2\x63\x21\x21\xbb\xb0\x22\x3b\xf7\x05\x7a\x5d\x01\xf7\xc7\x48\x61\xde\xeb\xfa\xd2\x0e\xb5\x42\x1d\xe7\x80\x3e\xce\x21\x85\x9c\x0b\x1a\x79\x67\x45\x76\xa1\xd0\xc8\x05\xa0\x91\x0b\x48\x23\x17\x82\x46\xae\xac\xc8\x2e\x45\x8d\x5c\xb2\x1a\xb9\xe4\x34\x72\xd9\x6b\x64\xe0\xdb\xcd\x6b\x85\x4a\xde\x01\x2a\x79\x07\xa9\xe4\x9d\xa0\x92\x81\x9d\x3d\x59\x29\x74\x72\x05\xe8\xe4\x0a\xd2\xc9\x95\xa0\x93\x81\xa5\x51\xf1\x45\xad\x24\x9f\xac\xb8\xbf\x44\x23\x5c\x9e\xd2\xd4\xf5\xcf\x15\xf3\x45\x13\x17\x05\xb4\x88\x51\x26\x5c\x1e\xd2\x72\xd6\x00\xe1\x8a\x29\xad\xc0\x76\x03\x97\xcc\x68\x09\x3b\xb3\x71\xc5\x9c\x56\xb0\x73\x0f\x57\x2c\x68\xc5\x7c\xe0\x6c\xd9\x97\x88\x7c\xdc\xd1\x8a\x85\xc8\xc7\x8a\x56\x2c\x07\x3e\x82\xbe\x7b\x77\x22\x23\x41\xdf\xcb\x95\xc8\x49\x30\xf4\x93\x4a\xa9\x3e\xba\xfe\x79\xf8\xa4\x40\x4b\x02\x52\xc2\xf1\x56\x1f\xdd\x90\x14\xf3\x22\xaa\x8f\xee\x94\x94\x53\x09\xd5\x47\x77\x46\x0a\x78\x01\xd5\x47\x77\x4e\xca\x79\xf9\xd4\x47\x77\x41\xca\xe7\x03\x4b\x4b\x5a\x20\x72\x70\x47\xca\x17\x22\x07\x2b\x52\xbe\x1c\x38\x08\x68\xa7\xee\x44\x16\x02\xda\xb7\x95\xc8\x43\xd0\xf7\x0e\x0b\x86\x5c\x31\x71\x83\x33\x1b\x12\x66\xb8\xa1\xf5\x21\x57\xcf\x0a\x86\x02\x4c\x39\x00\x2c\x21\x5a\x33\xe3\x6a\x58\x51\x51\x80\x39\x07\xc0\xca\x8c\x02\x2c\x38\x80\x39\xc3\xf6\x92\xaf\x91\xf9\xbe\xe3\x00\x16\x32\xdf\x2b\x0e\x60\xc9\xf0\x1d\xf8\xbc\x4c\x64\xc6\x03\x5e\x6a\x8c\xa4\xb5\xe1\x44\xb7\xce\x6e\xd5\x9b\xab\xb3\x17\x76\xe8\x3a\x4f\xfe\xf5\x7d\xba\x6e\xd3\xf0\x36\x6e\x5d\xb7\x49\x79\x39\xcf\xae\xdb\xf8\xbc\x8d\x73\xd7\x6d\xb4\xde\xc6\xbf\xeb\x36\x76\x2f\xe7\xe2\x75\x9b\xc5\xb7\xf1\xf2\xba\xcd\xe9\xdb\x38\x7a\xdd\x66\xf8\xe5\x7c\x3d\xbc\xa3\x7f\x1b\x77\x0f\x47\x10\xde\xc6\xe3\xc3\x11\x8b\x17\x76\xfa\xea\x0c\xf2\xfb\xb0\x85\x85\x5d\x3f\x6c\x06\x15\xde\x1f\x36\x54\xa2\x03\x88\xed\x8b\xc2\x07\xc4\x16\x40\xe1\x06\xe2\x39\x2a\x7a\x82\x78\x6a\x29\x9c\x41\xac\xfc\x0a\x7f\x10\xab\xa7\xe8\x12\x12\xad\x52\x78\x85\x64\xdc\x15\x8e\x21\x19\x19\xc9\x37\xc4\xc2\x14\xdd\x43\x2c\x4b\xd0\x43\xc4\xa2\x84\x9d\x44\x2c\x49\xc1\x4f\xc4\x82\x84\x5d\x45\x2c\x47\xd8\x5b\xc4\x62\x14\x1c\x46\x2c\x45\xd8\x67\xc4\x42\x84\xdd\x46\x2c\x43\xc1\x73\x24\x22\x84\x9d\x47\x22\x41\xd8\x7f\x24\x02\x94\x5d\x48\x2c\x41\xe1\x60\xc1\x58\x65\x72\x30\xb1\x40\x0d\x3e\x26\x96\xac\xca\xcd\xc4\x22\x36\x78\x9a\x58\xd6\x06\x67\x13\x0b\x5d\xe5\x6f\x62\xe9\x1b\x5c\x4e\x3c\x0c\x06\xaf\x13\x8f\x87\xca\xf1\x24\x03\x63\xf0\x3d\xc9\x08\x29\xdc\x4f\xfd\x77\x42\x37\x8b\x6f\xd5\xff\xcc\xe2\x17\xf6\x3f\xb3\xf8\x2d\xfc\xcf\x2c\x7e\x2b\xff\x33\x8b\x5f\xd2\xff\xcc\xe2\xb7\xf2\x3f\xb3\xf8\xad\xfc\xcf\x2c\x7e\x49\xff\x33\x8b\xdf\xca\xff\xcc\xe2\xb7\xf2\x3f\xb3\xf8\x25\xfd\x4f\xfc\x51\xeb\x6d\xfc\x4f\xfc\x11\xed\x6d\xfc\x4f\xfc\xd1\xee\x85\xfd\xcf\x2c\x86\xfc\x4f\x6c\x61\x61\xff\x13\x9b\x41\x85\xff\x89\x0d\x95\xe8\x7f\x62\xfb\xa2\xf0\x3f\xb1\x05\x50\xf8\x9f\x78\x8e\x8a\xfe\x27\x9e\x5a\x0a\xff\x13\x2b\xbf\xc2\xff\xc4\xea\x29\xfa\x9f\x44\xab\x14\xfe\x27\x19\x77\x85\xff\x49\x46\x46\xf2\x3f\xb1\x30\x45\xff\x13\xcb\x12\xf4\x3f\xb1\x28\x61\xff\x13\x4b\x52\xf0\x3f\xb1\x20\x61\xff\x13\xcb\x11\xf6\x3f\xb1\x18\x05\xff\x13\x4b\x11\xf6\x3f\xb1\x10\x61\xff\x13\xcb\x50\xf0\x3f\x89\x08\x61\xff\x93\x48\x10\xf6\x3f\x89\x00\x65\xff\x13\x4b\x10\xf6\x3f\xb1\x1c\xf5\xfe\x27\x16\xa8\xc1\xff\xc4\x92\x55\xf9\x9f\x58\xc4\x06\xff\x13\xcb\xda\xe0\x7f\x62\xa1\xab\xfc\x4f\x2c\x7d\x83\xff\x89\x87\xc1\xe0\x7f\xe2\xf1\x50\xf9\x9f\x64\x60\x0c\xfe\x27\x19\x21\x7b\xff\x93\x39\x00\xe4\xa6\x87\x5b\xf5\x3f\xd3\xc3\x0b\xfb\x9f\xe9\xe1\x2d\xfc\xcf\xf4\xf0\x56\xfe\x67\x7a\x78\x49\xff\x33\x3d\xbc\x95\xff\x99\x1e\xde\xca\xff\x4c\x0f\x2f\xe9\x7f\xa6\x87\xb7\xf2\x3f\xd3\xc3\x5b\xf9\x9f\xe9\xe1\x25\xfd\x4f\x7c\xae\xeb\x6d\xfc\x4f\x7c\x8e\xec\x6d\xfc\x4f\x7c\x6e\xed\x85\xfd\xcf\xf4\x00\xf9\x9f\xd8\xc2\xc2\xfe\x27\x36\x83\x0a\xff\x13\x1b\x2a\xd1\xff\xc4\xf6\x45\xe1\x7f\x62\x0b\xa0\xf0\x3f\xf1\x1c\x15\xfd\x4f\x3c\xb5\x14\xfe\x27\x56\x7e\x85\xff\x89\xd5\x53\xf4\x3f\x89\x56\x29\xfc\x4f\x32\xee\x0a\xff\x93\x8c\x8c\xe4\x7f\x62\x61\x8a\xfe\x27\x96\x25\xe8\x7f\x62\x51\xc2\xfe\x27\x96\xa4\xe0\x7f\x62\x41\xc2\xfe\x27\x96\x23\xec\x7f\x62\x31\x0a\xfe\x27\x96\x22\xec\x7f\x62\x21\xc2\xfe\x27\x96\xa1\xe0\x7f\x12\x11\xc2\xfe\x27\x91\x20\xec\x7f\x12\x01\xca\xfe\x27\x96\x20\xec\x7f\x62\x39\xea\xfd\x4f\x2c\x50\x83\xff\x89\x25\xab\xf2\x3f\xb1\x88\x0d\xfe\x27\x96\xb5\xc1\xff\xc4\x42\x57\xf9\x9f\x58\xfa\x06\xff\x13\x0f\x83\xc1\xff\xc4\xe3\xa1\xf2\x3f\xc9\xc0\x18\xfc\x4f\x32\x42\xf6\xfe\x27\x7b\xb2\xd7\x6d\x6f\xf6\x38\x65\xfb\xd2\x27\x2a\xdb\x37\x39\x54\xd9\xbe\xd9\xb9\xca\xf6\x45\x8f\x56\xb6\x6f\x76\xba\xb2\x7d\xb3\x03\x96\xed\x8b\x9e\xb1\x6c\xdf\xec\x98\x65\xfb\x66\x27\x2d\xdb\x17\x3d\x6c\xd9\xbe\xdd\x79\xcb\xf6\xed\x8e\x5c\xb6\xaf\x70\xea\xb2\x05\x0f\x5e\xb6\xea\xb3\x97\xad\xe6\xf8\x65\x0b\x9d\xc0\x6c\x35\x87\x30\x5b\xcd\x39\xcc\x16\x3a\x8a\xd9\x6a\x4e\x63\xb6\x9a\x03\x99\x2d\x74\x26\xb3\xd5\x1d\xcb\x6c\x75\x27\x33\x5b\xf8\x70\x26\x16\xa6\xe8\x80\x62\x59\x82\x0e\x28\x16\x25\xec\x80\x62\x49\x0a\x0e\x28\x16\x24\xec\x80\x62\x39\xc2\x0e\x28\x16\xa3\xe0\x80\x62\x29\xc2\x0e\x28\x16\x22\xec\x80\x62\x19\x0a\x0e\x28\x11\x21\xec\x80\x12\x09\xc2\x0e\x28\x11\xa0\xec\x80\x62\x09\xc2\x0e\x28\x96\xa3\xde\x01\xc5\x02\x35\x38\xa0\x58\xb2\x2a\x07\x14\x8b\xd8\xe0\x80\x62\x59\x1b\x1c\x50\x2c\x74\x95\x03\x8a\xa5\x6f\x70\x40\xf1\x30\x18\x1c\x50\x3c\x1e\x2a\x07\x94\x0c\x8c\xc1\x01\x25\x23\xa4\x72\x40\x69\x62\x68\xf6\x56\x3a\x9f\x82\x0a\x48\x72\x0b\xa5\x88\x1e\x32\x25\x91\x84\x9f\x42\x22\xd4\xa6\x28\xe1\xbc\x77\x43\x1e\xb5\x1e\x11\x8a\x70\xae\x68\x31\xd7\x3e\xa6\xbe\xe1\x5f\x20\x09\x95\x58\xb6\x45\xfc\xf8\x03\xfe\xdf\x33\x43\x55\x09\xdf\x27\xc7\x06\x93\x1d\xd3\x44\xd6\x75\xc6\x64\xb5\xee\xfe\x60\xba\x3c\x1d\x85\x32\x24\xbc\x06\xb2\x5d\x73\x44\xaf\x4f\x96\xad\x6a\x4e\x44\x06\x21\xa1\xb2\xe4\xa4\xd6\x3b\x86\x65\x3b\xf4\xac\xa9\x92\xb2\x83\xef\xe4\xe5\x34\xd5\x3a\x6f\x8e\x6e\xb1\x77\x9b\xc7\x12\x7d\x57\xc4\xf1\x47\x59\x30\x6c\xb6\x42\x7f\xfe\xb1\xc7\x84\x33\xf4\x8e\x78\x48\xc2\x5e\x7d\xe3\xe5\xd8\x9a\xbe\x44\xc3\xfd\xf5\xd3\xd8\xaf\xbe\xe0\x68\x8f\x91\xf0\xc3\xb5\xbf\x96\x29\x25\x0a\x86\x33\x0d\xcc\x15\xcc\xd6\xa7\xdd\x0e\xd5\xf5\x84\xff\x93\x21\x33\x94\x40\xf9\xd8\xe3\xfd\xde\x8f\xef\x40\xae\x69\x3b\x55\xcf\xff\x14\xfb\x68\xb5\x5b\x98\x9b\xaa\x7a\x2c\x00\x1d\x8d\x24\x92\x7c\x5f\x4c\x98\xdf\x0c\x62\xf2\x27\x88\x62\x85\xe2\xfd\x12\xe4\xb2\x6b\xa4\xec\xdd\x6e\x86\xa6\xfb\xa9\xa1\x9d\xaa\x6b\x2c\xc4\xd1\x88\xfc\x21\xaa\xf2\x24\x3f\x4c\xf8\x3f\x19\xdc\x43\x09\x98\x51\x9f\x66\xe7\x04\xd8\xa0\xed\x94\x7d\xdc\x47\xfb\x70\xb7\x33\x37\x55\x75\x53\x00\x3a\x1a\x49\xc4\x51\x7e\x40\xd5\x84\xfb\x8b\x41\xde\x17\x80\x88\xc2\x18\xc5\x08\xe4\x95\x34\x53\xf6\x12\x6d\x77\x3b\x45\x2f\xd9\x96\xaa\x4e\xf2\x30\x47\x1d\x81\xce\x70\xba\x49\x4e\xd2\x55\x36\xc7\xb3\x45\x8e\xbf\xbe\x55\x8c\xf6\xd1\x29\x6d\x98\x56\xb3\xc5\x2c\x9a\x41\x99\xf4\x79\x7b\x4e\xc9\x59\xd2\x62\x9b\x38\xec\xf4\xe9\x79\x96\x4b\xf8\xc5\x40\x5e\xe0\x28\xa4\x62\x19\xeb\x5f\x90\x70\x2b\x54\x97\x45\x5e\x27\xf7\x48\x9d\xde\x79\xc8\xed\xd7\xae\x87\xd0\x8f\xf0\x6e\x42\x57\xd4\xd5\x1d\x13\x7c\x87\x78\x78\x46\x41\x26\xa3\x66\x68\x5f\x54\x99\x4b\xdf\xb9\x32\xe7\x9a\x26\xa9\x5f\xa9\x7b\x22\x3c\x8a\xc0\x67\xf4\x0d\x87\x57\x10\x94\x63\x27\x0c\x4f\x92\x45\x07\xfa\x44\xd3\xb0\x91\x63\xda\xa4\x49\xb9\x1e\xf3\xa2\xb7\x1b\x6d\x9d\xb8\xee\x73\x99\x81\xe7\x1f\xad\xd3\x93\xb2\x03\xcd\xa6\x18\x75\xbc\x60\x5e\x4f\xe4\xb7\x5a\x24\x98\xcd\xb3\x22\xe3\x33\xa3\xea\xf1\x3d\x0b\x53\x2f\x8d\xc4\xa6\xd7\xbc\x8e\xae\xb1\xd6\xa3\xb6\x8c\xf2\xf8\x6c\x91\x4d\x53\xd4\x71\x9a\xca\xde\x4a\x37\xb9\x59\x3e\xdf\x6d\xa7\xfb\x31\xe1\xbd\x2f\xb1\x35\xbc\x1f\x55\x9e\x1a\xb7\x4c\xa3\x1d\x3a\xe2\xb7\xf6\xce\x7c\xde\xfe\xa2\x8c\x76\x49\xf3\x88\x13\xc8\x0a\xfd\x2a\x7e\x7b\x42\xbb\x4e\x1c\x4f\xa6\x79\x7d\x93\x21\x01\x3f\x57\xfc\x6b\x85\xa2\xb8\xc8\xd3\xc7\xcf\x67\x95\x8d\x36\x62\x84\xf2\xf6\x93\x77\x02\x78\x78\xfc\x16\x45\x67\x76\xfa\x77\x29\xb2\x53\xda\x24\x65\x8a\x3e\x7f\xec\x5f\xe0\xda\x45\xe9\xee\xbb\x90\x26\x65\xfe\xc1\x09\xcb\xf6\x23\x88\x0a\xeb\x02\xd1\xa8\xfb\x28\x3d\x21\x1b\xb5\xe0\xb9\xc7\x2f\x66\xf1\xb2\x70\xab\x6e\x91\x14\xde\xc0\xc2\x51\x2a\x0c\x45\x1e\x60\x60\x1f\x7d\xc0\xdc\x12\xcb\xea\x3a\x9d\xcd\xfa\xde\x09\x3f\x8a\x6f\x40\xc0\x40\xe2\x8b\x28\x02\x19\x37\x3d\x00\x94\x96\x56\xa4\x24\x28\x20\xbf\xbd\x40\xad\xce\x00\x6a\xa1\x15\xb5\x50\x4d\xcd\xbb\x5b\x8a\xd4\xc8\xcb\x08\xdc\xc3\x19\xe0\xbb\x19\x73\x39\x47\xb9\xbf\x11\xd3\xf1\x73\x63\x57\x37\x51\x93\xec\x9e\x8a\x5a\x5a\x02\xa9\x0d\x22\x8b\x10\x90\xea\x97\x2e\xb1\x65\xeb\xf8\x20\x23\x7c\x59\x7a\x98\x98\x81\xea\x6c\xe2\x11\x7b\x80\x5f\xcf\x72\xd3\xc3\x4f\xc6\x46\x76\x2d\x58\x98\x28\x8e\x8b\x5c\x6e\xc6\xfe\xbd\x6d\x72\x18\xcf\xb6\x11\x5a\xd6\xd9\xb5\x2c\xaa\x5a\x18\x58\xec\x9a\xd9\xb2\x68\x4c\x7e\xa9\x95\xba\xc8\xa0\x9e\x0f\x5b\x56\x19\xb6\xfa\x94\xf3\xe2\x6b\x1f\x74\xb6\x80\xe9\xb2\x8d\x04\xa8\x8d\xdc\x36\xb9\xce\xca\x4a\x8c\x5e\x69\xa5\x55\xed\x25\x89\x68\x91\x00\x44\xdd\x3a\xb3\x59\x1d\x02\xef\x2e\xa0\x06\x4c\x9a\x5e\xba\x79\xa0\x57\x77\xdb\x19\xc1\x8d\x21\x31\xb2\x81\xfc\x64\x4b\x08\x0d\xe2\x54\x1a\x44\x88\xc2\x53\x06\x31\x3d\x7c\xdd\x20\x8e\xed\xbf\x7e\x10\xd3\x83\xcd\x20\x4e\xbd\x00\x47\x5f\xc7\x61\xc4\x34\xcf\x50\xa4\x15\x57\x37\xa8\x6d\xd4\xb9\xdf\x3d\x4e\x21\x8e\x68\xf7\x05\xc8\x3a\x0a\xb6\xe6\x9e\x4b\x62\xda\x7b\xbd\x5f\xe3\x30\x85\x74\xf5\xe7\x5d\x2d\xc0\xef\x91\x9b\xf0\x89\xa2\xa8\x7e\x88\xeb\x8f\xf0\x2a\x16\x8b\x85\xbc\x03\x3c\xf4\x29\xda\xd6\x45\x7a\x6a\x90\x2c\x03\x21\xb7\xb0\x2c\x18\x82\x6a\xdd\x79\x7b\xe4\xa5\x91\x11\x2b\xb1\x9e\x02\x30\x7e\xf4\x44\xf1\xde\x82\x08\x07\xc8\x0a\x7e\x0d\x4c\x6e\xfa\x03\x40\x95\xed\x4a\xff\x88\x0f\xef\xbd\x21\x14\x77\x5e\xde\x59\xa9\x0a\x14\xb0\x0f\xd6\xf0\xe6\xa6\x8f\x36\x72\xa5\x34\x10\x24\xac\x1f\xa1\xfc\x88\x46\x85\x4a\x14\x35\xeb\xbc\xa0\xbf\xd8\xba\x41\xa4\x3b\xd4\x0d\xa5\x43\x1e\xbb\xf7\xe6\x0b\x7e\xab\xca\xb4\xa0\x86\x83\x58\x36\xa7\xff\xb1\x31\x42\x5c\xbc\x63\x54\xf7\x5d\x71\x04\x97\x6e\x22\x54\x9e\xea\xa6\x60\xec\x21\x57\x29\x8e\x1c\x58\x2d\xc8\x5d\x07\xc3\x4d\x95\xf9\x6e\x7b\x37\xdf\x5d\xd4\xe0\x67\x69\xb7\x26\xc3\x4b\xb6\x89\xc7\xbe\x81\x50\x40\x31\xa7\x68\xbf\x40\x91\x86\x97\xbe\xf4\x2c\x45\x37\x4e\x55\xfa\xdd\xbb\x38\x6a\xa2\x35\xfe\xfb\x53\x7d\x7f\xf8\xa1\xcd\xd2\xcd\xee\x18\x55\x35\x6a\x7e\x3c\x35\xfb\xbb\xc9\xfb\xe9\x5f\xeb\xfb\x83\xd3\x66\x69\x5e\xff\xf8\xe1\xd8\x34\xe5\xfa\xd3\xa7\x87\x87\x07\xef\x61\xea\x15\xd5\xe1\x53\xe8\xfb\x7e\xd7\xf2\x83\x73\x9f\xa0\x87\xbf\x14\xed\x8f\x1f\xf0\x37\x7a\xe7\xee\xc3\xfb\xe9\x7f\xbc\x9f\xfe\xb5\x8c\x9a\xa3\xb3\x4f\xd2\xf4\xc7\x0f\xef\xc3\x29\xe9\xc7\x07\x27\xfe\xf1\xc3\x2f\xa1\x37\x75\x16\xde\x72\xfa\xb3\xb7\x70\x66\xde\x7c\xba\x73\xbd\x99\x1b\x78\xfe\xcc\x9b\x2d\xdc\xc0\x9b\x75\x5a\xe1\x7a\x77\x69\xe0\x05\x4e\xf7\xe7\xd4\x9b\xb9\x53\xef\x6e\xe7\x2d\x5c\x6f\x31\x75\x82\xee\xdf\x70\xe9\x04\x5e\xe8\x2d\x53\x77\xe6\xcc\xbc\x45\x87\x62\xea\xcd\x5d\xef\x0e\xa3\x0a\xbc\xe0\xb7\x0f\x9f\x08\x1f\x1d\x93\xef\xa7\xff\xf1\xee\x23\x91\x15\x9d\x18\xb0\x8e\x8d\x95\x80\x8e\x0d\x95\xb0\x8e\x09\xd5\xa0\x8e\xc1\x30\x9c\x8e\xed\xfd\x28\x9e\xa1\x8b\x1a\x5c\x8c\xfb\x41\xf0\x4a\x1d\x23\xd0\x1b\x08\x85\x6a\xa3\xa9\xe6\xbb\xb7\x31\x37\xa1\x60\xa4\x13\x44\xc1\x66\xde\xcc\x99\x7b\xd3\x70\x76\x74\xbd\xbb\x7b\x37\xf4\x66\x8b\xa3\x77\xf7\x5b\xe6\x77\xea\x14\x76\x85\xff\xef\xdc\xbb\x5b\x75\x65\xbf\x4c\xbd\xe5\xc2\x5b\x4c\x7f\xf6\xfc\x99\xb3\xf4\xfc\xe5\x7c\xe7\x7a\x41\x30\xf7\x42\xcf\x0f\x16\xde\x2c\x9c\x7b\x61\xf7\xcf\xe2\xb8\xf4\xa6\xab\xe5\xce\x0b\x67\xa1\xe3\x3b\xde\x74\x19\xba\x5e\x18\x2e\xbc\x70\x7e\xe7\x76\xf5\x7f\x5d\x78\xcb\xb0\xd3\xe7\x55\xd8\x11\x9f\x2d\x9d\xd0\x5b\xae\x9c\x99\x17\xce\xa7\xde\x62\x8a\xb1\x4e\x5d\x2f\x58\xce\x5c\x6f\xba\xa2\x3f\x66\xab\x99\xe3\xab\x34\x95\x58\x7b\x58\x51\x87\x3a\x40\x4f\xfb\x3a\x58\x4d\xf9\x5a\x50\x4b\x41\x10\x4e\x49\xe3\xd5\x7c\x3a\xdb\x5f\x94\xd0\x82\x8e\x42\xe0\x4a\x15\x25\xc0\x1b\x08\x03\xa4\xa2\xf1\x7e\xb9\x5f\xaa\x39\xa1\x85\x2f\xae\xa3\x83\x1e\x12\x4e\x19\xa5\x75\x43\xc7\x0d\x9d\xa5\xb3\x64\xd5\xb6\x6e\xaa\xe2\x0b\xe2\x1a\x74\x8a\xeb\x3b\x7e\x3a\x75\xa6\x99\xef\x4e\x7f\xf6\x9d\x69\xaf\x18\xbb\xa4\xda\xa5\xc8\xa9\x7e\xfc\xe0\xcd\x85\xb2\x5d\xfb\xe3\x87\xe9\x07\xb8\xea\x51\x5d\x45\x5a\x41\x10\x8c\x12\x62\x39\x0a\xae\xd3\x33\xbf\xc8\x81\x9f\x62\xad\x8a\x07\x87\x7f\x95\x83\x2f\x86\x20\x99\x88\x2d\x71\xc9\x88\x8b\x32\x54\xe0\x42\xfc\x24\x5d\x3d\x54\xf5\xd8\xb9\x06\x32\x20\xd7\x71\x76\x1a\x31\x47\x2b\x34\xd9\xb6\xd8\xc6\xfc\x3b\xa7\xcf\x27\xbb\x97\xe8\x36\x87\xbc\x8c\x76\x5f\xc4\xf2\x7f\x9e\xea\x26\xd9\x3f\xba\xfd\xdb\x6e\x22\x7e\xb6\x8d\x02\x56\x8a\x14\xca\x92\x26\x1b\xa8\x97\x11\xd9\x57\x9d\x6a\xbe\x79\xbd\xb5\x91\xae\xf8\x8d\x8d\x7b\x7a\x77\x3c\xb7\xbd\xd1\xed\x77\x20\x84\x7d\xc8\x52\xb3\xc3\xea\x9b\x31\x86\xff\xcc\x9e\x14\x57\xe3\x26\xb3\x48\xdc\x66\xda\xb3\x88\xe7\xee\x1f\x93\xb0\x2f\x66\x86\x59\xf3\xee\x9c\xaf\x14\x25\x14\x0b\xd0\x40\x0b\x7b\x7e\xf1\xc5\x2d\x8e\x36\xfb\x8e\xa5\xf8\x60\x10\x87\x9f\xf7\x7b\xfe\x18\xdc\x01\x56\x3b\x2a\xbc\xd4\xdc\x24\x8f\x93\x5d\xd4\x14\x95\x18\x3b\xd9\xe8\x5e\xe6\xe6\xc6\x48\x3c\x1c\x88\xda\x86\x2a\x90\x40\xba\xf3\xcf\x7a\x2f\x53\xe1\x7c\x9e\xb1\x2a\x5c\x2e\x38\x38\x09\x72\x20\x3c\x98\x2b\x7f\xe9\x60\xde\x47\xed\x95\xfd\x98\x34\xc8\xc5\x2f\x54\xae\xf3\x02\xdb\x60\xd0\x70\x0c\x63\x70\xaa\x51\xe5\x92\x88\x20\x3d\x06\x90\x15\xbf\x41\xa5\xb5\x5c\x28\x15\x48\x47\x00\xd8\xaf\x2f\xc0\x4b\xb6\xc2\x61\x86\xb7\x7c\xbf\x14\x0f\x03\x7d\xcd\x1f\xff\x24\x87\x79\xc0\x67\xfa\xbb\x7a\x8f\x01\x15\x1e\xe6\xdf\xc8\xdf\xd7\xf1\xb2\xea\x3b\x61\xd9\x92\x53\x11\xe1\x24\x08\x96\x93\x30\x58\x4c\xbc\x10\x9f\x8c\xb0\x03\x24\x94\xc7\xaf\xc1\x1d\x71\xcd\x97\xdc\xe1\xeb\xaf\xb7\x98\x93\xa6\xfd\x49\xc5\xae\x21\xf9\x7d\x06\x0f\x83\x5c\x22\x9e\x52\xff\x8e\xfa\xaf\x7d\xc9\x67\x27\x22\x41\x75\x12\xf5\x74\xd1\x3d\xca\x9b\x7a\x14\x8f\x5b\x56\x49\x16\x55\x8f\xfa\x53\x41\x7e\xb8\x9c\xc7\x77\xc2\xde\x87\x14\x72\x58\xe8\x60\x18\x70\xcd\xa3\x68\x2e\xe2\x0a\xe6\xb3\xd5\x96\xc3\xc5\x0c\xdc\x80\x9e\x0c\xe0\x55\xc3\x66\x3b\x6a\x74\xd0\x06\xea\xdc\xe0\x0d\x0c\x0c\x83\xf8\x74\x19\xb1\x63\x3b\xe0\xed\xcb\xea\x63\xf1\xf0\x13\xcf\x47\x55\x94\x71\xf1\xd0\x2d\x48\x87\x43\x8a\xec\x64\x0b\x9e\x1b\x52\x4b\xbc\x46\xbb\x22\x8f\x19\x2d\xe8\x5f\x95\xb5\x38\xf9\x81\xcf\xb3\x71\x48\x78\x25\x50\xa2\x42\x8b\xee\x3f\x02\xb6\x28\xee\xfe\x23\x20\x64\x35\x61\xa4\x62\xad\x0b\xfe\x6c\xd2\xff\xd7\xa0\x0d\x3c\xa4\xc8\x05\xaf\x11\x23\x23\x1a\x9d\xb0\x11\x17\xa7\x0f\x23\x56\x59\x23\x18\x4e\x60\x9d\x30\x8a\xda\x42\x2d\xd8\x01\x48\xf2\x7d\xa1\xd7\xb7\xf9\x76\xe7\xc7\x22\x0a\x52\x38\xa2\xb0\x31\x0a\xd3\x60\xeb\xc7\xa2\x51\x08\xa3\x68\x1b\x87\x23\x22\x56\x0f\x30\x62\x5b\x15\x58\x05\x93\x60\x15\x4e\xc2\x30\x34\x68\x00\x0f\xc8\x50\xe6\xc7\x1e\x13\xd7\x0c\xbb\x95\x58\xb8\x71\xc7\x18\xe5\x21\x27\xb4\xaf\xb1\x00\xbd\x20\x2d\x86\x9a\x15\x6f\x1f\x93\xd7\x8f\xb6\xfa\x43\x00\x87\xc5\x66\xc0\x67\xb3\x55\x3c\x9b\x09\xb8\x66\xc1\x6a\x31\x0b\x38\x5c\xdc\xdc\xa7\xe8\xad\x87\x3d\x9c\x04\x77\xb3\xc9\xca\x38\xea\x2c\x1c\x4f\x5d\x98\xf3\x94\x01\xdd\xd0\x5b\xca\x88\x9f\xf5\x14\x2f\x30\xe7\x7b\x3e\xae\xd1\x81\x5e\xb6\x16\x3a\xc0\x4a\xbc\x0f\x9b\x6b\x71\x6b\x02\xf5\x1c\x16\x1b\x1d\x40\xbb\xd5\x32\x10\x0d\x24\xda\xae\xa6\xc1\x82\xc3\xc5\xea\x40\x8f\xde\xda\xfa\xcf\xfc\x49\xb0\x9c\x4e\x96\x77\x26\xe3\xcf\x01\xf2\xf4\x79\x2d\xe8\x59\xd0\xd9\x7d\x4b\x29\x71\x5a\xd0\xe3\x95\xb5\x60\xe0\xe3\x1a\x2d\xe8\xa5\x6b\xa1\x05\xac\xcc\x69\x5c\x5a\x8b\x5a\x13\x0a\x67\x91\xd8\xe8\xc0\x6e\x35\xf5\x43\x71\xbe\xec\x82\x10\x85\x11\x8b\x8a\x55\x01\x8a\xdc\x5a\x03\x82\xe5\xe4\x6e\x3a\x59\xae\x4c\x0a\xc0\xc2\x71\xb4\xf9\xe1\xa7\xe4\x35\xa3\x6f\x29\x1e\x6e\xf0\x29\x56\x79\xec\x7b\x1e\xae\x19\xfa\x5e\xa8\x16\x43\xcf\x8a\x9a\x6e\x8c\xc4\x2d\x41\xef\xd8\xc2\xd8\x2c\x9e\xec\x07\x7c\x61\x81\x94\xdd\xbe\xc1\xe0\x5f\x0b\x38\x59\x95\x11\xc9\xbd\xc2\x3e\x42\xe4\x86\x57\x22\x91\xa1\x71\x73\xa8\x92\xb9\x24\x5d\x98\x0c\xab\x53\x22\x11\x59\xb9\x24\x26\xaf\xdb\x6c\x58\x0e\x88\xb4\xbd\xd8\xed\x76\x5f\xaf\x4e\x83\x27\x2d\x91\xb1\xb2\x3b\xbb\x9d\x35\x3e\x48\x93\x5e\x7d\x1f\x22\x73\x05\x6b\x14\xb0\x2f\x81\xa5\x6e\x50\x28\x78\x7f\x22\x53\x51\x2b\x95\x71\xbf\xf2\xe4\x91\x61\x37\x26\xbd\xaf\xfd\xb5\xea\xc4\xba\xe7\x2c\x1d\x1b\x65\x32\xfa\xfb\x2c\x42\x48\x9b\x5e\x6f\x37\xc3\x71\x02\x6b\x10\xbf\xbb\x51\x8a\xd9\xa0\x3f\xd2\x16\x87\x43\xaf\xd6\x9a\xeb\xb7\x3c\xd6\xd2\x17\x36\x39\xf2\x11\xa6\x27\x6a\x0e\xe3\xdd\x0b\xa4\xac\x94\xc7\xb4\x63\x10\x70\x82\xd6\xe8\xf5\x76\x46\x22\x37\x0a\x2b\x24\xee\x94\x0c\xc7\xc6\xd4\x66\x08\xd8\x2e\x89\x44\x34\x26\xe8\x29\xdb\x27\xeb\x01\x11\x37\x4c\xd2\x71\xa5\xa7\xe9\x13\xbb\x4f\x10\x48\xd9\xe8\x93\x71\xef\x21\xe0\x84\xf4\xe9\x55\x77\x59\x22\x3f\xb0\x46\x49\xbb\x2e\xc3\x21\x31\xa5\x46\x41\x5b\x2f\x91\x88\x5a\xa3\x9e\xb4\x15\xb3\x1e\x12\x7e\xf3\x25\x1f\x2e\x7a\x9a\x42\xb1\x5b\x0f\x9e\x92\x8d\x3e\x19\x77\x33\x3c\x4a\x48\x9d\x5e\x6f\xc7\x26\xf0\x02\xab\x92\xb8\x83\x33\x9c\xe5\x52\x6a\x12\xb0\x8d\x13\x48\xa8\xf5\xe8\x29\xdb\x3a\xe3\x48\xa4\x49\xfe\xe5\x2c\x7e\x8c\x04\xbd\x75\xfa\xe9\xce\x1f\xdb\x4d\x86\x5f\x5c\x87\xba\x82\xb5\x54\xa0\xde\xfc\x4a\xc2\xe2\x71\xcb\xa8\x88\x52\x70\x7d\x02\x71\xf4\x97\xf6\xcd\x80\x8c\x02\x32\x0d\x87\xcf\x1e\xb3\xdd\xdd\x6e\x23\x7e\x2e\x3c\xe5\x31\xaa\xba\x81\xd9\xd8\xf5\x48\x52\x1e\x72\x5b\x01\x00\x90\xd8\x19\x2a\x0c\x1f\x2e\x99\x4b\x2c\xf8\x4e\x18\x46\x70\xf8\xba\xdb\x31\x23\xda\x3a\x63\xd0\x8e\x57\x13\x9f\x74\x71\xaa\x43\x81\x3f\x84\x2b\xaf\xc8\x33\x30\x3f\x30\xe0\xec\xbd\x02\x7c\xda\x1e\x9f\xc9\xf8\xb5\x79\x2c\xd1\x8f\xdb\x53\xd3\x14\xf9\xe7\x11\x7a\xc2\x54\x56\xa8\x46\x8d\xa2\xae\x3e\x6d\xb3\x84\xad\x64\x8f\xc7\x79\xfb\x28\x46\xe7\xfe\x73\xab\x0f\x7d\xb4\xa6\x95\xf8\x76\xb5\xd3\xa9\x44\x54\x09\x1f\xad\x21\x08\x7d\x35\xa1\x8b\xcd\xc0\x99\xb9\xe9\xbb\x2b\xd2\x34\x2a\xeb\xf1\x14\x23\x19\xfc\xbe\x98\xc0\xf3\x57\x65\x9b\x4a\x51\x4d\x93\x1a\x14\x0f\x17\x9c\x1d\xc7\x04\x45\xd4\x60\xa0\x85\xaf\x64\x48\x47\x61\xe8\x11\x06\x7f\x48\xb7\xb0\x3e\x26\x71\x8c\x72\x48\x6c\x04\xd6\xf1\xa6\x73\xf2\xb9\x5e\x90\x99\x54\xad\xa9\xbb\x0c\x66\x71\x82\x7f\x9d\x4a\x99\xb7\x8b\x68\x3a\xd7\xeb\x68\xdf\xa0\x4a\x77\x82\xcc\x1f\x3b\xc4\xdd\x7d\x99\xca\x07\x46\xe8\xe1\x8b\xfe\x10\xcb\xbb\x77\x6c\x6e\xa9\xae\x01\x39\x37\x31\xcc\x07\x72\xf6\x64\x28\x87\x6e\xb3\x0e\xb4\x64\x10\xb9\x33\xc2\x49\x85\x0b\x95\x83\xa3\xea\x35\xc3\x9d\x2f\xe4\xb0\x1a\x49\x32\x64\x32\x94\x9f\x80\xfb\x4e\x38\x73\x96\xef\xbf\xdf\x90\x63\x3a\x9b\xdf\xdc\x24\x8f\x51\xdb\x95\xf9\x1b\x56\x49\x37\xfb\xb4\x88\x9a\x75\x07\xb6\x61\x12\xcb\xfa\xcc\x65\x60\x7a\x7e\xa4\x97\xf5\xba\xbf\x5a\xe3\x3b\xe2\x2d\xe3\x0d\xff\xfd\x92\x39\x2c\x83\xf1\xa7\x49\xdd\xd0\x9c\x1e\xb0\xe7\x83\x97\xcb\x37\xc9\x8a\xc1\x48\x34\x4e\xee\x93\x18\x55\xc3\x35\xca\xb2\x1d\x3a\x4e\xe5\x20\x4e\x22\x75\xbe\x96\x01\x69\xd2\xa0\xcc\x9c\x77\x64\x5a\xb6\xfd\x3a\xb0\x4b\x51\x54\xad\xb7\x45\x73\xdc\x28\xfc\x00\x59\xc8\x49\x7e\x44\x55\xd2\x40\x47\x92\x46\x16\x3b\xdf\x8b\x49\x1a\xc1\x71\xd8\x2f\x71\x7c\x21\xb7\xec\x06\x71\x80\x82\xfd\x06\x5a\xec\xa0\xf1\x5c\xee\x97\xfb\x95\x40\x65\x70\x4b\x78\x32\xf4\x74\x0c\xa3\x09\x96\x44\xfa\x48\x25\x4f\x64\xf4\x18\x79\x32\xf0\x7a\x0f\xdc\x4e\x34\x38\x10\xc4\x13\xe4\xe7\xa1\x90\x0c\x01\x83\x44\xe2\xe4\x1f\xc0\x89\xb1\x39\xf7\x17\xaf\x99\x34\x91\x3c\x58\x57\xc1\x64\xe4\xdc\xf4\x27\xef\x06\xa8\x23\x8a\x62\xc6\x60\x12\xf5\x12\x0e\x7f\x99\x92\x04\xf4\x7e\x01\x2f\x15\x59\x93\x18\xb2\x9d\x7c\xba\x3f\x46\xf3\xb3\x4f\x5a\x14\x6f\x88\xed\xea\xbb\x35\x66\x0d\xe0\x2d\xd1\x6a\x05\x19\x43\x2c\xc6\x0e\x01\xee\x69\x7f\xbd\x55\xce\x2d\x38\xdc\xea\x1b\x1c\xa1\x09\xe3\x13\xf5\x6b\x80\xe6\x72\xeb\x98\xc7\x84\xac\x2e\xc0\x79\x4e\x5a\x25\x1d\xeb\x64\xca\xd9\x66\x2c\xb8\xe2\xe8\xb0\xcc\x21\xe3\xbb\xe1\x0a\x7a\x71\x5a\x62\xdb\x7c\xc8\x3c\x90\x0e\x99\x07\xdc\x21\x73\xf2\x97\x92\x07\x32\xcb\x45\x4e\xe8\xdc\xef\xc7\x2c\x54\x36\xe7\xb6\x1a\x10\x7a\x53\x3d\xe3\x5c\x8f\xe4\x65\xac\x0a\x64\x0c\x0e\x90\x59\xa7\xfb\xf9\x83\x20\xeb\xb1\x50\xd2\x20\x67\xfc\x09\xb6\x62\xaa\xd4\xda\x07\x12\x05\x6a\x0d\x18\x60\x36\x94\x30\xfc\x05\x71\x7a\xbd\xb9\x6c\x89\x30\x9a\xa2\x48\xb7\x51\xf5\x42\xc7\x99\xf1\xe9\xe1\xba\x89\xaa\x46\x79\xe0\x18\x9f\x32\xa6\x20\xdc\xa1\x63\x52\xa6\x06\xe7\xf8\x57\x9f\xf1\x17\x34\x22\x2f\x9a\xef\xd6\xfb\xa4\xaa\x1b\x72\x87\x9b\xdc\xb3\x5f\xa7\x11\x5f\x20\x3a\x63\x1f\xcf\xe0\xee\x9a\x55\xb5\x11\xa7\x98\x9d\x56\x0d\x79\x25\x71\x9a\x84\x13\x1b\xd2\x81\x13\xc6\x7d\x15\x6a\x24\xca\x23\x21\x59\x0e\xdc\xdc\x11\x5d\x51\x09\x5a\xe0\xa8\xeb\x29\xc8\x10\x57\x21\xf2\x43\x47\x6b\xf4\x37\x61\x00\x8b\x31\x23\x46\xd2\x30\x44\x14\x9b\x4e\xfc\xa2\x98\x26\x4f\x41\x21\x06\x7e\x9e\x67\xf0\x28\x69\xdd\x10\xca\x8a\xf8\x95\xa3\x24\xef\x49\x24\x3b\xeb\x15\x25\xca\x25\x38\xd6\xc3\xc1\x46\x4d\xa8\x77\xeb\x32\x4d\x1a\x21\x53\x00\xcd\xae\xc7\x5d\x27\xe8\x93\x17\xa8\x91\xf4\xdb\x24\xd5\x9c\xeb\xc3\x21\x8a\xe6\x7d\x94\xc4\x92\xc5\x29\xc4\xe3\x74\x29\x78\x1e\x7d\x64\x47\x4b\x33\x3d\xd8\xd1\x1c\x32\x1a\x08\x99\x30\x24\x7f\x67\x74\x72\x5e\xc7\xa5\x61\x0d\x7d\x51\x25\x9d\x75\xee\x39\xe0\xea\xe2\xa4\x42\x3b\xea\xae\x57\x19\x53\x89\x6d\xf9\x58\xbb\x2b\xd2\x53\x96\x8f\xab\x80\x54\xa3\x80\x97\xae\xcf\xf0\x0b\x0e\x7b\x29\x06\x5a\x6c\xd8\x36\x2a\xd8\x17\xbf\x44\x73\x51\xad\xe3\x86\x05\xfe\x2c\x06\xe2\x00\x4f\x4a\xe9\x28\xfc\x64\xe1\x70\xfc\x64\xe1\x70\xfc\xa4\x75\x38\x3a\xdf\xdd\x1d\xf7\xcc\xc0\x0c\xe5\xfd\x3e\xb3\xb5\xd7\x18\x7a\xd1\x87\xd4\x18\x6a\x2b\xbb\x0c\x59\x4e\x35\x39\x9d\x71\x3e\x2b\x2d\xbd\x8d\x25\x86\x64\xfd\x0c\xeb\x22\x88\xf6\x89\x0b\xe4\x13\x70\x3d\x65\xa5\xbc\x6a\x44\xbe\x66\xd1\xbc\x66\xa0\x7e\x8d\xa3\x26\xa2\xbd\xa0\xe1\xed\xfa\x33\xc6\xec\x30\xe1\x6b\x7c\x39\x71\x5b\xb4\x9f\x27\x76\xf0\x1d\xfa\x42\x07\xcc\xb8\x07\xd7\xd2\x51\x34\x25\x24\x81\xf0\x21\x0e\xaa\x75\x96\x97\xc6\xcd\xfc\x8f\x1b\xf0\xde\x11\xeb\x86\x9b\xf7\xda\x4f\xdf\x65\xb0\x76\x8f\xa1\x29\xdc\x39\x96\x39\x18\xf6\x82\xa6\xe7\xad\xd6\x81\xb4\x81\x0e\xb8\x0d\xf4\xf0\x17\x65\xe5\xbd\x7c\x9b\x55\xc9\xd8\xe0\x47\xa9\x21\xe8\xf6\x57\x0d\xc0\x6f\xc4\xa7\x1a\x6a\x13\x53\xbe\x36\xf6\xf6\xe3\xf3\x6e\x00\x6f\xc4\x2f\x78\xa9\x45\x5b\x3d\x3a\x66\xdb\x3c\x51\xa4\x8c\xbb\xa6\xd5\x53\xd7\x4b\x0b\x7d\xb0\xbd\xc5\x0a\x20\x3b\x83\x59\xb3\xf5\xe9\x48\xcd\x17\x6d\xf9\x14\xb5\xf2\xb5\x5b\x65\xfe\xdd\x27\x86\xff\xa5\x6e\x99\x13\x5f\x3e\x25\xb5\xa5\x4c\xe6\x39\x93\x5d\x02\x8c\x43\xd9\x1e\x9f\x92\xcf\xd1\xc0\xf8\xd7\x66\x78\xc4\x28\xe1\x55\x4d\x0f\x47\x97\x30\xf6\xae\xbf\x71\xa2\xda\x4c\xcb\xeb\x26\xa1\xe4\xa7\x89\x4e\x94\x2d\x0e\xcb\x10\x91\x02\x9d\x25\x55\x11\x8c\xf1\x0e\x6c\x5a\x3c\x57\xc4\xc3\x2c\xf9\x33\xf7\x55\xd6\xbf\xca\x02\x5b\x19\x5c\xdb\x61\xb9\x4e\x05\xec\x9b\x08\xa2\xbc\x6a\xbc\xae\x63\x55\xf2\xea\x9f\x2b\xc8\xc7\x8e\xc2\x0f\x36\x32\x3f\xb3\x9f\xd1\x05\x35\x80\x3f\x7e\x8c\xf6\xc4\x07\xbf\x48\xc1\xc9\x67\xcd\xdf\x50\x00\x17\x90\x7d\x35\x8f\xfe\xcd\xfc\x86\x49\xe1\x5d\x30\x10\x70\x87\x60\x21\x57\x70\xac\x94\xbd\xc0\xb1\x4e\xe7\x00\x3e\x93\x05\x38\x73\x09\x38\xc0\x4e\x3c\xcb\xfc\x18\x3f\xd1\x6c\x8c\x52\xd3\xdb\x5a\x85\x34\xf5\x8d\x60\x29\xeb\xdb\xd0\xaf\x63\x96\x46\xfc\x3a\xb6\xae\x63\x48\x56\x04\x21\x55\xcd\x5b\x7d\xf3\xcc\x92\x7c\xf4\xe0\xa0\x10\x26\xeb\x17\xd2\x60\x27\xfe\xe2\x2c\x64\xf3\x95\x72\xc8\xc0\x19\x7d\x7b\x01\xb8\xc1\x90\x74\xc3\x87\x1b\xaf\xb1\x2f\x81\xe2\xff\x4f\x9d\x9e\xc6\xe2\x7a\x94\x02\x37\x1e\x3b\x0d\x66\xe5\x21\xd9\xce\x41\xed\x08\x4e\xc8\x9f\xd3\xee\xcf\xe1\x68\xa7\x35\xac\x82\x2b\xa2\x80\x4f\xed\xf0\xdd\x7e\x17\xed\x91\x02\x75\x7f\x7e\x42\x87\xdc\xe2\x2c\xc5\x70\x44\xe6\x3a\x22\x31\xaa\x77\x55\x52\x76\xaa\x60\x91\x5e\xda\x9c\x8e\x88\x3b\x30\x45\x9d\x55\x7a\x50\x01\x3c\xad\xd3\xd5\xf7\x4a\x8e\x55\x5c\x8e\x8a\xbc\x50\xa2\x1f\xf9\x10\x71\x1c\x3f\x35\xcd\xb2\x98\x2d\x4a\x48\x9e\x3c\xf7\xdf\xe3\x97\x8c\x15\xe5\xa3\x5c\xa9\x8f\xae\xc9\xfb\x04\x6f\xb6\xcc\xed\xed\xa6\xed\x6d\xe4\x85\xdd\xd3\xdc\x9a\x0b\x6f\xbe\x98\x79\xcb\x79\xea\x4e\xbd\xf9\xca\x99\x7a\x8b\x20\x74\x03\x6f\x3e\xbd\xeb\xfe\x77\xfe\xb3\xef\xcc\xbc\x70\xe1\x84\xde\x6a\x39\x73\x96\x5e\x38\x77\xee\x9c\xd0\x0b\x56\x53\x28\x3f\xab\x9d\x88\x3a\x13\xd8\xa0\x2a\x4b\xf2\xa8\x41\x76\x82\x32\xdc\x05\x7e\x49\x09\xce\x9c\x99\x22\x45\xe9\x20\x43\xdf\x09\x8f\x33\xb5\x38\xf0\x6e\xcf\x5a\xdd\x58\x5d\x55\xb5\xbc\x31\x45\x73\x67\x8e\x3b\x63\x54\x6d\x4c\xcc\x3a\xfd\xc0\xab\x9c\x5a\x65\x08\xf7\xb5\x5b\x37\x51\xd7\xad\xdf\x5d\xac\x4f\xd9\x53\x29\x6b\x9f\x70\x66\x4c\xb0\x3e\x86\xd6\x3f\x28\xb0\xf5\xfb\x16\x5a\x4b\x8c\xf4\x59\x91\xd0\x8e\x7b\x1e\x57\xfd\x6c\xd3\x78\x5a\x6f\xda\x47\x52\xc8\xbf\xfd\xdf\x34\xaa\x66\x08\x93\xc1\x67\x9f\x99\xb3\x9f\xdd\x82\xef\xbc\xec\x14\x9f\x83\x46\x72\x3a\x9d\xd2\xd4\xec\x8e\xff\x33\x9e\xe4\xbf\x65\xbe\xd3\xd9\xc4\xe9\x71\x26\xdb\x3f\x67\x58\xc6\xfa\x27\x01\x88\x18\x0c\x0b\xd7\x5d\xd9\x3a\x81\x5f\xb6\x1b\x75\xc5\xd3\x9e\xcc\xeb\x16\xee\xa8\x2c\x51\x54\x45\xf9\x4e\x78\xbd\x4f\x28\x17\x14\x03\xba\x16\x03\x3c\xb2\x06\xb4\xb9\xfa\xc1\x2e\x1e\xc7\x57\x9c\x73\x15\x7d\x33\x8a\x91\x7d\x92\x4e\x76\xb9\x09\x90\xf8\x38\x96\x78\x84\x62\x38\xca\x2e\xbe\xad\x48\x5e\xf6\x27\xa8\xf6\x49\x8a\x34\xdb\x18\x8b\x29\x16\x7a\x56\x0f\x87\x30\xf4\xe8\x3e\x83\x39\x02\x3f\x23\x18\x8c\xe8\xd7\xfe\x66\x9f\xa4\x0d\xaa\xd6\x51\x5a\x1e\xa3\xef\xa8\x68\x7e\xf4\x3f\x02\x1b\x13\x4c\x4a\xda\xa9\x71\x5e\xe8\x78\x74\x56\x38\x31\x3b\x17\xc8\x03\xe9\x1d\x79\xfb\x20\x9a\x87\x37\x74\x56\xc7\xfc\x69\x57\x47\xe6\x01\xc9\xad\xd3\x28\x3f\x7c\x87\xf2\x8f\xfd\x71\xa0\xe1\x7a\xc7\x5f\x8f\x45\x51\xa3\xce\xee\x20\xcf\xf3\xde\xc1\xad\xd7\x5b\xb4\x2f\x2a\xa4\x90\x3f\x3e\xbd\x30\x86\x40\xfa\x43\xc8\xf8\x77\x3f\x14\x0b\x61\x77\xf0\x95\x03\xf3\x5c\x1f\x33\x7c\xa7\xff\x82\x40\x6f\x68\x98\xa4\x47\x05\x31\x88\xef\x2f\x55\xf1\x50\xa3\x77\x17\x2f\x8f\xee\x9f\xd1\x6f\xe0\x73\xc6\x02\xef\xc9\x71\xf7\x42\x30\x75\x72\x05\x52\x75\xa4\xbd\x13\x6b\xa7\x1b\x3d\x60\x1f\x42\x19\xfe\xd6\x5d\xc9\xeb\x81\x3c\x6b\x13\x49\xda\x34\xd1\xb6\xe6\x83\xa4\xec\x93\xeb\x71\xcc\x80\x39\xf8\x17\xbe\xf4\xc1\x77\x96\xc4\xb8\x78\x30\xdc\x53\x6d\x22\x57\x55\x10\x9d\xff\xba\x22\x06\x67\xfb\x09\x24\x53\x63\xc5\x25\xd4\x00\x97\x33\xa9\x32\x3a\xc3\xbf\x40\x57\x75\xf2\xb4\xbf\xe0\xcc\x5d\xb0\x90\x65\x89\x2f\x54\x8c\xf4\x20\xfe\x3d\xfe\x16\xc9\x15\x0f\x9f\xc6\x31\x19\x44\x87\x2c\xa6\x23\x6a\xfe\x6e\x82\x78\xcc\xe9\x29\xe7\x7c\x3a\xdc\x65\x92\xa6\xf2\xf8\x43\x43\xc7\x40\x2a\x85\x20\x60\xf3\xe4\xbb\x34\x54\xa9\xe9\x9b\xd3\x9a\x28\x57\x87\xa3\x73\xdb\x18\x15\x7e\xb6\xb3\x13\xd2\x67\x5c\x42\x8e\x7c\x6f\x4f\x3a\x17\xfc\x2a\x9a\x78\x49\xe6\x68\xe2\x12\xfe\x2f\x80\x66\x13\x6d\xfb\x6f\xfb\x3f\xe1\x3f\xca\x28\x17\xaf\x6e\x72\x30\x54\x9c\xc2\xf5\x9e\x3c\xba\xdf\x46\xd5\x8b\x9e\x7b\xb9\x91\xc3\x15\xf2\x82\xd6\xf7\xde\xdd\x56\x9d\x3b\x08\xba\x66\x9c\x1f\x18\x82\x6e\x60\xa8\x88\x09\xcb\x5f\x90\xd9\x05\x54\x7d\xcf\x8d\x67\x8b\x31\x73\x63\x99\x61\x65\xe8\x00\x9f\x77\xf1\xbb\xad\x31\xbc\x66\x0d\xa6\xb2\x60\xac\x94\xe9\xb1\x50\xda\x88\x7b\x84\x50\xad\x13\x33\x58\x29\x66\xa3\xf1\xc3\xc8\xf0\xa7\xd1\x31\x92\x4e\x4e\xed\xd6\x28\xdd\x83\x07\x7c\x3b\xeb\x01\x9c\xf2\x15\xe1\xc5\x23\x17\xcb\xb9\x59\xef\x02\xc5\x35\x4a\xed\xa2\x2d\x5b\x74\xa6\x53\x82\x86\xf6\xa5\x16\x3a\x4a\x41\xdd\x64\x57\xe4\xba\xab\xd2\x41\xe7\x2c\x6d\x46\xcf\xd3\xea\x86\xf4\xd8\xcb\x71\x1f\x6e\x17\x3a\xee\x4c\x2e\xb1\xbb\xca\x1a\xa9\x0b\xf8\x7e\xa3\xec\x8b\x93\xaf\x46\x80\xd0\xe8\xbd\x49\xb9\xc5\x68\x40\xc6\xd7\x73\x86\xfd\xdb\x7c\x39\xc7\xaf\xe7\x70\xb8\x3a\x77\xc5\xe1\x54\x5d\x71\xb1\x9a\x3e\x5b\x40\x2e\xaf\x00\x03\xd1\x21\xfa\xc9\xeb\x64\x18\x25\x39\xaa\x4c\x13\x45\xf3\xba\x8f\x84\xf6\x0c\x18\x90\x63\x51\x25\xbf\x75\xc4\x9e\x66\x42\xaa\xe2\x01\xb2\x1f\x5d\x31\x04\xc9\x22\xe9\xac\x6c\x7f\x42\x6c\x40\xc1\x16\xca\x50\x2f\xfa\x92\x92\x76\x38\xdf\x5a\x74\x17\x93\xb6\x29\x0c\x2b\xf0\xf9\xd4\x03\xcc\x87\xa8\x74\x2f\xf4\x84\xd6\xb7\x33\xe4\x52\x1a\x0e\x86\x91\x7f\x4b\xb2\xb2\xa8\x9a\x28\x6f\x40\x99\x40\xd5\xa3\x74\x80\x5a\xa1\x11\x7b\x42\x59\xcd\x60\xbf\x96\x71\xbe\x26\x60\xac\x96\x8b\x25\x6c\x0c\xdc\x3a\x7b\x36\x7b\x85\x4f\x28\x7e\x8d\xc9\x5a\x2e\xee\x94\x5c\xfe\x61\xb5\xae\x52\x61\x61\x5c\x6f\xd0\x70\x49\x9a\xf7\xf5\xb6\x4b\x50\xc0\x7f\x55\xf3\xc5\x4a\xf6\x56\x2d\x18\xcb\xa3\xad\x11\x5b\xad\x02\x85\x79\xc8\xe2\xe7\x33\x62\x59\xfc\x75\x46\x6c\xb5\x0a\x95\x5c\xfe\x61\xc4\xae\x53\x64\x7e\x5c\x6f\xd1\x88\x89\x9a\xf7\x0c\x46\x8c\x57\xc0\x7f\x59\x23\xc6\x48\xf6\x66\x8d\x18\xc3\xa3\xad\x11\x0b\x82\xd5\x4a\x61\x1f\xd2\xc3\xf3\x59\xb1\xf4\xf0\x75\x56\x2c\x08\x7d\x5f\xc9\xe6\x1f\x66\xec\x3a\x55\xe6\x07\xf6\x16\xcd\x98\xa8\x7a\xcf\x60\xc6\x78\x0d\xfc\x97\x35\x63\x8c\x64\x6f\xd6\x8c\x31\x3c\xc2\x66\x0c\x68\xd3\xa6\x7f\x58\x81\xeb\x34\xa1\x4d\x9f\xcf\xbc\xb7\xe9\x15\xe6\xdd\xc8\xcb\x2d\x5a\x24\x51\x5a\xcf\x60\x91\x78\xa1\xfd\xcb\x5a\x24\x46\xb2\x37\x6b\x91\x18\x1e\x41\x8b\xd4\x57\xa6\xe4\x30\x1f\xfb\x41\x6e\x02\xd7\xf5\x68\xc8\xd7\x69\xf6\xd8\xcb\xea\xa3\x0e\x9d\xf0\x45\x05\x82\xa0\x77\x79\x74\x64\xb5\x58\xf8\xaf\x34\x57\x30\xc8\x4f\x0c\xb9\xe1\xdc\xaa\xa1\x96\x37\x1e\x52\xc5\xe1\xd2\x8a\x90\x78\x9e\x83\xc5\x30\xd5\x62\x20\xdf\xcb\x7f\xe2\x0f\x29\x98\xa8\xf5\x97\xa6\x2c\x40\x8b\x12\xe5\x3a\xc0\xae\xfe\x27\x9d\xa4\x95\x43\xd4\xab\x1d\x77\x36\x84\x3b\x74\x65\x68\x49\x3e\xc8\x7d\xd5\x79\x71\xee\x40\xed\x34\x74\xa6\xe1\x07\x8b\x73\xb8\xc0\xc1\x7a\xca\xb7\x43\xff\xdf\x9b\x7f\xfc\x40\xeb\xc8\xae\xe1\xc7\x0f\xe1\x50\x90\x26\x39\xda\x45\xe5\x8f\x1f\x30\xd7\x43\x71\x96\x34\xa8\x4a\x93\x2c\x69\x7e\xfc\x10\xf8\xe4\x08\xef\xcc\xb9\x3b\x86\xb3\x5f\x66\x4e\xb0\x20\xff\x86\xb3\x63\x08\x1d\xda\x87\xe5\x84\xda\x46\xaf\xfb\x49\x7e\x8f\xaa\x1a\x29\xcc\x84\x58\xcb\x1b\x8a\xe1\xf0\x8e\x12\x91\x30\x7d\x60\x18\xde\x44\x28\x48\x1a\x30\x41\x66\x42\xcb\x9e\xd2\x3c\x84\xf3\xf9\xa4\xff\xaf\x4e\x50\x3a\x33\xa1\x87\x95\x0c\x05\x47\x72\x69\x4b\x13\xb4\x18\x1c\xaa\xd0\x84\x4a\x69\x3a\xf4\x84\x05\xe3\xa1\x07\xe6\xcc\x07\x08\x0a\x1a\x10\xed\xe0\xa9\x0d\x07\xd7\xff\xe0\xa3\x09\xc3\xcd\x19\x90\x8e\x6f\x67\xfc\x9f\x37\x33\x23\x92\xbc\x04\x43\x22\xcd\x92\x5d\x54\xc5\xff\x0a\xa7\xb3\x9e\x72\xda\x3a\x54\x1f\xb7\x8e\xaa\x98\x3e\xb7\xf0\x6c\xe7\xfe\xfa\xc3\x36\x01\x47\xa4\x49\x9a\x14\x89\x77\x74\x96\x0c\x40\x7d\xda\x72\x30\xf8\xd0\x65\x7f\x75\x40\x4a\xbf\x44\x70\xa2\xb6\x61\x6e\xb7\x9f\x61\x28\xe3\x11\xe1\x01\xea\x87\xf1\x27\x77\xff\x87\xeb\xc9\x4f\x1e\x3e\x3d\x25\xe5\x40\x73\x98\x72\x9a\x5f\xdd\x22\xf1\x98\xdd\xa1\x5e\x89\xee\xd8\x69\x99\x2c\x23\x10\x4d\xb2\x0e\x9e\x30\x90\x06\x82\x1b\x3d\x9a\x74\x5c\xca\x00\x13\x82\x37\x2f\x54\xa9\xe1\x37\xaa\xf3\xd4\xa2\xb6\x72\x54\x21\x39\x52\x1e\xf1\xe5\x2a\x7a\xa8\xcb\x75\x82\xb2\xfd\xe8\x00\x45\xbe\xd3\xab\xc2\xbe\x28\x1a\x75\x37\x4c\x6c\xe3\x67\x16\x4c\x3c\x13\x12\xc0\x20\x0c\xa7\xf6\x7d\xc7\x8a\x6d\x4e\x06\xe4\x38\x3a\x9f\xb1\xc1\x5b\x40\xd2\x77\xf9\x94\x4c\x24\xd7\x42\x0f\xca\xcb\xdf\xe7\x49\xe0\x63\xc5\x7a\x1a\x1c\x36\xda\xba\x7f\x76\xf6\xca\x97\x46\xd9\xb6\x0e\x2b\xba\x09\x54\x45\xf5\x4f\x9f\xa4\x9f\x9a\x11\xf2\x5a\xe0\x95\x0f\xc4\xb1\x6d\x21\x76\xf8\x2a\x7b\x76\xf0\x9b\x97\x57\x3e\x7e\x38\x34\x84\x18\x61\xca\xed\xb9\xe8\x9f\xbc\xbb\xf2\x8d\x33\xb6\x2d\xc4\x0b\x5f\x65\xcf\x0e\x7d\x2f\xed\xca\xa7\xb2\x98\xa6\x10\x33\x5c\x8d\x3d\x2f\xe2\xeb\xc9\x4f\x78\x19\x99\xc3\x33\xbe\x9a\x7b\xed\xa3\xb8\x1c\x1a\x58\x6f\xcc\xef\xa0\xf2\xbc\xa8\xe6\x82\xf9\x55\x4c\x0e\x8f\x52\x7d\xcc\xaf\x21\x72\x78\x54\xe3\x6e\x7e\x03\x8f\xaa\x3e\xf6\x09\x95\x6e\xe0\x62\x30\xc2\x83\xf7\x08\xcd\x1f\xb6\xca\x42\x4f\x36\x06\x27\x3f\x84\x89\x62\xa7\xea\xff\x9e\x8a\x06\x4d\x9e\xc4\x13\x58\x45\x1c\x24\xee\x1a\xa8\x8e\xb2\xe3\x8d\xbf\x75\x14\xc9\xd6\x0b\xa8\xe8\x7d\x32\x98\x19\x9d\x4b\xae\x1a\x0b\x76\xb3\xaa\xaa\x96\xf7\xd0\x42\xbf\x86\x05\x5c\x3e\xd9\x2e\xa4\x9b\x22\x24\xb2\x83\xd1\x6f\x18\x41\xdd\x8e\x7a\x1a\x3d\x1a\x2f\x6c\x8a\x6f\x9d\xc0\x7e\x6f\x87\xb1\x29\x4a\xa5\x03\x28\xb3\xa2\x72\x06\xb5\x4c\x13\x66\x74\x0e\x9f\x9a\x10\xe0\xfc\x01\xb4\xd4\x87\x98\x89\xf9\x45\xcc\x43\x72\xcf\x1c\xb6\xc7\xcf\x2f\x55\xc5\x83\xc3\x07\xee\xf9\x62\xb9\xe8\x32\x72\x46\xd4\xeb\x85\xee\x79\xc0\xbb\x25\x5f\x48\x2f\xe6\x33\xe9\xc5\x48\xdd\xad\xe4\x57\xe0\x85\x04\xe4\x70\xe3\xf6\x42\xf3\xb2\x55\xb4\x61\x73\xf9\xf1\xb7\x7c\xba\x36\x26\x05\x22\xc9\xc2\x6e\x52\x83\x68\x0a\x42\xac\x42\x5f\x3f\xf0\x32\x52\xb2\xef\xe4\x53\x4e\x80\x96\x8c\x69\xa3\x79\x0b\xc2\x3e\x29\xa3\x0e\xa9\x63\x67\xbf\xec\xb1\x98\x4d\x14\x84\x4b\xb9\x9b\xb5\x4d\x59\xa8\xc1\xa8\xee\xe2\x93\x70\x80\x1d\x34\x61\x7a\x4a\x8a\xdf\x27\x20\x91\xd8\x9c\x7c\x25\x16\x46\x60\x03\x63\xa6\x29\x4e\x2c\xce\xf8\x96\x30\xf9\xdb\xdd\x15\xa7\xbc\x59\x4f\x49\x12\x02\xa1\x4c\x04\xe1\x5b\x1e\xa2\x72\xb8\xbb\xc5\xb6\x66\xcb\xe5\xa2\x0b\xc7\x8d\xb0\x34\x40\xb7\xaa\x80\x17\xc9\x48\xe4\xea\xe2\x6d\x2b\x14\xc5\xbb\xea\x94\x6d\xa5\xa8\x82\xbc\x37\xa7\xc9\x01\x4c\xef\x22\x72\xe9\x00\xc4\x70\xcc\x48\x50\x7c\x3a\x93\xb0\xcc\xdc\xec\x1a\x5f\x15\x64\x9b\x91\x1b\xb7\xdc\xc3\x3c\x7c\xdd\x0f\x62\xc1\x90\x39\x40\x7b\xc9\x4f\xff\xc9\x5f\x78\x6a\x6e\xe0\xf2\xd3\x3b\x0b\xfa\xd8\x21\x1c\xb8\x50\x3e\x02\xfc\xd5\x98\xe8\x23\xbe\x7c\x1b\xe1\x7a\x75\xff\x62\x70\x19\x1d\x92\x1c\x37\x7b\xb9\xd4\x09\x92\xaa\x80\x1a\x51\x46\x07\x24\x05\x1c\x1d\x52\x2c\x85\x32\x7d\x63\xc4\xcf\x14\x8b\x1c\xc9\xb1\x46\x70\xa4\x66\x1d\x73\x54\xc4\x42\x19\x0a\x54\xf4\x2c\xf6\x31\x99\xa8\x45\x16\x47\xc5\x7e\x7d\xc4\xdf\x7f\xc1\x62\x29\xf0\x8a\x0a\x65\x51\xb1\xca\xaa\x03\xe6\x1c\xb8\x30\x74\xd4\xdf\x2a\xa0\x27\x1d\xa1\xa8\x5e\x50\xb6\xca\x1c\x51\x72\xc6\x37\xdd\xd7\x02\x81\xb7\x7e\x83\x36\x16\xd8\x3c\xc6\x6d\x65\xcd\x04\x59\xd0\x29\x84\x0f\xb9\x31\xa2\xb1\x4b\x34\x0e\x63\xd0\xcd\x04\x8d\xee\x4f\x75\xaa\x3f\xd5\x53\xbb\x7e\x22\x4c\xb5\xf3\x40\x22\x57\x67\xa0\x78\xb4\x09\xe4\x61\x04\x4f\x94\x4e\xa8\x35\x0c\x7a\x6a\x4f\x30\x13\x7a\x2b\x41\xd6\xc1\x28\x3e\xe8\x57\xa4\x4e\x3e\x9d\x78\x66\x62\xea\x29\xee\x3d\x82\xa5\xf8\x1e\xc1\x46\x7c\x93\x96\x3b\xc5\x65\x7e\x3a\x61\x1b\xd5\x88\x3c\x49\x0f\xaf\xdf\x1d\xdf\x6b\x94\x95\xcd\xa3\x70\x6a\x6a\xdb\xe4\x0e\xed\x96\x6c\x1b\xfa\x14\x24\x97\x88\x62\x20\x53\xb4\xff\x4b\x0c\x99\xc0\x93\x53\xcc\x88\x85\xdb\xe2\xb8\xbf\x78\x70\x6f\x21\x2d\xe2\x0b\x29\xb1\x3f\x7e\x36\xba\x47\x42\x53\x8d\x00\x31\xdd\xe1\x89\x7d\x16\xee\xd7\x63\x85\xf6\x9f\x87\x77\x40\x81\x2a\x9a\x9a\x46\x42\x37\xdb\xce\xc3\xf9\x72\xe0\xdd\xf0\xf1\x41\x80\x83\xc8\xf2\x55\x2a\xb2\x7e\x38\x8f\xa2\x79\x8f\xce\xf4\x91\x41\x80\x83\xc8\xf2\x55\xca\xde\xce\x56\xf1\x6c\xd6\xa3\xd3\x7e\x4c\x60\x81\x20\x82\x4c\xb9\x8a\xda\x34\xd8\xfa\xf1\xd0\x49\xd3\x47\x03\x01\x0e\xa2\xc9\x57\xa9\xc8\xa2\xdd\x6a\x19\xec\x07\x0d\xd1\x7f\x1c\xe0\xc1\x40\x3d\x62\x6b\x54\x34\x77\xab\xa9\x1f\xee\x2e\xde\x3f\x4f\xd9\xb6\x68\x2a\xe6\x61\x93\x50\xe1\xbc\x87\xf0\x27\x42\xd8\x59\x9f\x72\x69\x09\xa4\xdd\x90\x4c\x75\xd6\x51\x0d\xc9\x9e\x62\xa8\x75\x8f\xec\x13\xf1\x83\x1c\xfc\x18\x6b\xf6\x08\xb6\x4f\x4f\x49\x6c\x38\x68\xbc\x91\x76\x91\x51\x8a\xaa\xc6\xee\x93\x6e\x30\x1a\xe4\xab\xf2\x5f\x60\x12\x38\xa0\xdd\x29\x12\xe1\x9f\xe6\x73\xe9\x2b\xf1\x62\x20\x18\xe4\xbe\x2e\x4e\xea\x2c\xa9\xeb\x04\x5f\xaa\xde\xa5\x45\xad\xb4\x8c\xd4\x3d\xea\x13\xb9\xf1\x09\x68\xc4\xbe\x81\x7c\xa8\xa7\x74\xbc\xdf\xfb\x92\x2f\x19\xfb\x68\xb5\x5b\xf4\x6b\xc5\x74\xb7\x5c\x4c\x63\x01\x95\x03\x8e\xde\x2e\x40\xe1\x76\x2a\x82\xb2\xc2\xe8\x5f\x7c\xdf\xce\x67\x9d\x86\x92\x1a\xc5\xd4\x8f\x57\x28\xde\x2f\x05\xde\xb6\xbb\x78\xbf\x1f\xd6\xb1\x69\xb0\xf4\xef\xf6\x2c\x1e\x98\xb1\x68\x11\xcf\x11\x47\x0f\xe4\x6a\x36\x0f\x17\xab\x1e\x4a\x63\x22\x76\xfb\x3b\x34\x15\x3f\x0a\x45\xfb\x70\xb7\xeb\x19\xbb\x8b\x16\xf1\x74\x2b\xa0\x82\x79\xdb\x2f\xd1\x6e\x3b\x17\x41\x01\xf6\x16\x8b\x79\x30\x0a\x4d\x69\x4a\xf6\x61\x8c\xa4\xcf\xaf\x68\xbb\xdb\x8d\xdc\x45\xab\xd9\x6c\x16\xf2\x98\x60\xe6\xd0\x6c\xbb\xda\xae\x04\x48\x80\xb7\xbb\xd9\x74\x3e\x9d\x5d\xfe\xdc\x6f\x09\xbf\xa0\xc7\x7d\x15\x65\xa8\x76\xca\xaa\x38\x54\xa8\xae\xdd\x6d\x54\xb9\x75\x53\x25\x25\xaa\xcf\xfb\xaa\xc8\xce\x50\x5a\xef\x80\x24\xfb\x6b\x0a\xb0\xd6\x77\xfc\xcb\xe5\xcf\x6e\xf1\xa2\xe8\x5f\x10\xb7\xd7\x63\x7c\xc6\x6d\x75\xb7\x06\xe0\xb8\xee\x31\x89\x63\x94\xb3\xbe\x32\x90\x69\xb7\x2b\xb8\xfa\x09\x2a\x69\x0f\xcb\xc8\xe5\xcc\x62\xb6\x7a\x7c\x00\x90\x6a\x2c\x9f\x12\xec\x85\xd0\x71\x1f\x55\xee\xa1\x63\x01\xe5\xcd\x77\xb3\x79\x8c\x0e\x13\xe0\x38\xe2\xfc\xa3\x13\xce\xdf\x4f\x18\xbb\x2d\xfd\x3d\xf7\xdf\x2b\x5a\xaa\x6b\x96\x02\x0e\xe1\xef\x8f\x72\xde\x71\xb7\xf8\x06\x99\xbe\x79\x8e\x95\x69\x9a\x06\x8f\x46\x59\x23\xa8\x5c\x94\x27\x59\xd4\xa0\xf1\x6b\x07\x29\xe8\x26\x29\x34\xe1\x9d\xa0\x76\x88\x74\x9c\x24\xdf\x27\x79\xd2\xa0\x8d\x5b\x3c\xa1\xd1\xd5\x2d\x2e\x1e\xf6\xb1\x5e\xe8\xc3\xde\xcb\x3c\x39\x4c\x79\x76\xb7\x45\xfc\x78\x7e\x8e\x67\x8a\xc6\x03\x80\xff\x6a\x89\xec\x2e\xe2\xe1\x47\x37\xc2\xad\x99\xa7\x93\xd5\x6f\x0b\x0e\x0e\x20\x8c\x43\x3a\x58\x29\xf8\xb1\x7f\x0a\x57\xe1\xb6\xf3\x35\xe0\xe6\xfd\x9e\x44\x51\xcb\x6d\xd8\x59\xde\xcc\x01\x35\x72\x28\x51\x49\x97\x0f\x57\x13\x26\x35\x59\xbf\x05\x2c\xaf\x72\x84\xfa\x6b\x3e\xc9\xbe\xe8\x8d\xbc\x8d\xd5\x6e\x88\xa4\x82\x7d\xda\x39\xec\xcb\x0b\x9e\x12\xd6\x1c\x04\x56\x1c\x93\xf9\xaa\x83\xc1\x52\x47\x40\x85\xd7\x9e\xbc\x16\x60\x87\x78\xbc\x8c\xe5\x6b\x12\xdc\xe3\x23\x44\x2a\x52\xca\x69\xae\xe6\xc1\x64\x19\x54\x86\x45\x43\xb3\x13\xcf\x35\x04\x99\xb3\x57\x43\x80\x4d\xa4\x46\x0d\xc1\x73\x7c\x31\x81\x51\xdb\x8b\xce\xd4\xe0\x27\xaf\xce\xa2\x34\xbd\xbe\x1d\x6e\x66\x12\xbb\x0a\x09\x2b\xc4\x38\x42\x48\x50\x93\x7d\x7a\xaa\x8f\x52\x2b\xe1\x95\x4a\xfe\x98\x86\x1c\x64\x11\xf1\x3d\xe5\xc6\x00\x88\xe7\x29\x37\x00\xa0\x05\xb3\x8f\x7b\x70\x91\x8c\x8d\x2a\x0a\x72\x89\x54\x08\x26\xe4\x09\x72\x3b\xfc\x6a\x34\x6a\x9d\xd2\xe3\xb7\x9d\x93\x4a\xc2\x43\x40\x5d\x55\x4f\x6e\x09\xea\xb9\xa0\x48\x0c\x40\xdc\xda\xaf\x16\x38\x8e\x30\xa9\x19\xee\x6f\xc1\xe9\x89\x01\xc9\xc1\x81\xb8\x2f\xe5\x81\x9b\xfb\x7d\x4c\x4b\x44\x8c\x23\x51\x5c\x6c\x69\xa3\x8a\x4b\x01\xcc\x77\xad\x55\x2c\xcb\x98\x15\x08\xae\x56\x12\x6d\x23\xa3\x86\x74\xad\x95\xea\x81\x2b\xb5\xba\xc1\x34\xd7\x41\xf0\x5a\xa1\x12\xec\x6e\x86\xa6\xfb\xa9\x82\x49\x83\x4a\x30\x20\x06\x7d\xa0\xd4\x79\x7d\xa0\x71\x44\x11\x6b\x1f\x03\xe4\xa2\x7a\x1b\x55\x44\x10\xe0\x9c\x22\x50\x71\x0d\xe2\x57\xa3\xb9\x5a\x37\x4c\xed\x8c\xea\x41\x11\x28\x35\xa4\xaf\xd7\x2a\x09\x8f\xc4\x00\xc4\xa9\x8a\x5a\xe0\x38\xda\xaa\x66\xd8\xa0\x2d\x3c\x94\xe1\x0d\x49\xca\x03\xa7\x30\x7d\x7c\x57\x44\x4c\xa3\xb2\x5c\x9c\x75\xa3\x8a\xd1\x02\xec\x93\xf6\x2a\xb6\x21\xec\x4a\x24\x57\x2b\x8b\xa1\x99\x51\x57\x48\x7b\xa5\xaa\xd0\x6a\xad\xa6\x70\x28\xf4\x30\x9c\x9e\x28\x05\x4d\xe2\xde\x4a\x66\x0d\x6a\xc2\x01\xe9\xb5\xa4\xe7\x80\xd3\x92\x3e\xce\x8e\xb2\x2d\x8a\xdd\x0a\xd5\x65\x91\xd7\x1d\x2a\xd3\xf9\x18\x66\x8b\x3f\x5e\x07\x10\x22\xbd\x32\x5a\xe9\x2c\x9b\x78\x6a\x4e\x6e\xe2\x48\x25\xb8\xe7\x13\x19\x10\x17\x00\xe5\x09\x0e\x96\x03\x15\xc5\xf6\x9f\x68\xd7\x00\x15\xf7\x49\x8c\x0a\xe5\x0d\x04\xf1\xe6\x81\xfc\x66\x15\x49\xca\x4e\x36\xa3\xbe\xdc\x25\x37\x0c\xb6\x8f\xab\xf1\x69\x24\x26\x4f\xff\x2c\xf4\xee\xe6\xcb\x60\x36\x7d\x0f\x34\x0b\x16\xaa\x66\xf3\x85\x17\xce\xa1\x26\xb3\xed\xe3\x14\x6c\xb1\x04\xc1\x83\xed\x63\x00\x82\x93\x64\x34\xe4\x23\x20\x39\xbc\x88\x3d\x70\xee\x54\xd0\x78\x10\xc6\x74\xb8\xc3\xf7\x7d\x12\x6e\x19\x5e\xde\xed\xb6\xec\x3e\x7e\x0e\x66\x78\xc8\xcb\x9b\x53\x82\xc3\x85\x15\xfc\x07\x7f\x16\xaa\x47\xa4\x3f\x6b\x31\xe2\x5c\xce\x2f\x74\x26\xd1\x0f\x9a\x83\xee\x0a\x2d\xe0\xd7\x07\x7c\xf5\x4b\x74\x59\x11\x47\xa9\x5b\x94\x28\x3f\x4b\xd3\x00\xd7\x8d\xfa\xb4\x4f\x5a\x14\x1b\xae\xb3\xf4\xfb\xc6\xc0\x9f\x8f\xcf\xe3\xe2\xae\x89\x9f\x53\x98\x97\xed\x30\x1d\x6f\x1f\xc5\xc8\xa1\xfc\xc4\x49\x94\x16\x63\x52\x42\x1c\xb0\x26\x4c\x70\x45\xfb\xa2\xca\x1c\x6f\x5a\x3b\x28\xaa\x91\x5b\x9c\x9a\x8d\x3d\xa4\x5b\x70\x68\x0b\x0b\x8c\x4f\x85\x98\xe8\x59\x99\xa8\x89\x4b\x0d\x09\x85\x34\x6a\xd0\x77\xfe\xc4\x0d\xe7\xef\x3f\x6e\xd8\xd6\x40\xb5\xa6\xae\x97\x3c\x79\x2e\x48\x2d\x79\xa9\xb5\xaf\xa1\xea\xab\x48\xfa\x1f\x59\x6d\xa3\xf4\x06\xa5\x73\xdb\x41\x31\xfa\x92\xc7\x75\x74\x6a\x8a\x0b\xcf\x98\x6c\xe0\x89\x1d\xc3\x49\x04\xe8\x6b\x7b\x81\x5f\xb6\x7d\x33\x6a\xa3\xff\x75\x93\x3c\x00\xdf\x77\x76\x69\x52\xae\xc7\x27\x55\xf8\xb0\xa4\x54\xa7\x0b\x4e\x86\x1f\xa1\x33\x2c\xd2\xdc\xc6\xc4\xe3\xaa\x28\x9f\x6a\x4c\x66\x50\x7a\x00\xdf\x97\xf0\x63\x23\xc2\xbe\x3c\x29\x54\x77\x9a\x7e\x66\x2d\x35\xa9\xa7\x17\x3a\x5f\xf2\x7b\xd0\x33\x86\x9b\x59\xe4\x65\xb4\xfb\xb2\x26\x8f\x63\x3d\x0e\x15\xf4\xef\x5e\xf7\xd7\xf8\xe0\xa1\xbb\x45\xcd\x03\x42\x8c\x5a\x71\x6d\xf5\x6d\x86\x5b\x8a\xf3\xf1\x3d\x33\xf9\x7d\xbb\xfe\xeb\x00\x11\x2a\x94\xbb\xc3\x17\x5f\x39\x1c\x46\xa8\x88\x1f\x81\x39\xfa\xfc\xe9\x45\xe6\xa3\x69\xa0\x79\x1d\xbe\xd5\x51\x47\x79\xac\x1c\x71\x8c\x11\x03\x70\x83\xdd\x95\x28\x41\xa1\x31\xe6\x93\x57\x08\x03\x4c\xe4\xf7\x93\xe1\xea\x5f\x1f\xf8\x07\xda\x28\xaf\xfe\xf1\x6d\xea\x5d\x55\xa4\xe9\x36\xaa\xdc\x0c\x45\xf5\x49\xfd\x2a\xe7\x6a\xb5\x5a\x95\x2d\x5d\x10\xe6\x7e\xd9\xf6\x8e\x2d\xfe\x3d\x38\x20\x04\x9f\xe6\xa0\x1d\xb7\xe0\x30\xcf\x03\xf9\x1d\x1a\xba\xc6\x4c\xfd\xb2\x75\xd8\xf5\xa9\xce\x18\xd0\x69\x07\xaa\x4b\x25\x4f\xda\xa4\x2c\xfa\x3b\xd2\xc6\x6b\x8a\x22\x6d\x92\x12\xe8\xe4\x68\x0f\x97\xbe\xb0\xaf\xc1\xfe\xeb\x3e\xca\x92\xf4\x71\xdd\x39\x79\x29\x72\xeb\xc7\xba\xdb\x70\x90\x7f\xdc\x53\x32\xf9\x4b\x9a\xe4\x5f\x7e\x89\x76\xff\xc0\x25\xff\xab\xc8\x9b\xc9\xbb\x7f\xa0\x43\x81\x9c\xff\xfe\xdb\xbb\xc9\x7f\x16\xdb\xa2\x29\x26\xef\xfe\x37\x4a\xef\x51\xb7\x76\x39\x7f\x47\x27\xf4\x6e\xf2\xef\x55\x12\xa5\x93\x3a\xca\x6b\xb7\x46\x55\xb2\xa7\xbe\x33\xbd\x5f\x82\x97\x31\xd6\x79\x9e\x75\xce\x33\x6a\x1a\x54\xe1\xf3\xce\x9d\x42\x51\x28\x72\xd6\xba\x42\xd1\x17\xb2\x58\x8b\xef\x9d\x32\x1f\x59\x3b\xc5\x61\xff\x26\x1f\xc6\x41\x8f\x99\xf5\xc7\xc7\x82\xd1\x03\xc1\x65\xfc\xf9\x6b\xcc\xcd\x43\x51\xc5\x94\x1b\xb6\x44\xe0\x59\x3a\x1f\x4f\xa0\x70\xae\x4f\xdc\xd8\xed\xfe\x66\x1f\xf1\xa5\xa3\x27\xac\x34\xab\xb1\x62\x5b\xbb\x0d\x6a\x8e\xa8\x72\x51\x8a\x32\x94\x37\x6e\xd4\x34\xd1\xee\x88\xe2\xe1\x8e\x5d\x0f\x4a\xff\xc5\xb7\xe6\xfa\xd9\x39\xef\x76\x1c\x1b\x36\xdb\xd1\xb4\xb3\x68\xd6\xd8\x9d\x01\x6b\x92\xe7\xe3\xad\x26\x90\xa8\x02\xf6\xcc\xaf\xd3\xf3\xf1\x9e\x1b\xb9\x61\xd2\xd9\x0f\xf6\xa9\x30\x62\x4a\xe8\x1c\x2a\x5b\x87\x74\x41\x3e\x12\x87\xd7\x73\x8b\x8e\x74\x54\x64\x7e\xe9\x8b\x5f\xfd\xc6\xa8\xa3\xc2\xb1\x65\x2b\xa6\x0e\xd8\x5a\x48\xf4\xe5\x71\x58\x4c\x78\x87\xeb\xbf\xdf\xf0\xa7\x10\xf0\x98\xd9\x88\x88\x13\x13\xf9\xd8\x7a\xa5\xa0\x9a\xa2\x94\x59\xa6\xf7\x4d\x95\xfa\x64\x2b\x27\xb5\x7e\xa8\x68\xea\xe4\xf4\x14\x5d\xf2\x7b\x31\x09\x9f\x9d\xaf\x94\x12\x16\xad\xcc\x33\x79\x72\x4e\xa9\x4e\xd6\xd3\x4e\xa7\x22\x30\x55\x93\x3e\xf5\xee\xf2\x35\x0a\x25\xc9\x0a\x7f\x9b\x07\x24\x45\x68\x32\xcb\x12\x7e\x35\x60\x70\x0e\xa6\x65\xeb\xdc\x61\x5a\x9a\xeb\x2e\xa0\xab\xae\x38\xf2\x08\x77\x55\x5e\xfb\xe8\x90\xf7\x2b\xba\xaf\x7c\x15\xb8\xaf\x20\x2b\x14\x76\x5c\x2e\x5e\x59\x94\x38\xfe\xa2\x8a\x8d\x49\x1b\x8e\x85\xb8\xc0\x32\x02\xe9\xbc\x84\xd1\x5b\x2a\xdb\x3f\x16\xdf\x37\x5d\x7c\x6f\x66\xdb\x3b\xa8\x99\xcd\x1a\xdf\x83\xd2\x7f\xf1\x1a\xcf\x3d\x1c\x8d\x63\x18\xd6\x08\xe9\xb5\xee\xc9\x35\x2d\x7a\x1b\x04\xb0\x22\xa1\xe3\xea\xe8\x24\x1d\x2c\x36\x6f\x7e\xe9\x4c\xbd\x3c\x1b\x2b\xbc\xd7\xe1\x06\x81\x68\x8a\x03\xe1\x95\x6d\x39\x75\x30\x3e\x43\xf5\x74\x61\xca\x92\x19\xb9\xf1\x25\x6e\x7c\x88\x1b\x72\x9e\xc8\x82\x05\xe2\xdd\x88\x94\x89\x77\xc3\xa5\x54\xb1\x55\x10\x0c\x7d\x85\x7a\x10\x78\xd5\x88\x90\xc5\x47\x25\x20\x5a\x2b\x2c\x58\xec\x92\x73\x8d\x76\x58\x71\xc2\x2a\x23\xa7\x1b\x64\x1a\x31\xaa\xc1\xfa\x50\x4f\x51\x0e\x50\x90\x90\x5c\xce\x8c\x22\x88\x73\x1a\x74\xe8\x6c\x75\x03\x3b\x74\x22\x65\xea\xd0\x31\x84\xac\x55\x03\x9a\xe9\x26\x70\xd5\x70\x18\xa6\x0e\x3f\xd3\x25\xdb\xd1\x4d\x94\x6b\x54\xc3\x8a\x15\x46\x0d\x0d\x56\x83\xf3\x1c\x9f\xa2\x1b\x3a\x9b\xc9\x49\xe6\x3c\x6a\x82\xd2\x6a\xf0\x7e\x2c\x3e\xb9\xbb\xb4\xe5\xc2\x19\x8d\x55\xd2\xa4\xc8\x24\x24\x05\xb8\xde\x51\xea\xc6\x0d\xfa\xac\x1a\xc2\xbd\x92\xfd\x52\x39\x74\x78\x45\x27\xa9\xbf\x2e\xf6\x07\xfb\xeb\x12\x71\x7b\x8c\xd7\x4c\x04\xce\xf4\xc0\xac\x28\xb5\x81\x35\x6a\xa2\x85\x24\x46\xe1\x9a\x79\x60\xc5\x09\x25\xd6\xdf\x73\xd4\xd9\x48\x66\x5b\xf0\x94\x69\xa0\x5f\x1d\x18\xb9\x0c\xcc\xe8\x6c\x24\xbb\x47\x61\x4d\x24\x0d\x2d\xf7\x2e\xf8\x5d\xd9\x3a\xc1\x6c\xc4\x33\x84\x27\x98\xaf\xbc\x9a\x4c\xbd\x4b\x4d\x40\x7b\xdb\xfd\x67\xa3\xcf\xc2\x37\xb5\x4d\xc2\x37\x65\x73\xf0\xf1\xd3\x0e\xba\xd9\xdf\x43\x0c\x5f\xb0\x68\x77\x57\xb4\xbb\x03\x84\x28\x6f\xcd\x24\x86\x66\xed\x57\xee\xa9\x06\x6a\xaa\xed\x67\xa7\x5e\x22\xaf\x6a\x60\x9f\x26\x8a\x2b\x4e\x35\x4a\xe5\x2f\x02\x63\x1d\xdd\xa8\xaa\xbe\x07\xe2\xb3\x0c\xd2\x17\xed\xb1\xb1\xfe\xd6\x02\xd9\xb8\x8c\xef\xd9\xf4\x81\x5c\xe9\xb3\xa8\x3b\x8d\x49\x9e\x2a\x06\xad\xdd\x57\xeb\x05\xfd\xcc\x9b\xe4\x16\x1f\xae\x05\x60\xdd\xb7\x6b\x35\xde\xaf\x03\x9a\x18\xd9\x9a\x68\x19\x61\x37\x64\xfb\x68\x87\xdc\xfb\xa4\x4e\xb6\x49\x9a\x34\x8f\xfd\x97\x5f\x4d\x55\xdf\xba\x44\x55\x5d\x22\x7c\x6c\xa8\x1b\x19\x1c\x9a\x90\x8a\x2e\x97\x3f\xd7\xa7\xb2\x2c\xaa\xa6\x76\xbe\xfb\x4e\xf3\x29\x7b\x1a\x13\x03\xf7\xf1\xa3\x53\x54\xce\x77\x5a\x88\x3f\x86\xf9\xf6\x86\x99\x1f\x11\x37\xc7\xf7\x21\xf8\xb2\xb2\x42\xf7\x42\x59\x7f\xec\xec\xd9\x3e\xfc\xd9\xf2\xa1\xf2\xaa\xae\x32\x2f\x18\xbb\x50\x44\xf6\x8c\x32\x41\xa1\x88\x6c\x22\x6d\xe6\xc3\x46\x57\x79\xa1\x02\x84\xb0\x4f\x00\x66\x0d\x14\x3b\x03\xab\x23\x3a\xd4\x2b\xe8\xaa\x3a\x6f\x20\xeb\x9a\xe8\x8e\x00\xaf\x62\x4f\xfe\x18\xd7\x37\x18\xd7\x11\x7d\xe7\x90\x54\x45\x2a\xce\xdd\xbe\x58\x37\x7d\xc7\x73\x2b\xdf\xea\x51\x02\xa1\x5c\x3c\x22\x20\xe2\x67\xdb\x28\x60\xa9\xef\x34\x7f\xaf\xff\x52\xc0\x1d\x9a\x84\x86\x82\xc9\xfa\x0d\x54\xd2\x37\xb8\xc0\xd1\x52\xb6\xc4\x95\x76\xa9\xaf\x86\x73\x4c\x1b\xf6\x4b\x2e\xac\x1c\x4c\xca\x5d\x99\x53\xba\xdd\x51\x55\xe3\x07\x9d\x14\xac\x92\xc7\x9e\x34\x89\x46\x43\xe6\xa0\x03\xfe\xcd\x9c\x01\x65\x6f\xfe\xe7\x85\x5b\xa1\x12\x45\x8d\x43\x84\xef\x88\xda\x20\x5e\xf3\xf7\xfd\xf7\x0e\x39\x12\xac\xaa\xb9\xe8\x58\xfe\xaa\xf7\xa9\xcc\x6f\x51\x39\xfb\x24\x4d\x7f\xfc\xf0\x3e\x9c\xee\xf7\xfb\x0f\xfc\x83\x56\x77\xce\x1d\xfb\x56\x15\x79\x4a\xca\x4f\xdd\x99\x43\xfe\x13\x78\x73\xb7\xfb\x6f\x48\xfe\xeb\xd0\x7f\x5d\x5a\xfe\x1b\xf0\xc2\x94\x7a\xdc\x6e\xac\xa3\x81\x37\xef\xba\xda\xfd\x13\x90\xae\x39\x4c\x37\x9d\xbe\x7c\xe6\xe2\xff\x68\xbb\x9a\xe4\x71\xb2\x8b\x9a\xa2\xaa\x01\xd3\x27\x1c\xda\xc3\xfb\x76\xf1\x33\xda\xfc\x85\x2c\xe2\x0b\x19\x2d\x38\x6d\x40\x9f\x8d\x9c\xff\x32\xdd\xfd\x2d\x64\x5a\x05\x25\xe7\xa4\xc9\x93\xce\xb5\xf9\xd2\xb9\x36\x9f\x3b\xd7\x46\xff\x62\x8f\x1c\x8d\x66\x60\x3a\x06\x43\x2a\xb1\xa0\x3f\x0c\x41\x2c\x5e\x37\x50\x79\x83\x8f\x4e\x95\xad\xfa\x30\xb9\x6b\x78\x44\x0d\xe8\xb5\x21\x94\xe8\xb2\x0a\x63\x4a\xa3\x3c\xdc\x4f\xe0\xa2\x89\x6a\xca\x24\xc6\x20\x13\xe6\x3e\xda\xbc\x00\xed\x7e\x67\xa1\xb8\x4d\x3e\xda\x90\xa8\xc4\x09\x27\x54\xb3\xaa\x53\xae\x3e\x81\xdc\xc0\x6a\x57\x38\x7e\xa0\xde\xb0\xd7\x1c\x42\xe6\x13\xbd\xcb\x36\xd4\x2d\xbe\x17\x8f\xb8\x06\x7d\xea\xc9\xb3\x22\x25\xe5\xf8\xc2\x6f\xdf\xa2\x29\x4a\x11\xb8\x29\x4a\x19\x2e\x4b\xe2\x38\x95\xf0\x92\x52\x19\x9a\x7e\xc7\x10\xb9\xc0\xa5\x00\x0f\x5d\x77\xe0\x26\x4c\x95\xa2\x1d\xd4\x01\x5a\xce\xb6\xd8\x1e\xdc\x7d\x14\xf3\x49\x94\x84\xa0\xfc\xf6\x60\xcc\x26\xc9\x60\x8c\x18\xf8\x31\x17\xe7\x58\xa4\xcf\x23\x29\xb0\x66\x4a\x27\x29\xd2\x15\xaf\x2c\x33\x45\xfa\x44\x92\x02\x5d\x6d\x3e\x49\x91\x28\x77\x0b\xb6\xff\x5b\x9f\x49\x52\x20\x67\x4a\x28\x29\x52\x14\x2f\x56\x32\x45\xfa\x54\x92\x02\x5d\x43\x46\x49\x91\xac\x70\x47\x6f\x2c\xd1\xe7\x92\x94\x64\x4b\x1e\x2b\x92\xc1\x49\x4a\x16\x59\xbc\x18\x9e\x97\x30\x29\x52\xd1\x0d\xfc\x20\x08\x42\x8e\x2e\x09\xc0\xfa\xe7\xfe\xb6\x10\x50\xd9\x14\xe5\x00\x40\xb2\x0b\x00\x40\x24\x38\xee\x0b\xc9\x0e\x00\x40\xfa\x81\xcb\x17\x13\x0d\x00\xa0\x38\x8c\x3e\x00\x12\x9b\xcd\x82\xe1\xbe\x21\xf1\xbd\xbc\xfe\x74\x11\xad\xd5\xbe\x45\x61\x97\x26\xa5\xc7\x44\xf6\xda\x5f\x9f\xae\xbc\xc7\x67\x7e\xdf\xc2\x3a\xb5\x4a\x8f\x12\x7f\x09\xfb\xda\x84\xed\x3d\xb2\x5d\x52\xed\x52\x24\x88\x77\xde\xb9\xfe\x3d\x84\x0f\x3c\x35\x91\xa2\xa8\xda\x27\xed\x55\x8f\x0d\xc4\x6e\xe7\x44\x71\x1f\x41\xd8\x81\x8e\x5d\xb2\x42\x0b\x5b\x21\x08\x84\xbe\x4d\x0a\xad\xec\x3c\x38\x0f\x07\x00\x34\xd1\x36\x1d\x29\xe2\xbf\x00\x00\x77\x87\xd2\x94\x87\xc2\x45\x3c\x68\xe7\xb8\xbd\xfe\xab\xfc\x8c\x54\x40\x06\x7a\xe1\x68\xf9\x60\x10\x28\xd8\x61\x20\x60\x54\x20\x0a\xcd\x19\xfc\xd8\xad\x33\x93\x42\xd4\x99\x8d\x4e\x0c\x50\xd6\x6a\x51\x67\x66\xcd\xa8\x33\xb3\x72\xf4\x30\x76\xfa\x51\x67\x6f\xa8\x22\xa3\x90\x6e\x50\x4b\x00\x35\x59\x2e\xee\xa8\x9a\x64\x46\xbb\x91\x59\x99\x8e\xec\x6a\xeb\x91\x59\x18\x90\xcc\xc2\x86\x64\x57\x99\x91\xec\x2d\x2d\x49\x16\x7f\x5b\x6a\xd2\x5f\xb7\x89\xdd\xf4\x60\x52\x93\xf4\x60\xa3\x26\x03\x94\xb5\x9a\xa4\x07\xb3\x9a\xa4\x07\xb3\x9a\xf4\x30\x76\x6a\x92\x1e\xde\x50\x4d\x46\x21\x7d\x1b\x6a\x12\xe0\x43\xee\x58\x4f\xda\xd4\xa4\x27\x6d\x6a\xa3\x27\x03\x94\xb5\x9e\xb4\xa9\x59\x4f\xda\xd4\xac\x27\x3d\x8c\x9d\x9e\xb4\xe9\x1b\xea\xc9\x28\xa4\x5b\xd4\x13\x8f\xe4\x91\x4c\xaa\xba\x39\xf3\x57\xbc\xe3\x24\x8f\x52\xfa\xa8\xfa\x98\x5b\x81\xec\x9e\xdc\x60\x8c\x39\x0e\x25\xfd\x0f\x8a\x33\x8d\xb4\x28\x43\x01\xa5\x84\xb1\x47\xd8\xe3\x3b\xe5\xf8\x6f\x14\x6b\x90\x06\x02\x52\x5f\x44\xea\x6f\x86\xcc\x1f\xb8\xb4\x2a\x1e\xce\xc0\xcd\xf6\x63\x51\x25\xbf\x15\x79\x13\x31\x8a\xa4\xbd\xe5\x0e\x80\x09\xf7\xd7\xab\xe2\x81\x05\x92\xaf\xbd\xf3\x00\xba\x4a\xca\x3b\xb9\x11\x7f\xd6\x5c\xcc\x7f\x36\xe6\x09\x29\x3d\xff\x12\x8c\xa1\x7e\x1c\x01\xb7\x42\x24\x22\xf0\x75\x23\x41\xb1\x58\x0d\x85\x0b\x00\x83\x43\x02\x00\xda\x00\x71\x43\xa4\xeb\x9f\xf5\x50\x59\xf7\x8e\xa7\x69\x33\x66\xe6\x3e\xaa\xe0\x68\x37\x1f\xaa\xa8\x3c\x73\xec\xe0\xfb\x2b\xdd\xff\x40\xf4\xa1\x4a\x55\x05\xa5\x40\x1e\x14\x02\x68\x90\x0a\x25\x15\xa9\x5a\x5d\xc5\xf4\x45\x1a\x30\x9e\x3b\x9d\x6c\x75\x40\x26\x80\x8b\x27\x7c\xb3\x21\x59\xb1\xcf\xd2\x57\x21\x5c\x0c\x68\x02\x78\xed\x5d\x02\xe6\x3e\x16\x89\xb5\x36\x28\x64\x3e\x51\x1e\x9f\xa1\xbb\xfb\xb6\x3c\x0a\xa0\xe2\x7d\x7e\x13\x7f\x1c\x88\xcc\x1d\xf9\x14\x70\x56\x7c\x5c\xb3\xe0\x51\x06\x04\x3e\xb8\x69\x98\x14\x01\x64\x16\x69\x0e\x8a\xb3\x2a\xed\x85\x05\x93\x5c\x32\x0b\x25\xaf\x32\x3e\x4b\x3c\x32\xcf\x11\x0e\x8e\x9d\xf5\xfc\x10\x20\x25\x3b\x71\x52\x37\x55\xb2\x3d\x35\xc8\xc8\x91\x88\xa9\xff\xd8\x81\x4f\x7d\x00\x33\x85\xb9\xd8\x07\x48\x0f\x4e\x40\x0f\xf1\x09\xe3\x31\xb5\xe7\xb9\x13\xe7\x07\xc1\x09\x4f\x10\x09\xb3\x62\x72\x40\x38\xf4\x6d\x79\x9e\x80\x59\xc1\x7e\x39\x33\x70\xa6\x9e\x12\x0a\x24\xba\xc6\x3c\x63\xc3\xb7\x3a\x99\x35\xf9\x73\x1d\xc8\x1c\x04\xc6\xb3\x07\x40\xe8\x11\x88\xda\x56\xa1\x66\x77\x04\xf5\x0d\xd7\x18\x18\x04\xa0\x44\x75\x13\x01\xb4\xcd\x7b\xee\xe0\x75\x83\xab\x33\x68\x3b\xde\x24\x80\x2b\x83\x19\x8b\xc8\x05\xab\xf5\x40\x6b\x85\x5e\x8f\x1c\x40\xba\xad\xb3\xfb\x3c\x75\x41\xbf\xf9\xe6\x6a\xf5\x1d\xc9\x2b\x54\x58\x6d\xd4\x79\xfa\xa2\x49\xe7\x5b\x1b\xad\xf5\xc8\x87\x6c\xb2\xad\x50\x89\xfc\x08\xe6\x1a\xc2\xa1\x36\xd6\x23\x37\xa0\xc5\xb6\x41\x26\xeb\x28\x3f\x87\x04\x1c\xea\x19\xc2\xaa\x28\x3c\x4b\x94\x48\x7a\x1e\x6a\x94\xee\xdd\xe8\xd4\x14\x02\xf5\xae\x1c\xdf\x1d\x87\xe8\x92\xa7\x24\xf0\xf4\x04\x40\x0e\x55\x12\xe3\xcd\x0c\x08\xa1\x44\xcf\x71\x04\x4d\x5b\xdc\x46\x3f\x67\x19\xc6\xe0\x49\xab\xc4\xc1\x51\x97\xa7\xeb\xd8\x4e\x31\x57\x19\xca\xd0\x64\x55\xb4\xe7\xa8\x82\xd3\x14\x37\x54\xcf\x51\x86\x2c\x08\x24\x8c\x85\x62\x22\x83\x44\x38\xde\xa4\x95\x88\x69\xa8\x5b\x63\x18\xfe\x94\x0b\x8d\x02\x89\xa0\x0f\xd0\x14\xc1\x2d\x35\xf3\x83\x53\x07\x08\x4a\x10\x8f\x6a\x16\xc1\x74\x34\x9f\xb3\x88\x86\x65\x2f\x12\x4d\xaa\xb3\x67\x0f\x28\xd5\xd9\xcb\xc4\x94\xea\xec\x9b\x0e\x2b\xd5\xd9\xef\x24\xb2\x44\xc6\xe1\xf7\x1b\x5c\x1a\x06\xea\x77\x1f\x5f\xaa\xb3\x57\x08\x31\xe1\x4f\xf1\xaf\x15\x65\xa2\x3d\xba\x9d\x40\x53\xf6\xcd\xc4\x9a\xea\xec\xc6\xc3\x4d\xdd\xbc\xbc\xfd\x88\x53\x9d\x7d\x93\x41\xa7\x3a\xbb\xb1\xb8\x53\x76\xe3\xa1\x27\x60\xba\xdc\x42\xf4\x09\x9e\x24\xb7\x11\x80\xea\xa6\xc6\x37\x10\x83\xca\x6e\x3f\x0c\x95\xdd\x48\x24\x4a\x98\x04\xaf\x1f\x8c\x92\xd5\xfd\xd5\xe3\x51\x80\xc1\x7f\xeb\x90\x94\x6c\xcc\xdf\x3e\x2a\x95\xbd\x7d\x60\xaa\x13\xcb\xed\xc5\xa6\xb2\x37\x0e\x4f\x81\x73\xf8\x35\x22\x54\xaa\xb9\x7b\x23\x41\x2a\x68\xb5\x7a\xed\x38\x55\x76\x9b\xa1\x2a\xcd\x99\x5a\x4c\x3e\x8b\x5f\x24\x56\x95\xc5\xcf\x1e\xab\xca\xe2\x97\x89\x55\x65\xf1\x37\x1d\xab\xca\xe2\xdf\x49\xac\x8a\x8c\xc3\xef\x37\x56\x35\x0c\xd4\xef\x3e\x56\x95\xc5\xaf\x10\xab\xc2\xf7\x01\x5e\x2b\x56\x45\x7b\x74\x33\xb1\xaa\x2c\xfe\x66\x62\x55\x59\x7c\xe3\xb1\xaa\x6e\x5e\xde\x7e\xac\x2a\x8b\xbf\xc9\x58\x55\x16\xdf\x56\xac\x0a\x9c\x38\xb7\x14\xab\x02\xa6\xcb\x2d\xc4\xaa\xe0\x49\x72\x1b\xb1\xaa\x6e\x6a\xdc\x7e\xac\x0a\x6b\xde\x6d\xc7\xaa\xa4\xc9\xf1\x56\xb1\x2a\x61\x12\xbc\x7e\xac\x4a\x56\xf7\x57\x8f\x55\x01\x06\xff\xad\x63\x55\xb2\x31\x7f\xf3\x58\x15\x30\xab\x5e\x3d\x56\xd5\x89\xe5\xe6\x62\x55\x8a\xb9\xfc\x7a\xb1\x2a\x70\x0e\xbf\x46\xac\x4a\x35\x77\x6f\x24\x56\x05\xad\x56\xaf\x1c\xab\x52\x4e\x9a\xdb\x8b\x55\xf5\x17\x7b\xc9\x84\x3d\xbc\xcc\x2d\xbd\xc3\xb3\xc7\xaa\xd2\xc3\xcb\xc4\xaa\xd2\xc3\x37\x1d\xab\x4a\x0f\xbf\x93\x58\x15\x19\x87\xdf\x6f\xac\x6a\x18\xa8\xdf\x7d\xac\x2a\x3d\xbc\x42\xac\x0a\x27\x25\x78\xad\x58\x15\xed\xd1\xcd\xc4\xaa\xd2\xc3\x37\x13\xab\x4a\x0f\x37\x1e\xab\xea\xe6\xe5\xed\xc7\xaa\xd2\xc3\x37\x19\xab\x4a\x0f\xb7\x15\xab\x02\x27\xce\x2d\xc5\xaa\x80\xe9\x72\x0b\xb1\x2a\x78\x92\xdc\x46\xac\xaa\x9b\x1a\xb7\x1f\xab\xc2\x9a\x77\xdb\xb1\x2a\x69\x72\xbc\x55\xac\x4a\x98\x04\xaf\x1f\xab\x92\xd5\xfd\xd5\x63\x55\x80\xc1\x7f\xeb\x58\x95\x6c\xcc\xdf\x3c\x56\x05\xcc\xaa\x57\x8f\x55\x75\x62\xb9\xb9\x58\x95\x62\x2e\xbf\x5e\xac\x0a\x9c\xc3\xaf\x11\xab\x52\xcd\xdd\x1b\x89\x55\x41\xab\xd5\x2b\xc7\xaa\x94\x93\xe6\xf6\x62\x55\x43\x76\x31\x4c\xbf\x4d\x5f\x24\x58\xd5\xa6\xcf\x1e\xac\x6a\xd3\x97\x09\x56\xb5\xe9\x37\x1d\xac\x6a\xd3\xdf\x49\xb0\x8a\x8c\xc3\xef\x37\x58\x35\x0c\xd4\xef\x3e\x58\xd5\xa6\xaf\x10\xac\xc2\x99\x11\x5f\x2b\x58\x45\x7b\x74\x33\xc1\xaa\x36\xfd\x66\x82\x55\x6d\x7a\xe3\xc1\xaa\x6e\x5e\xde\x7e\xb0\xaa\x4d\xbf\xc9\x60\x55\x9b\xde\x56\xb0\x0a\x9c\x38\xb7\x14\xac\x02\xa6\xcb\x2d\x04\xab\xe0\x49\x72\x1b\xc1\xaa\x6e\x6a\xdc\x7e\xb0\x0a\x6b\xde\x6d\x07\xab\xa4\xc9\xf1\x56\xc1\x2a\x61\x12\xbc\x7e\xb0\x4a\x56\xf7\x57\x0f\x56\x01\x06\xff\xad\x83\x55\xb2\x31\x7f\xf3\x60\x15\x30\xab\x5e\x3d\x58\xd5\x89\xe5\xe6\x82\x55\x8a\xb9\xfc\x7a\xc1\x2a\x70\x0e\xbf\x46\xb0\x4a\x35\x77\x6f\x24\x58\x05\xad\x56\xaf\x1c\xac\x52\x4e\x9a\xb7\x0e\x56\x79\xfb\xb4\x88\x1a\xf2\x62\x10\xfe\xb9\xee\x7e\xf2\xbb\xb1\x0e\x80\xbc\x7a\x44\x20\xf0\x6f\x19\x04\x67\xcd\x27\x10\x42\xce\x7c\x5d\x56\xac\xae\x65\x9d\x99\x19\xa8\x33\x1b\x1e\xfa\x27\x63\x40\x36\xb4\x37\x1e\xbb\xd6\x59\x6c\xe6\x23\x8b\x6d\xf8\xe8\xdf\x24\xb1\xe5\x63\x3c\xcd\x86\x47\xe3\x60\xe6\x23\x3d\xd8\xf0\xd1\x3f\x7a\x61\xcb\x07\x13\xa9\xec\x9a\xb7\xa9\x99\x91\x36\xb5\x61\xa4\x7f\x55\x01\x66\xc4\xdb\x27\x2d\x7d\xa4\x6b\x78\x11\x11\x17\xd1\xf7\x95\xfb\xa7\x46\xc5\xe7\x45\xfd\xa9\xdf\xb7\xa5\xcf\x68\x09\xcd\x85\x37\x4a\x15\x18\xea\x26\xd9\x7d\x79\xe4\xc9\xf7\xd3\x94\xd4\x6d\x86\x72\xfa\x37\xe1\x4b\x40\x53\xb9\x45\x9e\x3e\x02\x8f\x3a\x52\xe1\x8e\xef\x73\x06\xe3\x73\x8d\xc3\x3b\xa3\x6b\xb7\x2b\x2d\xee\x51\xb5\x4f\x8b\x87\xfe\x41\xfc\x5d\x9a\x94\xeb\x0a\xed\x1a\xf2\x46\xf7\xc4\xff\xb8\xd9\x0e\xd1\x54\x4a\xd1\xc5\xaf\xbf\x45\xdb\x14\xad\xc9\xfb\x93\x13\xa0\x06\xff\x3a\x33\xfd\x88\x9a\x64\x47\x39\xc3\x2f\x89\x52\xd6\xe8\xab\xa2\x98\x23\x7f\x64\x07\x3f\xd5\x9f\x22\xc2\x4f\x07\x73\xf1\x1e\xdc\x70\x7e\xa6\x4f\x10\xcf\xdf\xb3\x63\xfe\xe0\xce\x7d\x5a\x33\xf7\x85\x9a\x65\xdf\x66\x29\xb6\x09\xfc\xbe\x51\xe0\xf3\xad\x8e\x1d\xa5\xfe\x85\xe3\xb9\x50\x35\xf7\xfb\xaa\xb9\xd8\x6a\x39\xb4\x5a\x8a\xad\x3a\x62\xc3\xcb\x9e\x7c\xbb\x8c\xb0\x32\xbe\xac\x2a\x01\x1c\x07\x00\x15\x0a\xb7\xab\x26\x32\x74\xb8\xe7\xea\xb2\x66\xa8\x92\x9f\xd1\xcb\xaa\xb1\x12\x78\x3c\x2f\xdb\x8e\xd5\xd0\x8b\x79\x59\x3a\xd6\xcb\x0f\xe5\x65\xad\x06\xf9\x46\xdd\xec\x51\xc9\xf0\x46\xc7\x8b\x1b\xf4\x12\x20\x2f\xca\x39\xe4\x1f\x41\x16\x01\x8b\x1a\x80\xa8\x46\x08\xc2\x33\x00\xb3\x1d\x61\x28\x27\x00\x50\x3a\x02\xe1\x3e\x02\x20\xad\x89\xd6\xc6\x80\xe0\x51\xdf\x9d\x8d\x91\x49\x37\x1c\x64\x46\x44\x06\x48\x2c\xe4\x48\x00\x02\x0b\x85\x4e\x00\xf2\x0a\x45\x79\x01\xe2\x0a\x79\x71\x01\xd2\xd2\x13\xda\xe8\x9b\x3f\x6a\x3b\xb2\x31\xf1\xe7\x4e\x7b\x49\x05\x9d\xa0\x02\x59\x4e\x53\x16\x7d\x20\x8b\x69\xca\x73\x1f\xc8\x52\x9a\x0a\x52\x0a\x64\x21\x4d\x39\x21\x05\xb2\x8c\xb4\x54\x36\xda\xc6\x8f\xba\x2e\x6c\x0c\xac\xb9\xb3\x41\x3e\x44\x95\x02\x48\x97\x66\x1c\x01\x48\x99\x66\x02\xff\x90\x36\xcd\x44\x39\x41\xea\x34\xe3\x25\x05\xe9\x93\x81\xd6\xc6\x80\xe0\x51\xdf\x9d\x8d\x91\x49\x77\xde\xcb\x6c\xda\x49\x6c\x2a\xcb\x6b\xce\x12\x98\xca\xd2\x9a\xf3\x3d\x98\xca\xb2\x9a\x0b\xb2\x9a\xca\x92\x9a\x73\x92\x9a\xca\x72\xd2\x52\xd9\x68\x1b\x3f\xea\xba\xb0\xd1\xb3\x56\xba\xfe\x79\xf0\x59\xf8\x45\xad\x6c\xc6\x3a\x79\x55\x2b\x2b\xa6\x16\x58\xd6\xca\x2d\x53\x0f\xad\x25\x65\xca\x00\xc8\x2b\x54\xd9\xea\xf0\x6f\x34\x0d\x1f\xd5\x6c\x6f\xb4\x0c\xb9\xc1\x20\x0a\xe5\xea\x56\x36\x23\x94\x62\x79\x2b\x2b\x06\x44\xb5\xbe\x95\x5b\x06\x48\xb9\x76\x94\x29\x03\xa5\x58\xa0\xca\xd6\x48\x6e\x63\x42\xf1\x68\xe8\xd4\xc6\xcc\xa9\x1b\x8e\xc2\x83\x97\xb9\xb2\x19\x61\xe0\x75\xae\xac\x18\x08\xc5\x42\x57\x6e\x19\x18\xd5\x4a\x52\xa6\x0c\x10\xbc\x56\x95\xad\x89\xd6\xc6\x80\xe0\x51\xdf\x9d\x8d\x91\x49\x77\x3a\x88\x0c\x5c\xef\xca\x66\x84\x00\x17\xbc\xb2\x62\x00\xe0\x15\xaf\xdc\x32\x20\x8a\x75\xa5\x4c\x19\x18\x70\xd9\x2a\x5b\x03\xa1\x8d\xbe\xf9\xa3\xb6\x23\x1b\x13\x7f\xee\x6c\x14\x94\x6a\xe1\x2b\x9b\x11\x4a\xb1\xf2\x95\x15\x03\xa2\x5a\xfa\xca\x2d\x03\xa4\x5c\x56\xca\x94\x81\x52\xac\x5d\x65\x6b\x24\xb7\x31\xa1\x78\x34\x74\x6a\x63\xe6\xd4\x9d\x0f\xc2\x03\x57\xc0\xb2\x19\x21\xc0\x25\xb0\xac\x18\x00\x78\x0d\x2c\xb7\x0c\x88\x6a\xa5\x49\x19\x18\x70\x21\x2b\x5b\x03\xa1\x8d\xbe\xf9\xa3\xb6\x23\x1b\x03\x7f\x34\x05\x1d\x75\x16\xc4\x90\x70\xd6\xb0\xd5\x18\xbd\x04\x52\x71\x20\xd5\xb0\xf1\x16\xbc\x05\x16\x88\xf2\x22\x41\xa5\x1c\x14\xee\xae\x04\xd3\x1a\xc9\x6d\xb4\xed\x1f\x0d\x3d\xda\x68\x79\x54\x87\xff\x32\xb7\xd6\xee\x94\x99\x5a\x70\xb3\xcc\xd6\xc3\xfb\x65\x16\x42\xb1\x65\x66\x41\xc0\x5d\xb3\x96\x8a\x76\xe3\xac\xe1\x5f\xbf\x77\xae\x2d\xb7\xcf\x0c\x9c\x7a\x07\xcd\x02\x69\x36\xd1\x2c\x98\x6e\x1f\xcd\xc2\xa9\xb7\xd2\x66\xa2\xe6\xdd\xb4\xa9\x77\x16\x1b\xea\xda\x6a\x4f\xcd\x40\x29\xb7\xd5\x2c\x8c\x7a\x67\xcd\x42\x69\x36\xd7\x2c\x98\x72\x7f\x6d\xa4\x68\xdc\x62\x1b\xfa\x65\xde\x65\xd7\x16\x1b\x6d\x06\x46\xb5\xd7\x66\x41\x94\xdb\x6d\x16\x48\xbd\xe3\x66\xa1\x54\x9b\x6e\x13\x39\xd3\xbe\x5b\xdf\x23\xe3\xd6\xbb\xb6\xdc\x7d\x33\x70\xea\x0d\x38\x0b\xa4\xd9\x83\xb3\x60\xba\x6d\x38\x0b\xa7\xde\x89\x9b\x89\x9a\x37\xe3\xa6\xde\x59\xec\xc7\x6b\x8b\x2d\x39\x03\xa3\xda\x95\xb3\x20\xca\x8d\x39\x0b\xa4\xde\x9b\xb3\x50\xaa\xed\xb9\x89\x9c\x69\x87\xae\xef\x91\x71\x93\x8e\xd7\x1c\xf5\x3e\x9d\xad\x06\xb7\xea\x1c\x00\xbc\x5b\xe7\x40\x14\x1b\x76\x0e\x06\xdc\xb3\xeb\x09\xe9\xb7\xed\xba\x5e\x18\x76\xee\x78\x51\xb1\xd9\xbc\xb3\x80\xea\xfd\x3b\x07\xa5\xd9\xc2\x73\x70\xba\x5d\x3c\x07\xa8\xde\xc8\x5b\xd0\xb5\xd8\xcb\x1b\xfb\x68\xb3\x9d\xc7\xab\x8c\x79\x47\xcf\x82\x29\x37\xf5\x1c\x90\x7a\x5f\xcf\x81\x69\xb6\xf6\x1c\x9c\x72\x77\x6f\x26\x6a\xde\xe0\x9b\x7a\x67\xb1\xc7\xc7\xcb\x8e\x69\x9b\xcf\x02\xa9\x76\xfa\x1c\x8c\x72\xb3\xcf\x41\xa9\xf7\xfb\x1c\x98\x6a\xcb\x6f\xa4\x68\xdc\xf5\x1b\xfa\x65\xde\xf8\xe3\xf5\xc6\x66\xef\xcf\x02\xaa\xb7\xff\x1c\x94\x26\x02\xc0\xc1\xe9\x82\x00\x1c\xa0\x3a\x0e\x60\x41\xd7\x22\x14\x60\xec\xa3\x4d\x34\x00\x2f\x44\xa6\x80\x00\x0b\xa4\x8a\x09\x70\x30\xca\xb0\x00\x07\xa5\x8e\x0c\x70\x60\xaa\xe0\x80\x91\xa2\x31\x3e\x60\xe8\x97\x39\x44\x50\x1b\xa3\x04\x3c\x84\x2a\x50\x20\x40\x29\x63\x05\x02\x9c\x3a\x5c\x20\x00\xaa\x22\x06\x16\x74\x4d\x41\x03\x63\x07\xf5\x71\x03\xcd\x79\x9d\xcc\xcd\x62\x5d\xe0\x80\xa9\x05\x03\x07\x6c\x3d\x1c\x38\x60\x21\x14\x81\x03\x16\x04\x0c\x1c\x68\xa9\x68\x03\x07\x1a\xfe\xf5\x81\x83\x2c\xb6\x0b\x1c\x30\x70\xea\xc0\x01\x0b\xa4\x09\x1c\xb0\x60\xba\xc0\x01\x0b\xa7\x0e\x1c\x98\x89\x9a\x03\x07\xa6\xde\x59\x04\x0e\xb2\xd8\x26\x70\xc0\x40\x29\x03\x07\x2c\x8c\x3a\x70\xc0\x42\x69\x02\x07\x2c\x98\x32\x70\x60\xa4\x68\x0c\x1c\x18\xfa\x65\x0e\x1c\x64\xb1\x39\x70\xc0\xc0\xa8\x02\x07\x2c\x88\x32\x70\xc0\x02\xa9\x03\x07\x2c\x94\x2a\x70\x60\x22\x67\x0a\x1c\xe8\x7b\x64\x0c\x1c\x64\xb1\x5d\xe0\x80\x81\x53\x07\x0e\x58\x20\x4d\xe0\x80\x05\xd3\x05\x0e\x58\x38\x75\xe0\xc0\x4c\xd4\x1c\x38\x30\xf5\xce\x22\x70\x90\xc5\xe6\xc0\x01\x03\xa3\x0a\x1c\xb0\x20\xca\xc0\x01\x0b\xa4\x0e\x1c\xb0\x50\xaa\xc0\x81\x89\x9c\x29\x70\xa0\xef\x91\x31\x70\x80\xd7\x1c\x75\xe0\x80\xad\x06\x03\x07\x1c\x00\x1c\x38\xe0\x40\x14\x81\x03\x0e\x06\x0c\x1c\xe8\x09\xe9\x03\x07\xba\x5e\x18\x02\x07\x78\x51\xb1\x09\x1c\xb0\x80\xea\xc0\x01\x07\xa5\x09\x1c\x70\x70\xba\xc0\x01\x07\xa8\x0e\x1c\x58\xd0\xb5\x08\x1c\x18\xfb\x68\x13\x38\xc0\xab\x8c\x39\x70\xc0\x82\x29\x03\x07\x1c\x90\x3a\x70\xc0\x81\x69\x02\x07\x1c\x9c\x32\x70\x60\x26\x6a\x0e\x1c\x98\x7a\x67\x11\x38\xc0\xcb\x8e\x29\x70\xc0\x02\xa9\x02\x07\x1c\x8c\x32\x70\xc0\x41\xa9\x03\x07\x1c\x98\x2a\x70\x60\xa4\x68\x0c\x1c\x18\xfa\x65\x0e\x1c\xe0\xf5\xc6\x26\x70\xc0\x02\xaa\x03\x07\x1c\x94\x26\x70\xc0\xc1\xe9\x02\x07\x1c\xa0\x3a\x70\x60\x41\xd7\x22\x70\x60\xec\xa3\x4d\xe0\x00\x2f\x44\xa6\xc0\x01\x0b\xa4\x0a\x1c\x70\x30\xca\xc0\x01\x07\xa5\x0e\x1c\x70\x60\xaa\xc0\x81\x91\xa2\x31\x70\x60\xe8\x97\x39\x70\xd0\x67\x0d\x57\x07\x0e\x78\x08\x55\xe0\x40\x80\x52\x06\x0e\x04\x38\x75\xe0\x40\x00\x54\x05\x0e\x2c\xe8\x9a\x02\x07\xc6\x0e\x5e\x1d\x38\xe8\x2f\xd8\x64\x6e\x7a\xd0\x05\x0e\x98\x5a\x30\x70\xc0\xd6\xc3\x81\x03\x16\x42\x11\x38\x60\x41\xc0\xc0\x81\x96\x8a\x36\x70\xa0\xe1\x5f\x1f\x38\x48\x0f\x76\x81\x03\x06\x4e\x1d\x38\x60\x81\x34\x81\x03\x16\x4c\x17\x38\x60\xe1\xd4\x81\x03\x33\x51\x73\xe0\xc0\xd4\x3b\x8b\xc0\x41\x7a\xb0\x09\x1c\x30\x50\xca\xc0\x01\x0b\xa3\x0e\x1c\xb0\x50\x9a\xc0\x01\x0b\xa6\x0c\x1c\x18\x29\x1a\x03\x07\x86\x7e\x99\x03\x07\xe9\xc1\x1c\x38\x60\x60\x54\x81\x03\x16\x44\x19\x38\x60\x81\xd4\x81\x03\x16\x4a\x15\x38\x30\x91\x33\x05\x0e\xf4\x3d\x32\x06\x0e\xd2\x83\x5d\xe0\x80\x81\x53\x07\x0e\x58\x20\x4d\xe0\x80\x05\xd3\x05\x0e\x58\x38\x75\xe0\xc0\x4c\xd4\x1c\x38\x30\xf5\xce\x22\x70\x90\x1e\xcc\x81\x03\x06\x46\x15\x38\x60\x41\x94\x81\x03\x16\x48\x1d\x38\x60\xa1\x54\x81\x03\x13\x39\x53\xe0\x40\xdf\x23\x63\xe0\x00\xaf\x39\xea\xc0\x01\x5b\x0d\x06\x0e\x38\x00\x38\x70\xc0\x81\x28\x02\x07\x1c\x0c\x18\x38\xd0\x13\xd2\x07\x0e\x74\xbd\x30\x04\x0e\xf0\xa2\x62\x13\x38\x60\x01\xd5\x81\x03\x0e\x4a\x13\x38\xe0\xe0\x74\x81\x03\x0e\x50\x1d\x38\xb0\xa0\x6b\x11\x38\x30\xf6\xd1\x26\x70\x80\x57\x19\x73\xe0\x80\x05\x53\x06\x0e\x38\x20\x75\xe0\x80\x03\xd3\x04\x0e\x38\x38\x65\xe0\xc0\x4c\xd4\x1c\x38\x30\xf5\xce\x22\x70\x80\x97\x1d\x53\xe0\x80\x05\x52\x05\x0e\x38\x18\x65\xe0\x80\x83\x52\x07\x0e\x38\x30\x55\xe0\xc0\x48\xd1\x18\x38\x30\xf4\xcb\x1c\x38\xc0\xeb\x8d\x4d\xe0\x80\x05\x54\x07\x0e\x38\x28\x4d\xe0\x80\x83\xd3\x05\x0e\x38\x40\x75\xe0\xc0\x82\xae\x45\xe0\xc0\xd8\x47\x9b\xc0\x01\x5e\x88\x4c\x81\x03\x16\x48\x15\x38\xe0\x60\x94\x81\x03\x0e\x4a\x1d\x38\xe0\xc0\x54\x81\x03\x23\x45\x63\xe0\xc0\xd0\x2f\x73\xe0\xa0\x4f\xe1\xac\x0e\x1c\xf0\x10\xaa\xc0\x81\x00\xa5\x0c\x1c\x08\x70\xea\xc0\x81\x00\xa8\x0a\x1c\x58\xd0\x35\x05\x0e\x8c\x1d\xbc\x3a\x70\x30\x64\xc4\xc8\xdc\x36\xd5\x45\x0e\x98\x5a\x30\x72\xc0\xd6\xc3\x91\x03\x16\x42\x11\x39\x68\x4d\x37\xfc\xb5\x54\xb4\x91\x03\x0d\xff\xfa\xc8\x41\x9b\xda\x45\x0e\x18\x38\x75\xe4\x80\x05\xd2\x44\x0e\x58\x30\x5d\xe4\xa0\xb5\xba\xf6\x6f\x26\x6a\x8e\x1c\x98\x7a\x67\x11\x39\x68\x53\x9b\xc8\x01\x03\xa5\x8c\x1c\xb0\x30\xea\xc8\x01\x0b\xa5\x89\x1c\xb4\x36\xb9\x00\x8c\x14\x8d\x91\x03\x43\xbf\xcc\x91\x83\x36\x35\x47\x0e\x18\x18\x55\xe4\x80\x05\x51\x46\x0e\x58\x20\x75\xe4\xa0\xb5\x48\x10\x60\x22\x67\x8a\x1c\xe8\x7b\x64\x8c\x1c\xb4\xa9\x5d\xe4\x80\x81\x53\x47\x0e\x58\x20\x4d\xe4\x80\x05\xd3\x45\x0e\x5a\xab\xac\x01\x66\xa2\xe6\xc8\x81\xa9\x77\x16\x91\x83\x36\x35\x47\x0e\x18\x18\x55\xe4\x80\x05\x51\x46\x0e\x58\x20\x75\xe4\xa0\xb5\x48\x25\x60\x22\x67\x8a\x1c\xe8\x7b\x64\x8c\x1c\xb4\xa9\x36\x72\xc0\x56\x83\x91\x03\x0e\x00\x8e\x1c\x70\x20\x8a\xc8\x41\x6b\xcc\x2f\xa0\x27\xa4\x8f\x1c\xe8\x7a\x61\x88\x1c\xb4\xa9\x65\xe4\x80\x05\x54\x47\x0e\x38\x28\x4d\xe4\x80\x83\xd3\x45\x0e\x5a\xbb\xa4\x03\x16\x74\x2d\x22\x07\xc6\x3e\xda\x44\x0e\xda\xd4\x2a\x72\xc0\x82\x29\x23\x07\x1c\x90\x3a\x72\xc0\x81\x69\x22\x07\xad\x55\x26\x02\x33\x51\x73\xe4\xc0\xd4\x3b\x8b\xc8\x41\x9b\x5a\x44\x0e\x58\x20\x55\xe4\x80\x83\x51\x46\x0e\x38\x28\x75\xe4\xa0\xb5\x49\x4f\x60\xa4\x68\x8c\x1c\x18\xfa\x65\x8e\x1c\xb4\xa9\x65\xe4\x80\x05\x54\x47\x0e\x38\x28\x4d\xe4\x80\x83\xd3\x45\x0e\x5a\xbb\x9c\x05\x16\x74\x2d\x22\x07\xc6\x3e\xda\x44\x0e\xda\xd4\x22\x72\xc0\x02\xa9\x22\x07\x1c\x8c\x32\x72\xc0\x41\xa9\x23\x07\xad\x4d\x22\x03\x23\x45\x63\xe4\xc0\xd0\x2f\x73\xe4\xa0\x4d\x4d\x91\x03\x1e\x42\x15\x39\x10\xa0\x94\x91\x03\x01\x4e\x1d\x39\x68\xed\xb2\x1b\x58\xd0\x35\x45\x0e\x8c\x1d\x34\x44\x0e\xbc\x06\xb5\x43\xaa\xfd\x33\xfe\x83\x64\x64\x95\x32\x41\x53\x50\xfa\x94\xc6\xc3\x31\x69\x90\x8b\x53\x2f\x03\x4f\x61\x60\xc8\xa6\x3a\xe5\xbb\xa8\x41\x67\x31\x37\x24\xae\x1d\x0a\x51\x9a\x26\x65\x9d\xd4\x1b\x19\x25\x45\x84\x73\x79\x32\xac\x89\x09\x3d\x71\x15\x49\xe6\xc9\x40\x49\x19\x3d\x71\x1d\x4d\xf8\xcb\xc0\x49\x39\x78\xd5\x79\x1f\x70\xab\x3e\xeb\xab\x89\xa1\x21\xf3\xab\x91\xa7\x3a\xb3\x61\x4b\x73\xad\x04\x37\xeb\xb3\xc0\x9a\xf8\x1a\x32\xc1\x1a\xf9\x1a\x1f\x9e\xbf\x92\xaf\xfe\xd4\x0a\x19\xbd\x83\x1d\x5f\x43\x66\x58\x23\x5f\xe3\x23\x63\x57\xf2\x35\x04\xc5\x70\xbb\x3e\x4b\xac\x89\xb1\x21\x53\xac\x91\xb1\x31\xa1\xb4\x96\x31\xda\x8b\xe2\x01\x55\xbb\xa8\x46\x67\x3a\x5b\xa2\xbc\xde\x17\x55\xb6\x1e\x2a\x24\xfc\xa7\xb2\x84\x9b\x0c\x15\xb2\xbe\x47\x65\xd2\x44\x69\xf2\x9b\xd4\x66\xac\xe1\xd2\xde\x16\x79\xe3\x3e\xe0\xec\xa0\x2e\x79\xea\xe9\xcc\x14\xad\x67\xbe\xcf\xc3\x6c\x8b\x34\xe6\x20\x96\x03\x04\xc6\xbe\x23\x95\x75\xf3\x98\xa2\x35\x29\xa1\x9c\xe1\xe9\x7e\xde\x15\x69\x51\xad\xff\xb4\xdf\xef\x65\xf5\x3b\x35\x28\xee\x01\x16\xd3\xc5\x6e\x19\x32\x30\x11\x03\x44\x92\xc4\x4e\xb8\xa2\x63\x67\x60\xfa\xd6\xb3\xed\x3c\x9c\x2f\x25\x0a\x65\x95\x64\x51\xf5\xd8\x43\xf9\xe1\x72\x1e\xdf\xc9\x34\x28\x18\x4f\xa5\x2f\xe4\xe8\xf8\xe1\x3c\x8a\xe6\xf2\x04\x3f\xed\x76\xa8\xae\x7b\xa8\xf9\x6e\x7b\x37\xdf\xc9\x74\x28\x18\x4f\xa7\x2f\xe4\xfb\x33\x5b\xc5\xb3\x99\x44\x27\xc9\xf7\xc5\x40\x64\xbb\xf3\x63\x24\x13\xe9\x60\x78\x0a\xb8\x84\x43\x3f\x0d\xb6\x7e\x2c\x77\xe3\x21\xaa\xf2\x24\x3f\x0c\x63\xe6\x47\xf1\x0c\xa0\x40\xc1\x78\x22\x7d\x21\x47\x07\xed\x56\xcb\x40\x1e\xf8\x38\xca\x0f\x23\x50\xbc\x9a\x4f\x67\x7b\x99\x0c\x81\xe2\xa9\xd0\x32\x8e\xc8\x6e\x35\xf5\xc3\x9d\x44\xe4\x50\x45\x8f\x6e\x1c\x55\x5f\x7a\xb8\x70\x15\x6e\x43\x60\x54\x06\x40\x9e\xd4\x58\xcc\x51\x0b\xfc\x20\x08\x42\x89\xda\x31\x89\x11\x9e\x09\x6b\xff\x93\xef\x44\x1b\x02\x8d\x27\x63\x19\x55\x28\x6f\xc8\xa2\x58\x1f\xa3\xb8\x78\xc0\x79\xa6\x37\xdb\x68\xf7\xe5\x80\x1f\x35\x70\x65\xe8\x31\x97\x72\x92\xd3\x14\xc7\x67\xfc\x6f\x92\x26\xcd\x23\x5d\x68\xb9\xcc\xc1\xb8\xc4\x6d\x6b\xf7\x54\x9e\xe3\xa4\x2e\xd3\xe8\x51\x99\xef\x7c\xc8\x20\x3c\x5f\xce\xb1\xbd\x1c\x5b\xc7\xc5\x43\xae\x6a\xaf\x59\x39\x29\x82\x3a\xd3\x90\x07\xe8\x2f\x17\x4b\xa1\xf9\x95\xf4\xfb\x15\x92\x22\xc8\xe2\xeb\xe8\xaf\x56\x81\xd0\xfc\x4a\xfa\xfd\x4a\x48\x11\xa4\x87\xeb\xe8\x07\xc1\x6a\x25\xb4\xbf\x92\x81\x61\xc9\xeb\x87\x30\xd5\x71\xc0\x40\xe9\xe8\x78\x54\xe5\x3a\x23\x98\x37\xee\x36\x2d\x76\x5f\x0c\x4a\x85\x21\xcf\xda\x86\xf8\x2f\x8e\x1b\x1e\x3a\xc9\xf1\x53\x08\x4f\xa0\x23\xb4\x24\x7f\x1a\x29\x3d\xbd\x5f\x60\x7b\xb6\x10\x18\x33\x8a\x88\x0e\x00\xf9\x4b\x35\x4c\x9f\xbe\xff\x93\x53\x17\xa7\x6a\x87\x7e\x89\xca\x32\xc9\x0f\xff\xfd\x9f\x3f\xff\xb8\x2d\x8a\xa6\x6e\xaa\xa8\xf4\xb2\x24\xf7\x76\x75\xed\x65\x51\xe9\x7c\xff\xe9\xff\x0f\x00\x00\xff\xff\xae\xba\xa2\x3e\xd4\x4d\x02\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xec\xbd\x7b\x8f\xe3\x38\x92\x20\xfe\xff\x7d\x0a\x6f\x16\x0a\xd5\x39\x6d\xb9\x24\xd9\xf2\x13\xdd\xd8\xd9\xc1\x2e\x6e\x81\xee\xf9\x63\xe7\x0e\x38\xa0\xaf\x0e\x90\x2d\xda\xd6\x94\x5e\x27\xc9\x95\xca\x36\x72\x3f\xfb\x0f\x7c\x49\x7c\x04\x29\xc9\x76\xd6\xcc\xdc\x6f\xb7\x77\x2a\x65\x32\x18\x11\x64\x04\x43\x11\x14\x19\xfc\xfc\x87\x7f\xfa\x6f\x93\x3f\x4c\xfe\x25\xcf\xeb\xaa\x2e\xc3\x62\xf2\x6d\x31\x5b\xce\xfc\xc9\x0f\xe7\xba\x2e\xaa\xed\xe7\xcf\x27\x54\xef\x79\xe5\xec\x90\xa7\x9f\x9f\x31\xfc\x9f\xf2\xe2\xb5\x8c\x4f\xe7\x7a\xe2\xbb\x9e\xe7\xf8\xae\xef\x4f\xfe\xc7\x19\x09\x78\xfe\x78\xa9\xcf\x79\x59\x19\x81\x5f\xe2\xba\x46\xe5\x74\xf2\xef\xd9\x61\x86\x81\x7e\x89\x0f\x28\xab\x50\x34\xb9\x64\x11\x2a\x27\xbf\xfe\xfb\xff\x10\x78\x88\xeb\xf3\x65\x4f\xa8\xd7\x2f\xfb\xea\x73\xcb\xd0\xe7\x7d\x92\xef\x3f\xa7\x61\x9c\x7d\xfe\xe5\xdf\xff\xf4\xaf\x7f\xfe\xcb\xbf\x62\xee\x3e\x6f\xcb\x3c\xaf\xaf\x8e\xb3\x4f\x2e\x68\xfb\xc1\x75\x57\xfb\xe3\x71\xe7\x38\x71\x16\xc5\xa7\x7c\xfb\x61\xb9\xf4\xdc\xa3\xbf\x73\x9c\xe2\x52\x16\x09\xda\x7e\x58\x1e\x17\xfe\xc1\xc3\x05\x71\xf6\x75\xfb\x01\xad\xe7\x68\x7d\xd8\x39\x4e\x89\xa2\xed\x87\xe8\x30\x0f\x16\xc1\xce\x71\xf2\x32\xcc\x4e\x68\xfb\xe1\x18\xad\x90\xb7\xd8\x39\xce\x2b\x4a\x92\xfc\x65\xfb\xe1\x78\x3c\x78\xee\x6a\xe7\x38\xa7\x12\xa1\x6c\xfb\xc1\x5f\x87\x2b\xd2\xa2\x46\x61\xb2\xfd\xe0\xbb\x87\xcd\x06\x57\x1f\x5e\xc3\x6c\xfb\xc1\x5b\x85\xfe\x7e\xbd\x73\x9c\x97\x73\x5c\x63\x74\x84\xb7\x53\x19\xbe\x6e\x3f\x2c\x0f\xab\x60\x15\xb1\x9f\x4e\x14\x96\x5f\xb7\x1f\xe6\x8b\x79\xb8\x70\x31\x73\x65\x9c\x86\xe5\xab\xd0\xa1\x0a\x1d\xf2\x2c\x22\x65\x6d\xcb\xea\x72\x38\xa0\xaa\x12\xb8\x88\xb3\x63\x2e\x92\x0d\xcb\x2c\xce\x4e\x02\xdb\x11\xee\x57\x29\xf4\x34\xc1\xc2\xda\x7e\x38\xae\x8f\x9b\x63\x48\x00\x24\x46\xf6\x25\x0a\xbf\x16\x79\x9c\xd5\x4e\x53\x6d\x95\x92\x2a\xdd\x06\xab\x65\xd1\xc8\xa5\x69\xb4\x5d\x2d\xd7\x6a\x69\x72\xda\x6e\x36\xbe\x5a\xda\x24\x5b\xcf\x77\x5d\x52\x7c\xcc\xb3\xda\x39\x86\x69\x9c\xbc\x3a\x55\x98\x55\x4e\x85\xca\xf8\xb8\x75\xc2\xa2\x48\x90\x53\xbd\x56\x35\x4a\xa7\xff\x92\xc4\xd9\xd7\x5f\xc3\xc3\x5f\xc8\xcf\x7f\xcb\xb3\x7a\xfa\xf4\x17\x74\xca\xd1\xe4\x7f\xfe\xfb\xd3\xf4\x3f\xf2\x7d\x5e\xe7\xd3\xa7\xff\x8e\x92\x6f\xa8\x8e\x0f\xe1\xe4\xcf\xe8\x82\x9e\xa6\x7f\x2c\xe3\x30\x99\x3e\xfd\x39\xaf\xf3\xc9\x5f\xc2\xac\x7a\x9a\x3e\xfd\x12\xef\x51\x19\xd6\x71\x9e\xb1\x92\x8e\xe4\xf4\xe9\x8f\x98\xe4\xe4\x4f\x79\x92\x97\x93\x7f\x4d\xf3\xbf\xc6\x4f\x1d\x15\xbd\xe0\x2f\xaf\xe9\x3e\x4f\x9e\x18\x7e\xb1\x95\xd2\xab\x34\xcf\xf2\xaa\x08\x0f\x68\xfb\x97\x7f\xfb\x35\xcf\x72\xe7\x3f\xd0\xe9\x92\x84\xe5\xf4\x57\x94\x25\xf9\xf4\xd7\x3c\x0b\x0f\xf9\xf4\x4f\x79\x56\xe5\x49\x58\x49\x3c\x62\xf0\xa7\xe9\xd3\x9f\xf2\x4b\x19\xa3\x72\xf2\x67\xf4\xf2\x34\x6d\xd1\xbd\xfd\x61\xba\xdd\x86\x47\x3c\xc7\xb6\xdb\x3d\x3a\xe6\x25\xba\xee\xf3\xc6\xa9\xe2\xdf\xb1\xf4\xf7\x79\x19\xa1\xd2\xd9\xe7\xcd\xdb\xb9\x4e\x93\xab\xc0\xd2\xb6\xeb\xf5\x2e\x89\x33\xe4\x9c\x11\xd1\x07\x6f\xe6\x05\x3b\xe7\x05\xed\xbf\xc6\xb5\x53\xa3\xa6\xc6\xb8\x90\x13\x46\x7f\xbd\x54\xf5\xd6\x73\xdd\x8f\x5d\x6d\x58\x38\xe7\xf8\x74\x26\x8a\xe4\x1c\x70\xef\xb7\x75\x19\x66\x55\x11\x96\x28\xab\xdf\xc2\xb2\x8e\x0f\x09\x9a\x86\x55\x1c\xa1\xe9\x31\x3e\x1d\xc2\x02\x77\x09\x3f\x5e\x4a\x34\x3d\xe6\x39\x66\xfc\x8c\xc2\x08\xff\x39\x95\xf9\xa5\x98\xe2\x69\x3e\xcd\xc2\x6f\xd3\x0a\x1d\x30\xf0\x35\x8a\xab\x22\x09\x5f\xb7\xfb\x24\x3f\x7c\x7d\xdb\xe7\xd1\xeb\x35\x0d\xcb\x53\x9c\x6d\xdd\x9d\xd8\x9f\x7f\x68\x6d\x21\x1d\xc1\x03\xbd\xf5\x4a\x94\xd2\x9f\x2f\x54\x20\x0b\xd7\x55\x04\x14\xec\xe8\x58\x7f\xf0\x3d\x3f\xf0\x37\x3b\x22\xa5\x30\x89\x4f\xd9\x36\x41\xc7\x7a\xb7\x0f\x0f\x5f\xf1\x60\x66\x11\x13\x0a\xb6\x3e\x6f\xbf\xd5\xe1\x3e\xce\x22\xd4\xfc\xf4\xe4\x78\x4f\x5f\xb6\xc7\xfc\x70\xa9\xb6\x59\x5e\xff\x40\x1f\x9d\x6f\x71\x15\xef\x13\xf4\x7c\xcd\x2f\x35\x26\xb8\x75\xff\x29\x4e\x8b\xbc\xac\xc3\xac\x7e\x3b\x97\xa2\x5e\x1d\xf2\xac\x46\x59\x8d\x15\x6b\xc7\xd8\x72\x77\xf9\x37\x54\x1e\xb1\xa9\x64\x88\xde\xce\xde\xf4\xec\x4f\xcf\xf3\xe9\x79\x31\x3d\x07\xd3\xf3\x92\x09\xce\xa9\xf3\x62\xeb\xee\xd8\x8f\x7d\x5e\xd7\x79\xba\x9d\x05\x25\x4a\xdf\x0a\x1b\x08\x1e\x9a\xb7\x70\xbf\x2f\x7f\x8b\xc2\x3a\x74\xf2\x32\x3e\xc5\x59\x98\x38\x75\x5c\x27\xe8\xcb\x94\xd4\xd0\xe7\x2b\x19\x92\x08\x1d\x72\x2a\xba\x2d\x79\xdd\xe0\x4e\xc9\xaa\x0d\x41\x4c\xa2\xbc\xae\x51\xb4\xeb\x05\x38\x5c\xca\x2a\x2f\xb7\x67\x94\x14\xbb\x76\xa2\x11\x46\x5d\x13\x15\xa7\xfa\x1a\x17\x0e\x7e\xfd\x64\x79\x86\x76\xd6\xda\xb7\x30\x8a\x4a\x54\x55\x57\x7d\x10\x98\xba\xd4\xaf\x09\xda\x66\x79\x99\x86\x89\xa4\x21\x71\x76\x46\x65\x5c\xbf\x45\xc9\x34\x4f\xa6\x97\xa4\x77\x4c\xf3\x64\x92\x63\xd8\xc9\x05\x83\x4f\x48\xa3\x49\xd7\x8e\xf7\xea\x2d\xaa\xaf\xa2\x66\xae\x5c\xf7\x2d\x8a\xae\x80\x1c\x39\x11\xac\x8e\x5b\xf7\x8d\x4c\xdd\xff\x7b\xc9\x6b\xd4\x4e\xdd\x89\x3b\x21\xa4\xf7\xd3\xaa\x2e\xf3\xec\x24\x21\xde\xe7\x49\x84\xca\xb7\x2a\x0d\x13\x66\xb3\xc8\xd4\x58\xbb\x1f\xdf\xaa\xcb\x7e\x5a\x5d\x8a\x6b\x91\x57\x31\x11\x4b\x89\x92\xb0\x8e\xbf\x21\x61\x0a\xad\x82\x8f\xd2\x78\xb8\xbb\x6f\x08\x9b\xa2\x30\x61\xb3\x64\x1f\x56\x08\x03\x60\x6c\x57\xc6\xb7\x33\xf3\x03\x94\xbe\x61\xdc\x78\x9c\x9c\x19\xfe\x15\x5e\xd9\x04\x62\x2f\x63\x55\x27\x88\x14\xb5\xe9\x26\xd9\xc0\xed\x19\xcf\x8b\x0e\x4f\xb0\xdc\xcf\xcd\xba\xf5\x16\x92\x19\xf9\xdb\xb9\x44\xc7\x2f\xcf\xf4\xf9\x90\x84\x55\xf5\xe5\x99\xa1\x60\xc2\x05\x59\xb1\xb4\x96\xd8\xb0\xe2\x38\xe4\x11\x9a\x7e\xdd\x47\xd3\xa2\x44\xd3\x2a\x4c\x0b\xe9\xad\xf1\xd8\xd7\x97\x68\xf7\xf0\xec\x2f\x51\x9f\xae\x76\x56\x26\xbc\xd4\xf9\xce\x49\x2b\x87\x97\xb0\x09\x51\x1d\xca\x3c\x49\xf6\x61\xf9\x46\x5f\x33\x9a\xca\xc5\xe9\xe9\xaa\x28\x44\x1a\x47\x51\x82\xf8\x2c\xe6\x13\x0b\x2b\xc8\xb7\xd3\xb5\xa5\x78\x8e\xa3\x08\x65\x3b\xb0\xed\x5b\x1d\xee\x13\xfc\xee\x25\x18\x0e\x79\x92\x84\x45\x85\xb6\xfc\xe1\x8d\xbd\xfa\xae\x45\x18\x45\x71\x76\x22\xfd\x9b\xad\xc8\x5c\xe1\x45\x7c\x02\xd1\x52\xa6\x30\xcc\xe3\x53\x4d\x3c\x43\xe7\xe0\x37\xeb\x96\x36\x7c\xab\xcf\x57\x01\x4c\x92\x31\x2d\xe2\x46\x29\x0d\xeb\xc3\xd9\x61\x0a\x9a\x84\x7b\x94\xb4\x2f\xd9\x38\x23\x13\x87\x4c\x58\xd0\x40\xef\x2f\x75\x9d\x67\xbc\x9f\x65\x18\xc5\x97\x0a\xcf\x70\x52\x3c\xe4\x9d\xc2\x40\xa7\x71\x56\x5c\xea\x69\x5e\xd4\xf4\xb5\x5f\xa1\x04\x1d\xea\x29\xe6\x36\x2c\x51\x08\xbf\xe2\x79\x9f\x3a\xad\xe1\x25\x90\xf9\x13\x09\x5d\xb5\x97\x13\xab\xa5\x74\xe9\xc0\x91\x79\x7b\xcc\xcb\x94\xca\xfe\xb7\x32\x4f\xd0\x4f\x14\xee\xcb\x95\x59\x7b\xe2\xbc\x62\xdb\x44\xdb\xbd\xe4\x65\xe4\xbc\x94\x61\xc1\xec\xf0\xdb\x6f\xf5\x6b\xd1\x36\x9a\xd2\x5f\x25\xaa\x50\xcd\x7f\x54\x97\x7d\x1a\xd7\x5f\xa6\x6c\x20\xb9\x4c\xc2\xa2\x40\x61\x19\x66\x07\xb4\xa5\x35\x32\x26\x3a\xa6\x51\x5c\x61\x2d\x8b\x9e\x25\xc4\x70\x1d\xa3\xa3\x56\x32\x41\xc9\xa5\x6a\xe7\x64\xd2\x5b\x27\xcd\x7f\x77\xa8\x3c\xe3\x2c\x43\xa5\x4c\xdd\x54\xcd\x19\xd0\xeb\x19\x0f\x5a\x05\x9f\x1c\x5b\x17\x98\x89\x44\x8c\x14\xf3\xe1\x8c\x0e\x5f\xf7\x79\xf3\x65\x2a\x14\x62\x55\xcc\xbf\xc0\xce\xef\xae\x45\xfc\xd6\x2a\x98\x6c\x47\x4a\x44\xd4\x89\x4f\xed\xb7\x63\x8c\x92\xa8\x42\xf5\x35\x8d\x33\xe7\x25\x8e\xea\xf3\xd6\xed\xb0\xec\x5a\xed\xa4\x34\xb6\xee\x5b\x82\x4e\x28\x8b\x64\x67\x75\x47\x1b\x12\x9f\x39\x0d\x1b\x47\xf8\xa9\xa2\x92\xdf\x9e\x82\x55\xa4\x05\x80\x7a\xef\x64\x53\x4e\xc2\x4c\x87\x86\x18\x4c\x15\x8b\x32\x3f\x11\x07\xc2\xf4\xf6\xa3\x03\x97\x5d\xd2\x3d\x2a\xb1\x9c\x98\x2a\x12\x59\x38\x55\x81\xb9\xa2\x93\xc4\x00\x98\x5f\x6a\x19\xf0\xca\x58\xc4\x43\xca\xb0\x57\x28\x2c\x0f\xe7\x2f\x7c\xfe\x3b\xf9\xf1\x58\xa1\x7a\xeb\x90\x78\x50\xd7\x7d\x3a\xf1\xc4\x96\x1d\x39\x5a\x20\xbc\xaf\xae\x26\x04\x5d\x9b\x63\x9c\x20\xe7\x52\x24\x79\x18\x71\x1e\xf1\xe0\xb6\xc3\x66\x9e\x7e\xf9\xa5\xc6\x76\x03\x32\x8c\x6f\xd5\x25\xc5\x31\x7a\x5b\x99\xc4\x55\xed\xc4\x35\xb6\xda\xf2\x44\xaa\x51\x5a\x24\x61\x8d\x5a\x48\xda\x3f\xfa\x22\xf9\x22\x95\x0a\xbe\xf6\xec\xec\x4d\x67\x67\x7f\x3a\x3b\xcf\xa7\xb3\xf3\x62\x3a\x3b\x07\xd3\xd9\x79\x39\x35\xfa\xd3\xba\xf2\x30\x47\x2a\xd0\x62\x07\x9f\x60\x3f\x7b\x82\x5b\xe5\x53\xcb\x8e\x29\x9e\x7d\xb1\x9c\x96\xce\xa7\xe7\xf9\x55\xd4\xc8\x15\x03\x5f\x4c\xcf\x8b\xab\xaa\xaa\x6f\x98\xd9\x73\x20\x95\xfb\xac\x62\x89\x59\x96\x23\x9d\xb7\x59\x82\xc2\x48\x87\x96\x7a\x31\x77\xdd\xb7\x19\x1b\x2b\x47\xe4\x7c\x09\x40\xea\xfd\xe5\x2d\xc5\xbe\x05\xb3\x60\x54\x5b\x71\x04\x16\x23\xdb\x8a\x83\x34\x1f\xd6\xf6\x5c\x8a\x7e\x90\x27\x78\xd4\xa2\x2b\xc4\x8d\x0f\xb7\x96\x04\xb6\x68\x26\x55\x9e\xc4\xd1\xa4\x3c\xed\xc3\x1f\xdc\x29\xfe\x6f\xe6\x3d\xbf\xcd\x88\x37\x3d\x55\x7d\xea\xd9\x7a\x15\xe8\x01\xe7\xdb\x2c\x0d\xcb\xaf\x53\xfc\x4f\x6b\x94\x67\x3e\x26\xa9\x87\x96\x87\xe3\x1a\xcd\xdf\x66\x64\x0e\x5c\x32\x62\xb1\xa3\xd6\xcd\xa1\x01\xc0\x8e\x54\x0a\xc6\x9c\x42\xd3\x39\x35\x06\x96\x4c\x32\x78\x4e\x6a\x60\xf4\x1d\x97\x84\x55\xed\x1c\xce\x71\x12\x3d\xf3\x21\x25\x8b\x94\xcc\x9d\x99\xc5\x59\x5c\xc7\x61\x12\x57\xa9\x30\x28\x1b\xf7\xe3\x4e\xf1\x08\x2e\x45\x81\xca\x43\x58\xa1\xb7\x99\x16\xcd\x00\xa1\x99\xa4\xf8\x5d\x03\x87\x2e\x79\x28\xaf\x09\x4d\x1a\x92\xef\x07\xb4\x6f\x97\x7a\x58\x1c\xbe\x7d\xfa\xdf\xbe\xeb\x2d\xfe\xb7\xeb\xfe\xd1\x7d\x7a\x9b\xc5\xe9\xc9\x39\x26\x97\x18\x87\x66\xd2\x5b\x47\x34\xcf\x04\xaa\x3e\x5f\xd2\x7d\x16\xc6\x89\x20\x65\xa2\xa0\xe0\x12\x02\x57\xb8\x4e\xc7\x3e\x44\x08\xf9\x68\xb9\x93\xdd\x41\x86\xc3\x46\x9c\xb9\xe6\xb0\x24\x69\xa5\x83\xfd\x74\xc8\xc0\x49\x93\xa5\x85\xe6\x0e\xb6\x2c\x45\x79\x24\x71\x68\x23\xc6\x93\xab\x59\xd0\x82\xb0\xe5\xe0\xce\xa1\x23\x6b\x95\x0e\xfe\xfd\x16\xfe\x4c\x5a\x4a\x6f\xdc\xb7\xaf\xfb\x48\x18\xb5\x12\xa5\x93\xd9\x42\x56\x00\x09\x3f\x19\x3f\x6d\x54\xd9\x0a\x8e\x3a\x7e\x58\x6d\xbe\xee\xa3\x89\x48\xc3\x15\x55\x0b\x0f\xa8\x1a\x8a\x17\xc2\x80\xaa\x8a\x25\xb1\x42\x89\x62\xf8\x89\x32\x22\x06\xdf\x02\x8f\x09\x19\x0e\xee\x5a\xcc\x8a\x12\x39\x34\xd0\x22\x61\x0f\x16\x35\x93\xc8\x7c\xe1\x16\x4d\x1b\xa5\x39\xaf\x2c\x1e\x7b\x9b\x61\x5d\x0d\x63\xec\xff\x75\x8f\x54\x4d\xc5\x82\xe4\x24\xfe\x4a\xa5\xba\x2a\x15\x7f\x35\xc9\x55\x77\xa8\xd8\xe4\xf6\x82\xa2\x75\xfa\xa8\x5d\x21\x25\x92\x01\x20\x7e\x9f\xb8\x4e\x41\x34\xf3\x9f\x53\x14\xc5\xe1\xe4\x87\xce\xef\x23\xeb\xdc\xcf\x57\x98\xff\x2a\x15\xe6\x58\x80\xbb\xfe\x06\xa0\x20\x8b\xe2\x26\x14\x6a\x1f\x05\x84\x2b\xdf\x80\x90\xac\xa7\x9b\x10\xda\x87\x50\x40\xbf\x59\x1a\xd0\xd3\x85\xf9\xdb\xf0\x2b\x22\x12\x8c\x80\x47\x87\x67\x56\xe6\x2f\xad\x9e\xe2\xf8\xfd\x98\xa0\x06\x3b\xe9\xbc\x0c\xff\xde\xf1\x0a\x3a\x17\xf1\x3f\x3b\xe5\xa7\x24\x4c\x47\x94\x2f\x91\x26\x29\x79\x9b\x65\xb9\x73\xba\xd4\x35\x2a\x2b\xd9\xfc\xbb\xca\x12\x95\x00\xf8\xf3\xec\x90\x27\x53\xb1\x80\x2e\xa2\xfc\xe1\xa7\x43\x9e\x38\x5f\xae\xb2\xaa\xb9\xb2\x9e\xb9\x6f\xb4\x35\x06\xf5\xd8\x1f\x97\xfd\xe5\xbf\x7d\xfa\x97\xfd\x99\xd3\x3f\x0b\xfa\x27\xa0\x7f\x96\xf4\xcf\x8a\xfe\x59\xd3\x3f\x1b\xfa\x07\xeb\x29\x7d\xa2\x92\xc0\x7f\x39\x2d\xfc\xe4\x76\x8f\x42\xa9\xdf\x3e\x76\x4f\xf3\xf6\x69\xd1\x3e\x05\xed\xd3\xb2\x7d\x5a\xb5\x4f\xeb\xf6\x69\xd3\x3e\x75\xfc\x50\x5d\xc0\x7f\x39\x3f\xf8\xc9\xed\x1e\x85\x52\xbf\x7d\xec\x9e\xe6\xed\xd3\xa2\x7d\x0a\xda\xa7\x65\xfb\xb4\x6a\x9f\xd6\xed\xd3\xa6\x7d\xea\xf8\xa1\xda\x88\xff\x72\x7e\xf0\x93\xdb\x3d\x0a\xa5\x7e\xfb\xd8\x3d\xcd\xdb\xa7\x45\xfb\x14\xb4\x4f\xcb\xf6\x69\xd5\x3e\xad\xdb\xa7\x4d\xfb\xd4\xf1\xd3\x24\xfc\x2f\xe7\xa7\xe9\xd4\xa3\xe9\x34\xa4\xe9\x94\xa4\x69\xf5\xa4\x69\x55\xa5\x69\xb5\xa5\x69\x15\xa6\x69\x75\xa6\x69\xd5\xa6\x69\x35\xa7\x69\x95\xa7\xa1\xfa\x03\xac\x9f\x8e\x34\xa6\x44\xcf\xaf\xed\x34\x2d\x4a\x74\x44\x65\x89\x22\xfa\x22\x71\xe9\x6c\xdd\x87\x55\x4c\xbe\x1d\xb6\x60\x84\xec\x37\xb4\xf5\x28\xc0\xa9\xcc\x5f\xb6\x9e\xe2\x2a\x10\x13\x81\xdf\x90\x95\xe3\xfd\xfc\x87\x96\x06\x5d\xc1\x23\x6f\x3e\xe9\x97\xb1\xb1\xaf\x36\x0e\xc4\xb6\x81\xd4\x34\x90\x5a\xce\xd5\x96\xf3\xf9\x6c\x4e\xfe\x4f\x40\x20\x94\x75\x78\xba\x42\x01\xdd\x42\x45\xe7\x07\x02\x1e\xfc\xa3\x43\xe0\x07\x62\xcb\x40\x6b\x29\x76\xc1\x97\xba\xe0\x4b\x5d\x58\x6a\x23\xb7\x9c\x2d\xf1\xff\xad\xc4\xf1\xeb\xca\x84\x51\x6c\x0b\xdf\x5a\x7b\x23\xa3\x22\xaf\x4e\xf9\x17\x6d\xca\xde\xa9\xb2\x3c\x88\xcd\x93\x11\xac\xf5\xd1\x5c\x03\x83\xb9\xee\xc6\x92\x18\xcc\x07\x75\x68\x3e\x4e\x18\xc4\x3a\x3f\x40\x1d\x88\x79\x97\xf1\x2c\x3c\xbd\x0b\x42\x59\x87\xa7\x2b\xa4\x78\x96\xe3\x14\x9b\xbc\x4b\x94\x26\x80\x0c\x02\x48\x08\x81\x22\x85\xb5\x8c\x67\x09\x48\x61\x09\x49\x61\xa9\x48\x61\x23\xe3\x59\x89\x52\x58\x49\x52\x58\x71\x29\x78\xae\xa2\x46\x80\x18\xd6\x90\x18\xd6\x8a\x18\x3c\x45\x1f\x37\x80\x1c\x36\x90\x1c\x36\x8a\x1c\x3c\x7f\xb4\x79\xa2\xae\xfe\x31\x2e\xab\xba\x33\x9f\x34\xb0\x72\xbc\x1d\x7f\xe0\x70\x38\x7e\x55\xc1\xbc\xf9\x8e\x3f\x70\x30\x57\x85\x71\x77\x7c\x65\x92\x41\x78\x1a\x16\x8e\x84\x43\xf8\x2a\x84\xcf\x20\x7c\x0e\x31\x57\x21\x38\x23\x2d\x1f\x0b\x15\x62\xc1\x20\x16\x1c\x22\x50\x21\x02\x06\x11\x70\x88\xa5\x0a\xb1\x64\x10\x4b\x0e\xb1\x52\x21\x56\x0c\x62\xc5\x21\xd6\x2a\xc4\x9a\x41\xac\x39\xc4\x46\x85\xd8\x30\x88\x4d\x3b\x62\xda\xa0\x7a\x7c\x54\xbd\x6e\x58\xf5\x71\x6d\x07\xb6\x1d\x59\x4f\x1b\x5a\x8f\x8f\xad\x87\x07\x97\xac\x89\x3a\xde\x55\x74\x49\x85\x59\xc7\xea\x7d\xa9\x5e\x34\x6a\x0c\x60\x2e\x01\x10\xdb\xc5\x6a\x16\x52\x8d\x68\x94\x18\x40\x20\x01\x88\xd6\x86\x01\x2c\x25\x00\x62\x54\x58\xcd\x4a\xae\xd1\xf9\x5e\x4b\x00\x4b\x9d\xef\x8d\x04\xb0\x12\xf8\xf6\x5c\x79\x4c\x74\xc6\x3d\x79\xd4\x84\xf9\x69\x8b\xe4\xb0\x5f\xf6\xee\xbe\x0b\xf6\x2a\xef\x71\x5f\xb0\x2b\x7a\xb3\x07\x83\xbd\xd7\xc7\x3a\x31\xd8\x0b\xbe\xd9\x8f\xc1\x8e\xf3\xcd\xae\x0c\xf6\xb5\x1f\xe6\xcd\x30\x87\xfc\x5e\x87\x06\x0b\xf7\x11\x3e\x0d\x16\xf2\xe3\x7a\x76\x83\x67\x83\xc5\xfa\x20\xe7\x06\x0b\xf9\x41\xfe\x0d\x16\xf9\x78\x17\x07\x87\x62\x0f\xf2\x72\x70\x2c\xf7\x20\x47\x07\x07\x83\xe3\x7d\x1d\x12\xa9\x3e\xc8\xdd\x21\xa1\xee\x83\x3c\x1e\x12\x2b\xdf\xe8\xf4\x54\xe9\x60\xbf\xa7\x4a\x87\xba\x3e\x55\x3a\xc0\xfb\x91\xa6\xab\xc9\x01\x92\xe6\xa2\xc9\x07\x92\x66\x99\xc9\x0d\x92\x26\x95\xc9\x13\x92\xa6\x8b\xc9\x19\x92\x26\x82\xc9\x1f\x92\xf4\xde\xe4\x12\x49\x1a\x6d\xf2\x8a\x24\x5d\x35\x39\x46\xb2\x6a\x9a\x7d\x23\x59\xed\xcc\xee\x91\xac\x52\x16\x0f\x89\x88\x5a\x59\xb7\xeb\xaa\xfa\xfc\x27\x22\xde\x1e\x17\x8a\x48\xd7\xe4\x45\x11\xa9\xf6\x38\x52\x44\xa8\x3d\xbe\x14\x91\xa9\xc9\x9d\x22\xb2\xec\xf1\xa8\x88\x28\x7b\x9c\x2a\x22\x49\x93\x5f\x45\x25\xd8\xe3\x5a\x51\xf1\x19\xbc\x2b\xeb\x2a\x77\xe2\xa4\xd1\xbb\xbb\x57\x69\x74\x9f\x7b\x95\x46\x77\xb8\x57\x69\xf4\x68\xf7\x2a\x8d\xee\x70\xaf\xd2\xe8\x0e\xf7\x2a\x8d\x1e\xe8\x5e\xb1\xf5\xd7\x7b\xdd\x2b\x2c\xdc\x47\xb8\x57\x58\xc8\x8f\xeb\xd9\x0d\xee\x15\x16\xeb\x83\xdc\x2b\x2c\xe4\x07\xb9\x57\x58\xe4\xe3\xdd\xab\x34\x7a\x98\x7b\x95\x46\x0f\x73\xaf\xd2\xe8\x16\xf7\x8a\x7c\x98\x78\x90\x7b\x45\xbe\x6c\x3c\xc8\xbd\x22\x9f\x46\x6e\x74\xaf\xd2\x68\xb0\x7b\x95\x46\x43\xdd\xab\x34\x1a\xe0\x5e\x49\xd3\xd5\xe4\x5e\x49\x73\xd1\xe4\x5e\x49\xb3\xcc\xe4\x5e\x49\x93\xca\xe4\x5e\x49\xd3\xc5\xe4\x5e\x49\x13\xc1\xe4\x5e\x49\x7a\x6f\x72\xaf\x24\x8d\x36\xb9\x57\x92\xae\x9a\xdc\x2b\x59\x35\xcd\xee\x95\xac\x76\x66\xf7\x4a\x56\x29\x8b\x7b\x45\x44\x0d\xbb\x57\x44\xc0\x76\xf7\x8a\x88\xb7\xc7\xbd\x22\xd2\x35\xb9\x57\x44\xaa\x3d\xee\x15\x11\x6a\x8f\x7b\x45\x64\x6a\x72\xaf\x88\x2c\x7b\xdc\x2b\x22\xca\x1e\xf7\x8a\x48\xd2\xe4\x5e\x51\x09\xf6\xb8\x57\x54\x7c\xc3\xdd\xab\xee\x9b\x7f\xe2\x24\xa7\x77\x77\xaf\x92\xd3\x7d\xee\x55\x72\xba\xc3\xbd\x4a\x4e\x8f\x76\xaf\x92\xd3\x1d\xee\x55\x72\xba\xc3\xbd\x4a\x4e\x0f\x74\xaf\xd8\xe7\xf6\x7b\xdd\x2b\x2c\xdc\x47\xb8\x57\x58\xc8\x8f\xeb\xd9\x0d\xee\x15\x16\xeb\x83\xdc\x2b\x2c\xe4\x07\xb9\x57\x58\xe4\xe3\xdd\xab\xe4\xf4\x30\xf7\x2a\x39\x3d\xcc\xbd\x4a\x4e\xb7\xb8\x57\x64\x1f\xca\x83\xdc\x2b\xb2\x91\xe5\x41\xee\x15\xd9\x09\x73\xa3\x7b\x95\x9c\x86\x7f\xb5\x3b\x0d\x75\xaf\x92\xd3\x00\xf7\x4a\x9a\xae\x26\xf7\x4a\x9a\x8b\x26\xf7\x4a\x9a\x65\x26\xf7\x4a\x9a\x54\x26\xf7\x4a\x9a\x2e\x26\xf7\x4a\x9a\x08\x26\xf7\x4a\xd2\x7b\x93\x7b\x25\x69\xb4\xc9\xbd\x92\x74\xd5\xe4\x5e\xc9\xaa\x69\x76\xaf\x64\xb5\x33\xbb\x57\xb2\x4a\x59\xdc\x2b\x22\x6a\xd8\xbd\x22\x02\xb6\xbb\x57\x44\xbc\x3d\xee\x15\x91\xae\xc9\xbd\x22\x52\xed\x71\xaf\x88\x50\x7b\xdc\x2b\x22\x53\x93\x7b\x45\x64\xd9\xe3\x5e\x11\x51\xf6\xb8\x57\x44\x92\x26\xf7\x8a\x4a\xb0\xc7\xbd\xa2\xe2\x1b\xee\x5e\x09\x7b\x1e\x13\xa7\x79\xff\x9d\x4d\x4d\x72\x9f\x7f\xd5\x24\x77\xf8\x57\x4d\xf2\x68\xff\xaa\x49\xee\xf0\xaf\x9a\xe4\x0e\xff\xaa\x49\x1e\xe8\x5f\x35\x8f\xd9\xee\xd4\x3c\x68\xc7\x53\xf3\xb8\x4d\x4f\xcd\x4d\xfb\x9e\x9a\xc7\x6d\x7d\x6a\x1e\xb7\xfb\xa9\xb9\x69\x03\x54\xf3\xb8\x3d\x50\xcd\xe3\xb6\x41\x35\x37\xed\x84\x6a\x1e\xb8\x19\xaa\x79\xe0\x7e\xa8\xe6\x8e\x2d\x51\x4d\x32\xd8\xbf\x6a\x92\xa1\xfe\x55\x93\x0c\xf0\xaf\xa4\xe9\x6a\xf2\xaf\xa4\xb9\x68\xf2\xaf\xa4\x59\x66\xf2\xaf\xa4\x49\x65\xf2\xaf\xa4\xe9\x62\xf2\xaf\xa4\x89\x60\xf2\xaf\x24\xbd\x37\xf9\x57\x92\x46\x9b\xfc\x2b\x49\x57\x4d\xfe\x95\xac\x9a\x66\xff\x4a\x56\x3b\xb3\x7f\x25\xab\x94\xc5\xbf\x22\xa2\x86\xfd\x2b\x22\x60\xbb\x7f\x45\xc4\xdb\xe3\x5f\x11\xe9\x9a\xfc\x2b\x22\xd5\x1e\xff\x8a\x08\xb5\xc7\xbf\x22\x32\x35\xf9\x57\x44\x96\x3d\xfe\x15\x11\x65\x8f\x7f\x45\x24\x69\xf2\xaf\xa8\x04\x7b\xfc\x2b\x2a\x3e\x93\x7f\x35\xa3\xe9\x10\xa4\x03\xd0\xda\x51\x39\xf9\x38\x12\x6d\x32\xa9\xa3\x29\x7f\x3a\x77\xe7\xab\x68\x4e\x04\xe5\x20\x73\x9d\x17\xf0\xd1\x47\x76\x2c\xad\x45\x79\x46\x61\x84\xd1\xa9\x07\xa1\x09\x2f\x4a\xee\x16\xdf\x88\x65\x9f\x47\xaf\x3f\x92\x7f\xaf\x02\x55\x13\xbc\x53\xa5\x5d\x5f\xc8\x0f\xa1\x3b\x73\x72\x2e\x90\x56\x51\x5c\x28\xba\x9a\x4e\xd7\xa9\x80\x02\xda\xae\xe8\x3c\xa2\x39\x1d\x0e\x08\x09\x1b\x27\x69\x44\xb8\x4b\x50\x34\x32\xa6\x04\x55\x95\x38\x28\x53\xa0\x36\x82\x0a\xcf\x60\xa1\x44\x1a\x4f\x5d\x36\x70\x75\x19\x17\x98\x37\x4c\x62\x52\x97\xdb\xac\x3e\x3b\xf9\xd1\xa9\x5f\x0b\xf4\x43\x1e\x45\xcf\x57\xed\x50\x9d\x78\xf0\xd5\x0d\x9e\x39\x26\x92\x00\xa5\xc3\x23\xa5\x65\xe1\xc7\xf0\xac\xa8\x56\x1d\x2e\x96\xa4\x6d\x2a\xff\xfc\xb9\xeb\x6f\x5b\x72\xd6\xf9\xfb\xb0\x5f\x47\xe1\xf1\xa8\xe0\x82\x86\xb2\xad\x8a\xb4\x92\xb3\x5e\x22\x0b\x8f\xd1\x5a\x85\x7b\x81\x16\x1d\x03\xb9\x25\x1b\x09\x9d\xcd\xcd\xf1\x10\x0d\x69\x2a\x74\xdb\x06\x74\xee\x25\xd1\x26\xba\x9b\xaa\x05\x02\x09\xa1\x0c\xc2\x18\x2d\xa3\x75\xb4\xd7\x30\x42\xa3\x2b\x54\x46\x40\xd9\x19\x2a\x03\xc7\x78\x3f\xdf\xaf\xf6\x7b\x70\xa0\xba\xdc\x7d\xa6\x51\x3e\xac\x0f\xfb\xc3\x71\x48\x63\xd3\x38\x6b\x60\xe7\x5e\x32\x2c\x7d\xe0\x54\xfe\x29\x8e\x32\x2f\x01\x71\xcd\xd1\xf2\xb0\x57\x70\x81\x23\xcc\xab\x22\xad\xe4\xac\x97\x80\x63\xbb\x3e\x46\xde\x06\xc1\xc3\xc3\x72\x20\x9a\x46\x76\xef\x45\x47\x93\x58\xc4\xa6\xc6\x71\x95\x81\xce\xbd\x24\xe2\xec\x98\x4f\x85\x67\x01\x31\xfd\x09\xa2\x40\x28\x40\x12\x0a\x68\x24\x69\x79\x24\xff\x3c\x2b\x3f\xe1\x01\x5c\x1e\x8e\x51\x08\x8e\x02\x49\x19\x69\x1a\xbd\x70\x1f\x45\x28\xe8\x69\x67\x1a\x3a\x11\xe2\xdc\x8b\x9c\xe5\xaa\x9c\xca\x3f\x05\xdc\x6d\x09\x84\xeb\x78\x44\x68\x1f\x2a\xb8\xa0\x31\x6c\xab\x22\xad\xe4\xac\x97\x80\x83\x79\x3c\x46\xc7\x15\xac\x8d\x3c\xe1\xa6\x69\x3c\x8f\x47\xb4\x0e\xbd\xfe\xa6\xa6\x21\x55\x80\xce\xbd\x24\x68\xbe\xcf\xa9\xf4\x4b\x40\xce\x0b\x40\x44\xc1\x41\x98\xe0\x14\x12\x1a\x51\x5e\x13\xa9\x05\x67\xad\x00\x1c\x4e\x14\x6d\x96\x86\xc9\xcd\xb2\x95\x1a\x47\xd3\xdb\xbb\xfb\x55\x6f\x4b\xd3\x60\xca\x30\xe7\x5e\x02\x24\xc3\xe5\x54\xfc\x21\x60\x66\xbf\x41\x2c\xd1\x31\x3a\x22\x09\x0b\x34\x8e\xac\x22\x52\x7e\x9f\xd5\xdf\xb0\x4e\xee\x8f\x87\xe3\x01\x1c\x0a\x9a\xe1\xd5\x34\x86\xe8\x80\x0e\xc7\x65\x5f\x43\xd3\x10\x4a\x20\xe7\x5e\xf4\x51\x58\x7e\x9d\x0a\xcf\x92\x26\xe2\x9f\xe0\x8b\x66\x79\x58\x1f\x42\x11\x05\xac\x85\xb8\x3c\x92\x7f\x9e\x95\x9f\xe0\xd0\x6d\x82\xcd\x66\x73\x30\x68\x51\xf9\xd5\xfc\x66\xd9\xec\xf7\x7b\xd4\xd3\xce\xac\x7b\x1d\xc4\xb9\x17\x79\x78\xa8\xe3\x6f\x68\x2a\xfd\x12\x30\xf3\x82\xf3\x75\xb0\xef\x2a\x31\x43\xdb\x9b\x3a\x3a\x1a\x85\xa9\xcf\x32\xcc\x70\x66\x27\x33\x22\x39\x2e\xc4\xab\x35\x97\x06\xcb\x5c\x2c\x8b\x78\x11\x2c\xa2\x20\x50\xd0\xf1\xf9\xc4\xf1\x2d\x36\x81\x1b\xac\x00\x94\x68\x83\x0e\xe8\xa8\xa0\x94\xc3\x2a\xcc\xda\x10\xbe\xde\xee\xd6\x56\xa9\x2b\x04\xd2\x10\x41\xba\x00\xcc\xad\x71\x94\x1f\x04\x53\xfe\x3f\x31\x9a\x12\x50\xdb\x02\x2b\x70\x44\x00\xc4\x58\xe4\xed\x37\x99\x6e\xd9\x75\x15\xcc\x36\x74\x53\x31\x25\x55\xa2\xaa\xc8\xb3\x2a\xfe\x86\x23\x6a\x73\xb2\xb5\x36\xfb\x48\xc3\xb2\x44\xf2\x84\x65\x6d\xa6\x48\x92\x93\x04\xbf\x4e\xeb\xfc\x72\x38\xbf\x41\xe8\x7f\x36\x8e\x2e\xc0\xe9\x6a\xb9\x32\x72\x9a\x46\xef\xca\x69\x1a\x8d\xe2\x74\xb3\xf1\x8c\x9c\x26\xa7\x77\xe5\x34\x39\x8d\xe2\xd4\xf3\x36\x1b\x23\xab\x4d\xf2\xae\xac\x36\x89\x85\x55\x0d\xfc\x3d\x59\x31\xf3\x31\x3b\xe6\x65\xea\x1c\xf2\xac\x2e\x73\xcb\x68\xb0\xbc\x3c\x87\x30\x39\xfc\xe0\xcd\x02\x94\x4e\x7e\x9c\xd0\xf5\xb4\xc9\x8f\x13\xbf\x68\x9e\x77\xdd\xb2\x14\x2d\x66\xab\x6d\xb7\xe5\xa4\x36\xda\x52\xd5\x14\x24\x71\xb1\xed\x52\x9f\x36\x40\x72\xa9\x03\x8a\x16\x51\x08\x27\x97\x22\x99\xb9\x68\x06\x0b\xd1\x4a\x4e\x66\x5e\x50\x4d\x50\x58\xe1\x18\xc4\xc9\x2f\xf5\x94\x24\x84\x3c\x87\x51\xfe\xa2\xd5\xb5\x3a\x47\x3f\xf1\x56\x4e\x89\xa2\xcb\x01\x45\x4e\x9a\xb3\xd4\x18\xf8\xe7\xf3\x55\x1e\x68\x81\x32\xc9\x4f\x26\xcb\x61\x4b\x52\xda\xa0\xa6\x08\xb3\xe8\x6a\xcb\x0c\xbc\x83\xe5\x48\xf3\xa6\x5e\x07\x0d\xa6\x1c\xe7\xb9\xfb\xe8\x78\xdc\xb5\x79\x56\x77\x5d\xc7\xc9\x87\x17\x77\x42\x93\x54\xb1\x37\xad\xe7\xcf\xa9\xe9\xf5\xb1\x4d\x57\x7a\xd0\x26\x82\x2c\x2e\xb5\x53\x24\xe1\x01\x9d\x49\x46\xe6\xab\x9c\x94\x36\x2f\xc2\x43\x5c\xbf\x92\x24\x5c\xca\x10\xe4\xbf\xdf\xd0\x0e\x8f\xdc\x1d\x34\xef\x68\x3c\xbe\x09\xcf\x9d\x3a\x95\x8a\x7f\x2b\x51\x18\xe5\x59\xf2\xfa\xe5\x6a\x74\x26\x3a\x8c\x42\xf6\xd2\x28\xac\xd1\x17\x09\xd5\x54\xa9\xad\xe3\x14\x39\x49\x7e\x08\x13\x33\x5c\x9a\x67\xf5\xd9\x5c\x8d\x51\xc8\xb5\xa6\x0c\x9a\x3b\x22\x41\xb5\x50\x4d\xb3\x49\x73\xe0\xaa\x32\xe4\x39\x5d\xcb\x38\x3b\x5d\x75\xb5\xa7\x57\x0a\x88\x7a\xc9\xb4\x1c\x44\x47\x13\x0a\x13\xe1\x7e\x0b\x93\x0b\x1a\x32\x31\x64\x49\x91\x14\xa0\xb2\x94\x1c\x72\xc5\x87\xd1\x62\xd2\x2f\x99\xa4\x01\x4d\x8e\x2c\xe6\x6c\x26\x66\x94\x1b\xca\x1f\x27\x9e\x60\x3f\xf9\x17\x04\x08\x44\xc9\xa4\xde\x93\xc1\xd8\x9b\x05\x2a\x13\xf8\xdd\xac\xf3\xd1\xcb\x85\x08\xa0\x27\xd9\xec\xa3\x59\xa5\x00\x4d\xbf\x97\xa8\x0f\x53\x9d\xad\x57\x30\x55\x49\x36\x45\x12\xc6\x19\x56\x12\xf3\x1b\x4d\x7d\x5f\xb9\x96\xe1\xf5\x00\x8a\xbb\x9e\x55\x7f\xc0\x4a\xd3\x37\x92\x5e\xc1\x5d\x95\xa2\x99\xb8\xa6\x8e\xc8\xc5\xc9\x69\x3a\x08\x4e\x18\x7b\x53\xa2\x31\x15\x1e\x7c\xd3\x83\x2f\x7a\x2a\x21\x35\xd9\xb0\x41\x40\x60\x76\x42\xb5\x53\x20\x71\x0f\xa2\x4d\x48\xc3\xa9\x32\xfb\x28\x93\xcf\x66\x80\x99\xf8\x2d\xbd\x24\x75\x5c\x24\xe8\xcb\x14\xaa\xc5\x24\xbe\x48\xb9\x89\x79\x16\x68\xd9\x18\xca\x19\x2a\x71\x0d\xc9\x4d\x0e\x64\xf9\x64\xd5\x80\x9a\x0a\x69\x5b\x79\xfa\x4f\x02\xfa\x2e\x49\xef\xb4\x9c\x77\x24\x2f\x17\xa7\xc7\xf2\xd8\xb5\x3f\x6d\x59\xec\xb4\x14\x5f\x1d\x26\x92\x6d\x1b\xc8\x17\x26\xf7\x5b\xce\x0f\x26\x75\x9d\x20\xa0\xef\xe6\x0e\x4d\xb8\xaf\xf2\xe4\x52\x23\x69\xc0\xe6\xea\xd5\x11\x8e\x11\x53\xfb\x02\xfe\x4f\xb1\x8a\x98\xad\xa9\x06\xfc\x1b\x07\xfe\xa2\x43\x5f\x95\x64\xab\x5a\xbd\x7a\x09\x86\x8c\x9d\x64\xb0\x15\x05\xcb\x52\x99\xaa\xf2\x15\x8a\x3b\x31\xd3\xcf\xd0\x07\x94\xd5\xa8\xdc\x91\x1f\x24\x73\x6d\xc5\x8b\x94\xcc\xb8\x72\xfe\xda\x15\x30\x30\xe4\x7a\x12\xcb\xa8\x57\x75\x58\xc7\x87\x1d\x74\xc7\x02\xc3\x3a\xf7\x7c\xe0\x02\x8f\xd9\xb7\x30\x89\x23\xe7\x88\x50\x84\xad\xa5\x94\xb8\x7a\xa7\x7f\xe4\xef\xb4\xdf\x98\xdb\x96\xde\x5b\xc5\x11\xd7\x79\x8e\x27\x30\xa0\x1e\xe4\xc3\x3e\x46\xcd\xc6\xe0\x77\x87\xdc\x61\xb3\x0d\x76\x12\x0f\x86\xf4\xea\x92\xa1\x13\x99\xf3\x86\x59\xbe\xde\x55\x8c\x85\x3b\xf5\x96\xab\xe9\x72\x33\x9d\x6d\x9e\xc1\x48\x45\x99\x8f\x3f\xcb\x3d\x36\x4d\x4f\x05\xec\xda\xcd\xc9\x98\x78\x42\x71\xf4\x9f\x8a\x4c\xa6\x5a\x4d\x4b\xe2\x25\x64\x35\x61\x8d\xa2\xc9\xd6\xd0\xdc\x06\xc5\xd9\x90\xef\x62\x92\xac\x67\x4b\x5e\xc5\x24\x3b\x74\xa4\x5c\x59\xd8\x62\x77\x98\xc9\x16\x09\x88\x57\x9f\xbb\x1c\xe9\xa2\x38\xe2\x34\x3c\xa1\xed\xa5\x4c\x7e\x78\x8a\xc2\x3a\xdc\x92\xdf\x9f\xab\x6f\xa7\x1f\x9b\x34\x99\x7e\x9c\x1f\xaa\x6f\xa7\x49\x93\x26\x59\xf5\xd3\xa7\x73\x5d\x17\xdb\xcf\x9f\x5f\x5e\x5e\x66\x2f\xf3\x59\x5e\x9e\x3e\xfb\xae\xeb\x62\xe0\x4f\x13\xa2\x3f\x3f\x7d\x5a\x7f\x9a\x50\x0d\x20\x8f\xdf\x62\xf4\xf2\x2f\x79\xf3\xd3\x27\xb2\x9d\x6e\xb2\xfe\xf4\x71\x8e\x3e\xce\x0f\x45\x58\x9f\x27\xc7\x38\x49\x7e\xfa\xf4\xd1\x9f\xd3\x0e\x7c\x9a\x44\x3f\x7d\xfa\xd5\x9f\xcd\x27\xcb\xd9\x6a\xfe\xcb\x6c\x39\x59\xcc\x82\xf9\xc1\x99\x2d\x1c\x6f\xe6\x2e\x66\x8b\xa5\xe3\xcd\x16\x13\x6f\xe6\x39\xb3\x75\xe2\xcd\xbc\x09\xfe\x39\x9f\x2d\x9c\xf9\x6c\x7d\x98\x2d\x9d\xd9\x72\x3e\xf1\xf0\x5f\x7f\x35\xf1\x66\xfe\x6c\x95\x38\x8b\xc9\x62\xb6\xc4\x28\xe6\xb3\xc0\x99\xad\x09\x2a\x6f\xe6\xfd\xfe\xe9\x33\xe5\x03\x73\xfe\x71\x8e\x9e\x9e\xc5\x01\x29\x51\x81\xc2\x7a\x9b\xe5\xec\x49\xac\xeb\xec\x38\x59\x03\x6d\x7d\x55\x3a\xcc\x1e\x9d\x07\xcf\x13\x66\x80\x84\x86\x64\x9e\x50\x70\x0e\x3d\xe7\xc0\x50\xa9\x41\x3b\xa8\x47\x3f\x40\x47\x58\x20\x0c\x6a\x8a\x2d\xb4\x15\x66\x24\x09\x6d\x65\x42\x50\x8c\x41\xb5\x16\xa8\x69\x99\x56\x5e\x96\xf8\x35\x05\xab\xa2\x32\xba\x34\x25\x3e\x1b\x4c\x95\x15\xd0\x07\x61\xcc\x80\x75\x26\x76\xa0\x99\x02\x32\x55\xe7\x85\x51\xe0\x56\x75\x78\x9b\x1d\x2e\x55\x9d\xa7\x0e\x1b\x24\xe3\x54\x97\xc0\x46\xce\x75\xae\x40\x3e\x7f\x07\xc1\xd3\xfd\x71\x13\x7d\xd1\x4d\xf4\x40\x99\xe8\x8b\x49\x00\x4e\x74\xba\x94\xcf\x26\xfa\xc4\xfd\xc5\x9d\xf8\xe7\xc5\xef\xa9\x3b\x09\x7e\x71\x27\xf3\xf3\x42\x9f\x97\x6c\x60\xd9\x82\x1b\xd5\x84\xcf\xeb\xa2\x99\x78\x6e\xd1\x4c\xda\x29\x3a\xc5\xef\x98\xc9\xff\xcf\x6d\x18\x1b\x9e\x09\x9f\x3c\x64\xcc\x3e\x8f\xb0\x39\xdd\x78\x9a\x34\xd6\x60\x7e\x00\xbd\x7d\x94\xfd\x51\x9d\x31\xe1\x35\xad\x3b\xae\xa0\x55\x14\x9c\x5e\x43\xc3\xab\xe2\x54\x59\x68\xaa\x6f\xfd\x5e\x50\x83\x17\x61\xe4\xcd\xee\x56\xf4\x34\x33\xf8\x19\x4c\x3c\x3c\xda\x54\x19\x55\xaa\xe1\xb1\x84\x70\x6c\x2d\x08\xd4\x31\xbd\x81\x07\x7e\x4d\xc3\xdd\xbc\x08\x57\x7b\xea\xda\xd8\xc3\xda\x96\x0c\x36\x7a\x1c\x8b\xc3\x10\x2a\xac\xce\x17\x07\x04\xae\xd7\xd1\x8a\xbe\x3e\x90\xb9\xf8\xb8\x1e\x0c\x40\x77\x1d\x33\xc7\x07\x30\x4f\x6f\x23\x61\x43\xf7\xfc\xe0\xae\x8c\x41\x6e\xd7\x21\x72\x5f\x92\x41\xb7\x49\x9d\x75\x72\x75\xad\xb7\xa6\xa6\xa3\xc9\x2b\xc2\x1a\xcf\x84\x11\xc1\xfd\xb6\x3d\xce\x1e\x1e\x17\xd3\xdb\x99\x3b\xd4\xff\xb0\x91\xb1\xef\xbb\xd3\x60\x3e\x2a\x32\x56\xfa\x6c\x8e\x8d\xd5\xc1\x91\xa2\x63\x56\xf9\x9f\x9a\x74\xa6\x60\xad\x29\x4a\xb6\xa0\xe9\x83\x1c\x18\x2d\x33\x70\x7b\x2c\xc4\x80\x14\x5d\x65\x77\x78\xff\x9d\x44\xcc\x9e\xdf\xb9\x9b\xf8\x99\xfa\x94\x58\xfb\x3e\x4d\xaa\xba\xcc\xbf\x22\xe2\x61\x52\xa6\x15\x77\xd4\xf3\x27\x9e\xcf\x1c\xd2\x43\x5c\x1e\x12\x34\x39\x34\x3f\x7d\x5a\x7e\x9a\x1c\x5e\xc9\x9f\xf2\xa7\x4f\x8b\x59\xc0\x7d\x45\xe2\xb3\x52\x9c\x0e\x56\xc9\xbf\xe6\x71\xf6\xd3\x27\xd2\x2b\xea\xba\x06\xb3\xf5\x64\x3e\x5b\x9e\x67\x8b\x5f\x96\x93\xe5\x2c\x68\xbd\x4c\x1d\xf9\x7a\xe6\x13\xf4\xb3\xe5\xa7\xce\x0d\xe6\x4c\x72\xbe\x49\x2f\xfe\x01\x83\x6d\xa6\x37\x43\xc2\x6d\x09\x14\x56\x34\x9b\x51\x14\x26\xfa\xc0\x80\x9b\x2b\xbe\x21\xe4\xe6\x2a\xff\xfd\x82\x6e\xce\x90\x31\xec\x86\x59\xfa\x9b\x04\xde\x26\xab\x21\x87\x30\x63\xcd\xc6\x7f\x05\xdf\x93\xff\x32\x87\xb7\x9a\xc3\xf7\x8d\xdb\xed\x96\x0c\x54\xfb\x47\x99\x32\x28\x38\x6e\xdf\xf6\xe3\xa3\x77\x63\xd3\xab\xe2\xfc\x59\xe9\xea\xfe\xc8\x20\xf0\xc1\x71\xfc\x60\xc7\x67\x40\xd3\x91\xf1\x7c\xdb\xfe\xf6\x88\xde\x8a\x42\x1d\xe7\x9b\xf8\x18\x17\xa5\x0d\x42\x05\x6a\x6a\x2f\x7b\x8f\x8c\xec\x47\xa1\x54\x4f\x71\x2c\x96\xee\x32\x82\x76\x4f\x93\x8a\xfe\x7e\x3c\x2c\xba\x1f\x81\xf0\x3a\xc6\x0e\x0c\xea\xc0\xe3\x23\xfc\x9b\xd1\xdb\xf5\x49\x0e\xb2\x55\x05\x1d\x15\x60\x9b\x1b\xdf\xc0\xc2\x3d\x91\x7e\x1f\x8a\x07\xbd\x0b\x80\xef\xfd\xf6\x8d\x1c\xe4\x86\xf1\x32\x7f\x99\x74\x9b\x39\xe4\xa2\xa1\x7b\x01\x24\x06\x44\xd3\x2b\x9c\xb1\xb7\x5c\x79\x22\x36\x96\x6f\xfc\xef\xef\x43\xdf\x2e\x85\x2e\x05\x52\x78\xf8\xca\x0b\xff\x7a\xa9\xea\xf8\xf8\xea\xf0\x1b\x6a\x59\x31\xbc\x99\x42\xea\x15\xdd\x73\x33\x98\x3d\x53\x86\x9e\xc7\x8b\x60\x08\xf3\xea\x6e\x6c\xf1\x62\x5b\x31\x69\x90\x92\x89\x20\x8d\xa3\x28\x41\x16\x84\xc0\xb6\x38\xe5\xce\x5c\xb1\xa5\xe4\x14\x4d\xe5\x3a\xba\x47\x96\x0e\x72\xc7\x90\x59\xbd\xfe\x36\x7a\x22\x0c\x15\xb8\xeb\xad\x7f\xab\x4b\xbb\x4f\xa9\x25\x9b\xa1\x13\x29\xe1\x29\xbc\xaa\x73\x19\x67\x5f\xbb\x1d\x30\xd0\x76\x18\x70\x33\x0c\x34\xd6\xed\x86\xda\x77\x18\x0d\x2b\x45\xc3\x2e\xa5\xb7\xd9\xbe\xce\x60\x35\x54\x37\xf2\xcb\xbb\x21\xc9\xfe\x5c\x89\x79\x50\x57\xdb\x93\x0c\x97\x0a\x95\xdc\xfd\xee\xb6\x0e\x03\xa5\x95\x5e\xa8\x15\x0c\xd9\x8a\xd9\x1d\x10\x10\x2b\x87\x9d\x61\xe8\xdb\xd9\xa8\x1e\x2d\x30\x9d\x29\x50\xd8\x84\x4e\x1d\xbc\xf7\x99\x04\x2c\x5e\xfd\x28\xc2\xbe\xce\xc0\xcc\x16\x44\xaa\x11\x3a\xe4\x65\xd8\x81\x63\xe8\x19\x0b\xab\x70\x43\x1a\x35\xdd\x76\x82\x00\xa3\xea\xf6\xc4\x63\x6c\xfc\xd7\x95\x6f\x78\x9f\x2d\x03\xca\x20\xf1\x64\x78\xf5\x33\xf9\xd9\xb6\x7d\xbe\x1e\x2e\x65\x95\x97\xdb\x22\x8f\x89\xee\x87\x32\xea\x63\x8c\x92\xa8\x42\xdd\xfe\xbf\x09\x01\xb8\x32\x70\x07\x7d\x43\x59\x5d\x75\xfd\xe3\x59\x28\xec\x47\xf4\x5c\x77\xb5\xd7\x4e\x54\xd0\x42\x09\xcb\x80\xc3\x6d\x1f\x5c\x77\xb9\x89\x36\x1a\xae\xa5\x7f\x38\x48\xb8\x84\x91\x6f\xd1\x4b\x87\x3f\x46\xa3\xb7\x0a\x6c\xbe\x9e\x7a\x0b\x26\x31\x26\xb0\x96\x13\x49\x70\x2d\x33\xad\x00\x1f\x33\x74\x56\xa9\xcf\xf8\x39\xd7\xc1\x2d\xb6\xbc\x45\x75\xce\x5f\x7e\x96\xbb\x53\xe6\x45\x94\xbf\x60\x8b\x7e\x3a\x25\xa8\x77\x3c\xe9\xd0\xc9\xfc\x07\x87\xfd\x0d\xfc\x6f\x01\x99\x0e\xe9\x05\x6f\xd7\xdb\x97\x76\x65\x63\x9c\xa0\xdb\x14\x21\xf6\xb1\x60\x67\x5e\xe4\xb1\xe0\x1b\x63\x25\x3c\x43\x26\x42\x10\x2e\xfd\xe5\x5a\xc1\x16\x2c\x82\xfd\xd2\x57\xb0\x89\x53\xa1\x23\x31\x60\x32\x58\x48\x58\x27\x83\x37\x77\xa7\x1e\x19\x28\x68\x90\x94\xf9\xd0\x71\x34\x6c\x46\x8c\x18\xc5\xe1\x73\x62\x60\x1b\x60\x56\x08\xdd\x1a\x33\x2f\xda\x51\x94\x8e\x20\xa3\x20\x08\xf6\xb7\xf4\x62\x0b\x8a\xf8\xb6\xb9\x61\xec\xd1\x80\xd9\x01\x4b\x9e\x66\x7a\xb1\x0f\x48\xfb\x7d\x18\xfa\x7e\x2d\x60\x19\x32\x35\x7c\x6f\xbd\x9e\xab\x7a\xeb\xa1\x15\x9a\x2f\x24\x5c\xd2\xc4\x60\xe8\x07\x4c\x0b\x0b\x7a\xeb\xb4\x58\xf9\x53\x6f\xed\x4e\x37\x2b\x6d\x68\xd4\x29\xc1\x78\x19\x36\x21\x06\x8f\xdc\x88\xe9\x30\xa4\x05\x34\x19\x78\x77\xc6\x4c\x85\x76\xe4\xa4\xe1\x3c\xac\x16\x73\x77\x3c\xff\x5b\x40\xa4\x37\x4e\x03\xb8\x2f\x03\x26\x01\x20\xe7\x38\x3b\xe6\x3d\xa3\xb0\x0a\xfd\xbd\xa6\x54\xa4\xb0\x43\x31\x44\xf9\xbd\xf9\x7a\xb1\x59\xaa\x88\xbc\x55\xb8\xde\x77\x88\x44\xcd\x27\x88\x07\xa8\xbd\x05\xb1\x55\xed\x83\xf5\xd4\x5b\x2d\xa7\xde\x26\x90\xc7\x43\x51\x7a\xc2\xc6\x30\x8d\x1f\x36\x56\xc3\xd5\xbd\x1f\x1c\xd0\x75\xda\x85\x51\x8a\xce\xc7\x4a\x62\xdb\x5d\xb9\xab\xe3\x48\xb6\xb7\xaa\xf8\x6e\x53\x71\xa8\x0b\x03\xf4\x1b\x12\x28\xcb\x9f\xd4\x97\xf1\xef\xc3\xf1\x78\xf0\xdc\xd5\x4e\xcd\xfb\x84\x0b\x25\x44\xc3\x12\x08\x7e\x40\x6e\xb8\x76\xd5\xa4\x24\xd1\x7c\x83\x5c\x57\x42\x27\xea\x3b\xa7\x20\xa9\xfc\x2d\x14\x7a\x16\x38\xfd\xa9\xb7\xc2\x71\x9c\x36\x48\x8a\xe2\x73\x7e\x54\xdd\xbf\x7f\x0c\x87\xcf\x80\x41\x2d\x80\x49\xd0\xf6\x08\x9e\x07\xc6\x2e\xb4\x03\x28\x76\xe1\xb0\xdc\x04\x8a\xdc\x46\xcf\x86\x31\x1d\xd1\x27\x84\xa1\x3b\x03\xe6\x04\x24\x6e\x9a\x06\xcb\x6e\x13\xda\xa5\x72\x68\x39\xbf\x43\x32\xc4\xf0\x1f\xd6\xfe\x7c\x3e\x57\x50\xed\x23\xdf\xe3\xef\x51\x8a\x4a\x9c\x0a\x0c\xf9\x00\xe3\x6f\x41\xde\x33\x0d\x82\xe9\x7a\x2e\xbd\x0b\x19\x1b\xf2\x24\x60\x9c\x0c\xb3\xff\x43\x07\x6d\xb8\xfe\x0f\x69\x00\xa8\x3f\xef\xca\x98\xb7\x40\x3b\x68\xd2\x48\xfa\xde\xd1\x8f\x46\x33\xbf\xd5\x65\x79\x9b\xe2\xc3\x1d\x19\xa4\xf7\x9a\x7c\x49\xfa\xa7\x7e\x23\xb6\x3e\x6e\x8e\xa1\x6a\xc4\x48\xa1\x80\x66\xe8\x6b\xc0\x47\x4b\xa4\x22\x8b\x42\xe4\xa2\x40\x40\x26\x6a\x3e\xc5\x3e\xf0\x15\x60\xc6\x6e\xd7\x7d\x6f\x39\xf5\xbd\xd5\xd4\xf7\x36\xca\xe8\x28\xca\x4f\x99\x19\x6e\xff\x87\x0d\xdd\x70\xed\x1f\x00\x0f\x28\x3f\xeb\xc9\x58\xcb\xcf\xc7\x4d\x7e\x9f\x46\x9b\xe8\x38\x96\xf9\xad\x26\xcf\xdb\x94\x1f\xec\xc8\x10\xdd\x87\xe4\x3b\x34\x61\xd9\x4e\xdd\xc1\x4f\xb3\x98\x71\x14\x83\xc2\xdc\xb9\xbf\xf2\x35\x7f\x32\xf2\x3d\x7f\xd1\x21\x92\xcd\x7d\xf9\x75\x50\x80\x6b\x46\x6c\x55\xf8\xb5\x3f\x5d\xaf\xa7\x9b\xb9\x3c\x1a\x9a\xa5\x2f\xbf\x0e\xb4\xf3\xc3\x46\x6a\x8c\x95\xef\x03\x07\x6d\x3c\xee\xc2\x28\x3f\x9f\x8f\x94\x1c\x9e\x78\xa1\x17\x8d\x64\x7b\xab\x0a\xef\x56\xeb\xae\x77\x61\x80\x7e\xeb\xe2\x64\x1f\x2f\xd4\x55\xff\xde\x45\x6a\xa5\xdd\xb0\x75\xfe\x71\x38\x45\x3d\x57\xc9\xf5\x77\x55\xf8\xde\x62\xe8\xab\xa2\xc5\x2a\x09\x55\xa1\x39\xfb\x96\x2f\x6e\xf0\xd0\x0c\xd7\xe6\x51\x2d\x01\xc5\xd6\x3a\x38\x6e\x5d\x7f\xa4\xc8\xc7\xaa\xfb\x2d\xbd\xd3\x35\xbf\xa7\x8f\xf7\x69\x86\xb6\xec\xdf\xbb\x34\xad\xb5\x1c\x32\x13\xc6\x63\x85\xe6\x82\xba\xf0\x6f\x5d\xc5\x75\xd7\x53\xcf\x5b\x4d\x3d\xdf\xd6\x6b\xc3\x8c\x30\xaf\xe7\xf3\x8e\x0c\x9e\x13\xb7\xac\xe4\x8f\x6c\x6b\x99\x17\x37\xae\xec\xdf\xa0\x04\xb7\xce\x8d\x7b\x57\xfa\x7b\x7b\x7a\xb7\xae\xc8\x2b\xff\xbd\x2b\xd5\x4a\xbb\x41\x4e\xd0\x48\x9c\xe0\xdc\x90\xd6\xfe\x07\x1e\x51\x33\xf4\xd5\x34\x2b\x0c\x4b\xfa\x9c\xfd\xe1\x73\x62\xf4\x62\xfe\xa8\x96\xb6\xf9\x70\xcb\xe2\xfe\x68\x91\xdf\x3c\x17\xee\x5a\xec\xef\xe9\xe3\x7d\x9a\x21\x2e\xfe\xf7\x2e\x5d\x8b\x8d\x06\x2d\xf7\x8f\x41\x08\x29\xbf\xb0\xfc\x6f\x0d\x76\xe6\x53\x6f\xe9\x4f\xbd\xf5\x02\xee\xa0\x41\xef\xc1\x55\x7d\xce\xf3\x60\xa5\x1f\xb9\x9e\x3f\xbc\x99\x45\xdd\x6f\x58\xdf\x1f\x25\xdb\x5b\x15\xfd\x8e\xf5\x7e\x5b\xd7\xee\x54\x01\x65\xfd\xbf\x77\x89\x5a\x69\x37\x70\x9d\x67\x2c\x5a\x48\xdf\xe5\xe5\x7f\x6b\x7f\x83\x60\xea\x6d\xe6\xd3\x95\xb1\xbb\x06\xa5\x37\xad\xe8\x73\xf6\x07\xeb\xfd\xf8\x85\xfc\x51\x2d\x2d\xda\x7f\xeb\xc2\xfe\x68\xc1\xdf\x3a\x0d\xee\x5b\xe8\xef\xe9\xe6\x7d\xca\x21\xaf\xfb\xf7\x2e\x56\xcb\xcd\x86\xd8\xfc\x91\x28\xa1\x59\x20\xad\xfc\x0f\xdc\xa8\x0f\xf7\xd3\x30\x07\x0c\x0b\xfa\x9c\xf5\xc1\x53\x60\xf4\x52\xfe\x98\x86\x96\x09\x70\xcb\xd2\xfe\x58\x51\xdf\xaa\xfb\x77\x2d\xf5\xdb\x3b\x78\x9f\x46\x48\x4b\xff\xbd\xcb\xd4\x52\xab\xa1\x6f\x80\x51\x48\x21\xcd\x17\x57\xfe\xad\xdd\x5c\xac\xa7\xfe\x62\x33\xf5\x03\xd7\xd0\x51\x83\xe6\xc3\xab\xf9\x9c\xf1\xc1\x8a\x3f\x76\x11\x7f\x44\x3b\x8b\xda\xdf\xb6\xa8\x3f\x52\xd4\xb7\xea\xfd\x3d\x8b\xfc\xd6\x0e\xde\xab\x0e\xe2\xa2\x7f\xef\xa2\xb5\xd8\x68\x88\xb5\x1f\x85\x10\xb6\xf5\xed\xb2\xbf\x75\x5b\x87\x3f\x0d\xd6\xd3\xe5\x02\xee\x9e\xd1\xcc\x03\xab\xf9\x9c\xe3\x11\x46\x7e\xd4\x3a\xfe\xf0\x66\x56\x03\x3f\x76\x5d\x7f\x9c\x64\x6f\x37\xee\x37\xaf\xf3\xdb\xba\x76\x93\x02\x24\x71\xf6\xf5\x6a\x38\xd0\xc2\x56\x80\x8d\x47\x1f\x48\x63\x59\xbf\x5d\x37\x58\xee\xe7\x5a\x93\x4b\x16\xa1\x12\x33\xde\xb5\x93\x3f\xd5\x66\x5c\x7d\x87\xb4\x54\x3f\xad\x66\x5f\x4d\x0b\x91\xc6\x43\x0d\xe4\xf8\x16\xb9\x4f\x65\x5f\x67\x0c\xcf\xe9\xfa\xb0\x14\xdb\x02\x8d\x2a\x15\x68\x74\x39\xc9\x1f\x92\x42\x1c\xa3\x24\x47\x92\x2c\xa9\xf8\x5b\x98\x1f\x05\x70\x31\x5f\x11\xc9\x24\x24\x5c\x72\xb0\xbf\xd4\x75\x9e\x7d\xe9\xa0\xc5\x1b\x10\x4a\x54\xa1\xda\x50\x57\x5d\xf6\x69\x2c\x56\x8a\x27\x2b\x67\xc7\x30\x42\xe2\x79\x1b\x76\xa8\x85\x9e\xdf\xc1\xbd\x0d\xcb\xe1\xd7\x89\x28\xb8\xf8\x35\x22\x61\x84\xe8\x44\xc2\x13\xe6\xb9\x3d\x37\xe3\x92\xbc\xfc\x49\x58\x54\x52\xb5\x98\xe5\xa9\x85\xc0\x11\xae\x7e\x04\x8e\x09\xc2\x6d\xaf\xa3\xd9\x9e\xe3\x28\x42\x99\x78\xd4\x89\xc2\x4c\x66\x73\x76\x1e\x69\x70\x6f\x04\xca\x7a\x9f\xba\xca\x19\x19\x4d\x36\xa6\xee\x4e\xc8\xb5\x2e\x72\x41\xaa\xef\x62\x82\xd1\xd1\x59\xe1\xe6\x66\x4a\x9e\x12\x74\xac\xe9\x53\x49\xef\xf6\xc3\x8f\x97\x42\x1f\xbc\x37\xcd\x04\xbf\x9c\xe3\x1a\x39\x55\x11\x92\x7b\x30\x5e\xca\xb0\xd0\x60\xb6\xdb\xf0\x58\xa3\x12\x3e\x7f\x27\x9e\x26\x9c\xf9\x41\xa0\x5f\x6c\xcd\x4a\xf9\x29\xc0\xa7\x27\xf1\x9a\xeb\xd9\x1c\xa5\xf4\x00\x5c\x3b\xab\x58\xea\x6e\x5e\x0e\xdd\x53\xd0\x5e\x8d\xc0\x7e\x53\xea\x60\x13\xbd\x37\x28\x2d\xea\x57\xde\x27\xe5\x30\x64\x0b\x9b\xa2\xec\x32\x22\x4d\x99\xe7\xba\xae\x9c\xa9\xec\x98\xe4\x61\xbd\xc5\x60\xbb\xee\x00\xb3\xe7\x62\x73\x22\x5b\x36\x7e\x48\x73\x3b\xa3\xb9\x6a\xf0\x6b\x42\x3d\xe9\x67\x3c\xd4\x48\xf0\x27\x71\x55\x3b\x55\xfd\x9a\x20\xc3\xb9\xc3\xf1\xb7\x15\x89\x37\xd8\x79\x81\x29\xe3\x99\x34\x5a\x64\x0c\xaf\x65\x37\x11\xc0\x31\xa5\xe2\xbd\xf2\x4b\x20\x08\x0c\x39\xb2\x6b\x3e\xed\x2d\xb7\xaf\xd2\x81\x84\xaa\xd4\x48\x0b\x20\xb6\x5a\xae\x01\x62\x69\x34\x90\x58\x1a\x8d\x21\xb6\xd9\xf8\x00\xb1\xe4\x34\x90\x58\x72\x1a\x43\xcc\xf3\x5d\x17\xa0\xd6\x24\x03\xa9\x35\x89\x99\x1a\xb3\x33\x13\x65\xde\xe0\x59\x42\x30\xf2\x4b\x26\x94\xac\x81\xea\x15\x27\x4c\xf3\x01\x74\xef\x6f\x80\xdc\x1b\xec\x8e\x6e\xb4\x7a\x0d\x10\xd4\xab\x3e\x43\xc4\xf2\x3d\xe9\x63\xeb\xee\x54\xa9\x19\x47\x98\x32\x26\x8e\xaf\x8a\xf5\x7b\xda\x78\x68\x4c\xb9\x5a\x99\x86\x18\x6a\xa3\x0c\xb7\xb5\x63\x63\x47\x59\x1e\x0f\xa5\x9f\xac\x0d\x6e\x6f\x13\x4c\xf7\x8a\x20\x22\xb2\x1c\xc9\x17\x25\xa3\x60\x7d\x1f\xc1\x8c\x20\x45\x7d\x31\x0b\x38\xcb\xcf\x62\x63\xad\xcd\x3c\xf0\x1e\x4a\xa3\xcf\x43\xab\xf6\xd8\xfa\xd2\xa7\x25\xf6\x11\x80\xb5\xa4\xd5\x8d\xdf\x1a\x7a\x8d\x5b\x8a\xb2\xfa\xff\xfc\x44\x79\xfc\x32\xb5\xc1\x60\x72\x76\x08\x32\x02\x76\x90\x3a\x2f\xbe\x88\xf6\x9d\x0d\x0e\xcd\x90\xd1\xb6\x8b\xe2\x6f\x71\x84\xca\x6b\xeb\x56\x73\x77\x84\x79\x27\xaa\x97\x2d\xc8\x48\xb8\xdd\x90\x5e\x07\x27\xa0\x8d\x6b\x94\x0e\xb8\xf4\x8a\xba\x3c\x34\xcb\xe1\xee\x90\xa0\xb0\xdc\xee\xf3\xfa\x3c\x3c\xad\x03\xbf\x71\x4c\xf7\x63\x77\x03\x2f\x2c\x94\x58\xe6\x51\xbe\x5c\x28\x85\xd5\xde\xd2\x5b\x7b\x7b\x30\x12\x37\x5e\xba\xab\x50\x69\x97\x57\x64\x32\xb4\x54\x5c\x15\x19\x48\x84\xef\x04\x93\x89\x74\xa1\xb9\x4c\x46\x8d\xcf\xc3\x68\x1f\xec\xc1\xf8\xbc\x67\x4d\x49\xd2\x3d\x12\xc8\xa9\xb9\xd1\x5a\x88\x33\x0a\x23\xc1\xb4\x48\xd7\x2c\xf1\x10\x5f\x4a\xdf\x0b\xdc\x7e\xc6\xc3\x71\x79\x59\xc1\x1a\xc0\xe0\xfe\x42\x17\x5b\x19\xf4\x4f\x54\x32\x61\xdd\x60\x2a\x2c\x21\xf0\xa9\x6e\xb9\x43\x6a\xe0\xc5\x49\x86\xac\x39\x3a\x29\x61\xcd\x82\x54\xfc\xcc\x72\x44\x98\x72\xc3\x6c\xbd\x89\x27\x24\x11\xe2\xbf\x8c\xa8\xa9\x7a\xab\x04\x98\xd2\xb7\x11\x8e\xb1\xb9\xb4\x56\x08\xa1\xef\xab\x17\x16\x9f\x3a\xf2\x3a\x56\x03\x32\x01\x87\xca\x6c\x9d\xe7\xc9\x3e\x2c\x1f\x71\x55\x99\x9c\xe0\xa6\xaa\xc3\xb2\xd6\xf2\xdb\xd0\x3c\x3c\xb8\x4a\x22\x6f\xce\x52\x24\xf7\x81\x3e\xd2\xb5\xc8\x63\x5c\x56\xb5\x73\x38\xc7\x49\xf4\xac\xf5\x55\x83\xb8\xca\xb7\x8c\x15\x8d\x0d\x75\x12\xb6\xed\x40\xc5\xd2\xa0\xd8\x72\xa8\xfc\xea\x7b\xbe\x76\xef\x01\xfa\x36\xe6\xc1\xa1\xe2\xc9\x29\x95\x43\x3b\x6d\x61\x4d\xea\xb9\xc0\x05\xee\xbd\x89\x09\xa9\x4e\x5b\x12\x70\xaa\x22\x89\x6b\x25\x1f\xee\x2c\x58\xd2\x35\x46\x29\x65\x13\x2f\x35\xe0\x60\x1e\xc4\xd4\xe2\x59\x02\x80\x40\x70\x20\x41\x0d\x76\x48\x78\x2b\xe6\x96\x48\x3e\x98\x0b\x2c\x84\xfe\x08\x23\xe0\xeb\xa3\x3f\x0e\x1b\x28\x9a\xa4\x48\x19\xa7\x39\xbb\xd1\x4d\x5b\xe0\xb5\xd2\x4c\x4e\x03\x69\x42\x24\x35\x8a\xad\xad\x6e\x67\x6f\x14\x97\xe8\xc0\x93\x21\x5d\xd2\x6c\x07\x97\x2a\x79\xaf\xe8\x74\x17\xd3\x5e\x75\x53\x7d\x5c\xea\xab\x7e\xe3\x2e\x57\x48\x46\xa3\x5b\x43\x36\x42\x5a\xad\x87\x62\x76\x8d\x66\x04\xbb\x76\x8a\x15\x31\xd3\xb2\x98\x13\x88\xde\x60\xbb\x02\x5a\x0f\xfb\xac\x1e\x39\x32\x43\xd8\x1d\x65\x6b\x74\x53\x28\xf2\x44\xfb\xa7\x11\x15\x8a\xc5\xb7\xbb\x96\x9d\x0f\x6c\x31\x11\x56\xfc\x49\xde\xb8\x7d\xde\x7c\x99\xf6\xc3\x62\xfe\xf2\x2f\xfd\x6c\x8c\xc1\x6f\x68\x46\x49\x01\x4b\xa9\x64\x11\x12\xcf\x3b\xb6\xce\xe8\x3e\xc3\x5f\x88\xc4\x97\xa7\xdd\xe7\xba\xf7\xd5\xce\x27\x7b\x89\xea\xc3\x59\x9a\xee\xbc\x4c\x9c\x87\x02\x5f\x3f\x8b\x29\x3a\xa7\x60\x0d\xcf\x5e\x28\xd5\x49\x57\x5b\x9b\xab\x84\x74\x89\xa3\x9d\x3e\xce\xf2\x47\x61\x15\xda\xd5\x73\x3f\x9a\x3a\xf3\x63\x7f\xcf\x24\x30\xb0\x9b\x12\xa0\xa5\xcf\x12\x8e\x1f\x87\x8e\xe9\x20\xda\x1c\x74\xe0\x88\xdb\x88\x83\x70\xbd\xe2\xfd\x71\xbc\xb0\x87\x32\x01\xb4\xe8\x65\x47\x6c\x23\xa5\xfa\xd4\x3d\x49\x93\x28\xa1\xc4\xb5\xe6\x9c\xb7\x66\xa1\x70\xf7\xdf\xc8\xab\xe2\xdb\xcf\x6f\x60\xa9\x6d\xbc\x78\xb3\x71\x02\xbc\x3c\xcd\x5c\x3d\xca\x17\x35\x75\xe6\x71\xb9\x4a\xcd\x34\xb4\x77\xf2\x64\xa8\xec\x86\xb6\xe6\x1e\xec\xad\xd1\x82\x9d\xb6\x38\xfc\x13\x73\x9e\xe4\xdb\x25\x42\x7d\x94\x73\x97\xb0\x39\xce\xb3\xe7\xfb\x86\xf0\x31\x28\xdb\xf8\x61\x30\x66\x51\xc7\x05\xdc\x43\x30\xe8\x7a\x2f\x20\x78\x84\x68\x15\x92\xca\x68\xd4\x67\xa7\xa3\xf7\x43\xf6\xe3\xbc\x77\x8c\x1f\x80\x0f\x1a\x60\x13\x5a\x3e\xb4\x3a\x62\x7b\x73\x79\x5c\xf5\xd6\x8f\x18\x5a\x27\x2c\x0a\x94\x45\x12\x23\x4e\x51\x22\x5c\xd8\x6b\x62\x20\x4c\x13\xea\xc1\x02\xe8\x26\x86\x75\x29\x6e\x7c\x7d\x23\x3a\xe0\x1d\x20\x21\xb5\xbe\x02\x44\x44\x3f\xea\xcc\x49\xb5\x62\x05\x7e\xfb\xc1\xa0\x2a\x94\x05\xab\x0e\x6a\x27\x21\xf6\xea\x47\xfb\x48\x0e\x46\x35\x80\x5d\x0b\xac\x5a\x62\x77\x01\x5a\xd5\x91\xef\xee\xd7\xc0\xe8\xf8\xf4\xe0\x92\x16\x66\xef\x4f\xc9\x6d\xc8\x9a\x6c\x5e\x50\xee\x36\x95\x09\x5f\x1a\x0c\x77\xc3\x2d\x36\x81\x1b\xac\x80\x84\xd2\x43\x3e\x3c\xb0\xaf\x00\xfa\x3e\x8b\x0f\x07\x14\x2d\xa2\xd0\xb0\xbf\x42\x1d\x2b\x43\x38\x66\x03\x63\xe1\x97\xf8\x05\x52\xc6\x9b\x9c\x6c\x31\x0a\xa9\xd6\xcc\x3f\xbf\x59\xea\x99\x7f\x34\x92\xee\x8e\xc2\xa3\x3a\xf9\x71\xe2\x17\xcd\xf3\x5d\xa4\xf4\x5a\x5d\xc1\x7e\xd6\x55\xdd\x04\x68\x9f\x4c\x6a\x2b\xa6\xe6\x03\xf0\xb7\x90\x9a\x66\x3f\x6e\x07\xa3\x88\xba\x4a\xad\xa3\x88\xab\x47\x0a\x8c\xf2\x07\x49\x6c\x24\x2d\xbd\x76\x90\xc4\x4c\x80\x76\x89\xa9\xad\xcc\x12\x33\x42\x9a\x25\xf6\x80\xfd\xa0\x23\x34\x5f\x1b\x66\x65\xb5\xd3\xe3\x4b\x9b\x36\x67\x42\x1f\x41\xc8\xa5\xd0\x87\xe7\x66\x44\x56\xf1\x18\x3c\x49\x08\x37\xbc\x8a\xf8\x20\x5c\x56\x26\x41\x1c\x5d\xf3\x31\xcb\x96\xe3\xf0\xaa\x5c\xd9\xbd\xf2\x81\x7a\x3e\x54\xc9\x1f\x12\x8a\x0d\x99\xd8\x37\xcc\x6a\xb0\x0f\x62\x98\x67\x58\x9b\x1d\x8b\x04\x16\xc0\x48\x8c\xa6\x15\xe5\x5b\x1a\xda\xa4\x34\x22\x74\x55\xee\xef\x30\xfb\xe2\xde\x4e\xfe\x20\x9e\xc6\x99\x60\xd1\xb4\x6f\x2b\xac\x8c\x5f\x93\x51\x94\x71\x56\x53\xdf\xc6\x09\xa3\xbf\x5e\xaa\x7a\x8b\x9a\xf0\x50\xef\x80\x22\x13\x2c\x70\x11\x95\x76\x1d\xd1\x80\xaf\xe8\x92\x1f\xea\x11\x2b\x09\x5d\x3f\x05\x2c\x40\x2b\x5b\x78\x1d\x8f\xaf\x95\xe2\x9e\xb6\x63\x41\xdf\xd2\xe2\xee\x75\xe8\x72\xab\x61\x37\x8d\x89\xbb\x71\x81\x4c\x3e\x96\x8d\x1d\x20\xd1\x7b\x2f\x06\x53\x6f\xbd\x30\x13\xb9\xe3\xba\xae\xb5\xbb\x8f\x8c\x3d\x50\xce\xdd\xd0\x6f\xfb\x23\x06\x51\xcf\xf6\x38\x8f\x56\xda\xe8\xd2\x42\x03\x0b\x9c\xba\xe9\x9a\x3e\xa8\xd1\x6f\xbc\xd1\x17\xfb\xcd\x7c\x3c\x0d\xcd\x0d\x84\xbb\xbb\xd5\x6e\x61\xa0\x93\x85\x71\x3f\x12\xc8\xb7\x6e\x2f\xd4\xe0\x49\xd9\xb4\x52\xe7\xc5\x9b\x9d\x03\x78\x0f\x3d\x77\x7e\x69\x5c\x48\x8d\x0b\xb8\x59\x4c\x9c\x8b\xc4\x2a\x01\x9b\x94\xc4\x0d\x84\xf0\xd6\x77\x2d\xec\xa2\x5b\x9e\x4c\xac\xd3\x25\xcb\x07\x73\x0e\x72\xb9\x0d\xdc\x8f\x9f\x03\xf7\xe3\x04\xff\x4f\xbf\x37\x94\x07\x79\x93\x41\x33\x4e\x89\x1e\xfb\x70\x0c\xb2\x5c\x6c\xf5\xf6\xdd\x6e\xdb\x5e\x77\xb7\xcb\xae\x95\xdb\x63\xd7\x93\x35\x78\x73\xee\xf1\x78\xa4\xd7\xc1\x2e\x67\xc1\x72\x31\x5b\x05\x89\x33\x9f\x05\x9b\xc9\x7c\xb6\xf4\x7c\x2c\x92\xf9\x1a\xff\x1b\xfc\xe2\x4e\x16\x33\x7f\x99\xf8\xb3\xcd\x6a\x31\xf1\x67\x9b\xcd\x2f\xeb\x89\x3f\xf3\x36\x73\xfd\x6e\xdd\xa1\xa3\x85\x5f\x15\x35\x2a\xd3\x38\x0b\x6b\x34\xca\x0e\x0e\x36\xf1\x0f\x60\xe0\xbd\x85\x26\x5c\x77\xbc\xd0\xae\x3b\x5e\x7c\xd2\x6e\xf3\x95\xc5\x46\x6e\x3a\xbe\x59\x02\xdc\xf2\x0d\xbd\xdc\x13\xbc\xce\x5f\xc9\x32\x37\x92\xf2\x28\x25\x18\x41\x9f\xac\xd5\x8c\x9a\xea\x81\xfb\xb1\xa7\xf5\xdf\xc5\x24\x57\xef\x90\x6e\x35\xc6\x59\x4c\x9c\x85\x30\xd1\xd9\x3d\xce\xe5\x4f\x9f\xe6\x9f\xe4\x09\x6f\x54\x17\x5b\xb7\xdf\x51\x57\xaa\x97\xb8\x3e\x9c\xaf\x92\x93\xec\x2b\x96\x97\xc2\xf4\x08\x94\xbe\x48\x58\x53\xfe\xee\xe0\xdb\x9b\xe4\x97\x5d\x98\x24\xea\x52\xc3\x08\x7a\x54\xc8\xf8\x15\x46\x6f\xad\xf6\x85\x55\x1f\xfa\x3a\x23\xe5\x9c\x15\x5e\x43\x39\xa2\xeb\x45\xb8\xd8\x99\x2c\x70\xb1\xb4\x8e\x24\x94\xeb\xf6\x8d\xed\x2e\x06\x18\x17\x8f\x4a\xbe\xe3\x25\x74\x53\x1e\xb5\x10\x72\xc7\xbc\x4c\x35\x10\x91\x13\x33\xd4\x7b\xde\x94\xf7\xb7\xe7\x60\xc0\x30\x0d\x3f\xc0\x3a\x42\x21\xf5\x53\xb6\xd6\xc6\xb7\x19\x34\xc1\x19\xd4\xba\x49\xc7\x3b\x09\x6b\xf4\xbf\x7e\xa0\x13\xef\x79\x67\xab\x1c\xc6\xe1\x7b\xda\x1e\xba\x46\x68\xb9\x95\x95\x9c\xb1\x00\x97\x7a\x57\xe2\xdc\x56\x3f\x98\x30\xbb\x33\xb1\x5f\x3b\x39\xee\x83\x09\x7c\xdf\xa6\xe0\x01\x63\xa1\x4c\xde\xc3\x35\x09\x34\xd7\x24\x00\xfd\x49\x9a\x52\x82\xfa\x26\xfe\xc4\xfd\x85\xf8\x27\xbf\xa7\xee\x04\x7b\x90\xf3\xf3\x42\xf7\x16\x27\x6c\x67\x2f\x1d\x25\xfa\x1d\xe8\xf3\xba\x68\x26\x9e\x5b\x34\x9d\x1b\x3f\xee\x73\x4f\xab\x98\x61\x51\xa0\xb0\x0c\xb3\x03\x12\xae\x20\x55\x0b\x95\xdf\x6f\xd0\x9e\x1a\x30\x12\xdf\xdd\x76\x23\x26\x80\x7e\x4b\x96\x68\xbe\x85\xc9\xa5\x0d\xca\x99\xcc\xc1\x89\xa7\xe0\xf8\x2d\xbd\x24\x75\x5c\x24\xe8\xcb\x54\xa9\xc0\x9a\xf6\x85\x2c\x0d\x90\xc7\x9f\x9e\xbc\xa7\x2f\xed\x87\x0b\xe9\x12\x5d\x69\x2f\xb0\xe6\xbe\x40\xe3\x32\x34\x47\xae\x1a\x26\xb3\xe6\xa4\xc7\xa8\x29\x42\xe1\xdb\x39\x44\x86\x88\x8c\x0c\x52\xd9\x65\xe9\x13\x4f\x1f\x91\xcf\x88\xd2\xd8\xb3\xb1\x53\x30\x39\x55\xda\xfb\xc9\xa6\x1d\x0e\x21\x3c\xed\x0e\x77\xd3\xf3\x70\xe0\x4e\x76\xf0\xe3\x86\xca\x40\x72\xea\xfb\xc8\x27\xd3\x07\xc9\x03\x0b\x8a\xe0\xd7\x30\xe9\x4a\x75\xcb\x6e\xcf\xdb\x4d\x9e\xb6\xf3\x51\xdb\x31\x66\xdb\xc0\x70\x0b\x2d\x20\x51\x85\xbe\x9a\x38\x60\x0f\x1d\x3c\x9b\x6f\x98\xc3\x02\x2d\x6d\x0d\x4a\xdc\x4f\xa3\x81\x03\xab\x4e\x22\x7b\x7d\x73\x48\xa0\x9b\x84\xd9\xe9\x07\x94\x3d\xff\xa7\x79\xc3\x58\xbb\x5c\xf2\x2f\x65\xfe\x52\xa1\x27\x00\x0d\xd0\xfa\x37\xfc\x0e\x71\xf6\xa4\xc9\x17\x15\x55\x58\xd7\xe5\x0f\x02\x80\x32\x24\xca\x12\x98\xb4\xea\xc3\x0f\xf6\xba\x5a\xe2\x87\x1b\x5e\xb3\xcc\x60\xa9\x5a\x31\xee\xbd\x3a\x74\xa5\xcb\xba\xc1\xc0\x38\xfa\x7d\xa3\xd0\xae\x07\xb6\x5b\x72\x94\x45\x30\xf3\xa8\x18\xc7\xc3\xde\x5f\x55\x1f\xfa\x36\x59\x50\x33\xc3\x4f\x87\xca\xdd\xc7\xb3\x84\x52\x66\x19\x37\x84\x68\x32\x3b\xa1\xab\x3e\xcb\xbd\xd9\x42\xcc\xdc\x61\x4f\xb6\xf5\x98\x37\x39\x61\x45\xbd\xc5\x1a\xaa\xdd\x6e\x39\xbd\x2a\x89\xc9\x37\xa3\xf3\x25\xdd\xeb\x2b\xff\x58\x29\xb0\x92\x4c\x87\x1a\x0a\x99\x06\xe6\x9d\x94\xbc\x17\xfe\xea\xc1\x88\x85\xb7\x30\x0e\x5e\xda\x4d\xa8\xda\x28\xc2\xe3\x67\x58\xc6\x15\xcf\xc8\xb0\xd7\x6a\xcf\x75\x0d\x42\x8a\x09\xaa\x7e\x9e\xe8\xed\x7d\x9f\x18\xf8\x3b\x85\xda\x46\xcd\x57\x95\x7c\x64\x20\x69\x93\x13\x30\x90\x84\xa4\x31\xb0\xb4\x20\xe3\x27\xb0\x4d\x1f\x96\x7a\x70\x94\x97\x2c\xc3\x2f\x48\xcc\x8b\x94\x71\x8b\x6b\x90\x78\xcc\x58\x34\x18\xf2\x2d\xf1\x50\xaa\x53\x84\x7c\xa4\x5c\x06\x0a\xa5\x45\xe8\x14\x0c\x9c\x0c\xe2\xfc\x35\xe8\xf7\x6d\xca\x8c\x91\xff\x3f\xa6\xc9\x43\x6c\xf5\x8d\x6a\xac\x8a\x42\x1d\xbe\x61\xfa\xab\x60\x19\xad\xbb\x42\xfb\xbf\x47\x75\xad\x06\xdb\x61\x35\xa7\x8a\x2f\xd4\xb3\xd4\x28\x77\x68\x76\xf5\xff\x98\x62\x3f\x4a\x87\xab\x56\x79\xab\x1b\x74\xb7\xba\x55\x69\xab\x87\x6b\x2b\xa0\x98\xc6\x0a\x4a\x55\x5e\x76\x17\x58\x3b\xc6\x49\xe2\x24\xf9\x0b\xb8\xf8\x28\x4f\x8a\x1e\xdd\x27\x98\x2e\x45\xd1\x1d\xfe\x66\x3b\x5c\x82\xa2\xd9\xdd\x8e\xbb\x5d\x95\x34\xf8\x8c\x86\xd5\xfb\xa1\x58\x94\x17\x20\x1b\xf9\x08\x1d\xc3\x4b\x52\x9b\x91\x68\xae\xe5\x68\x36\x54\x5b\x36\x98\x72\x35\x94\xa4\x7d\x77\x06\x10\x37\xb3\x55\xda\xef\x33\xab\xc7\xce\xe2\x07\xf4\x86\x4d\xec\x2c\xfc\xf6\x88\xfc\x1a\xd2\xe2\x90\x76\x40\x55\x4d\x71\x48\xc8\xd2\x74\xb9\xd6\x8c\x32\x64\x02\x70\x50\x7e\xc8\xa4\xfd\x4d\x13\x9c\xc0\x19\x75\x39\xd0\x6c\x78\x32\xdb\x9d\xaa\x74\x18\x47\x1d\xee\x2b\xf9\x48\xbb\x18\x9c\xd3\x69\xdb\x41\x4e\xba\x7e\xc9\x23\xe0\x78\xd0\xb4\x07\xf2\x19\x75\xc8\x01\xeb\xa5\x6e\x26\xe4\xf1\x8b\x61\x43\x28\x5f\x25\xd0\xb9\x13\x87\x52\xa9\xa1\x83\x1a\x57\x79\x42\x87\x93\x3e\x21\x65\x4b\x16\x0d\xd5\x27\xed\x5f\xf3\x40\xcc\x6e\xb8\xd6\xcc\x68\xc6\x55\x02\x24\x4d\x52\x75\xc6\x13\x8a\xd3\x83\x3a\x35\x93\x13\x33\x0d\x58\x81\x91\xed\xf2\xa4\xfd\x4b\xd6\xc1\x3b\x02\x72\x06\x39\x25\xfd\xc2\xee\x96\x7c\x03\x18\x77\x11\x27\x89\xa8\x4a\xc2\xc7\x16\x77\xe2\x9a\xdc\x1d\x51\xda\x0a\x86\x36\x17\x8f\x50\x47\xd3\x60\xb7\x34\x06\xdc\x5e\x48\x51\xe3\x17\x5b\x37\xf8\xd3\xb6\x4c\xc0\xd5\x77\xa4\x5d\x3b\x83\x43\x31\xd3\x9c\x1b\x31\x8a\x54\xf4\x6d\x05\x40\xc3\xa1\x06\xb3\x44\x11\x5d\x88\x76\xa9\x61\xda\x87\x55\x8c\x47\xba\x03\x23\x0b\x62\xdf\xd0\xd6\xa3\x00\xa7\x32\x7f\xd9\x7a\x10\x2b\x75\xb8\xe7\x69\x3f\x7e\x26\x3f\x8a\x50\xd8\xd5\x4a\xad\x8b\x04\xc3\x94\x4b\xc9\x9c\x95\x85\xdf\xf6\x61\xf9\x5d\x32\x1e\x98\x4f\x54\xc9\xb9\x4d\x58\x52\x13\x2d\xb9\x09\x39\xfb\xe4\xec\x51\xfd\x82\x50\x66\x32\xc1\x24\x11\x12\x6e\x11\xc6\x19\x2a\xa7\x7a\x91\x73\x4c\x2e\x71\x04\x55\x24\x27\xa8\x34\x05\x61\xab\x14\x2a\x6d\x92\xeb\xdf\xf9\xb0\xf1\x31\x72\xf6\xa5\xf8\x71\x49\xfa\xd0\x21\x7d\x67\x99\x7b\xf0\x97\x1e\x5e\xae\xed\x8b\xee\x39\x7b\x64\xce\xa3\x27\xb3\x26\x98\xfe\xae\xac\xe7\x4d\x8a\x01\xc7\xf9\x09\x03\xf3\xf4\xdc\xe0\x35\x30\x5e\x04\xf3\x28\x7f\x4d\x74\x15\xa4\x72\x23\x43\x7e\xe8\xaa\x0e\xeb\xf8\xc0\x72\x3e\x4b\xa4\xa4\x23\x8e\x66\x69\x1a\xbf\x9a\xb5\x88\x78\xd2\x74\xa3\xe5\x22\xa1\x90\x60\xbc\xc8\xef\x3e\xfb\x35\x3c\x85\x00\xef\x0f\x39\xee\x52\x6a\x27\xa5\xb4\x9d\x02\xd0\xf1\xb6\xfb\x3d\x18\xfd\x5d\x25\x30\xa5\xa8\x26\x2f\x1d\xa0\x9c\x0c\xd4\x89\x0f\x79\x66\xdd\x57\x31\x0b\xc4\xb3\x01\x40\x4e\x53\xb6\xbf\xc1\xbc\xd9\x17\x8b\x65\x42\xfe\x11\xb6\xfb\x76\x2a\xe6\x54\x87\x32\x4f\x92\x6b\x1a\x36\x7c\xd8\x56\xc1\xb7\x73\xfb\xb1\xc8\x79\x55\xd2\x65\x87\x4d\x9b\x2e\x3b\x98\x6d\x68\x12\x6b\x86\x8e\x7e\xa8\xa6\xa7\xcb\x54\xc3\x0b\x56\xca\x26\x18\x06\xe9\x8c\x31\x5c\x9f\xf6\xb4\xef\x0c\x34\x5c\xdf\x24\x7d\x13\xd2\x92\x2a\x5c\x45\xdc\x4d\x16\xf2\xa1\xad\xcc\x5f\x26\xec\x88\x2e\x58\x38\x36\xc9\x9f\x4a\x6e\x22\x1a\x3b\xc0\x96\x95\xf9\xcb\x4e\x2f\xb2\xe3\x99\xf4\xe5\xa4\xef\x6b\x6e\xb0\x73\x33\xc3\x8e\x80\xb7\x7f\x74\xed\x91\xdf\xe3\xa2\xb8\x85\x02\xfb\xa0\xf1\x49\xd8\x7e\xa1\xfd\x16\x57\xf1\x3e\xb1\x0d\x75\x6b\x9e\x81\x77\xdc\x3f\xc5\x69\x91\x97\x75\x98\xd5\xd2\xdb\x4e\x28\x36\xd9\xf4\xd6\xf9\x65\x36\x9d\xa6\x8d\x34\x32\xc1\x8d\xb3\xe4\x6c\x02\xa6\x62\xb5\x5c\xc1\xa6\x22\x8d\x2c\xc2\x96\x2a\x61\x61\xcb\x20\xba\xb0\xe5\xfa\xb4\xa7\xbd\x2e\x6c\xb9\xfe\x26\x53\xc1\x13\xfd\xab\x88\xbf\xab\xa9\x48\xa3\xc7\x98\x0a\x19\xcf\x68\x53\xa1\x36\xbf\xd3\x54\xfc\xc3\x69\xcf\x4d\xa6\x42\x1e\xb4\xa1\xa6\x42\x68\xf5\xb7\x33\x15\x02\x13\x43\x4d\xc5\x66\xe3\xc1\xa6\x82\x1c\x69\x37\x09\x5b\xaa\x84\x85\x2d\x83\xe8\xc2\x96\xeb\xd3\x9e\xf6\xba\xb0\xe5\xfa\x9b\x4c\x05\xbf\xa6\x43\x45\xfc\x5d\x4d\x45\x72\x7a\x8c\xa9\x90\xf1\x8c\x36\x15\x6a\xf3\x3b\x4d\xc5\x3f\x9c\xf6\xdc\x64\x2a\xe4\x41\x1b\x6a\x2a\x84\x56\x7f\x3b\x53\x21\x30\x31\xd4\x54\x78\xde\x66\x03\xdb\x8a\x26\xb1\x48\x5b\xaa\x84\xa5\x2d\x83\xe8\xd2\x96\xeb\xd3\x9e\xf6\xba\xb4\xe5\xfa\x9b\x6c\x45\x7b\xcb\x8e\x8a\xf9\xbb\x1a\x8b\x26\x79\x8c\xb1\x90\xf1\x8c\x36\x16\x6a\xf3\x3b\x8d\xc5\x3f\x9c\xfa\xdc\x64\x2c\xe4\x41\x1b\x6a\x2c\x84\x56\x7f\x3b\x63\x21\x30\x01\x1b\x0b\x19\xfe\x7b\x4e\x09\xb3\xe6\xf4\xa9\x8d\x55\x67\xac\x0a\x63\xd5\x96\x71\x96\x46\x6e\xfb\x90\xc9\x7d\xcf\xcc\x7e\xe4\xb4\xfe\x7b\x97\xcc\x2d\x93\xf8\x86\x19\xfc\xb7\x9f\xbe\xf6\xb9\xcb\x2b\x13\x7a\xe4\x49\xfa\x4a\x21\x9d\x54\x23\x77\x05\x6e\x9e\x6d\x0d\x94\x05\x5a\x08\x42\xbc\x69\x67\x10\x62\x59\x13\xf5\x86\xc1\xa0\x86\x56\xce\x64\x48\x13\x87\xab\x41\x84\xd4\xcf\xd9\x22\x86\xb9\x15\x03\xfd\x4c\xf8\xb3\xfc\xa1\xba\x8f\x9a\xf0\xe1\xb6\x0f\xb4\x3a\xe7\x2f\x36\x40\xf0\x83\xef\x20\x11\x71\xbd\x82\x84\x23\x7f\x2f\x97\xae\x9d\xec\x41\x47\x17\xeb\xdf\xef\xd0\xfa\xdc\xed\x8e\x12\xe2\x67\xe9\x2c\xe1\x1c\xff\x3f\x94\xe8\x00\xf7\xe0\xa3\xbf\x76\xa7\x13\xf6\xff\xb3\xe0\xa3\xbf\xf9\xc4\xea\xf1\xd0\xa1\x43\x58\xfc\xf4\x89\xb0\xdc\x16\xa7\x71\x8d\xca\x24\x4e\xe3\xfa\xa7\x4f\x9e\xdb\x16\x33\x4e\x7c\x7a\x36\x71\x31\x59\x9d\x7d\xff\xd7\xc5\xc4\x0b\xe8\x5f\x7f\x7e\xf6\x7d\xe0\x64\x3c\x3c\x6a\xa8\xa9\xc7\x4c\x0f\x92\x48\x32\x1c\x25\x66\xd2\xc2\x3a\x93\x18\xc8\x80\x49\x1e\x85\xe5\x57\xd0\xda\xb4\x5b\x28\x60\x28\x85\x3c\x00\xa0\x5e\x01\x0f\x23\x33\x9a\x15\x3f\x08\xa6\xfc\x7f\xe2\xe8\x99\x5b\xdb\x58\xea\x31\x2d\x12\xb1\xd5\x20\x6a\xa0\x81\x91\xf0\xf8\x56\x3c\x46\x33\x63\x21\xa9\x58\x19\x0b\xa4\x64\x64\x74\x38\xe3\xa6\x12\x98\x61\xc0\xb0\x28\xe2\x01\xcc\x8b\x04\xe1\x3d\x5b\x31\xff\x5d\xdb\x18\xdc\x81\x49\xf7\xcf\xdf\xd0\xd2\xc8\x43\xa7\x18\x9a\x41\x13\x46\xb2\x36\x16\x81\x43\x26\x06\x82\xd0\x27\xf9\x21\x2c\xa3\xbb\x76\xd3\x0c\xdc\x92\x20\x5e\xb3\xf1\x92\x97\x11\xf5\x16\xf7\x25\x0a\xbf\x3a\xf8\xf7\xc0\xdb\x99\xdb\x2d\x83\x7d\x97\x33\xfb\xc6\xdb\x99\x71\x8f\x7f\x3e\x2b\xfb\x87\xe5\x8b\x61\x5d\x06\x35\x23\x3b\x25\xe8\x1d\x2b\xc2\xfd\x8e\xca\xe9\x39\xb6\x2f\x81\x95\xea\x4d\xc5\x94\x86\x62\xfe\x42\x3e\x1c\x86\xfd\x6c\x62\x3a\x12\x67\xe2\x91\x2c\x22\x86\x0d\x6e\x3a\x28\xc0\x45\x97\x46\x53\xb9\x4b\x48\xe1\x03\x4a\x73\x69\xe6\x05\xc8\xb7\x68\xe6\x06\xff\xcb\xae\x3c\xfc\x51\x60\x6d\xaa\x31\xfb\x23\x05\x3d\xe6\xb9\x7c\x49\x02\x97\x8c\xb3\xcf\xa3\xd7\xde\x0d\x71\x62\xf2\xc6\xa2\x69\x77\x60\x79\xa2\x26\x38\x75\x5c\x27\x48\xd9\x56\xca\xf3\xca\x12\x80\xea\xb2\x97\x60\xe8\x11\xb7\x39\x98\x44\x9b\xe3\x44\x4d\x2d\x8e\x37\x0c\xd5\xbb\xd9\xb6\x85\xfa\xb1\x7b\x94\x52\x87\xcb\x3d\x61\x77\x49\xb6\x5b\x50\x78\xf2\x0a\x1f\x4c\xf7\x6d\xca\xac\x41\xa6\x8f\x3b\x57\x04\x6c\x99\x66\x12\x75\x48\xd7\x8d\x6a\x31\x01\x8a\xdc\x09\x1f\x1e\x26\x7c\x43\x77\x86\xb2\x2f\xdf\xc7\x6a\xe0\x9d\x92\x02\x66\x48\x7b\x30\xd6\x9d\x0c\x62\x5f\x1a\x0b\xba\xc9\x59\x4e\x08\x3f\x5b\x42\xd2\x70\xe4\x94\xec\x34\xf7\x11\x07\x55\xee\xf6\x97\x49\x90\x5d\xa7\x76\x1a\x12\x36\xd6\x3a\x4e\x4f\x0e\x56\xbc\x24\x7c\x1d\x7e\xa6\x99\xed\x26\x53\xa6\xd1\xae\x4f\xca\x1d\xc9\x69\x47\x9c\x22\x15\x0a\xea\xbc\xe8\x96\x16\x32\x74\x22\xaf\x21\xbe\xed\xb4\x3a\x97\x78\xae\xb8\xd2\x45\x53\x00\x56\x8c\xe4\xfd\xac\x29\xd8\x85\xeb\x7b\x5b\x4d\x6c\x16\xbe\x4e\xe8\x7b\x5a\xd6\x1a\x2f\x28\x1a\xcb\xa6\x9f\xb6\xf1\x88\xfd\x85\xed\x1a\x23\xb0\xec\x48\x8a\x94\xeb\x0d\x82\xa2\x91\xd5\x8c\xf0\xa4\xf1\x2d\x18\x6a\x77\xc2\xb6\xe3\xf1\x67\xfd\x18\x8f\x6a\xa9\x24\x8b\x87\xf1\x33\x02\xfc\xf6\x9b\xdb\x46\x86\xbe\xd5\x1f\x37\x34\x00\x53\x03\xba\xad\xcc\x6a\xa1\xf5\x8f\x52\xc7\xd8\xdc\x13\xcf\xf0\x03\x6d\x1e\x77\x09\x4d\x2f\xe6\x89\x68\x86\xa6\x83\xe1\x81\x59\x7a\x2b\x69\x6a\xb4\xc7\x91\xee\x9f\xb3\x46\x06\x1e\x70\xa5\x55\x3f\xe2\x41\xa3\x0a\x34\xe8\x31\x7e\x63\x68\xdb\x87\xd5\x40\x1b\x1c\x57\x99\x03\xc6\x02\x0d\x07\x2a\xd0\xa0\x31\xb7\xab\x67\xe2\x32\x0c\xed\x01\x77\xfa\xdb\x39\xe4\x97\xac\xde\xce\xe9\x01\x65\xa5\x4c\x05\x91\x5b\x9e\xc2\xa2\x7d\x99\x89\xad\xc5\x72\xa0\x28\x2f\x8b\x73\x98\x55\x5b\x92\x1f\x3b\x7f\xa9\xb6\x1e\xd8\xc5\x9e\xdc\x3c\x6f\x6f\xb3\xf0\x70\xc8\xcb\x28\xce\xb3\x76\x4d\xdc\x09\xb3\xc3\x39\x2f\x99\x1b\xd8\xd6\x33\xb3\xa2\x24\x48\xd1\x00\x84\x09\x90\x1f\x9d\xfa\xb5\x50\x6f\x0f\xed\x99\xfd\x76\x25\x06\x89\x51\xb5\x50\xa9\x8d\x3a\xa1\xa3\xe0\x95\x82\x05\xd5\x1d\xdb\xe9\xa7\xc0\xde\x66\x38\x96\x8c\x0e\xe5\x25\xdd\x3f\xf0\xe0\x5d\xeb\x76\xea\x4e\x9b\x47\xf7\x71\x4b\x5b\xe9\x7b\xb3\xaf\x28\xb1\x68\xc7\x33\xd9\x56\xfe\xa3\x5a\x70\x85\x3e\x17\xf5\x35\x6a\x93\xe7\xd1\x7d\xf7\xb8\xe9\x0e\xfa\x14\x25\x1f\x1c\x6b\xb7\x66\x7f\x7e\x1a\x40\x82\x84\x2d\x2d\x21\x35\x7c\xb9\x64\x11\x2a\xb1\xba\xdf\x8d\x89\xce\x00\xa5\x8d\x72\xee\x8c\xa7\x13\x2f\xc2\x53\x9c\x91\x66\xfd\x0a\xa0\x9c\x90\xd0\xc4\x08\x4a\xab\x08\x4f\x88\x7d\xd9\x33\x2e\x98\x40\xe7\x2d\x21\xef\x1e\x07\xa4\x72\x66\x1f\xbf\x4d\xed\x63\xcc\x89\x0c\xa7\x32\xe2\x87\x04\x5b\xf6\x94\x2b\xea\xfd\x0e\x6f\xb0\xdc\xcf\x77\xd0\x18\xf7\x2a\xae\x74\x70\x4f\xa4\xa5\x5c\x41\x76\x63\x1e\x3d\x82\x8f\xe8\x83\xf0\x86\x99\x08\x23\x0e\xfa\x41\xf6\x83\x9b\x80\xfd\x92\x24\x49\xc8\x75\x7e\x82\x48\xcd\x7e\xf4\xd3\x66\x3d\x35\x0a\x4c\x59\x45\xec\xdd\x60\x0d\x38\x1e\x08\x5e\x89\x20\xe2\xe7\x0b\xdb\x22\x85\xc1\x87\x72\xc9\x3a\xc9\xf0\x13\x9b\xe2\x24\x23\x7b\xa1\x84\x29\xa1\xc6\xe9\xc1\xa0\x8b\x9d\x60\x8c\x36\x4d\x30\xc9\x7e\xde\x23\xfa\x39\x97\x0b\x4c\x6d\xa4\x22\xcc\xfb\xf4\x40\x23\x57\xa5\xe0\x70\x8d\xba\x52\x09\x46\x78\xcb\x68\xf9\x7d\x13\xc5\xc8\xfe\x4d\xd3\xa6\x77\xd6\xd0\x37\x5b\x18\x9d\x90\xf5\x58\x18\x1e\x2f\x3c\x5c\x0b\x69\xb4\x56\xc1\x47\x29\x4d\xdc\x4a\x4d\x13\x37\xec\x7e\x3a\xe5\xcc\xd2\x3e\xac\x10\xc6\x02\xa7\x25\x15\x8e\xfc\x9b\xf2\x12\xfc\x1d\xe4\x35\xa0\x23\xaa\xa5\x27\x08\x69\x05\xfb\x62\xc0\x7f\xd9\xd6\x22\x29\x04\x4a\x8b\xfa\x55\xd9\x08\xb1\xaf\xb3\x09\xa3\xa3\xbf\x16\x85\x3b\xf3\x31\x04\x59\xaf\x52\xf7\xc5\x2c\xb5\x6d\x31\x4b\x6d\x59\xc9\x73\x3b\x05\x71\x8a\x32\x4e\xc3\xf2\x75\xd0\xe1\xea\x50\x6e\x23\xf7\xb8\x2d\x55\xbf\x8b\x80\xf8\x96\xfe\xe1\xa0\xe2\x9b\xc1\xf8\x94\xf4\x74\x43\x5f\x85\xf8\x4d\x48\x11\x55\xe8\x90\x67\x51\x6f\x27\x99\xeb\x13\xaa\xad\x94\x6e\x76\xe5\x03\x3a\x1a\x2c\x82\xfd\xd2\xd7\x71\xce\x4c\x38\xc7\x74\xd6\x73\xd7\x53\xcf\x5b\x4d\x3d\x5f\xee\xee\xe5\x70\x40\x55\x65\x67\xcc\x5f\x87\xab\x45\xd0\x31\x46\xdb\xa8\x5d\x65\xa5\x03\x3a\xea\xa1\x15\x9a\x2f\x54\x7c\x33\x18\xdf\x98\x4e\x2e\xdc\xa9\xb7\x5c\x4d\x97\x1b\xb1\x8b\x71\x76\xcc\x7b\xf8\x59\x85\xfe\x7e\xdd\xf2\x83\x1b\x28\x9d\x23\x45\x43\x7a\xe6\xad\xc2\xf5\x5e\xc2\x34\x03\x30\x8d\xe9\x93\x3f\x9f\x7a\x4b\x7f\xea\xad\x17\x62\xa7\x5e\xc2\x32\xeb\x32\xf9\x7e\xf0\x3d\x3f\xf0\x37\xa0\x3f\x71\xf0\xdc\x55\xcb\x10\x6b\xa6\xf4\x8e\x97\x4a\x1d\x34\xa2\x8c\xe6\x1b\xe4\xba\x2a\xca\x19\x8c\x72\x54\x4f\x83\x60\xea\x6d\xe6\xd3\x95\xd8\xd1\x28\xcc\x4e\x7d\xa3\x1e\x1d\xe6\x81\xa0\x9f\xb4\x89\xd2\x47\x56\x38\x40\x86\xfb\xc8\xf7\xe6\xae\x82\x6d\x06\x62\x1b\xd5\x3b\xdf\x9d\x06\x73\x45\x37\xc9\x6e\x94\x7e\x21\xae\x8f\x9b\x63\xd8\x72\x44\x1a\x29\xdd\xa3\x65\x03\x05\x18\x22\x17\x05\x32\xba\x19\x84\x6e\x54\xf7\x16\xeb\xa9\xbf\xd8\x4c\xfd\xc0\x95\xc5\x57\xf6\xe4\xe2\xa0\xd9\xce\x85\xe1\x2e\xbf\x6a\xa2\x2b\xbf\x0e\x9a\x7c\x91\xef\xf9\x0b\x09\xd3\x0c\xc0\x34\xa6\x57\x81\x3f\x0d\xd6\xd3\x25\x9b\x7a\x7f\xbd\xa4\xfb\xbc\x2e\xf3\xac\x75\x22\x7d\xc3\x12\x85\x21\xbf\x1b\xbc\x24\x31\xb7\xaf\xbd\xe9\x54\x17\x98\x2a\x71\xdc\x04\x9e\xe8\xce\xd4\x9e\xfd\xbb\x6a\xde\xd9\xb7\x59\x98\xa0\x12\x4a\x31\x3d\xe8\x63\xa6\xd7\x79\x97\xa3\x8e\xc9\x13\xa2\x64\x89\xa9\xb3\x61\xed\x57\x7c\x5a\x49\xdc\x5a\xc5\xb5\xe4\x75\x51\x5c\xa5\x71\x45\x36\xaf\x2a\xfd\x5d\x08\xe8\x05\xa8\xc9\xec\x90\xe4\x15\xea\xfd\xe2\xd6\x05\xee\x86\xee\x83\xac\x2a\x5e\x91\xeb\x2e\xdc\x75\x00\x48\xff\x70\x40\x81\x7e\x17\xdc\x3a\x0a\x71\x58\x29\xa1\x9a\x9c\xc5\x6f\xef\x1c\x74\x73\x3c\x44\x3a\xa8\x38\x5e\x2d\x07\xfe\x2a\xf0\x39\xa0\xe6\xd1\xcc\xd7\xf3\x68\xe1\x41\xea\xe9\xa3\x39\x0a\xd4\xf8\x73\x19\xad\xa3\xbd\x86\x0c\x66\xf1\xb0\x3e\xec\x0f\x47\x1d\x18\x60\xd2\x77\xfd\xb9\xbf\x6c\x41\x65\x3f\xc4\x0b\x82\x95\xbf\x80\x6c\xd7\x02\x45\x5d\xf6\x68\x4e\x75\x8e\x96\x87\xbd\x82\x0a\x66\x70\xef\x45\xc7\xbd\x06\x0a\x8d\xe1\xde\x47\xde\x9c\x03\x8a\x3e\x84\x7b\x08\x16\x4b\x17\xe2\xcd\x43\x87\xa3\xa7\xca\x17\xa1\x00\xed\x45\x3c\x30\x63\xe1\x3e\x8a\x50\x20\xc1\x41\x5c\x2d\xfd\xc3\xbc\xe5\x4a\x71\x02\xd6\xc1\x72\xe1\x2e\xe0\x45\x85\xf9\x21\x52\x18\x3b\x1e\x11\xda\x87\x0a\x2a\x98\xb7\xe3\x11\xad\x43\x4f\x05\x05\xd8\x0b\xe6\xf3\xa3\xdb\xb2\x27\xbf\xba\x57\xbe\x77\x00\x45\x7a\x5c\x47\x2b\x4d\xa4\xc7\xe0\x20\x88\x94\x62\x32\x30\xe7\xed\xdd\xfd\x4a\x81\x04\x78\x5b\x6c\x3c\xdf\x5b\x75\xe6\x45\x78\xf1\xae\xbd\xb5\xb7\xf6\x21\xd6\x10\xfe\x4f\x65\x2d\x3a\x46\x47\x24\x21\x82\x39\x43\x07\x74\x38\x2e\x65\x40\x80\xb1\xe5\x1a\xff\xd7\x75\xa0\x7b\x61\x7a\x7b\x0f\xf9\xd0\x44\x25\x73\x72\xa3\xce\x82\xe5\x61\x7d\x08\x45\x3c\x86\x29\xb0\xd9\xef\xf7\x48\x82\x83\x34\x6d\xe1\x06\x6e\xf0\xf6\xcf\xfc\x93\xcd\x57\xf4\x7a\x2c\xc3\x14\x55\x93\xa2\xcc\x4f\x25\xaa\x2a\x67\x1f\x96\x4e\x55\x97\x71\x81\xaa\xeb\xb1\xcc\x53\x71\x5f\x62\x6b\x69\x3d\x9a\xcf\xbc\xce\xc1\x5a\x77\xe2\xbe\xbd\xfd\xf3\x3b\xe2\x9e\x71\x8c\xfd\x2b\xd3\x62\x32\x57\x35\x15\xbe\xb8\xa6\x21\x5e\xd8\xaf\x5f\xf5\x31\xe4\xe3\x83\xd8\xcb\xc7\xe7\x20\x92\x8f\x27\xb1\x45\x17\xf5\x7c\x12\x2b\x56\xfb\x29\xf8\x57\x83\x16\x6e\x8c\x6b\xa7\xc2\xc2\x07\xf1\x66\x26\xb3\x25\x5d\x47\x19\xbc\x80\x22\x0d\x92\x9e\xe6\x11\xd0\x94\x48\xdf\x18\x8b\xe5\x16\x96\xce\x09\x0b\x00\x65\xf5\x0f\x8b\x20\x42\xa7\x29\xb0\xed\x36\x78\x9e\xf8\xc1\xc7\xa9\xe0\xba\x68\xbf\x03\xf7\xa3\xa1\xa5\xb9\x66\xa5\xe0\x50\x7e\x4b\xd7\x93\xb5\x17\x1a\xb1\x1c\x65\x52\x0f\xc3\x2c\x4e\xc3\x1a\x45\xed\xc7\x57\x5a\x40\x66\x41\x35\xa1\xdd\x9c\xc4\xd9\x31\xce\xe2\x1a\x81\xd3\x68\x37\xba\xc5\x4d\xa2\xb2\x71\x4a\x53\x56\x4b\x3f\xdf\xde\x66\x84\xc8\x88\x69\x40\x75\x92\x1e\xbb\x13\x13\x43\x89\x47\xee\x08\x4e\x75\xaf\x22\xdb\x06\xf2\x26\x6e\x2e\xfd\xde\x19\xc0\x60\x83\xd0\x31\x44\xfa\xe2\x84\x04\xa5\x98\x52\x58\xce\xf4\x28\xcc\xcd\xd6\x17\x85\x71\xf0\xad\xc9\x86\x5a\xf9\x7b\x95\x07\x91\xe9\xff\x5e\xc5\xc2\x53\x13\x0d\xf9\x9b\xa1\x31\x2a\xe5\x97\xb3\x28\x58\x86\x7f\xf1\xeb\xd9\xa6\x08\x7f\xc3\xd3\xf7\x25\x2a\xf4\x4d\x7b\x88\xc5\x35\x7b\x65\x5b\xb2\xb6\x0a\x6f\x92\x91\x79\x67\x30\xd4\xdc\xf2\xd1\xc0\x44\xa0\xfd\x44\xa5\x29\xc0\x76\x44\x1a\x59\xc3\xed\x59\x2a\x2d\x26\x67\xed\xe3\xe7\x0d\xdf\xd8\x14\xd4\x3f\x6a\x4a\xa1\x6f\xe6\xee\x6f\xc4\x19\xb4\x64\x35\x65\x13\xae\x68\x24\x6c\xe7\xbc\x8c\x7f\xcf\xb3\x3a\x4c\xc6\x9c\x71\x05\x11\xfc\x3c\x44\xbd\x8c\x9f\x4f\x6d\xbb\x38\x06\x92\xd3\x35\x6e\xd8\xa7\x56\x65\x2f\xca\x30\x6a\xc0\x88\x0f\x6e\x3b\x40\xe6\x82\xf0\x08\x7b\x90\x26\x8c\xa1\xa0\xb0\xdb\x6d\x17\xd0\x89\x78\xd6\x6d\x8e\x20\x7d\x29\xfb\xdb\x8d\xea\x43\x92\x8b\x7d\x57\x0d\x02\x29\xbe\xa7\x12\x41\x04\x47\xe8\x11\xd4\xfc\xe1\xaa\x34\x88\xc8\x48\x6d\xb2\x64\x06\x83\x79\x10\x33\x84\xdd\xaa\x4e\x69\xf4\xbd\xd5\x09\xa2\xf8\xae\xea\x04\x10\x1c\xa3\x4e\x40\xf3\xc7\xab\xd3\x10\x22\xf7\xab\x13\xcf\x1e\x05\xf3\x20\x66\x91\xba\x55\x9d\x92\xd3\xf7\x56\x27\x88\xe2\xbb\xaa\x13\x40\x70\x8c\x3a\x01\xcd\x1f\xaf\x4e\x43\x88\xdc\xaf\x4e\x6d\x82\x21\x98\x89\xe6\x7e\x67\x89\xe4\xb1\xf9\xbe\xfa\xd4\x7c\x67\x97\x09\x22\x38\x46\x9f\x9a\xef\xe0\x38\x0d\x22\x32\x56\x9f\xc4\xf6\xc7\xe4\x52\x9d\xaf\xda\x97\x29\x15\xe2\x67\x53\xc7\x18\xfb\xf4\x62\xbe\x01\xed\x7a\x0f\x64\xea\xa1\xec\xd0\x4f\x3c\xfc\x6b\x8e\xa1\xfd\xc8\x20\xbd\xa7\x95\xf4\x49\xd4\xc8\x12\xff\x6a\x34\x0e\xb9\xb2\xd3\xd7\x14\xc3\x51\x9a\x4a\x0c\x87\x0b\x75\x7a\xc3\x3f\x43\xf1\x2f\x4e\x46\x0c\x23\x87\xb1\xb7\x9d\x34\x90\x46\xb6\xf8\xb7\xad\xb1\xe8\x07\x0d\x25\xa7\x2a\x0d\x25\x2d\x04\x28\x0e\xfc\x58\xc6\xbf\x8b\x19\xda\x8f\x1d\x46\x7b\x2b\x69\x10\x8d\x2c\xf1\xef\x6f\xe3\x90\x0f\x1a\x42\x4e\x53\x1a\x42\x5a\xa8\xd3\x1b\xf4\x41\x8f\x7f\xbb\x83\x1a\x8f\x1c\x3c\x5b\x13\x79\x1e\x9b\x98\xe1\x1f\x08\x47\x60\x1e\x36\x89\x19\x41\x79\x12\x93\x42\x9d\xd8\xf0\x2f\x8e\xf4\xe3\xa2\xa1\xfd\xc8\xc1\xeb\x69\x25\x8d\x9f\x8d\x25\xf2\x11\x73\x1c\xf2\x41\x43\xc8\x69\xca\xf7\x61\x93\x42\x9d\xde\xd0\xaf\xa2\xec\x03\x28\xdc\x7c\xe4\x00\xda\x1b\x49\xe3\x67\x66\x88\x7d\x67\x1d\x85\x7b\xd0\xf0\x71\x92\xd2\xf0\xd1\x42\x9d\xdc\xc0\x0f\xb7\xec\x1b\x2d\xd8\x7a\xe4\xe0\x59\xdb\xc8\xba\x67\x62\x87\x7f\x09\x1e\x83\x7a\x98\xe6\x31\x8a\xb2\xe6\x91\x42\x48\x52\x03\x3e\x2d\xf3\xaf\xc8\x50\xe3\xd1\x5a\x67\x6e\x22\xbf\x2d\x4c\xcc\xf0\x4f\xd5\x23\x30\x0f\x7b\x55\x30\x82\xf2\xab\x82\x14\xbe\xb1\xad\x42\xf4\x08\x17\xf1\xf2\xa5\xb3\x14\xdd\x71\x01\xe3\x96\xf7\xd6\x11\x72\xe9\x17\x94\x76\x73\x99\x57\x34\x13\x97\xdc\xb9\xd5\xde\xb8\x3f\x0b\x18\x41\xd5\x9b\x73\x77\x86\xd4\x14\x04\x98\x9c\xfd\xe3\x4b\xf8\xcf\xe4\xe7\xac\xfb\xc9\xe4\x31\x04\x94\x52\x6d\xb9\x59\x05\x6f\xfb\x4b\x5d\xe7\x19\xdf\x30\x35\xec\x7e\xf1\xf6\x1e\xeb\x90\xb6\xeb\x72\x3e\x01\xdf\x13\xde\x66\x75\x1e\x56\xb5\xf1\xde\x98\x79\xe0\x16\x8d\x98\x22\x90\x16\x74\x79\x7d\x19\x80\x76\x64\x03\xce\x4c\x21\x7d\x93\x5d\x07\xcf\x5a\x66\x9b\xee\x96\x9b\xbe\xd4\x36\xcf\xf2\x5e\x41\xe9\xaa\x19\x15\x92\x0f\xa9\xe9\x93\x1f\x19\x03\xfd\xd8\x38\x9c\x0e\x85\x00\x93\x64\x54\xf8\xe5\xcb\x51\x7b\x62\x85\x72\xef\xa0\x06\x73\x8e\x23\xed\xd2\x2f\x5c\xc1\x0f\x7a\x8e\xfd\xfe\x6a\xbe\x6c\x0a\xbe\x89\xa7\xe7\xb2\xbc\x5b\x45\x65\xcf\x92\xe2\x06\xcf\xef\x94\xe4\x87\x8e\x1d\xf9\xc0\x2c\x7f\x80\x7c\x9b\xa5\x79\x14\x26\x4e\x5e\xa0\x4c\x3f\x30\xdc\xd5\x4d\xe8\x73\x77\xf2\xb8\xe1\x7b\x30\xd4\x9b\x75\x18\x60\xfb\x1d\xf4\x18\x37\x28\x62\x1b\x17\xd9\x57\xe6\xf6\x03\xae\x1b\xb8\x3b\x51\xc8\x3b\xfd\x56\x5a\xf2\xac\xee\xfb\x10\xee\xf3\xa7\x2c\x46\x71\x98\xe4\x27\xe0\xe3\x2b\x45\x48\xb3\xfc\x10\x5d\xe5\xe9\x55\xa1\x89\x4e\x70\xcd\x8e\x61\x84\x26\x32\x5e\x61\x3f\x87\x74\x5d\xfa\x31\x2f\xd3\xc9\x6c\xce\x8e\xdc\x28\x97\x10\xdf\x0a\x31\xed\x21\xa1\x55\x53\x3c\x49\x58\xa3\x1f\xdc\xa9\x83\xad\xcd\xf3\xce\x56\x39\x78\xa3\xc4\x90\xf1\xe0\xbb\x22\x08\x28\xbd\x0a\x52\x02\xd5\xb9\xed\x6e\x38\x6e\x7f\xf2\xf6\xb4\x25\xbd\x0d\xac\x17\x4f\x75\x08\x13\xf4\x83\x37\x73\x7d\xb1\xbb\x42\xa9\xac\x1c\x2c\x9f\x2c\xb6\xf3\xfd\xd6\x43\xb8\x3e\x8a\x4c\x27\x72\xe1\x94\x43\x76\xba\x98\xd1\x72\x8e\xd9\xa6\xa5\x2b\x80\xe4\xdb\x99\x63\xd9\x19\x26\x9b\x11\x2b\xcf\xb7\xd0\x03\xc6\xec\x63\x6f\x8a\x9c\x5e\x7a\xc4\x58\xc0\x93\x9b\x37\xa2\x16\x14\x45\x0f\xb4\xc6\x42\x2a\xae\xbe\x81\xe7\xd4\xdb\x33\xe1\xf2\x2b\xc5\x3c\xf2\xac\x86\x6b\x14\x26\xc9\x44\xd6\x56\xa5\xf9\xef\x50\xb9\x58\xd4\x5d\x51\x66\xe0\xcb\xa8\x7d\xef\xb9\x43\x4e\xb0\x9a\x23\xd9\xb2\x68\xaf\x30\x45\x87\x62\x6b\x85\xc2\xf9\x13\x71\x70\x12\xdf\x21\x9d\xa0\xf0\x42\x51\x4c\xbe\xed\x44\xf3\xad\x2e\x97\xff\x0c\x1d\x96\xd0\x5f\x57\x98\x40\x54\xe6\xc5\xc0\xb7\xe4\x42\x48\x68\xf5\xed\x45\x90\xf1\xb7\x33\xb8\xcc\xa9\xd1\x21\x36\xbc\x75\xc4\xf4\x6a\xe2\x91\x89\x3e\xbe\x64\x4b\x1e\xb9\xd7\xed\xae\x2b\x51\xdb\xdd\x86\xbb\x9e\x1b\xa1\xed\x5e\xd4\x7c\xb0\x13\x35\x17\x7d\x28\x71\x4c\x26\x4a\xc0\xe1\x29\x07\x6b\xb6\x0e\x29\x11\xff\x15\xed\x27\x94\x4b\xd0\xd5\xcf\x70\x0b\x86\x58\x9f\x2a\x7d\x49\x0d\x45\xd6\xde\xa4\x77\xc8\xdf\xf0\x2e\x57\x94\x45\xf0\xdd\x03\xb8\x42\xf6\x4c\xe1\xc4\x7c\x8a\x80\xcd\xd9\xd4\xe6\x23\x92\xa9\x01\x62\xa6\x23\xf5\xf3\x1f\xae\xdc\x6b\xf4\x45\x6f\x99\xda\xb9\x7d\x58\x3a\x29\x0a\xab\x4b\x69\x3a\xaa\xe3\x6c\x36\x9b\x4d\xd1\xb0\xd9\x4b\xe2\x40\x26\x5f\xf2\xdc\xba\x00\x14\x9f\x65\x8b\x8e\xe4\x0a\x09\x77\x56\xba\x6e\x9b\x07\x6d\xeb\xb1\xc8\x0e\x78\x51\x0b\x2f\x1f\x83\x67\x33\x27\x6e\xf1\xfd\xbe\x0d\x8c\xa7\x75\x14\x0c\xaf\x77\x7b\xab\xf6\x5d\x62\x21\xf8\x98\x97\x7a\x2b\xdf\x54\x18\xe4\x39\x1e\x64\xdb\x0e\x05\xda\x26\x39\x71\xdf\xac\x49\x84\xd6\x6b\x53\xeb\xf6\x83\x34\xd0\xc8\xf3\x16\xa4\xd5\xac\xce\xf3\xa4\x8e\x0b\x40\xbd\xba\xb7\xc3\xca\x55\xb6\x98\x32\x7d\x60\x1b\xff\x8f\x61\x1a\x27\xaf\x5b\x27\x2c\x8a\x04\x39\xd5\x6b\x55\xa3\x74\xfa\x2f\x49\x9c\x7d\xfd\x35\x3c\xfc\x85\xfc\xfc\xb7\x3c\xab\xa7\x4f\x7f\x41\xa7\x1c\x4d\xfe\xe7\xbf\x3f\x4d\xff\x23\xdf\xe7\x75\x3e\x7d\xfa\xef\x28\xf9\x86\xea\xf8\x10\x4e\xfe\x8c\x2e\xe8\x69\xfa\xc7\x32\x0e\x93\xe9\xd3\x9f\xf3\x3a\x9f\xfc\x25\xcc\xaa\xa7\xe9\xd3\x2f\xf1\x1e\xd1\x05\x1f\x56\x52\x85\x59\xe5\x54\xa8\x8c\x8f\xd3\xa7\x3f\x62\x92\x93\x3f\x91\xac\x05\xff\x9a\xe6\x7f\x8d\x9f\x3a\x2a\x7a\xc1\x5f\x5e\xd3\x7d\x9e\x3c\x31\xfc\x62\x2b\xb6\x78\xc2\xd2\xee\x94\x69\x98\x48\x4b\x5a\x0b\x57\xb3\x9d\xe2\x96\x63\x92\xd7\x48\xf8\x4d\xdf\x43\xe0\x66\x61\x71\xfd\xab\x2b\x50\x42\x97\x04\xd5\xd8\x8d\xc0\xaf\x28\x6c\xad\x18\x43\x24\x57\x31\x49\x53\xdc\x96\x48\xe7\x0f\x3a\x20\xa5\x21\xcd\x5d\x41\x1a\x52\x2b\xae\x2d\x14\x81\x69\x90\x85\x97\x39\x53\x12\xe5\x2d\xbe\x69\x2b\x26\xb3\xb0\x2c\xf3\x17\x40\x89\x64\xbd\xa1\xba\x37\x5b\x97\xdd\x1d\xbd\xb3\x05\x5b\xd0\x11\x11\xb5\xf3\x51\x47\x28\xde\xdb\x2b\xae\x56\x02\x67\x2c\xa9\x38\x89\x55\x7f\x9b\xed\x2b\x87\xd1\x70\xf0\x20\xfc\xd6\x38\x45\x12\x1e\x50\x8a\xb2\xfa\xff\xfc\x54\xe7\xc5\x97\xa9\x08\x52\x63\xcf\x89\xbf\x2c\x16\xf4\x54\x4d\x3f\x0a\xc6\xbd\x8a\x89\x8f\x4e\x97\x61\x71\x28\x26\x3e\x0e\x06\x8c\x5d\xae\x2a\xe2\xd5\x49\x5f\xff\x29\xd7\x8c\xf7\x9d\x7e\xe8\x89\xf8\x70\x56\x3e\xc8\x2b\x4f\x1e\x16\x52\xd4\xad\x81\x4e\x98\xf0\x06\xa0\x81\x86\xa6\x64\x07\xc0\xc8\xe0\x30\x97\x54\x60\xbe\xd5\x90\xf5\x48\x22\xe0\xa8\x89\xc4\xda\x71\xeb\x12\xcb\x1a\x46\x4e\x19\x3f\xea\x05\x0c\x1e\x41\x2a\x70\x79\x08\x59\x7e\xc2\x71\xca\xc5\x10\x41\x83\x48\xab\xf8\x28\xb2\xbd\x31\x23\x90\x81\x83\x25\x21\x6d\x47\x4b\x3d\xb3\xc1\xb7\x99\x08\x43\xa5\x38\x42\x83\x47\x0a\x4b\x5f\x1e\x27\x5c\x32\x52\xd3\x08\x12\x68\x8c\x70\x05\x1f\x21\x2e\xf2\x1b\x15\x4d\xa4\x01\x0e\x9d\x40\xab\x1d\x38\xf9\xa8\xb9\xa8\x65\xe0\xe0\x11\xf7\x51\x1c\x3a\x8e\x3b\xce\x32\x54\x0a\x2f\x71\xf2\x7e\xdf\x81\xf9\x9b\xac\xe7\xd6\xc0\x88\xce\x74\x34\x2f\x2f\xc8\x17\x11\xd3\x49\x71\x2d\x94\x5c\xea\xce\x42\xcb\x2f\xf6\x35\xff\xcb\x67\xf8\x7f\xd8\x67\xf8\x2e\xab\x1d\xad\x52\x8e\x73\x3b\x3c\x71\xaa\x0b\xb9\x1b\xb0\x75\x81\xd0\x6e\xb7\xe1\x91\xac\x87\xaa\xc5\x46\xdf\x44\xa6\x7a\x87\xa7\xc2\x28\xda\x3c\x15\x0e\x82\x3d\x15\xe5\x1b\x59\xc0\xcd\x98\x1d\xcd\xcf\x82\xa5\x14\xb0\xfd\x2c\x7b\x2b\x24\x14\x72\x66\xd2\xb7\x9e\xa1\xa8\x25\x03\xa9\x93\xe8\x79\xb1\xcc\x3a\x73\x06\x79\x30\x92\x9e\x04\xa3\xb8\x62\x72\x35\x30\x45\x6a\xaf\xdd\xc2\xcf\x28\xae\xe8\x49\x30\x2b\x2b\x82\x5f\xc5\x81\xa8\x5f\x25\x6e\x15\x1d\x22\x44\x8a\x08\x12\x23\xa9\xf9\x59\xf4\xac\x74\x31\xee\x84\xfe\x48\x47\xbd\xf9\x7a\xc4\xbc\xf3\x4c\x06\xf2\x00\xca\x5b\xe4\xc5\xfe\x46\x14\x46\x56\x19\x5f\xd1\xef\x1a\x27\x77\x85\x3f\x5d\xf2\x32\x7b\x54\xf6\x34\xbf\xbb\x4d\xf2\x16\xfe\x06\x68\x80\xe8\x17\x72\x28\xe6\x17\x0a\x7b\x9c\x87\xa8\x00\xc3\x04\xe9\x00\xad\xfa\x59\x70\x0c\x47\x4f\x65\x19\x3b\x28\x5d\x89\x8a\x2d\x1e\x71\x27\xda\xf8\x81\xce\xe2\x38\xf1\xaa\x1c\xea\xf2\x55\x18\xa4\x02\x66\x2b\x7e\xb7\x71\x38\x5c\xc0\x13\xfe\xea\xe0\x57\x92\x98\x47\xd0\x04\x6a\xf7\xbb\x02\xf7\xa3\xf9\x55\x27\x5f\xba\xc1\xbc\x42\xf5\x95\xa4\xaf\x6f\x1f\x57\xf8\xbf\x9e\x0e\x76\xfe\x3a\x87\x21\xfe\xba\x74\x83\xc2\x10\xfd\x25\x78\x20\xed\xc5\x15\x3f\x4b\x2e\xfb\x7b\x59\x30\x91\x05\x50\x40\x02\x2b\x3d\x81\x63\xc0\x5c\x7a\x5d\x81\x04\x97\x7e\x9c\x82\xcb\xdc\xe9\xea\x2d\x31\x47\x95\xbb\x6c\xaf\x19\xba\x81\x3b\xaa\xdc\xb2\x2e\x5e\x6d\x39\xa4\xdb\x77\xb7\xb0\x27\xcc\x70\xdc\x9c\x28\x96\x59\xf1\xd0\x1e\xff\xf7\x2e\x1f\x56\x94\xb9\x05\xe5\x0e\xed\xa6\xa3\xb8\x83\x05\xd8\xb0\x43\xcf\xeb\x93\x04\xfb\xf9\xa5\x42\x89\xfe\xe1\xa4\xab\x9b\x49\x5f\x04\xc9\x67\xd9\x3a\xbf\x1c\xce\x7c\xd3\x5f\x11\x66\xce\xeb\x4e\x2f\xea\x30\xb0\x98\xcf\xb4\xed\x04\xda\xbb\xa2\x36\xe6\x7a\xa1\x78\xa7\x09\x0a\xcb\xed\x3e\xaf\xcf\xd2\x77\xe6\xae\xa9\x3d\xd5\x00\x89\x39\x84\xac\xee\x02\x3b\xca\xc5\x2c\xb8\x88\xaf\x99\x63\xa5\x38\x86\x07\xe4\x90\x9b\x76\xe3\x24\xae\x5f\xf9\x86\x1b\x4b\x95\x7d\x6f\xcc\x52\x4a\x47\x6b\xd8\xfc\x72\x03\xd0\xb4\x97\xd6\xe0\x5d\x2e\xf2\xa0\xea\x5b\x5b\xa4\x7a\x27\x43\x4d\x3d\x55\xca\x8a\x12\x7d\x53\xca\xf8\xbe\x4e\x49\xac\x6f\xac\x54\x69\x4e\x64\x31\x05\xe8\xd0\xdd\x8f\x72\x39\x96\xe7\xf3\xd5\xb2\x07\xe8\x7f\x91\x8f\x2a\xe0\x0e\x20\x56\x65\x60\x03\x63\x86\x7a\x06\x71\x41\x58\xee\x61\xc3\xb1\xf0\xe1\x30\x46\x5a\xac\x74\x93\x91\x2c\x8a\x6e\x4f\x62\x27\x14\xa7\x28\xf3\x02\x95\xf5\xeb\x96\xd5\xee\x06\x6e\x30\xb2\x51\x22\x83\x6d\x1f\x0d\xa8\x15\x1e\x9c\x1e\x51\x02\xcd\xd4\xc4\x13\x9e\xb8\xf9\x51\x69\x38\x44\x4e\x16\x48\x1a\xb8\x70\x42\xee\x0e\x1a\x50\x3e\x8e\x13\xb7\xc2\x33\x68\xfc\xac\x79\x20\xa7\x96\xb9\x87\xad\x60\x99\x27\xea\xf4\xe3\xc5\x58\x14\x46\x67\xac\x7d\x09\x76\x43\xfe\xb8\x0d\x4b\x63\x36\xe7\x30\x33\x1c\x7c\xdc\x75\x1b\x95\x07\x2e\x05\x6e\xdd\x36\x9e\x11\x04\x39\x0b\x20\x49\xb6\x49\xc0\xc7\x0b\x73\xc8\x30\x0f\x94\x52\xbb\xad\x1b\xac\x24\x1b\xb9\x0d\x14\x8c\x2d\x49\xa5\x96\x59\x15\x5c\x95\xeb\xf2\xa5\x8a\x1f\xc4\xe0\x0e\x09\xb7\x64\xe9\x9c\x72\x67\xd2\x50\x4d\x6e\xb8\x35\xb0\x4a\x6f\xbf\xb5\xdc\xeb\xe3\x0b\x1b\x02\xc8\xb3\x20\xef\xc0\xfd\xf8\x99\x7c\x1d\x27\xff\x64\xb9\x53\xa2\x02\x85\xf5\x9b\x8d\xd4\x3b\x5c\xb4\x7b\x8c\x93\xe4\xa7\x4f\x1f\xfd\xf9\xf1\x78\x6c\xaf\xdd\x5d\x77\xb7\xee\xae\x95\x4b\x77\xd7\x93\xb5\x78\xe5\x6e\xf4\xd3\xa7\x5f\x83\x99\x1f\x4c\xdc\xc4\x59\x4c\xe8\x7f\xde\x2c\x70\xbc\x59\xf0\xcb\x02\x97\x2f\x12\x7f\x16\x38\xfe\x2c\xf8\x85\x82\xfd\x0e\xdc\x92\x6b\x1e\xf8\xbf\xd3\x1e\xfb\xb3\x15\xe9\xb1\x37\x0b\x70\x6f\x7f\x99\xe3\xdf\x8b\x04\x77\x73\x82\xbb\x4a\xea\xd7\xc9\xc2\x21\xff\x59\xbb\x1c\x67\x51\x7c\x08\xeb\xbc\xac\x00\xf3\x66\xba\x79\xb1\xb5\x73\xc1\x08\x43\x37\xc0\x7e\xc1\xc9\xc2\xf8\x8d\x7c\x1f\x95\x0b\xf8\x3e\xaa\xb7\xe5\x80\xdd\x9a\x24\xf1\x95\x1c\x53\x88\x7f\xc7\x06\x91\x51\x24\x8b\xcf\xed\x0e\x27\x57\xda\xe1\xd4\xfe\xe2\xdb\x33\xba\x49\x34\xef\x6e\x05\x2c\xd5\x02\xc2\x15\xfe\x4d\xec\x05\x1e\xa0\xac\x26\x1b\x74\x8a\x86\x5f\x72\xc2\xe2\x81\x9b\xd7\xc9\xe9\x5e\x25\xd7\x96\x59\x98\x07\x56\x30\x50\x8f\x5d\x5f\xde\x6a\xd6\xe5\xe1\xb6\xb9\xb8\x1d\x20\xf7\x53\x20\xef\xe4\x10\x16\x24\xe3\x9b\x49\x25\xb1\xf0\x79\x6a\x69\x2c\x9e\x56\x23\xba\x0f\x51\xad\x32\xe1\x31\xf3\x85\x2f\x65\x8e\xd8\xd0\xf6\x76\x84\x92\x7d\x56\x05\x09\xaa\x1c\x3a\xda\xd7\x3a\x07\x5c\xd4\x32\xaf\xc3\x1a\xfd\x30\x5f\xba\x11\x3a\x89\xfe\xa9\x5c\x21\x25\xfa\x7c\x28\xde\x99\x82\xcd\xf6\x86\x10\x16\x4f\xc8\xb3\x72\xf5\x88\x33\xf3\xfc\xa0\x4b\x6a\x4d\x2f\x3d\xa1\x7a\x75\xb8\x94\x58\xa7\xc8\x08\x42\x2b\xa1\xe6\xb4\xd7\x81\x10\x13\x76\xe9\x0f\x67\xab\x40\xcf\xc3\x28\xf7\x64\x37\x0a\x5a\x1d\x07\xa7\x4a\xaf\xfa\xb7\x20\x71\xbb\x27\x5b\x2a\xf1\x51\x6a\x93\xfd\xa9\xcc\x5f\xae\xee\x47\xe3\x89\x01\x57\x3f\x2e\xe0\x3e\xbf\x05\xee\xc7\x4e\xd5\x07\x06\x15\x90\x86\x7c\x47\xea\x33\x89\xe6\x23\xb4\x48\xb5\x7b\xa0\x0e\x75\x4a\xd2\xc5\x13\x23\xd5\x05\x33\xbc\x1b\x01\x2b\x77\xd5\xac\x28\x83\x2d\xa3\xac\x79\x53\x79\x24\xb5\xce\x38\xd1\x85\xf9\x96\xde\x2c\x10\x32\x93\xca\xe5\x6f\x6f\x33\x1a\x1f\xf0\xfb\x80\xae\x86\x7b\x82\xfe\x29\x4e\x8b\xbc\xac\xc3\xac\xe6\x2d\xea\xbc\x50\x81\xeb\xbc\xd0\xe1\xd2\x38\x8a\x12\x0d\x2f\x2d\xd5\xa1\xd9\x47\x0b\x95\x0b\x52\x0a\xf0\x80\xed\x2b\xdc\x44\xa8\x32\xb4\x83\x3a\xc0\xca\xc5\x16\xfb\x53\x9b\x9a\xc4\x94\x62\x51\x00\x0f\x05\xf8\xee\x8e\x85\x93\x7c\x19\xcf\x94\x1d\x00\xd5\x40\xf5\x72\x1a\x39\x98\x6e\xec\x51\xf8\xec\xf2\x7f\x98\x6e\xd3\x51\x39\x05\x2e\xd5\x39\xa9\x37\xea\x08\x5c\xa9\xe0\x50\x8d\x89\x63\x7a\xf5\x8e\xca\x31\x4b\xb3\x61\xba\x10\x47\xe3\x57\xbd\x17\xe7\x24\x5f\x8a\x23\x72\x24\x81\xea\xe5\x26\x3e\xe9\xcd\x39\x0a\x9f\x24\x97\x85\xe9\x56\x1b\x95\x49\xf9\x72\x9b\x93\x70\xb3\x8d\xc0\x86\x00\xa4\x14\x1a\x19\x23\x17\xdf\x28\x8c\xf1\x6c\x11\xa6\x6b\x69\x54\xde\xb4\xdb\x69\x4e\xf2\xd5\x34\x02\x33\x32\xa8\x5e\x6e\xe2\x93\x5e\x5e\xa3\xf0\xc9\x52\x32\x98\x2e\x96\x51\xd9\x54\xef\x97\x39\x49\x97\xcb\x08\xcc\x48\x80\x5a\xb1\x89\x45\x7a\xff\x8c\xc2\x22\x4d\x7b\x60\xca\xbd\xab\x72\xa8\xdc\x10\x73\x12\xaf\x87\x11\x18\x11\xc1\xd4\x52\xe3\x00\x92\xcb\x63\xb4\x01\x2c\xbf\x5e\x4d\x57\xbb\xe8\xc3\x27\xde\xf0\x72\x12\xae\x77\x91\xc6\xa8\x05\x52\x0a\x8d\x1a\x48\x6e\x7f\x51\x35\xf0\x1c\xd7\x08\xd4\xbf\xa3\x02\x29\x78\x6f\x57\xdb\x59\x77\xa9\x19\x75\x37\x4d\x17\x83\xea\xa0\xca\x55\xd1\x83\x9a\xd0\x95\x3c\xf1\xc7\xa0\x66\xd0\xc5\xd0\x83\x1a\x92\x2f\x9b\xe2\x75\xe7\x43\x1a\xb9\x7c\x10\x5c\xb8\xd3\x2d\x00\x4d\x67\x66\xea\x66\x07\xc6\x22\x71\x63\xc7\x3a\x48\x1e\xab\x1b\xba\xd2\x01\xd2\x20\x1b\x00\x6b\xdf\xa0\x40\x2e\x62\x00\x5c\x78\x91\x49\x0d\xb4\x97\x58\xdb\x80\xbf\x47\x24\x70\xed\x1d\xc2\xc1\xa9\x39\x97\x53\x53\xa8\xa6\x9c\xc3\xb6\x16\x56\xb9\xda\x43\xb1\xae\x1c\x9c\x1b\x3a\xf9\x82\x17\xd5\xc8\xb5\xc3\x27\x6a\x9e\xc9\xde\x74\xa8\xcb\xaf\x0a\xac\x36\xfd\x5b\xae\xe9\xac\x54\x78\x96\xc6\x9a\xcc\x3e\x14\x61\xcf\x54\xdd\xa8\x59\xa2\x14\x80\xbc\x42\xfb\x39\x21\x8c\x96\xdb\xda\xd5\x46\x3b\x7b\xbe\x3f\x08\xbb\x34\x5b\x7b\xdb\xf5\xdf\x67\x0b\xd1\xe8\xbf\x4b\xbf\x87\x8e\xad\xcf\x1d\x19\xd1\x10\x0c\x1d\xa9\x71\x04\x4e\x57\x60\xbb\x23\x04\x79\x88\xcb\x43\x82\xae\x5a\xc0\x04\xc1\x92\x8b\x2e\x55\x48\x03\x5e\x57\xcd\x3a\x28\x02\x91\x4f\xc6\xc7\xb8\x19\xf5\x41\x39\x72\x70\x28\x29\x7d\x6c\x17\x71\x46\x0e\x8d\x26\x95\xe0\x12\x02\xa1\x01\x27\x18\x85\xca\xe0\x32\x1c\x00\x50\x4b\x47\xf4\xc9\x2f\x00\xc0\x11\x63\xde\xb6\x04\x02\x3c\xa0\x24\x51\x20\x71\x91\x0c\x7a\x4c\x50\x03\x9d\x8b\x14\x74\x46\x5c\x36\x05\x47\x40\xc3\x21\x94\xc3\xa8\x04\x00\x01\xa3\xf9\x18\x20\x36\x30\x7d\x12\xab\xd2\x21\x42\x6b\xa1\x06\xcb\xad\x4a\xfb\x45\x57\xa5\xfd\xd2\xe3\x30\x43\x04\xd8\xc2\x0e\x92\x61\x95\xde\x27\xc6\x6e\x4c\x1e\x25\x49\x4b\x96\xec\xc8\x49\x7b\x27\x5f\x3a\x68\xfe\xa5\xa3\xa7\x60\x3a\x60\x16\xa6\x03\x26\x62\x3a\x62\x2e\xa6\xa3\xa6\x63\x7a\xe7\x8c\x4c\xa3\xef\x20\x4a\x7e\xfe\x13\xbf\x1a\xfa\x44\x99\x9c\x86\x88\xb2\x85\x1a\x2c\xca\xe4\xd4\x2f\xca\xe4\xd4\x2f\x4a\x0e\x33\x44\x94\x2d\xec\x20\x51\x26\xa7\xfb\x44\xd9\x8d\xc9\x3b\x8a\xb2\x3d\x8c\x1b\x39\x4d\xd2\x27\xcb\x26\x19\x22\xcb\x16\x6a\xb0\x2c\x9b\xa4\x5f\x96\x4d\xd2\x2f\x4b\x0e\x33\x44\x96\x2d\xec\x20\x59\x36\xc9\x7d\xb2\xec\xc6\xe4\xd1\xb2\x2c\xca\x38\xab\xb1\xf8\xc8\x43\x9f\x04\x29\xd0\x00\x21\x8a\x80\x83\xe5\x48\x1b\xf5\x8a\x92\x82\xf5\x4a\x53\x00\x1b\x22\x50\x11\x7c\x90\x4c\x69\x83\xbb\xc4\x2a\x8d\xd2\xc3\x24\x3b\x43\xe9\x1e\x87\x28\xa8\x2a\xf2\xac\x8a\xbf\xa1\xde\xbb\x95\xc4\x64\x2f\xed\x06\x1b\x6d\xff\xa5\x8a\xd6\x90\x3f\x48\x74\x93\xd5\x26\x13\xad\x84\x6c\x0a\x9a\xea\x80\xa4\x00\x28\x8f\xc9\x67\x23\xa0\x22\xdf\xff\x15\x1d\x6a\xa0\xe2\x5b\x1c\xa1\xbc\x7f\x8f\x93\x74\x52\x57\x4b\xa4\xd6\x66\x3e\xd4\x3b\xe0\x7b\xfb\xd7\x4d\xb7\xb1\x5d\xf8\x3a\xbb\xf0\x67\xeb\x60\xe5\x2d\xe6\x1f\x81\x66\xde\xd2\xd4\x2c\x58\xce\xfc\x00\x6a\xb2\xd8\xbf\xce\xc1\x16\x2b\x10\xdc\xdb\xbf\x7a\x20\x38\x4d\x72\x44\x36\x2f\x90\xcf\x36\x60\xfe\x7e\x41\xdf\x6c\x95\x0c\x0f\xcd\x1a\x64\xce\xd0\x64\xc6\xa6\xd6\x77\x8c\x39\x25\xfa\x86\xca\x0a\x19\x18\xe4\xd5\x56\x46\x75\x20\x89\x61\x1b\x09\x19\xa2\xaf\x03\x46\x42\x2f\x65\x58\x5c\xf5\xbc\x30\x2a\x3e\xa0\x82\x21\xa0\x57\x30\x2a\x28\x68\x21\x88\x44\xad\x12\xf8\xd0\xbb\xdb\x92\x35\xf5\xd3\x02\xc0\x10\x1f\x71\x20\xae\x25\xd5\x51\xf0\x00\xe5\xac\x39\xf9\x30\xe9\x0a\x59\x42\xc9\x44\xfd\x86\xc4\x20\x7d\xd7\x42\xca\xa1\x7b\x87\xc0\x03\x10\x78\x20\x02\x4f\x43\x40\x33\xbb\x89\x3c\x74\xb9\xdf\x54\x14\x3c\x0b\x9c\x09\x89\x07\x20\xf1\x0c\x48\x24\x4e\x94\x9d\x43\x34\xe9\xd3\x55\xde\x64\x44\xca\x04\x64\x60\x42\x20\x05\x48\xc7\x8c\xb2\xe8\xaa\x25\x17\xea\xc3\x2a\x81\xe8\x38\xe9\xc6\x92\x2b\xb4\x27\xca\x82\x59\x05\xd0\xf1\xb2\x44\x56\x57\x30\xf9\x95\x05\xb3\x94\x06\xcb\x46\x20\x24\x4b\x44\x0a\xfe\x28\xae\xea\x32\xde\x5f\x6a\xd4\x4b\x82\xb6\xd7\x3f\xee\x92\xad\xae\xaa\x10\x85\x23\xd1\x02\x62\x38\xdf\x97\x09\xa5\x24\x3d\x8a\x50\x16\x9f\x86\x0e\x99\xf9\x53\xc5\x26\xee\x12\x32\xa0\xd4\x65\x26\x22\x6c\xbf\xe0\x2b\x28\xf5\x2f\xf8\x12\x52\xf3\x07\x7e\x3e\x8e\x25\xaa\x0f\x67\x7d\x24\x49\xb1\x01\xa9\x56\xcb\x71\x1a\xa6\x18\xf1\xa5\xc0\x79\x26\x35\xb3\xca\x08\x9c\x63\x1d\x62\x48\x52\xb6\x69\x26\x23\x55\xa5\xd5\xe1\x35\x48\xcc\x3c\xcf\x64\xc4\xda\x2c\xeb\x30\xeb\x53\x4d\x46\x6d\x9c\x68\x32\x05\x75\x9a\x75\x04\xc0\xb9\x06\xd1\x30\xcd\xb4\x4e\x9a\x8a\x8e\x88\xf2\x84\xf5\xa4\x25\x60\xd2\x94\x0a\x25\x47\x72\x7a\xad\xc3\x4a\x53\x90\x13\xf5\x53\x5e\x73\x5d\x93\xad\xfa\xa2\x13\xb0\x29\x4a\x27\xa0\x83\xb5\x8e\xe0\xb3\xa9\x1c\xc1\x2a\xe9\x9b\x80\x13\x52\xb8\x0e\x23\xa8\x6d\x04\x9f\xaa\x6a\x02\x4a\x83\xae\x11\xac\x26\x45\x23\x38\x75\xdb\x20\x60\x35\x1a\x08\x82\xd7\x6c\x1f\xd8\x98\x2a\xa2\x97\x46\x15\x96\x3d\xc1\xab\x0b\xde\xbc\x84\x4c\x65\x90\x3e\xcc\x63\xae\xd2\xc7\x3b\xcd\x94\xbd\x77\xf5\x9b\x5b\xb6\xbf\x83\xeb\x5c\xa5\xf7\x7b\xcf\x64\xdd\xff\x21\x0e\x34\xe3\xe6\x5d\x7c\xe8\x2a\xbd\xd7\x8d\xae\xd2\xfb\x3d\x69\x8e\xe3\x2e\x67\x3a\x7d\x90\x3f\x9d\x3e\xde\xa5\x4e\xdf\xd1\xab\xae\xd2\x77\x71\xac\xf1\x74\x7b\x27\xdf\xba\x4a\xdf\xdf\xbd\xae\xd2\xf7\xf6\xb0\xd3\xf7\x70\xb2\x55\x61\xde\xeb\x67\x03\x52\xbc\xdb\xd5\xc6\xe2\x7b\x27\x6f\x3b\x7d\x2f\x87\x3b\x7d\x4f\x9f\x5b\x15\xda\xa3\xdc\x6e\x40\x78\x0f\xf3\xbc\xa1\x39\xf8\x70\xe7\x1b\x98\x84\xef\xe1\x7f\xa7\xef\xe7\x82\xe3\x1e\x3c\xd6\x0b\x4f\xdf\xc9\x11\x57\x95\xf0\x01\xbe\x38\xa0\x7f\x8f\x70\xc7\x41\xfb\xf1\x30\x8f\x3c\x7d\xa4\x53\x6e\xd9\x0d\x40\x30\xa7\xd1\xc3\xbc\xf2\x34\x7a\xbc\x57\x4e\xd9\x7b\x57\xaf\xbc\x65\xfb\x3b\x78\xe5\x69\x74\xbf\x57\x4e\xb6\x70\x3c\xc4\x2b\x67\xdc\xbc\x8b\x57\x9e\x46\xf7\x7a\xe5\x69\x74\xbf\x57\xce\x71\xdc\xe3\x95\xa7\xd1\x63\xbc\xf2\x0e\xcf\xc3\xbc\x72\x8c\xf2\xdd\xbc\xf2\x34\x7a\x17\xaf\x1c\x4f\xb7\x77\xf2\xca\xd3\xe8\xfd\xbd\xf2\x34\x7a\x67\xaf\x5c\x97\xe9\x23\xbc\x72\x55\x98\xf7\x7a\xe5\x80\x14\xef\xf6\xca\xb1\xf8\xde\xc7\x2b\x27\x63\xfa\x1e\x5e\xb9\x2e\xac\x47\x7a\xe5\xaa\xd0\x1e\xe5\x95\x03\xc2\x7b\x98\x57\x0e\xcd\xc1\x87\x7b\xe5\xc0\x24\x7c\x07\xaf\x1c\xd2\x9a\x47\x79\xe5\xb8\x07\x0f\xf5\xca\x75\x4d\x7c\x90\x57\xae\x2a\xe1\x03\xbc\x72\x40\xff\x1e\xe1\x95\x83\xf6\xe3\x51\x5e\x39\xa4\x0c\x0f\xf5\xca\xf9\xc6\x4e\xaa\x66\xa7\x87\x79\xe5\xc9\xe9\xf1\x5e\x39\x65\xef\x5d\xbd\xf2\x96\xed\xef\xe0\x95\x27\xa7\xfb\xbd\x72\xb2\x1b\xf7\x21\x5e\x39\xe3\xe6\x5d\xbc\xf2\xe4\x74\xaf\x57\x9e\x9c\xee\xf7\xca\x39\x8e\x7b\xbc\xf2\xe4\xf4\x18\xaf\xbc\xc3\xf3\x30\xaf\x1c\xa3\x7c\x37\xaf\x3c\x39\xbd\x8b\x57\x9e\x9c\xde\xcd\x2b\x4f\x4e\xef\xef\x95\x27\xa7\x77\xf6\xca\x75\x99\x3e\xc2\x2b\x57\x85\x79\xaf\x57\x0e\x48\xf1\x6e\xaf\x1c\x8b\xef\x7d\xbc\x72\x32\xa6\xef\xe1\x95\xeb\xc2\x7a\xa4\x57\xae\x0a\xed\x51\x5e\x39\x20\xbc\x87\x79\xe5\xd0\x1c\x7c\xb8\x57\x0e\x4c\xc2\x77\xf0\xca\x21\xad\x79\x94\x57\x8e\x7b\xf0\x50\xaf\x5c\xd7\xc4\x07\x79\xe5\xaa\x12\x3e\xc0\x2b\x07\xf4\xef\x11\x5e\x39\x68\x3f\x1e\xe5\x95\x43\xca\xf0\x50\xaf\xbc\x3d\xa3\x43\x50\x37\xc9\xc3\xdc\xf2\x26\x79\xbc\x5b\x4e\xd9\x7b\x57\xb7\xbc\x65\xfb\x3b\xb8\xe5\x4d\x72\xbf\x5b\x4e\x0e\x56\x3d\xc4\x2d\x67\xdc\xbc\x8b\x5b\xde\x24\xf7\xba\xe5\x4d\x72\xbf\x5b\xce\x71\xdc\xe3\x96\x37\xc9\x63\xdc\xf2\x0e\xcf\xc3\xdc\xf2\x26\x79\x47\xb7\xbc\x49\xde\xc5\x2d\xc7\xd3\xed\x9d\xdc\xf2\x26\x79\x7f\xb7\xbc\x49\xde\xd9\x2d\xd7\x65\xfa\x08\xb7\x5c\x15\xe6\xbd\x6e\x39\x20\xc5\xbb\xdd\x72\x2c\xbe\xf7\x71\xcb\xc9\x98\xbe\x87\x5b\xae\x0b\xeb\x91\x6e\xb9\x2a\xb4\x47\xb9\xe5\x80\xf0\x1e\xe6\x96\x43\x73\xf0\xe1\x6e\x39\x30\x09\xdf\xc1\x2d\x87\xb4\xe6\x51\x6e\x39\xee\xc1\x43\xdd\x72\x5d\x13\x1f\xe4\x96\xab\x4a\xf8\x00\xb7\x1c\xd0\xbf\x47\xb8\xe5\xa0\xfd\x78\x94\x5b\x0e\x29\xc3\x1d\x6e\xf9\x8c\xdc\x2a\x42\x93\xed\x74\x17\x8c\xc8\x3e\x03\x06\xa0\x89\x85\x28\x04\x79\xd6\x41\xc8\x19\x6d\x0a\xa1\x9c\xd0\xb6\xed\x5e\xc7\x2d\xab\xb4\x9f\x81\x2a\x1d\xc2\x03\x4f\xa7\x02\xb2\x61\xdd\xaf\x83\x5b\xa7\x51\x3f\x1f\x69\x34\x84\x0f\x9e\x0b\x64\x28\x1f\xdd\x17\x0a\x22\x8d\x53\x3f\x1f\xc9\x69\x08\x1f\x3c\x91\xc5\x50\x3e\x84\x98\x0c\x37\x6f\x92\x7e\x46\x70\x64\xd4\xcf\x08\xcf\xc2\x00\x33\x32\xbb\x54\x24\xb3\x59\x82\x0e\xb5\x13\x62\x6f\x9d\xa5\x6c\x15\xca\xb7\xa1\x78\xd2\x7d\x47\x6e\x7f\x37\x57\x1b\x6b\x14\x5a\x17\x21\xf5\xb3\xd4\x46\xb6\x7d\x3a\x35\xb5\xbe\xb2\x55\x9b\xab\x64\x76\xc8\x10\x41\xec\xc8\x03\xa6\xb3\xa3\xd5\x57\xb6\x6a\x73\xd5\xdb\x8c\x1f\xaf\xa7\x43\xd3\x1e\xb6\x57\xb9\x6e\xc1\xe8\x29\xfc\xab\x72\x2a\x5f\x04\xe5\x47\xdc\xb1\x75\xaf\xe3\x43\x77\xe4\x9d\xfe\x06\x41\x79\x42\x00\x3d\x45\x00\x08\xce\x0f\xcf\xeb\xc7\xe9\x41\xf0\x63\xdc\xa0\xa8\x83\x25\x3f\x0d\x1c\xc7\x87\xaf\xaf\x1d\x24\x17\x0d\x2d\x17\x46\x54\xe8\x93\x5c\xf3\x36\x23\xd8\xe9\x15\xe7\x12\x41\x76\xd0\x9f\xe7\xfc\xd7\x6e\xf6\x9d\xbb\xbc\x2d\xbf\xc4\x5a\x6e\xde\x7b\x59\x00\xc6\xf0\xcf\xd5\xa5\xc0\x9c\x54\x93\x1f\x7e\x30\xf4\xe2\x79\x92\x97\x93\x1f\x94\x0e\x3c\x3f\x5f\x67\xf4\x49\xe6\x5c\x6e\xaa\x76\x9b\x75\xa9\xe3\xc0\x77\xdf\xde\x66\x55\xe9\xe4\x59\xf2\x0a\xa4\x3a\x60\x36\xa7\xcb\xf7\xef\x09\x17\x2c\xf3\xfb\x08\xb6\x0e\x2e\x55\xf4\x6b\x47\x32\xf6\x97\xe8\x50\xb3\xcb\xdd\xdc\x67\xe5\xae\xdd\x97\x32\x2c\x84\xf4\x08\x8c\x09\x87\xe4\xf4\x0c\xf7\x09\xda\xd2\x74\xf8\x53\xa0\x86\x3c\xa9\x6a\xca\x98\x25\x17\x15\x30\x6e\xc9\x73\xcb\x18\xb9\x49\x2b\x41\x94\x33\x7a\x9f\x81\x76\xf9\xef\xdb\x8c\x5e\x2c\x4c\xf3\x0a\x36\xfc\x9a\x61\x77\x32\xf3\xd8\x75\xd2\xf4\x8f\x78\x6b\x9d\xbb\x0a\x9e\x45\x7d\xa2\x6d\x94\xe6\xa4\x95\xa7\x36\xf5\xa0\x96\x34\xef\x9d\xd0\x98\x34\x9b\x6b\x6d\x41\xb2\xd4\x42\x09\xcd\x55\xf3\xf1\xe2\xf8\x01\x4b\xe6\xed\x07\x1f\xe5\x9a\xc0\x65\x35\x4a\xea\xbc\x17\x67\xc5\xdb\xac\xd4\x36\x9e\xcb\x1b\x79\xae\xda\x8a\x58\xa8\x4e\x2c\x62\xe5\x19\xb3\xc1\x33\xa4\xcb\x38\xcf\x98\x0f\x56\xa5\x30\x72\xc6\x8c\xb0\xaa\x95\xda\x0a\x73\x22\xa4\xde\x90\x2b\x09\x2b\x82\x5a\x88\xb5\x29\xed\x45\x77\x31\xb7\xda\x3c\x3d\xb7\x00\x06\x02\xf8\x05\xfd\x8d\xa1\xe9\xde\xd5\xae\xfb\xed\x45\x83\x3a\xb7\x50\x1d\xae\x6f\x92\xf7\xff\x4d\x19\x55\x19\xc9\x37\xb5\xa7\x72\xe3\xd4\x71\xaf\xfc\x22\x67\xa9\xbc\x76\xdc\xe9\x2c\x7d\x6d\xab\xf5\x4c\xab\x69\x49\x40\x9a\x0e\x04\xc8\xb2\x9a\xee\x55\x3c\x50\x82\xd5\x34\x51\x51\xe9\xd9\x55\x53\xc7\xe3\x9c\xea\x39\x20\xd3\xda\xf1\x08\x19\x4f\xba\x03\x56\x87\x2b\x09\x5c\xd3\xc1\xb1\xdb\x36\x75\xc8\xbd\x8a\x91\x5f\x10\xad\x83\x26\x2a\x52\x7a\x09\xb1\x0e\xe8\xf8\x6d\x17\x80\x1e\xf8\x84\x9e\xaf\xdd\x62\xab\x74\xc0\x27\xb4\x7c\xe0\xba\x50\x85\x7f\x05\x9f\x78\xc1\xb5\xc2\xbe\x82\xb2\xbb\x43\x59\xe6\x7e\xce\xb9\xf7\x74\xe6\xe7\x84\xd8\x5c\x64\xde\xd3\x79\x9f\x13\x42\x73\x99\x77\x4f\x67\x5d\xc1\xc6\xf3\x0d\xeb\x9c\x2b\x08\x69\x86\x61\x8d\xf1\x45\xcb\x38\x34\xee\x0b\x42\x6c\x21\xb1\x0e\x0d\xfc\x82\xd0\x5a\x28\xcc\x43\x23\xaf\x60\xe4\xec\x43\x43\xaf\x20\xa5\x1d\x00\xc6\x3e\xe0\x5d\x98\xeb\x1d\x08\x08\xb9\x40\xec\xc0\x5c\x67\x3f\x20\x94\x02\x99\xfd\xb9\xce\xbc\x82\x8d\x31\x3f\xd7\x59\x57\x10\xd2\x0b\x7c\x14\xb0\xc2\x71\xdb\xfb\x40\xa5\xe9\x5c\x10\x03\x53\xbc\x76\xf5\xba\x85\x29\x88\x85\x29\x1a\x01\x06\x30\x31\xc5\x5e\xc3\x04\xd9\x98\x22\xd1\x90\xe9\x46\xa6\x70\xbc\xee\xfa\x52\x6d\xfe\x16\xc4\xca\x14\xaf\x1d\x90\xc1\xcc\x14\xc4\xcc\x14\x8d\x00\x68\xb2\x33\xc5\x5e\xc3\x69\x34\x34\x45\xa2\xa1\x35\x58\x9a\xc2\xf1\xe5\x6b\x58\x95\x6e\xf8\x84\xa4\x2f\x77\x03\xe8\x85\x4f\xc8\xf9\x6a\x2f\x80\x4e\xa8\x18\x4d\xd6\xa6\x48\x34\xa4\xb0\xb9\x29\x9c\x79\xdb\x05\x4f\xef\xc1\x9c\xd0\x9b\xcb\x09\xa7\xf4\x0e\xcc\x09\xad\xb9\xd2\x01\x4f\xe7\x5f\xc5\x67\x30\x39\x45\xa2\xa1\x04\x6d\x4e\xe1\x2c\x3a\xee\x21\x09\x2c\x08\xbd\x85\xcc\x3f\x24\x82\x05\x21\xb7\x50\x7b\x00\xc9\x40\xc5\x69\xb4\x3b\x45\xa2\xa1\x35\x18\x9e\xc2\x09\xda\x7e\xcc\xf5\x5e\x04\x84\x62\x20\xf5\x62\xae\xf7\x21\x20\xc4\x02\xa5\x0f\x73\xbd\x07\x2a\x3e\x83\xf1\x29\x12\x0d\x25\x68\x7d\x52\x27\x6b\x9d\x06\x07\xf4\x1a\x32\xfa\x92\xcf\x24\xbf\xc1\x01\x1d\x87\x8c\xbe\xe4\x33\xc5\x75\x70\x40\xdf\x41\xc3\xcb\x7a\xe2\x80\xee\x83\x86\x9a\x5d\x3b\x0e\x78\x10\x99\xdf\x75\x08\xea\x0f\x7d\xe9\x67\xbe\xdc\x1f\xa8\x3b\xf4\xa5\x9f\xf9\x6a\x77\xa0\xde\xa8\x58\xdb\xde\x40\x9d\x51\x11\x0b\x77\xa8\x2b\x7d\x69\x1d\x0a\x07\xf0\x28\x32\xea\x04\x64\x92\x4f\xe1\x00\x4e\x45\x46\x9d\x80\x4c\x71\x2b\x1c\xc0\xaf\xd0\x70\xf2\x8e\x00\xae\x85\x86\x96\xf6\x43\xf7\x2e\xb2\x45\xd7\x0d\x50\x26\xd4\x1d\xc8\x16\x72\x47\x40\xa1\x50\x77\x20\x5b\xa8\x5d\x01\xa5\xa2\xe2\x6d\x3b\x03\x8a\x45\x45\xcd\xba\x03\xc9\xa5\x75\x36\x1c\xc0\xdb\xc8\xa8\x83\x90\x49\xfe\x86\x03\x38\x1c\x19\x75\x10\x32\xc5\xe5\x70\x00\x9f\x43\xc3\xc9\xbb\x02\xb8\x1d\x1a\x5a\xda\x11\x7d\xee\x93\x20\x8e\x75\x44\x0b\xe2\xe8\x5a\x21\xa1\x2a\xc0\x91\xbe\x68\xb0\x25\x87\x6d\x24\xd8\x12\x0e\x0f\xf7\x30\x66\xd6\x23\x0d\x3c\x81\x91\x93\x4e\x29\xc0\xe6\x75\xf7\xd4\xa9\x2c\x91\x1c\xae\x23\xfc\x08\x40\x60\x3c\xc7\x00\x1b\x09\x10\x8e\xea\x40\x9c\x86\xd8\x0e\x44\x0b\x45\x78\x55\x5f\x90\x87\x01\x38\xd5\xfe\x50\x8f\x41\x37\x12\xb4\x25\xe0\x03\xb1\xdb\xc2\x3e\x90\x80\x31\xf8\xab\x7a\xe2\x3f\x5c\xcf\xc9\xf7\x46\x81\x0c\xb8\x91\x80\xcd\xb1\x20\x88\xdb\x12\x11\x82\xe8\x4d\x71\x61\x65\x0f\x0d\x71\x35\xa7\xdd\x17\x20\x32\xd8\x46\x82\x35\x86\x89\x20\x66\x73\xb0\x08\x22\x37\x84\x8c\x55\x5f\xd4\x88\x01\x38\xed\xfe\xd8\x91\x41\x37\x12\xb4\x25\x82\x04\xb1\xdb\xe2\x48\x90\x80\x31\x9a\xac\xec\x01\x25\xae\xe6\xd4\xfb\xc2\x4a\x06\xdb\x48\xb0\xc6\xe0\x12\xc4\x6c\x0e\x31\x41\xe4\x86\x40\x93\x18\x17\x53\xac\x49\x4d\x50\xf1\x2a\x41\x81\x11\x27\x83\x6c\x64\x48\x38\xee\x84\xb1\x1a\xa2\x4f\x18\x31\x14\x83\x12\x6b\x62\x0d\x43\xa9\xe1\x29\x5e\x25\x50\x73\x30\xca\xc0\x1b\x19\xdc\x12\x92\xc2\xf8\x6d\x81\x29\x4c\xc2\x18\x9e\x12\xb3\x62\x8b\x50\xa9\x01\x2a\x5e\x25\x48\x63\x9c\xca\xa0\x1b\x19\xda\x1c\xad\xc2\xd8\x2d\x31\x2b\x4c\xc0\x14\xb9\x12\xfb\x62\x09\x5e\xa9\x21\x2a\x5e\x25\x40\x53\x08\xcb\x80\x1b\x19\xd8\x18\xc8\xc2\xb8\xcd\xe1\x2c\x8c\xde\x10\xd4\x12\xe3\x62\x8d\x6b\xa9\x1d\x2a\x5e\x25\x50\x73\x74\xcb\xc0\x1b\x19\xdc\x12\xe3\xc2\xf8\x6d\x91\x2e\x4c\xc2\x18\xef\x12\x4b\x63\x09\x79\xa9\x49\x2a\x5e\x25\x40\x53\xe0\xcb\x80\x1b\x19\xd8\x18\xfe\xc2\xb8\xcd\x41\x30\x8c\xde\x10\x0a\x57\xfd\xd1\x30\x01\xe1\xe6\x79\x48\x4c\xcc\x1b\x34\x72\x03\x5b\x64\x6c\xa0\x61\x8d\x8f\x0d\x64\xcc\x51\x72\xd5\x1b\x28\x13\x88\x96\x8d\xfe\x70\x99\xc3\x37\x32\xbc\x25\x68\x36\x50\xb0\x85\xce\x06\x22\xc6\x00\xba\xea\x8b\xa1\x09\x40\xcb\x43\x6f\x24\xcd\xc1\x1b\x19\xdc\x1c\x4f\x1b\xf0\x5b\xa2\x6a\x03\x09\x53\x6c\x5d\xf5\x87\xd7\x04\xa4\xe5\x61\x40\x90\xcd\x1b\x34\x72\x03\x5b\xa8\x6d\xa0\x61\x0d\xb8\x0d\x64\xcc\x61\x77\xd5\x17\x79\x13\x80\x96\x8b\xde\xf8\x9b\x83\x37\x32\xb8\x39\x0a\x37\xe0\xb7\xc4\xe2\x06\x12\xa6\x88\xbc\xea\x0d\xca\x19\x04\x67\x62\x40\x68\xde\xb5\x68\xd4\x16\xc6\x00\xdd\x42\xc5\x1c\xa6\x5b\x08\x41\xc1\xba\x65\x77\x5a\xea\xa4\x91\x39\x5a\xc7\x75\x84\x33\x01\x08\x8c\xd6\x19\x60\x23\x01\xc2\xd1\x3a\x88\xd3\x10\xad\x83\x68\xa1\x68\x3d\x8d\x7a\xa2\x75\x0c\xc0\xa9\xf6\x47\xeb\x0c\xba\x91\xa0\x2d\xd1\x3a\x88\xdd\x16\xad\x83\x04\x8c\xd1\x7a\x1a\xd9\xa3\x75\x5c\xcf\xc9\xf7\x46\xeb\x0c\xb8\x91\x80\xcd\xd1\x3a\x88\xdb\x12\xad\x83\xe8\x4d\xd1\x7a\x1a\x59\xa3\x75\x5c\xcd\x69\xf7\x45\xeb\x0c\xb6\x91\x60\x8d\xd1\x3a\x88\xd9\x1c\xad\x83\xc8\x0d\xd1\x7a\x1a\xf5\x44\xeb\x18\x80\xd3\xee\x8f\xd6\x19\x74\x23\x41\x5b\xa2\x75\x10\xbb\x2d\x5a\x07\x09\x18\xa3\xf5\x34\xb2\x46\xeb\xb8\x9a\x53\xef\x8b\xd6\x19\x6c\x23\xc1\x1a\xa3\x75\x10\xb3\x39\x5a\x07\x91\x1b\xa2\x75\x62\x5c\x4c\xd1\x3a\x35\x41\xc5\xab\x04\x05\x46\xeb\x0c\xb2\x91\x21\xe1\x68\x1d\xc6\x6a\x88\xd6\x61\xc4\x50\xb4\x4e\xac\x89\x35\x5a\xa7\x86\xa7\x78\x95\x40\xcd\xd1\x3a\x03\x6f\x64\x70\x4b\xb4\x0e\xe3\xb7\x45\xeb\x30\x09\x63\xb4\x4e\xcc\x8a\x2d\x5a\xa7\x06\xa8\x78\x95\x20\x8d\xd1\x3a\x83\x6e\x64\x68\x73\xb4\x0e\x63\xb7\x44\xeb\x30\x01\x53\xb4\x4e\xec\x8b\x25\x5a\xa7\x86\xa8\x78\x95\x00\x4d\xd1\x3a\x03\x6e\x64\x60\x63\xb4\x0e\xe3\x36\x47\xeb\x30\x7a\x43\xb4\x4e\x8c\x8b\x35\x5a\xa7\x76\xa8\x78\x95\x40\xcd\xd1\x3a\x03\x6f\x64\x70\x4b\xb4\x0e\xe3\xb7\x45\xeb\x30\x09\x63\xb4\x4e\x2c\x8d\x25\x5a\xa7\x26\xa9\x78\x95\x00\x4d\xd1\x3a\x03\x6e\x64\x60\x63\xb4\x0e\xe3\x36\x47\xeb\x30\x7a\x43\xb4\x9e\x46\xbd\xd1\x3a\x01\xe1\xe6\x79\x48\xb4\xce\x1b\x34\x72\x03\x5b\xb4\x6e\xa0\x61\x8d\xd6\x0d\x64\xcc\xd1\x3a\x06\xb3\x47\xeb\x04\xa2\x65\xa3\x3f\x5a\xe7\xf0\x8d\x0c\x6f\x89\xd6\x0d\x14\x6c\xd1\xba\x81\x88\x31\x5a\xc7\x50\xd6\x68\x9d\x00\xb4\x3c\xf4\x46\xeb\x1c\xbc\x91\xc1\xcd\xd1\xba\x01\xbf\x25\x5a\x37\x90\x30\x45\xeb\x18\xa8\x27\x5a\x27\x20\x2d\x0f\x03\xa2\x75\xde\xa0\x91\x1b\xd8\xa2\x75\x03\x0d\x6b\xb4\x6e\x20\x63\x8e\xd6\x31\x98\x35\x5a\x27\x00\x2d\x17\xbd\xd1\x3a\x07\x6f\x64\x70\x73\xb4\x6e\xc0\x6f\x89\xd6\x0d\x24\x4c\xd1\x3a\x4f\xbc\x67\x8e\xd6\x19\x04\x67\x62\x40\xb4\xde\xb5\x68\xd4\x16\xc6\x68\xdd\x42\xc5\x1c\xad\x5b\x08\x0d\x8c\xd6\xf9\x19\xae\xd4\x49\x4e\xe6\x68\x1d\xd7\x11\xce\x04\x20\x30\x5a\x67\x80\x8d\x04\x08\x47\xeb\x20\x4e\x43\xb4\x0e\xa2\x85\xa2\xf5\xe4\xd4\x13\xad\x63\x00\x4e\xb5\x3f\x5a\x67\xd0\x8d\x04\x6d\x89\xd6\x41\xec\xb6\x68\x1d\x24\x60\x8c\xd6\x93\x93\x3d\x5a\xc7\xf5\x9c\x7c\x6f\xb4\xce\x80\x1b\x09\xd8\x1c\xad\x83\xb8\x2d\xd1\x3a\x88\xde\x14\xad\x27\x27\x6b\xb4\x8e\xab\x39\xed\xbe\x68\x9d\xc1\x36\x12\xac\x31\x5a\x07\x31\x9b\xa3\x75\x10\xb9\x21\x5a\x4f\x4e\x3d\xd1\x3a\x06\xe0\xb4\xfb\xa3\x75\x06\xdd\x48\xd0\x96\x68\x1d\xc4\x6e\x8b\xd6\x41\x02\xc6\x68\x3d\x39\x59\xa3\x75\x5c\xcd\xa9\xf7\x45\xeb\x0c\xb6\x91\x60\x8d\xd1\x3a\x88\xd9\x1c\xad\x83\xc8\x0d\xd1\x3a\x31\x2e\xa6\x68\x9d\x9a\xa0\xe2\x55\x82\x02\xa3\x75\x06\xd9\xc8\x90\x70\xb4\x0e\x63\x35\x44\xeb\x30\x62\x28\x5a\x27\xd6\xc4\x1a\xad\x53\xc3\x53\xbc\x4a\xa0\xe6\x68\x9d\x81\x37\x32\xb8\x25\x5a\x87\xf1\xdb\xa2\x75\x98\x84\x31\x5a\x27\x66\xc5\x16\xad\x53\x03\x54\xbc\x4a\x90\xc6\x68\x9d\x41\x37\x32\xb4\x39\x5a\x87\xb1\x5b\xa2\x75\x98\x80\x29\x5a\x27\xf6\xc5\x12\xad\x53\x43\x54\xbc\x4a\x80\xa6\x68\x9d\x01\x37\x32\xb0\x31\x5a\x87\x71\x9b\xa3\x75\x18\xbd\x21\x5a\x27\xc6\xc5\x1a\xad\x53\x3b\x54\xbc\x4a\xa0\xe6\x68\x9d\x81\x37\x32\xb8\x25\x5a\x87\xf1\xdb\xa2\x75\x98\x84\x31\x5a\x27\x96\xc6\x12\xad\x53\x93\x54\xbc\x4a\x80\xa6\x68\x9d\x01\x37\x32\xb0\x31\x5a\x87\x71\x9b\xa3\x75\x18\xbd\x21\x5a\x4f\x4e\xbd\xd1\x3a\x01\xe1\xe6\x79\x48\xb4\xce\x1b\x34\x72\x03\x5b\xb4\x6e\xa0\x61\x8d\xd6\x0d\x64\xcc\xd1\x3a\x06\xb3\x47\xeb\x04\xa2\x65\xa3\x3f\x5a\xe7\xf0\x8d\x0c\x6f\x89\xd6\x0d\x14\x6c\xd1\xba\x81\x88\x31\x5a\xc7\x50\xd6\x68\x9d\x00\xb4\x3c\xf4\x46\xeb\x1c\xbc\x91\xc1\xcd\xd1\xba\x01\xbf\x25\x5a\x37\x90\x30\x45\xeb\x18\xa8\x27\x5a\x27\x20\x2d\x0f\x03\xa2\x75\xde\xa0\x91\x1b\xd8\xa2\x75\x03\x0d\x6b\xb4\x6e\x20\x63\x8e\xd6\x31\x98\x35\x5a\x27\x00\x2d\x17\xbd\xd1\x3a\x07\x6f\x64\x70\x73\xb4\x6e\xc0\x6f\x89\xd6\x0d\x24\x4c\xd1\x3a\x4f\xc8\x69\x8e\xd6\x19\x04\x67\x62\x40\xb4\xde\xb5\x68\xd4\x16\xc6\x68\xdd\x42\xc5\x1c\xad\x5b\x08\x0d\x8c\xd6\xdb\x4c\x27\xa9\xd3\x24\xe6\x70\xbd\x49\x58\x68\x2d\x00\x81\xe1\x7a\xc3\x8f\x24\x8b\x80\x70\xb8\x0e\xe2\x34\x84\xeb\x20\x5a\x28\x5c\x6f\x92\x9e\x70\xbd\x49\x58\x40\x2d\x40\x9a\xc3\xf5\x86\x9f\x51\x16\xa1\x2d\xe1\x3a\x88\xdd\x16\xae\x83\x04\x8c\xe1\x7a\x93\xd8\xc3\xf5\x26\x61\x21\xb5\x00\x68\x0c\xd7\x1b\x7e\x80\x59\x04\x36\x87\xeb\x20\x6e\x4b\xb8\x0e\xa2\x37\x85\xeb\x4d\x62\x0d\xd7\x9b\x84\x05\xd5\x02\x9c\x29\x5c\x6f\xf8\xe9\x66\x11\xd6\x18\xae\x83\x98\xcd\xe1\x3a\x88\xdc\x10\xae\x37\x49\x4f\xb8\xde\x24\x2c\xa0\x16\x20\xcd\xe1\x7a\xc3\x0f\x3d\x8b\xd0\x96\x70\x1d\xc4\x6e\x0b\xd7\x41\x02\xc6\x70\xbd\x49\xac\xe1\x7a\x93\xb0\xa0\x5a\x80\x33\x85\xeb\x0d\x3f\x13\x2d\xc2\x1a\xc3\x75\x10\xb3\x39\x5c\x07\x91\x1b\xc2\x75\x62\x5c\x4c\xe1\x3a\x35\x41\xc5\xab\x04\x05\x86\xeb\x0d\x3f\x32\x2d\x41\xc2\xe1\x3a\x8c\xd5\x10\xae\xc3\x88\xa1\x70\x9d\x58\x13\x6b\xb8\x4e\x0d\x4f\xf1\x2a\x81\x9a\xc3\xf5\x86\x9f\xa1\x96\xc0\x2d\xe1\x3a\x8c\xdf\x16\xae\xc3\x24\x8c\xe1\x3a\x31\x2b\xb6\x70\x9d\x1a\xa0\xe2\x55\x82\x34\x86\xeb\x0d\x3f\x60\x2d\x41\x9b\xc3\x75\x18\xbb\x25\x5c\x87\x09\x98\xc2\x75\x62\x5f\x2c\xe1\x3a\x35\x44\xc5\xab\x04\x68\x0a\xd7\x1b\x7e\xfa\x5a\x02\x36\x86\xeb\x30\x6e\x73\xb8\x0e\xa3\x37\x84\xeb\xc4\xb8\x58\xc3\x75\x6a\x87\x8a\x57\x09\xd4\x1c\xae\x37\xfc\x50\xb6\x04\x6e\x09\xd7\x61\xfc\xb6\x70\x1d\x26\x61\x0c\xd7\x89\xa5\xb1\x84\xeb\xd4\x24\x15\xaf\x12\xa0\x29\x5c\x6f\xf8\x99\x6d\x09\xd8\x18\xae\xc3\xb8\xcd\xe1\x3a\x8c\xde\x10\xae\x37\x49\x6f\xb8\xde\x24\x3c\x94\x16\x81\x2d\xe1\x7a\xd3\x1e\xe3\x96\x1a\xd8\xc2\x75\x03\x0d\x6b\xb8\x6e\x20\x63\x0e\xd7\x31\x98\x3d\x5c\x6f\x12\x1e\x4c\x8b\xb0\xe6\x70\xbd\x69\xcf\x78\x4b\xf0\x96\x70\xdd\x40\xc1\x16\xae\x1b\x88\x18\xc3\x75\x0c\x65\x0d\xd7\x9b\x84\x87\xd3\x22\xa8\x31\x5c\x6f\xda\x03\xe0\x12\xb8\x39\x5c\x37\xe0\xb7\x84\xeb\x06\x12\xa6\x70\x1d\x03\xf5\x84\xeb\x4d\xc2\x43\x69\x11\xd8\x12\xae\x37\xed\xb9\x70\xa9\x81\x2d\x5c\x37\xd0\xb0\x86\xeb\x06\x32\xe6\x70\x1d\x83\x59\xc3\xf5\x26\xe1\xe1\xb4\x08\x6a\x0c\xd7\x9b\xf6\xd8\xb8\x04\x6e\x0e\xd7\x0d\xf8\x2d\xe1\xba\x81\x84\x29\x5c\xe7\x89\x7a\xcd\xe1\x7a\x93\x74\x81\xb4\x0c\x6d\x0a\xd7\x1b\xe1\x2c\xb9\xd2\xc2\x18\xae\x5b\xa8\x98\xc3\x75\x0b\x21\x30\x5c\x9f\xb1\x4c\xb5\x28\x72\x92\x38\xfb\xba\xdd\x86\xc7\x1a\x95\x40\x06\x41\x39\x87\xa2\x31\x15\xe2\xae\xc8\xe3\xac\x46\xa5\x83\xbe\xa1\xac\xae\x68\x7a\x3e\x9e\x20\xf9\xe9\x69\xb7\x0f\x0f\x5f\x4f\x24\x0b\xb3\x73\xc8\x93\xbc\xdc\x0a\x99\xf0\xdc\xe7\xb7\x59\x8d\x9a\xda\x49\xf3\x2c\x27\xc9\xfc\xae\xc7\x3c\xab\x9d\x63\x98\xc6\xc9\xeb\xf6\x2f\xff\xf6\x6b\x9e\xe5\xce\x7f\xa0\xd3\x25\x09\xcb\xe9\xaf\x28\x4b\xf2\xe9\xaf\x79\x16\x1e\xf2\xe9\x9f\xf2\xac\xca\x93\xb0\x9a\x3e\xfd\x12\xef\x51\x19\x62\xde\x27\x18\xfc\x69\xfa\xf4\xa7\xfc\x52\xc6\xa8\x9c\xfc\x19\xbd\x3c\x4d\x5b\xd4\xe2\xb8\x11\xa2\x2c\x51\xf5\x95\xfc\xa0\x29\x7e\xb5\xdc\xd5\x0c\x94\x5c\xc5\xa0\xe7\x1c\xd4\xe0\xd8\xa5\x0d\x7a\xba\x44\x0d\xb2\x2e\x2f\xd9\x21\xac\x91\x9a\xdd\x73\x47\x6a\xdb\x42\x94\x24\x71\x51\xc5\x15\x90\x81\x91\x21\x22\x49\x64\x85\x2e\xa8\x99\x64\x49\x15\xcd\x22\x2b\x40\x69\xa9\x64\x49\x1d\xcb\xd8\x2c\xc0\x69\xc9\x98\xcd\x79\x0f\x48\x2b\x9e\x6e\xb8\x8f\xa1\x36\xe5\x70\x2f\x4f\xdd\x5d\xe8\x36\xb6\x2c\x27\x3c\xa8\x82\x45\xc3\xf8\x6a\x53\x10\xf7\xf2\xd5\xdd\x06\x39\x92\x2f\xbe\x97\x85\x4a\xef\x34\x8c\xaf\x36\x25\x71\x2f\x5f\xdd\x7d\x38\x23\xf9\x6a\x57\xed\x48\x3b\x9e\x9e\xb8\x8f\xb1\x36\x45\x71\x2f\x63\x5d\x46\x70\x2b\x63\xac\x17\xf9\x0b\x2a\x0f\x61\x85\xae\x6c\xb6\x84\x59\x75\xcc\xcb\x74\xdb\x56\x68\xf8\x2f\x45\x01\x37\x69\x2b\x74\x7d\x0f\x8b\xb8\x0e\x93\xf8\x77\xad\x4d\x57\x23\xe5\x9b\xc5\xc6\xe9\x85\xa4\x6f\x74\x12\x9a\x98\xb9\x2b\xd9\xce\x5d\xd7\x0a\x8c\x4a\x09\x9c\x95\x99\x9a\x50\x0b\x23\xb5\x58\x98\x09\xec\xf3\x24\x92\x60\x57\x76\x58\x85\x17\x5a\xa4\x35\x20\x43\x70\xa0\x90\x55\xfd\x9a\xa0\x2d\x2d\xd1\xed\x23\xb6\x4e\x57\x6a\xdf\x3f\x1c\x8f\x47\x0d\xa0\x28\xe3\x34\x2c\x5f\x39\x88\xeb\xae\xf6\x12\x54\x28\x81\xd1\x34\xb1\x53\xa5\xf0\x8c\xad\x62\x87\x21\x58\xee\xe7\xba\xb5\x40\x87\x3c\x8b\x04\x4a\xcb\xc3\x2a\x58\x45\x3a\xa5\x16\x50\xa6\xd5\x15\x4b\xd4\x16\x9b\xc5\x31\x58\xe8\xd4\x2e\x87\x03\xaa\x2a\x0e\xe5\xaf\xc3\xd5\x22\x00\x68\x51\x30\x85\x12\x2b\x94\xe8\x78\x9b\xe5\xc6\xd7\x87\x37\xce\x8e\x79\x0b\xb2\x0a\xfd\xfd\x5a\x27\x82\x61\x64\x0a\xa4\x44\x1e\xb4\xe3\x72\xb9\xd2\xbb\xf1\x12\x96\x59\x9c\x9d\x3a\xf9\x1d\x3c\x77\xa5\x53\x60\x60\x32\x11\x5e\x28\xd1\xd9\x87\xeb\xbd\xac\x7f\x04\x36\x0a\xb3\x53\x07\x14\x1d\xe6\x01\x34\x5a\x14\x4a\xa6\xc2\xca\x24\x22\xe1\xca\x8b\xfc\x50\xb7\x7f\x64\x5e\xf2\xae\xac\x8f\x9b\x63\xa8\xd3\x20\x40\x32\x09\x5a\x24\x51\x38\xec\xa3\x79\x14\x02\xdd\x28\xbf\x72\x90\xf9\x62\x1e\x2e\x5c\xa8\x13\xe5\x57\xb5\x0b\xe5\x57\x45\xd8\xbe\xb7\xf0\x96\x1a\xfa\x7d\x1e\xb5\xda\xeb\x7b\x7e\xe0\x6f\xf4\x77\xcf\xa5\x46\x91\x51\xc3\x19\x9a\x24\x3c\x7c\x75\x02\xf7\xaa\x79\x5d\x33\x39\xfb\x70\x37\x81\x15\x68\x3f\x08\xa6\xfc\x7f\x50\x9b\x73\x1c\x51\x7f\x6d\xeb\x7e\x76\x27\xe1\x8e\x36\x25\x36\xb4\x08\x4b\x94\xd5\xd4\x97\x11\xb2\x19\xeb\xce\xa0\x08\xdd\x65\x94\xa6\x03\x86\x0e\x39\xf5\xeb\x68\x66\x64\xa5\x50\x4b\x8f\x4c\x7b\x5d\xa2\xf0\xeb\xf5\x25\x2f\x23\xfa\xb8\x25\xff\x3a\xb8\x40\x48\x29\x4e\xea\xc9\xfd\x56\x50\x35\xf7\x99\x50\x85\xb8\x22\xc5\xd9\x19\x95\xb1\xf4\x4e\x63\x39\xa9\xaf\xe4\x6f\x9c\xc4\xf5\x2b\x4f\x53\x2d\x42\xc5\x19\x00\xa7\xe5\x71\x67\x2f\xe3\xa2\x8c\xb3\xfa\xfa\x87\x29\xf3\xc9\xa7\xdb\xed\x1e\x1d\xf3\x92\x75\x1d\xcc\x0a\xbd\x33\xe7\x8b\x0e\xb7\x59\x5e\xff\x30\xdb\xd7\xd9\xb3\x36\x76\x97\x2c\x42\x65\x12\x67\xe8\x2d\xdc\xef\xcb\xdf\xea\xb8\x4e\xd0\x17\x1e\x0a\xb4\xce\xfb\xe4\x87\xa7\x49\x58\xd7\xe5\x0f\xa4\xfe\x79\xf2\xf4\xfc\xf4\x56\x94\x48\x72\x6f\x8b\x12\x39\x8a\x83\xbb\x4f\xf2\xc3\xd7\xff\x7b\xc9\x6b\x34\xc5\xd0\x4c\xac\x5e\xd1\x4c\xaa\x3c\x89\xa3\xc9\x87\x30\xda\x07\xfb\x68\x57\x84\x27\x44\xa5\xe4\xc4\x59\x15\x47\x68\x1b\x7e\xcb\xe3\xe8\x2d\x4e\x4f\xd3\xba\xbc\x9a\xaa\xcf\xfe\xf4\x3c\x9f\x16\xd7\xbc\x2c\xce\x61\x56\x6d\xe7\xbb\x97\x38\xca\x5f\xaa\xed\x9c\x56\x89\x0d\x49\x87\x58\xbb\x7f\xc6\xe5\xd7\x2a\xfe\x1d\x6d\xc3\xf9\x1b\x99\x65\x8a\x53\x26\x0a\x0e\x0f\x42\x18\x67\xa8\xb4\x01\x65\xe1\xb7\x7d\x58\x5e\xa3\xb8\x2a\x92\xf0\x95\x08\xe0\x6d\xb6\x0f\xa3\x13\xd4\x6b\xd7\xc5\x9a\x1d\x62\x5d\xa0\x95\x78\x0a\x24\x61\x51\xa1\x2d\x7f\x90\x74\x10\x43\x4e\xea\x68\xca\x9f\xce\x57\x6d\xf6\x68\xaf\x5a\x0c\xe9\x50\xec\x28\xea\x1a\x0b\x45\x67\x80\xb3\x08\x21\x1f\x2d\x75\x44\x82\xa1\x63\x13\x40\xac\x99\xd4\x78\x0c\x7f\x24\xff\x4e\xa5\xf2\x48\xfe\x79\x56\x7e\xa2\x50\xe0\x83\xf7\x84\xf2\xc0\xbb\x3d\x23\x50\xbc\x81\xcc\xc3\x0e\x6c\xf8\xf6\xdf\x3e\xff\xe1\xc3\xa4\xca\x2f\xe5\x01\xfd\x1a\x16\x45\x9c\x9d\xfe\xe7\x7f\xfc\xf2\xd3\x3e\xcf\xeb\xaa\x2e\xc3\x62\x96\xc6\xd9\xec\x50\x55\xb3\x34\x2c\x26\x7f\xf8\xfc\xff\x05\x00\x00\xff\xff\x81\x0f\x8e\xc4\xd8\x79\x02\x00"), }, - "/static/lib/bootstrap-4.0.0-alpha.6-dist/css/bootstrap.min.css.map": &vfsgen۰CompressedFileInfo{ + "/static/lib/bootstrap-4.6.2-dist/css/bootstrap.min.css.map": &vfsgen۰CompressedFileInfo{ name: "bootstrap.min.css.map", modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), - uncompressedSize: 68044, + uncompressedSize: 654593, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xec\x7d\x59\x77\xdb\xba\xce\xe8\x7f\xe9\x6b\xb4\x77\x9d\xb1\xe9\xb9\x4f\x04\x45\x39\x92\x22\x3b\xaa\xea\x7a\xbb\x77\x7d\x6b\x2f\xd5\x51\x15\xc5\x53\x6c\xc7\x71\x9c\xbb\xee\x7f\xff\x16\x67\x8a\xa6\x1d\x27\x4d\x77\x7b\xce\x71\x1e\x1c\x89\x04\x07\x80\x20\xc0\x01\x80\xfe\xdf\xbb\x87\x62\x36\xaf\x26\xe3\x77\xff\x3a\xf6\xde\xcd\x27\x8b\x59\xbf\x98\xbf\xfb\xd7\xff\x7d\xf7\xe7\x9f\xef\xff\xfc\xf3\xfd\xbc\x3f\x9f\xbf\xff\x7b\x3c\x99\x8d\xf2\x61\xf5\x54\xfc\x49\xdf\xdf\x79\xef\xbe\x4d\x26\xf7\xf3\xfb\x59\x7e\xf7\x27\x7f\x37\x81\xef\x66\xd5\xf8\x5e\x02\x9a\x19\xb3\x82\x16\x73\xe5\x3c\xe4\xb3\x2a\xff\x36\x2c\xe6\x8e\xcc\x51\xf5\x58\x8d\xe7\xef\xff\xbe\x99\x3c\x14\x33\x57\xe1\xfb\xd5\x5d\xb1\xa5\xdc\xb0\x9a\xdf\xbb\xea\xfd\xbb\x1a\xe5\xe5\xd6\x16\x19\xc0\x96\xfc\x6f\x93\xd9\x75\x31\xfb\x63\x96\x5f\x57\x0b\x67\x0b\x1c\xd0\x95\xd3\x9f\x5c\xbb\x6a\xfe\xbb\x9c\x55\xd7\x5b\x5a\x7c\x26\xfb\xdb\xac\xc8\x07\x77\x93\x6a\x7c\x3f\x7f\xa6\x92\x3f\xbe\xcf\xf2\x51\xb1\x9c\xcc\x06\x4e\x8a\x3e\x37\x16\x0c\xe0\x8f\xd9\x64\xe9\x2a\xfd\x7d\x32\x1b\x6d\x2b\xbc\x29\xff\xef\x6f\x8b\xfb\xfb\xc9\x78\x5b\xd1\xcd\x10\x7f\xdf\xcf\xf2\xf1\xbc\xba\xaf\x36\x64\x5f\xcf\x26\x77\xd7\x93\xe5\x78\x4b\xe5\xe3\xfc\xe1\x8f\xeb\xea\xa1\xba\x76\xb3\x19\x6f\xfb\x8f\x72\x36\x59\xdc\x39\xd9\x69\x7c\xb7\xb8\xdf\x9c\xdd\x5f\xcc\xef\x27\xa3\x3f\x36\x22\x3f\xce\x1f\x36\x24\x7f\xcb\x9d\xfd\xe9\xe7\xb3\x6d\xbc\x40\xb3\xdd\x54\x9e\x15\xf9\x75\x7f\xb6\x18\x7d\xdb\x56\x7a\x58\xe4\xb3\xef\xd5\xa3\xab\x82\xbb\xbc\xac\xc6\x39\xa5\xf4\x96\x0a\xb6\x02\xfd\xfd\x2d\xbf\xde\x3e\xb3\x36\xe4\xff\x7d\xbb\x18\x7d\x9b\xdc\xcf\xdc\xb5\xe6\xc3\x62\x76\xbf\xa5\xd6\x4d\xf9\x7f\xdf\xcd\x26\xe5\xac\x98\x6f\x9f\x34\xf9\x75\x55\xb8\x27\xd6\xdf\xa3\xe2\xba\xca\x5d\x19\x54\xf6\x6c\x64\x09\x53\x40\x6d\xe6\x9b\x59\x31\xbf\x9b\x8c\xe7\xd5\x43\xf1\x47\x31\xfa\x56\x5c\x3b\x59\x61\x38\x99\x3b\xc9\x35\x9a\x5c\xe7\x43\xe7\x6c\x99\x4c\x86\xf7\xd5\xb6\x5e\xcd\x8a\x79\x71\xff\xc7\x7d\xf1\xe8\xa6\xd8\xe4\x6e\x93\x38\xee\xe7\xb3\xc9\x62\x5e\x0c\xb7\x89\x0f\x3a\x57\x37\xcd\x84\xc5\x7d\x35\xac\xee\xab\x82\x0d\x58\x55\x8e\xb7\x83\x7c\xcb\xfb\x03\x4a\xbb\xf1\x56\xb9\xa8\x80\xfe\x60\x9a\xc6\xa9\x9e\xcc\x4a\x99\x60\x7f\xa6\x73\xd7\xd5\xfc\x6e\x98\xaf\xb6\x03\x7d\x1f\x16\x8f\xcf\x41\x4c\xf2\x6d\x4c\xbb\x29\xdf\xa8\xe2\x6e\xc2\x05\xdf\x76\xa8\x79\x7f\x56\x14\x63\x3a\xf9\xdd\xa8\xc9\x06\x39\xdc\x1f\x1c\xf0\x99\x2a\xab\xa7\x6a\x5c\x3e\x03\x73\x97\xf7\x9f\x05\xda\xc0\x66\x8a\x5f\x8a\xc7\xfb\x3f\xee\x67\x8b\x71\x3f\xbf\x2f\x9e\x83\x2b\x46\x77\x37\xf9\xbc\x9a\x3f\x07\x77\x53\x39\x55\xb0\xd1\xab\x87\x6a\x5e\x7d\xa3\x6f\xab\x2d\x75\xd9\x40\xff\xe3\xbd\x1b\xe7\x23\xb6\x84\xfa\x1f\xef\xdd\x28\xbf\xbb\xab\xc6\xe5\xfc\xdd\xbf\xde\xfd\x1f\xfa\x77\x42\x50\x0f\x79\x31\xc2\xc4\xeb\x21\x84\xbc\x2e\xc2\x88\x3f\xc5\xf4\x69\x0a\xea\x71\x25\x1e\x3b\x01\x07\x6f\xd3\x57\x82\xda\x81\x97\xd2\xa7\x84\xfe\xb4\xd5\x4f\x48\x7f\x52\x94\x10\x99\x9b\x06\x5e\x93\x16\xeb\xf0\x5c\x2c\xe0\x12\x5e\x4b\x37\xf0\xba\xaa\x6c\x8c\x9a\xaa\x58\x3b\xf0\xda\xaa\xb5\x90\xe7\xca\xaa\x46\xac\x47\xa2\xdb\xec\x49\xd6\x4a\xe8\x53\xc6\xbb\x90\x06\xb4\x39\x81\x5e\x87\xff\x60\x24\xfb\xd1\x0d\x28\x30\xf1\x2a\x50\x35\x9c\x81\x2a\x28\xaa\x20\xc4\xeb\xf3\x6a\xd3\x80\xc2\x88\x57\x46\x96\x12\x54\x95\xf2\x91\xe1\xd1\xa6\x15\xb3\x27\x22\xda\x4e\x1d\x69\x6d\x5a\x63\x6c\xe0\xd6\xdc\xd4\xd1\xb6\x40\xa3\xab\xaa\x8f\x75\xbf\x59\x4f\x12\xfe\xd4\x0e\xbc\xc4\x20\x34\x43\x9f\x3d\x11\x93\xf8\xbd\x3a\x99\x32\xfa\x54\xf0\xa7\xa6\x68\x49\x0c\xa6\x7c\x0d\xf9\x80\x74\x02\xde\x50\x42\xeb\x63\x83\x94\xd3\x26\xe7\x40\x61\x52\xd5\x19\xcd\x1d\xac\x70\xae\xfa\x56\xd0\xd7\x8c\x57\xdd\x0d\x0c\x26\xc8\xd4\xf8\x67\x28\x36\xb9\xb1\xa3\x2a\xed\xd9\xd5\xa7\xaa\x02\x42\x8c\xf1\x6e\x2b\x22\x17\xbc\x44\x16\xf0\x1e\xf4\x55\x1b\x23\x40\xa1\xe4\x20\x46\xcd\x12\xd3\xc7\x03\x96\xc0\x9f\x57\x0c\x24\x57\x6d\xa6\x0a\x25\xce\x21\x27\xec\x97\x3f\xcf\x19\x6c\xaa\x06\xb2\xcd\x7b\xdf\xa6\x2c\x54\xe3\x5e\x31\x4d\x34\x0a\x72\x40\xac\x49\xc4\x08\xdd\xd6\x5c\xde\x35\x7e\xe4\x58\xa7\x46\xb9\x1a\x9d\x52\x35\xb8\x9a\xc9\x32\x35\x3e\xb9\x31\xd6\xb2\x83\x8c\x76\x31\x7e\x1f\x05\x82\x8b\x73\x7f\x15\x6f\x68\x9b\xd7\x8e\xef\xe2\xc0\x5b\x71\x42\x61\xff\x2c\x16\x48\xc6\xf8\x31\x0e\xbc\xbe\x5f\x5d\xca\xd2\x1d\xd5\x5c\x8c\x3f\xc4\x81\x77\x22\xcb\xcc\x15\x08\x9b\xd2\x67\xa0\xb1\x65\x04\x8a\x39\x8e\xdd\x40\xb2\x15\x31\xa5\x42\xaa\xf0\xe9\x28\x52\x69\x76\xd4\xd8\xc6\xf8\x43\x12\x78\x99\xbf\x6c\xc9\x04\x72\xd3\x67\x44\x20\x9c\xfa\xa9\x62\x3e\x2e\xe1\x16\xec\x77\xc0\x19\x81\xfd\xf2\x39\x56\xe8\x84\x3e\xea\x0b\x06\x2d\x10\x41\xa2\xcf\x85\xa2\x52\x41\xe7\x0c\xe1\x5d\x23\x44\x89\x85\x34\xa0\x90\xbc\x5f\x67\x40\xd1\xfb\x00\xb4\x96\x33\xf0\x42\xd4\x7f\x0f\x86\x98\x1a\x01\x22\x42\x22\xb2\x79\x6b\xf1\x0f\x1b\x64\xde\x43\x26\x58\x13\x85\xed\x08\xf8\x7c\x45\xc8\x6b\xd2\x82\x12\xa8\x49\x45\x26\x4b\x64\x9c\x21\xe5\x2b\x31\x18\x51\x83\x10\x29\x56\x12\x94\x98\x84\x8e\x69\xa7\xda\x0e\x7e\x8e\x69\x61\x96\xc1\x71\x1d\x01\xf2\x03\x29\xc2\xe2\x50\x11\xb0\x19\x09\x5a\xd1\x6e\x86\x76\x2d\x25\xe0\xe3\xe0\x13\x17\x6b\xeb\x8c\x27\x49\x2a\x86\xab\x29\x61\x52\x05\x93\xa2\x09\xb0\x29\x5e\x02\xaf\x30\x47\xe9\x90\xd2\xb9\xa7\x59\xb1\x29\xa7\x6d\x8f\x56\xa8\xd5\x5e\x5f\xc9\x5c\xa3\xe5\x36\x3e\x8a\x4f\x2e\xbc\x0a\xfc\xe3\xf8\xf4\x82\xd7\xe9\x92\x48\xa1\xf1\x44\xd4\xdc\x24\x92\x71\xe2\x60\x94\x52\x01\x49\x0e\xaf\x04\x21\x7b\xa8\xc7\x88\x1d\x6e\xf8\xc1\x43\xe0\x3d\x60\xe3\xd3\x57\x3c\x4f\x94\x02\xd0\x19\x31\x0a\x03\xaf\x21\x71\x22\x4a\x83\x8a\x81\xd3\x8a\xaa\xab\x26\x96\xd0\x46\x35\x9e\x68\xd2\xb2\x6b\x55\x37\x95\xb0\xd7\x3f\xa1\x52\x86\x4d\xa1\x87\x05\xea\xf2\xb5\xaf\x24\x52\x4f\xc1\x75\x8d\x15\x83\xfc\x61\xb3\x9e\xa1\xa4\xa5\x19\xe7\x9f\x98\xdc\x44\x82\x54\x69\x30\x8a\xd0\x1a\x40\x07\x75\x22\xef\x1c\x36\x94\x8d\x89\x37\x61\x42\x66\x82\x83\x51\xbc\x5e\x3a\x46\xad\x88\x42\x74\x42\x39\x0b\xb2\x88\xcf\x33\x41\x00\xa2\x08\x40\x84\x68\x88\xb9\x5a\x69\xba\x91\x08\x69\x06\x9b\xff\xed\xe0\x3c\x09\xbc\x3e\xb9\x4d\x04\x64\x8a\xfa\x81\xa4\x17\x12\x32\xad\x5d\x27\x69\xdb\x60\xeb\x4c\x4e\xbd\xdc\xf8\x61\x33\x5c\x09\x92\x4c\x73\x56\x4f\x0d\x73\x4f\x0d\x6e\xa1\x9e\x34\xda\x5d\xc5\x04\xb9\xd2\xe9\x4d\x85\x6f\xac\x1a\xd0\xea\x41\xf3\x5c\xae\xa6\x7f\xa8\x6a\x4e\x8d\x05\x0b\x97\x9b\x4d\x53\x93\x0b\x25\x9e\x10\x83\xd3\xce\x59\x87\x8f\x00\x25\x62\xde\xf7\x50\x1c\x09\x34\x2a\x99\xc7\xe5\x6e\xa6\xa7\x76\x93\x4a\x72\x29\xff\x32\xfe\x9a\x88\x65\x0c\x1b\xa6\x35\x29\x56\x93\x67\x6d\x43\x65\x60\x53\x76\xa6\xf6\xe4\xc2\x6a\xdd\x56\x9b\x1f\x23\x40\xb1\x56\x52\x61\x4d\xcd\x04\xe7\x61\xe0\x65\xe4\x5e\xea\xfd\xa2\xf9\xfe\x2f\x26\x7a\xe3\x4d\x3f\x4f\xb0\x6d\xd2\x93\x21\xd8\x53\x27\x75\x8a\x18\x3d\xb4\x4d\xb6\x2a\x8b\x68\x0d\x1d\xd5\xff\x96\x9d\x16\x3b\xd2\x52\x47\x5a\x7b\x47\xb8\x18\x91\x2f\xc6\x12\xd3\xec\x64\x28\x66\xfa\x36\x01\x69\x82\xb4\x7f\x22\x88\xdc\x25\x68\xe6\xef\xdb\xcb\x47\x39\x35\xb4\x0e\x2a\xea\x4b\xca\x8e\x5d\xa9\x14\x88\x7a\x31\xc2\xea\xab\xf4\x96\xa1\xc0\x1f\x88\x58\x35\xea\x06\x62\xbf\x0a\x02\x2f\xc7\xc3\xc0\x91\x35\x09\x02\xca\xf6\x7a\xfd\xe2\x07\xde\x08\xa3\x30\xe4\xa0\x21\x95\x75\xbd\xfa\xd6\xa9\xe0\x42\x30\x14\xbb\x91\xb4\xbe\x32\xd0\x78\x5a\x03\xa4\xa7\xa8\xe4\x6e\x4c\xec\x05\xa4\xc9\x5f\x17\x81\x98\xb1\x29\x42\x73\xca\x9d\xf1\x21\x78\x13\xa8\xeb\x15\x0b\x9f\xc4\x10\x33\xc8\x14\x42\x5a\x19\x1c\x60\x44\x58\x9d\x5d\xaf\x89\x82\xef\xde\x39\xa6\x8b\x04\xd1\x06\x99\x85\x87\xe0\x75\x71\xa8\xb8\xa8\x29\xb7\x85\xbe\x2f\xb6\x0f\xa9\x1a\x75\x63\xfb\x63\xaf\x49\xc8\x57\xd1\xcb\x36\xee\xca\x39\x1c\xaa\x1f\xad\xf5\xad\xb4\xae\x95\x16\x44\xd1\x7a\x47\x8a\x80\xef\x0a\xc5\x80\x35\xcd\x5d\xa1\xa5\xf9\x4a\xa8\x0f\x1d\x27\x48\xf8\x88\xcd\x7d\x9f\x90\xa5\xa1\x90\x98\xa6\x14\x65\x32\xf1\xd3\xe8\xea\x28\xf0\xfa\xe9\xf8\xea\x38\xe0\xe3\x1e\xd7\xc7\xdd\x3d\x7e\x9a\x33\x83\xcf\x92\x18\x24\x37\xa5\x18\x71\x42\x53\xd1\x1c\x3e\xdf\x80\xc9\xfa\xc1\x13\x48\xfc\xc9\x14\x22\x2f\x45\x59\x68\x34\xb1\x26\x10\x92\x7a\x0b\x92\x7b\x88\x83\x7f\x4d\x8c\x2e\xa9\x06\x58\xaf\x39\x75\xa1\xd1\x53\x75\x11\x8a\x10\x1f\x88\x6e\xbd\xbd\x36\x7e\xf2\x91\xd7\xc5\xc8\xdc\x07\xf7\xea\xbc\x1d\x53\xee\xb4\xf8\x3d\xc6\x47\x38\xf0\x56\x10\x8c\xfd\xc0\xeb\xe2\xf6\x1a\x40\xf2\x46\x00\x8d\x9d\x6b\x18\x40\x68\x0f\x55\x82\xcb\x37\x82\x68\xac\x41\xb4\x35\x84\x7f\x45\x35\x39\xfe\xfa\x5a\x1a\x3e\xe0\x80\x96\xbf\xdc\x8c\xe1\x0f\x43\x34\xb6\x41\xf8\xfd\xc8\x8b\x71\x8e\xe4\xe2\x5c\x2e\xc7\x72\xf5\xa4\xd3\x8c\xad\x57\xac\x44\x48\xac\x76\x0f\x0c\xcf\xbc\x2e\x06\x12\x9c\xb1\x2e\x7e\x80\xc0\x8b\xf1\x08\xd6\x00\xda\x6f\x03\xd0\xd8\x06\xe0\x5f\x0b\x25\x92\xd7\xcf\x06\x08\x0a\x02\x31\x5f\x1a\x4c\xd4\xf7\x55\x3e\x87\x6c\xde\xe2\xc8\x58\xb6\xa6\xf5\x9f\xf6\x8e\x3f\xa9\xa2\x50\xb7\xfe\xd3\xd9\xf1\xe7\xdf\xbd\x02\x79\xc6\x92\xd5\xa5\x27\xd7\x36\xc1\x02\xc8\xfa\xec\x98\x03\x1d\x74\x7c\xeb\x07\x7b\xfa\xff\x68\x05\x41\x03\x1c\x92\x61\x4f\xe1\x3d\x85\xff\x13\x28\xdc\xd8\x53\xf8\xe7\x51\x98\x44\xc8\x3c\x93\x64\xc7\x38\x4b\xfd\xa8\x97\xad\x95\x4e\x1c\x38\x1f\x3b\xf6\x72\x98\x04\x5c\x33\x18\x25\x73\xfb\x78\x49\xae\x4c\xad\xb4\xd8\x4e\xd3\x6a\x25\x44\x5e\x3b\x38\x83\xd6\x96\x6a\x3b\x8e\x6a\x3b\x8e\x6a\x3b\x28\x96\xb4\x21\x43\x9c\x3c\x5b\x6f\xd7\x51\x6f\xd7\x51\x6f\x57\xd5\xdb\xdd\xa9\xde\xd0\x51\x6f\xe8\xa8\x37\x54\xf5\x86\xbf\xb4\xbf\x7b\x3a\xfc\x9e\x74\x48\x7f\x52\x7f\x7f\x55\xbd\xbb\x8b\x07\x59\x6f\x4c\x8e\x21\xf5\xd2\x60\x81\x3f\xc9\x73\x92\x07\x5c\x4b\xe8\xd8\x09\x5d\x3b\x21\x7c\x16\xe2\xed\x8a\x64\x36\xc4\xb6\x04\x89\xcb\x08\x7f\x12\x64\x20\xe3\x7a\x42\xc7\x4e\xe8\xda\x09\xe1\xb3\x10\x6f\x57\x24\xb3\x21\xb6\x25\xc4\xe4\x10\x52\xaf\x13\xcc\xe1\x93\x30\x11\x20\xf7\xf5\x84\xae\x9d\x10\x3e\x0b\xf1\x76\x45\xba\x36\x84\x99\x80\x1f\x80\xd0\x75\xe0\x21\x10\x7e\x5f\xf1\x53\x74\x69\xfe\x53\x74\x69\xe7\x27\xe9\xd2\xce\x4f\x92\x19\x9d\x9f\x24\x3b\x7f\x55\x7f\xf7\x74\xf8\x3d\xe9\xd0\xfd\x49\xfd\xfd\x55\xf5\xbe\x56\x97\x76\x6d\xfd\xd3\xb5\x75\x69\xd7\x56\x59\x5d\x5b\xcb\x6d\x83\x78\xbb\x22\x3d\x1b\x62\x5b\x82\xc4\xc5\xd2\xa5\x5d\x5b\x97\x76\x6d\x95\xd5\xb5\xb5\xdc\x36\x88\xb7\x2b\xd2\xb3\x21\xb6\x25\x70\x5d\x9a\x6b\x0d\x45\x98\xca\xca\x6d\xe5\x9a\xdb\x4a\x2d\xb7\xd5\xde\x36\x88\xb7\x2b\xd2\xb7\x21\x8c\x84\xde\x5e\xb9\xee\x95\xeb\x5e\xb9\xee\x95\xeb\x5e\xb9\xee\x95\xeb\x5e\xb9\xee\x95\xeb\x5e\xb9\xee\x95\xca\x9e\x0e\x7b\xe5\xba\x57\xae\x7b\xe5\xfa\x6f\xa0\x5c\x1b\x7b\xe5\xba\x57\xae\x7b\xe5\xba\x57\xae\x7b\xe5\xba\x57\xae\x7b\xe5\xfa\x66\xca\xb5\x79\x2c\xbd\x35\x93\xba\x3d\xbd\xe9\x23\x72\xa1\xdc\x34\xdb\xa1\xe1\x56\x51\x28\xbb\x7b\xcb\x3f\x26\x45\x9f\x99\x25\x7d\x1e\x1a\x8e\x66\x7d\x1b\xe6\x9a\xf9\x79\x0e\x20\x5c\x2f\x3e\x84\xc8\xeb\xa3\x39\x84\xca\x75\x23\x8b\xa4\x9f\x5b\x33\x94\xee\x00\x99\x34\xd7\x6f\xdb\xe5\xfd\x40\xbb\x90\xc6\xe1\x7a\xfe\x65\x24\xdc\x78\x57\x80\xba\x89\x37\x11\x6e\x1f\x9d\x96\xb7\x62\x5e\x27\x95\xf4\xeb\xcd\x22\xef\x04\x50\x33\x51\x3e\x68\xf8\x03\x89\x38\x2a\xca\x2b\x2d\x0c\xf5\x73\x12\x79\x15\x46\xb1\x86\x47\x97\x2d\xe5\x66\x88\xb2\x54\xa7\x8f\xe1\x13\x27\xce\x40\x7a\xb4\xa9\x7a\x52\x5a\xcd\xc0\xa8\x26\xa5\xb5\x4c\x59\x2d\x53\xa3\x96\x94\x55\xd2\x53\x6e\xc5\x85\x55\xc5\x01\x58\x55\x0c\x58\x15\x83\xb5\x2a\xde\xa4\x1f\x1b\x88\x92\xda\x34\x49\xdd\x24\x49\xfd\x2a\xf8\x42\x9b\x27\xe1\xba\xdf\x08\x0a\x23\x33\x2b\xb5\xb2\x8a\x3a\xff\xca\x1c\xee\x31\xa5\x50\x5b\x02\x65\x5f\xe1\x68\x70\xc5\x3c\x43\xbb\xa1\x74\xf2\xea\x45\xa6\x77\x55\xe2\xb0\xbf\x66\x4f\x23\xc9\x35\x51\x40\x91\x4a\x65\x79\x72\x13\x51\xb6\x70\x95\x6f\xd6\xbd\xf6\x37\x84\x2a\xb0\xf1\x8a\x0d\xcf\x60\x9a\xba\xd4\x51\x2c\x4a\xa8\x87\xb1\x30\x7d\xa3\x51\x2c\x3d\x78\x3e\x7d\x96\x0b\xe5\x5c\x95\x8c\xb5\xeb\xb2\x7e\xef\xee\x00\xd3\x77\xc0\x74\x9f\xaf\xe6\xe5\x20\x66\xc3\xe9\xe7\x96\xd7\x00\x74\xa6\xa4\x80\x11\xb9\x03\x67\x81\x70\x31\x5b\x27\x1c\x56\x3e\x19\xca\x87\xd3\x3f\xc6\x11\x9d\xda\x73\x1c\x1a\x8e\xd7\xc2\x3d\xe8\x11\x47\x5e\xb9\x25\x6f\xb2\x25\xef\x08\x36\xe7\x2d\x00\xa1\x25\xd0\x91\x1b\xf8\x77\xa0\xb8\x52\x03\xdd\xf9\x0c\x68\xe9\x2b\x67\xd7\x30\xf2\x4a\x5f\x39\xbd\x4f\x00\x5d\x44\x74\xa6\xf5\x42\x07\x9a\xb1\x74\x93\x9f\x80\xe1\xc0\xda\x91\xbe\x64\x3d\x11\x70\x42\xca\x69\xfe\xa8\x7d\xb2\x47\x1a\x6a\xa1\xa1\xf8\x63\xc7\x72\xfe\xdb\x0a\xd5\x61\x9e\x21\x58\x39\xa5\x49\xa0\xc4\x68\x4f\x33\x7d\x16\x78\xd3\x1d\xa0\xad\x18\x1e\x89\x1a\xfe\x5c\x71\x3c\x41\xad\x33\x9f\x49\xa3\xf7\xfc\xdf\xb4\xe9\x0d\x7c\x84\x66\x4d\x6f\xe1\x33\x4f\x15\x1f\xa1\x39\x66\x69\xf7\x58\xa7\x75\xd6\xbd\x57\x50\xce\x9d\x8c\x07\xc0\x3c\x90\x87\xe0\x8d\x98\x7c\x9a\x63\xc3\x8f\xb0\xe6\xef\x94\x7e\x3e\x8d\xa4\x27\x5b\x56\xc6\x91\xb7\x24\x08\x4d\x7c\xaf\x24\x08\xdd\xf9\xde\x94\x2d\xf6\x46\x3e\x95\x58\x6d\xe1\x85\xb9\x5b\x13\x6d\xa3\x89\xc7\x58\x35\x71\xf2\x7c\x13\x3d\xe5\x01\xaa\xdd\xf2\xbb\x0e\xe7\xb9\xb6\x0a\x4f\xa3\x5d\x4d\xd2\xfa\x10\x24\x54\xe3\x2f\x30\x6a\x27\x06\xdf\x49\x7f\xec\x96\x10\x94\x7a\x8e\xf5\xeb\x4e\xd5\x8c\x71\x38\x8c\x6e\xc1\x8a\x2b\x90\xd1\x16\xce\x98\x2b\x91\x88\xe8\xc2\xd9\xb9\xe6\xde\x3a\x65\xee\xad\x62\x05\x11\x45\x94\x56\x69\x28\x7d\x54\x33\x36\x77\x74\xa8\x9b\x66\x20\xc2\x10\xcd\xe5\x6f\x53\x50\x22\xd5\xce\x58\x2c\xca\xc8\x04\xea\x7e\xa7\x99\x96\xaf\x99\xfa\x29\x8d\x77\x7c\x7a\x25\x23\xb8\xf0\x5f\x1e\xff\x85\xeb\x30\xaa\xda\x94\x14\x0a\x99\x2b\xac\x26\x4e\xca\x22\xc6\xd4\xa4\x54\x6e\x2b\x30\xff\xa8\x1d\x09\x4f\x5e\x9e\xb2\xbc\xc2\x77\x69\xf0\xd3\x1a\x8c\xfd\xd1\x55\xbd\xc1\xaa\x83\x4f\xd3\x40\x84\xbc\xe0\xbf\xdc\x11\x9f\xb3\x68\x69\x35\xd8\xb0\x1a\x3c\x80\x67\x31\xbc\x62\x4b\x00\xd5\xe0\x20\x43\xfd\xc8\x88\x19\xb0\xb3\x33\x5d\x58\xd7\x48\x61\xdd\xad\x2e\xb4\xa0\xa5\x10\x95\x8f\x85\x7a\x12\x3c\x74\x11\x50\x55\x9e\xc9\x05\x47\x74\x78\x45\x75\x7b\x58\x5d\x31\xc1\x57\x84\x2f\xec\xdd\xb3\xed\x29\x92\xb4\xf5\xd9\x55\xbb\x1e\x71\xa8\x84\xfa\x82\x99\xb0\xb5\xf0\x0a\xd0\x02\x76\xef\xce\x1b\x1d\x63\xfd\x14\x9a\x6b\xc4\x8e\x81\xe9\xcf\x12\x87\x46\x48\x09\xbd\xe8\x12\x25\x87\x98\xad\x41\x17\x1a\xea\x01\x47\x94\x07\x8f\xb0\x5a\x28\x52\xed\x5e\x61\x74\x80\x4d\xd1\x2e\xca\xdf\xf8\x8c\x7c\x73\xff\x17\x8f\xa6\xb5\x9a\x24\x26\x21\x7c\xb6\x56\x3f\xf7\x43\x39\x5c\x1f\x79\x4a\x45\x42\x5b\x84\x12\xc3\x71\x5e\x7b\x67\xde\x91\x88\x4a\x8a\x15\xf9\xc5\x48\x8a\xee\x9f\x92\x88\xaa\x8f\x03\xa2\xa4\x3b\x46\xc6\x18\xe7\xf5\x1d\x64\x0f\x0d\x83\x88\xaa\xe9\x45\x10\x8a\xa0\x44\xe4\xf0\xaf\x96\xe1\xbc\x9e\x3b\x42\x37\xb8\xa2\xd5\x58\xa1\x4d\x26\xda\x01\xb7\xd2\x8f\xa5\x7e\xec\x6d\x0a\x0b\xd0\xc3\x13\x82\xec\x80\x09\x7c\x05\xf3\xf5\x3d\x79\x93\x88\x01\xad\x58\x84\x6e\xea\xd2\x0e\xa9\x5e\x5d\xa7\x34\xf5\xab\xd7\x65\x1b\x63\xed\xc0\x6e\x9c\x79\x5b\x27\x6d\x13\x30\x4e\xbf\x9d\xd9\x63\xb6\x9b\x46\x85\xd7\x47\x2b\xf8\x4b\x0e\xaf\x8e\xd0\x72\x08\x19\xed\xe3\x37\xaf\xc7\x26\xa3\xa4\x55\x12\x71\x5a\xae\xc0\x88\x91\x96\x06\x5e\x8e\x3f\x38\xb7\x5b\x4a\xf4\xdf\x82\x4f\x09\x53\x41\x82\xb6\x81\x21\x62\xec\xd2\x93\x70\x0b\x8a\xa3\xed\x28\xd2\x4d\x7e\xa4\xf5\xbe\x0a\x4c\x65\xb6\xd5\x0c\x04\xa1\x26\x52\xb3\x35\x37\xe0\xb0\xb6\x8d\xf0\xfb\x91\x57\xe0\x1b\x7f\xdb\x5e\x23\x66\x38\x4f\x0d\x9c\xd3\x8d\x38\xf3\x65\xca\xf4\x19\x9c\xa7\xdb\x71\x9e\x32\x9c\x97\x72\x63\x4b\xc8\x7a\x97\x28\xce\x73\x63\x49\x34\xd5\x38\xa7\xcf\xe2\x5c\x41\xe4\x75\xf0\xd8\x7f\x7e\xa0\xcb\x9d\x06\xba\x94\x27\x2a\x5b\x91\x7e\x9e\x97\x63\x23\x38\xd8\xa6\x81\x36\xe3\x05\x95\x2f\x19\xe8\x09\x44\x5e\x8e\xef\xfd\xff\x2a\xee\x5e\x30\xa4\x9f\xfe\x61\xa4\x77\x1a\xe9\x9f\x87\x74\x03\x22\xaf\x87\x4f\x77\x40\x7a\xb0\x13\xd2\xea\x9c\xe9\xc7\x47\x5a\x89\x87\x4d\x48\x2b\x02\xf3\xb3\xbc\xdd\x91\x3e\x00\x5a\x3b\x7e\x82\x0d\x92\xcc\x38\x65\x91\x04\x38\xc4\xc4\x3b\x82\x0a\xce\xf0\x76\x12\x34\x03\x11\x99\xeb\x88\xf5\xfb\x47\x48\xa0\xc2\x80\x9d\xb3\xaa\xd6\xe3\xb5\x34\xeb\x5b\x95\xa3\xcd\x24\x10\x78\xb3\xb3\x18\x7c\x0a\xeb\x50\x4e\xb4\x63\x8e\xf6\xd9\x06\xb4\x2d\x09\xab\xb6\x69\x5b\xd1\x7e\x5e\x9a\x37\x65\x70\xd1\x12\x2b\xb4\x63\x0b\xed\x73\x63\x6f\x76\xe6\x44\xdb\xe8\x9c\xcf\xce\x4c\xf1\xfb\x17\x8e\xf6\x72\xb7\xd1\x36\x35\xcf\x8f\xcc\x72\x8b\x71\x9c\xa3\xad\x8e\xea\x69\x8b\xcf\x8e\x76\x9b\x31\xf9\x10\xff\x97\x31\x79\x87\xa1\x3d\xfb\x95\x68\xef\x34\xda\x6f\x8c\x76\x1e\x79\x13\xc0\x8f\x2f\x44\xbb\xb1\x1b\xda\x0d\x19\xf1\xe6\xc7\x47\xdb\x14\x13\x4e\xb4\x8f\x8c\xf0\x86\x8d\x67\xd1\xa6\x4a\xbb\x63\x44\xd5\xac\xdd\x20\x88\x6d\x25\xbf\xb5\x3b\xe3\x27\xcf\x43\xfe\x6f\x82\x69\x7f\xb2\x63\xac\x9a\xfe\xcc\x02\x97\x9d\xf0\xec\x5b\xa0\x4b\xb4\xe2\x4a\x9c\xd2\xdf\xc0\x63\x93\x2e\xda\x4a\x38\x6a\x22\x95\x76\xdb\x44\x6a\x39\x57\xc2\xa4\xe9\x0a\xbc\x69\xe0\xf6\x00\x6c\xc9\xd6\x90\x21\xa1\xd2\x1b\x78\x6a\x22\x35\xa9\x4b\x38\x69\x12\xb5\xfd\xe9\x34\x19\x39\x3f\x7b\x29\x7e\xf4\x37\x9c\x8b\xea\x1d\x58\xd2\x6d\x84\xb1\x2a\x70\xea\x6f\x38\xab\x35\x0b\x4c\xa2\xc8\x3e\x15\x4d\x54\xdc\xc6\xb9\x19\xfc\x2b\x5c\x8b\xe0\x1c\x86\xea\x76\x3b\x8e\x8c\x70\xba\xe4\x6b\x3f\x34\xe3\xcc\xc6\xf5\x4d\xb2\x95\xd6\xb5\xd2\x7a\xdf\x5b\x5e\x57\x84\xb6\xa3\xc3\x16\x8a\x91\x15\x20\x2c\x9a\x9d\xbe\xf3\xe4\xc7\xc8\x72\x9f\xcf\x8e\x95\x27\xfa\xbd\x04\x9a\x60\x1d\xee\x5a\xb1\xce\xdb\x5f\x6f\x20\x54\x11\x94\x6b\xe7\x3f\x7d\x47\x5a\xd7\x4a\xcb\xaf\x5b\xf2\xe4\x9f\xa8\x56\xb8\x42\x68\xae\x1d\xe4\x58\x31\x37\x7b\xf6\xe1\x0e\xdf\x83\x76\xbd\x26\xc2\x7f\x19\x76\x18\x89\xa1\x62\x6b\xa7\xff\x3d\x3b\xed\x2f\x76\x0a\x5c\x82\x49\x3d\xba\xe4\x4f\xd6\x03\xc5\xf1\x48\xc5\x2d\x23\xb4\x38\xa3\x8e\x3e\xc0\x8a\x55\x89\xb4\x1e\x02\x34\xae\x9f\xdf\x74\x54\x17\x53\x23\x36\x3d\x36\xa3\xa3\x10\x47\x48\x3b\x57\xa0\xd5\xae\x4b\x7d\xef\x78\xd5\x77\x4d\x77\xa4\x7c\xc4\xfa\x73\x9f\xe9\xfa\x99\xaf\xee\xc2\xad\xc8\xf9\x6a\xf0\xcd\x63\xd9\x55\x2d\x52\xa2\x2b\xf8\x69\xe8\x38\xbe\x72\x49\x9c\xae\x1d\x41\x52\xdb\x04\x28\x06\x18\xc3\x03\xdb\x22\xf3\xf5\xce\x08\x1a\xbe\x2b\xe6\xae\x21\xed\xbe\xf3\x0d\xc0\x02\xe8\xbf\x09\x8c\xc1\xe8\x84\x03\xfc\x1e\xf8\x7e\x78\xc5\xae\xdc\x8e\x60\x06\xeb\x97\x17\x86\x58\xca\xd8\x4a\x5b\x4f\xac\x8b\xc8\x4b\x51\xaa\xf8\x28\x8d\xc4\x3d\x95\x26\x60\xac\xd6\x7c\xc6\xcd\xa3\xc9\x39\xa1\xbc\x09\x4b\x1d\x1c\xd2\x76\x5c\x87\x59\x01\x09\x05\xed\x42\x79\xed\x96\xa9\x6a\xc2\x7a\x14\x46\x6b\x5a\x59\x8c\xcb\xbe\x02\xb0\x60\xb8\x85\xf5\x03\x2e\x6d\xd3\x91\x92\x63\x26\x08\xd5\xf5\xa1\x75\x17\x64\x48\xb3\x89\x7e\x34\x52\x7b\xc6\x2c\x8e\xe4\x12\xad\x64\x37\xec\xba\xaa\xb7\x38\x87\xfe\x14\x89\xdb\x8f\x39\xa0\x3c\x91\xc3\xf3\xad\xa5\x57\xcb\xe2\x7e\x64\xe4\xb3\x1b\xd7\x43\x60\xff\x9e\x18\xd7\x0c\x40\x95\x18\x42\x4b\x30\x9f\xa9\x69\x2b\xac\x57\xd4\xca\x26\x81\x6b\xe0\x23\x08\xa5\xbc\x89\x5f\x78\x59\x21\xe3\xa2\xab\x13\xd3\xae\x92\xae\x89\x9e\xd6\x5d\x14\xb0\x25\x46\xac\xce\xb1\xc3\xc8\x5b\x11\x75\x83\xc7\x18\xea\x44\x5f\x96\x12\x66\xd6\x42\x6e\xe0\x06\x87\xa2\xfb\x44\xcb\x0b\x52\xc2\x02\x47\x74\x5b\x40\x11\xc2\x37\x70\x08\xa1\x58\xc0\x30\xa8\x85\x84\xa2\xbb\xc0\xb9\xc9\xc0\x24\xf0\xce\x7d\xa3\x55\xba\x87\x67\xc4\x9f\x90\x1b\xb8\xf3\xdd\x6d\xad\xfc\x88\xe5\x9f\x62\x77\x2b\xa5\x1f\x89\xeb\xa3\x0a\xab\xeb\x69\x82\x4a\x90\x28\xf5\xeb\x87\xc6\x6d\x4a\x8c\x11\x0b\xf1\x2a\x90\x0d\xcf\x81\x0e\x03\x1a\x62\x71\xc3\xd4\x5f\x5b\xa1\x95\xd8\x01\x91\x29\x88\x0c\x4d\x40\x4e\xd6\x17\x70\xf5\x48\x5f\xfd\xcd\xb5\x96\x5c\x80\xf9\x55\x08\xeb\xbc\xdc\x08\xb4\x5f\x5f\x07\x17\x86\xae\x92\x71\xe1\x77\x3d\x4f\x57\xd3\xea\x00\xa8\x60\x4a\xd4\x7c\x70\xb2\x6b\x11\x1a\xda\xa4\xa7\x94\xe1\x09\xbb\x20\x16\x23\x1b\x44\xde\xdc\xbf\x81\x61\x58\x1b\xd3\x86\x1c\xb3\x2a\xe4\xf9\x37\x51\xa8\x0c\xab\xcd\x31\x6d\x44\x91\xb7\x20\x75\x4e\x39\x61\x9c\x72\x46\x78\x29\x57\xad\xd3\x28\x62\xf9\x77\xb1\xab\xd6\xcf\x8d\xb2\xc9\x8c\x1e\xf8\x96\x96\x4e\x4c\xf6\xbc\xf4\x57\x70\x7b\x18\x24\x86\x34\x11\x4b\x14\xfd\x9d\x88\x61\xd2\xe2\xf3\xd2\x12\x5e\x3b\xcc\xd0\x44\x19\xb6\x1d\x31\xe2\x5a\x35\x90\xb7\x92\x5e\x72\x71\xdc\x34\xa4\xff\xf5\x39\x30\x4b\xac\x21\x66\xe2\x67\x4a\xe8\xbf\x01\xbc\xf7\x65\xdb\x71\x4b\x10\x72\xa4\xac\xa9\x76\x97\x3d\xaf\xe3\xde\x5d\x79\xb2\xc5\x64\x05\xad\x9b\xfd\x4e\xfc\x5b\x78\x90\xd1\xd0\x48\x05\x13\x1c\xe9\x4e\x13\x47\xc0\xf9\x15\x58\x01\xa5\x37\x68\xc6\x78\xd3\x8d\x8f\xb5\xe6\x68\x5b\xdb\xa3\xb5\x55\xd2\x2d\x3c\xa9\xfb\x9a\x0a\x4a\x22\xa5\x12\xff\x5d\xfa\xa8\x1f\xba\x37\x0d\xb7\xf0\x5e\x06\xf8\x4f\x9c\x05\x47\x10\xba\xf7\x27\xb7\x70\x17\xd4\x4b\x2e\xa5\xc9\xdc\x89\x34\x76\x24\xa8\x13\x89\x6f\x9c\x88\x79\xcc\x18\xe6\x80\xfd\x2e\xb8\x99\x9e\xcf\x0d\x3c\x6e\xe1\x29\x70\xc9\xe0\x0a\xaa\x26\x33\x4e\xd2\xe1\x5a\x49\x20\xe6\x10\xb7\xd1\xe3\xcd\x8e\xc4\x48\xe9\x56\x56\x74\xd4\x02\x97\xdc\xae\xe0\x20\x88\x68\x09\xad\x73\xda\x72\x51\x23\x97\xfa\xa6\xfb\x84\x18\xdf\x4b\xb6\x75\xea\xa8\x69\x44\xb6\x4d\x9e\xa6\x63\xf2\x34\x1d\x93\xa7\x89\xbe\xb2\xfb\xe1\x22\x91\xc3\xff\x7d\x05\x6c\x4b\xf6\x1e\xd8\x9e\xec\xc0\xa7\xff\x26\xf0\xa4\x26\xce\x1d\xb4\x04\xf1\xce\x28\xad\x13\xb9\x87\x38\x85\x96\x20\xc6\x39\x46\x03\x9c\xd8\x9f\xbe\x89\xd1\x18\xb7\xbc\xa9\x49\x28\x1f\xa1\xca\xf7\x0e\x30\x42\xb7\x3e\x2d\x85\x46\x4d\xfa\x6f\x8e\x8f\x03\xf9\x69\x9b\x61\xfc\x49\xd8\x5a\xbd\x6a\xf1\xd4\xb5\x15\xa0\xde\xf3\xd4\x2c\x69\xe6\xae\x26\x9a\x86\xa8\xba\x08\x28\x3b\x26\x2e\xb3\xc9\x2b\x2a\xd0\x51\xbe\xed\x4c\x3a\xde\x94\x91\x6e\x3d\xd5\xd8\x52\xec\x5b\xe4\x2d\x7c\x54\x81\xab\x43\xcc\x98\xc1\x47\x4b\x48\xd6\x96\xe4\x29\x7a\x82\x16\x95\xfe\x67\xe0\x30\x3b\xca\x5a\xc2\xee\xc4\xda\xb9\xb5\x1d\x0b\x60\x6b\x27\xd3\xae\xef\x3a\xe3\x17\x5e\x0d\x1b\x3b\x33\xb7\x11\x51\x5b\x4f\x4a\x7d\xbf\x5b\x9a\xef\x69\xe0\x1d\xe1\x21\x1c\x4b\x4d\xdc\x1e\xc0\x11\x61\x6b\xbd\x44\x5e\xb7\xae\x12\xd4\x8a\xe8\xfc\xef\x84\xeb\x87\xf8\xf3\x88\x6e\x57\x96\x58\xa9\xf2\x90\xa9\x72\xa3\xf8\x28\xa2\x02\x65\x05\x2f\x59\xa5\xbe\x42\x53\x04\xec\x63\x4e\x32\x48\x77\x9b\xd9\x51\xfb\x28\x4d\xa4\xb0\xe8\xb5\x8c\x0d\x65\x6e\x3a\x58\x69\x53\x03\xbc\x16\x78\x34\xad\xdf\xe2\x5b\x72\xbe\xa8\xef\x28\xd9\xe8\x4c\xb4\x01\x4a\xb2\x71\x1c\x62\x6b\x1c\x62\xa7\x82\x18\xc2\x47\xf9\xad\x9a\xf6\x00\x2a\xf5\x69\x2b\x83\x44\x31\xfa\xce\x6e\x6d\x07\x32\x62\xb6\x61\x59\xca\x2e\xd7\x4b\x2e\x6d\xd6\x4f\x20\x3f\x50\xc1\x03\x68\x80\xc3\x2d\x7b\xd1\x14\xdd\x71\x4b\xd2\x15\x36\x8f\x31\x06\x7a\xe5\xaf\xe9\x90\x1a\xf1\xee\xf3\xc0\xb9\xfa\xc9\xeb\x4a\xb4\xed\x50\xb1\x6d\xcb\xbe\xb3\xe3\xf8\x3a\x58\xdb\xfe\x04\x99\x7c\xaa\xa0\xfe\x99\xb3\xa9\x6b\x5a\x5a\x7b\x55\x6b\x82\x92\x7a\x03\x96\x9d\x85\xeb\x80\xe1\x47\x67\xae\x63\xd8\xc7\x6d\x3d\xec\xf3\x16\xb3\xb3\x1d\xd1\xed\xe2\x23\x9c\x67\x03\xf0\x2a\x58\xc2\x6d\xe7\x91\x69\x9c\x25\x84\xce\x13\x23\x97\x8c\x49\x1d\xb2\xe8\x45\xa8\x6e\x5b\xcd\x0c\xe1\xe9\x0a\x19\x1f\x0a\xd2\x41\x79\x09\x47\x62\x8e\xd1\x0a\x33\x24\x8e\x3e\x75\xbc\x6c\x05\x4f\x37\x70\x03\x86\x29\xcd\x0e\x72\x21\xb7\xed\x93\xf4\xd4\x6b\x06\xc6\xd9\x64\x62\x1c\x90\xd1\x7e\x3e\x42\x42\xd4\xc1\xf0\x12\x2e\xf4\xa8\x5c\xb2\x55\x61\xc7\x31\x09\x32\x71\xd8\xd9\xb7\x3f\x15\xe6\xb3\x8d\x5b\xa8\x02\xed\x46\xec\x9c\x33\x5d\xf3\xe5\xe8\x8d\xe1\x23\xe8\x45\xab\x5a\xca\xb4\x47\x30\x05\x66\x27\x86\x8e\x80\xfe\xeb\xcd\xc0\x40\x59\x74\xfb\x6b\x8b\x0e\x6f\xe9\x98\xbb\xfa\xca\xa0\xc7\x8e\x0e\xf8\xb2\xef\x88\xf3\xc2\x16\x3b\x10\xe3\xe7\x90\x1b\xee\x1d\xc8\x35\x5f\x3c\x86\x99\x8f\x1c\x7b\xa0\x11\x1c\xf8\x91\x37\x85\x31\xdc\x2b\x0d\x31\x82\x39\x89\xc4\xda\xf0\x84\x1d\xab\x24\xf6\xda\xc0\xe0\x95\x4c\x9e\x02\xbf\x91\xe5\x9f\x58\x9b\x84\x0c\x81\x37\xaf\x96\x9b\xee\xca\x33\xeb\x98\xea\xb2\x29\xa8\x13\xf0\x04\x8f\x9b\x11\x77\xf4\x7d\xf9\xbe\xee\x75\xbb\x1f\x73\x56\xa6\x81\xe1\xc7\x91\x6f\x32\x2d\xcb\x37\x7d\x3c\xc7\x38\xc8\x7b\x82\x1b\x20\xca\x44\x61\x05\x23\xd0\x33\x22\x8b\x8c\x6f\xf2\xfc\x34\xbc\xb6\xcc\x64\xbe\x64\x4f\x1d\xb6\xf0\x99\x79\xd8\x95\xd7\x11\x2b\x94\xc9\x7f\x09\xd6\x07\xf8\x26\xfa\xfc\xc3\xfa\x08\xa4\xbd\x3f\xaa\x7f\x58\xd4\x3a\x26\x36\x66\xf6\x1d\xdc\x06\x52\x44\x5f\x96\xa0\x2d\xbb\x57\x30\x25\x9a\x94\x89\x3c\xa9\xb5\xee\x1e\x12\xe3\x0c\x7c\xdb\x8d\x43\xc7\xb5\x80\x88\x5d\x9a\x25\x46\xf1\xba\xba\x8b\xd5\x21\x9a\xbd\x50\xe7\x0c\xf5\xfd\x14\x13\x6f\x05\x45\xe5\x07\x74\x03\x91\x75\x8c\x83\x78\xc1\x72\x5f\xbe\x78\xe7\x80\x8a\xd4\x1e\x8b\xe6\xf7\x8f\xa4\x45\xcb\x9e\x73\x7f\xb6\x29\x24\x26\xc5\xd7\x18\xc1\xb8\x8d\x0c\x15\x23\x84\x96\xb1\xa7\xde\xd3\x77\xac\xb3\xab\x67\x6d\x41\x1f\xa0\xe5\x1d\x00\x6a\x40\xfa\x9a\x6e\x1c\xc2\x27\xba\x78\x3c\x83\x8e\xf1\x05\x24\xf1\x01\x92\x8f\xc0\x48\x30\xc1\xe9\x6b\xec\x57\x7f\x00\xa5\x7b\xfc\x89\x0a\xd9\x23\xd9\xf0\x5c\x6f\xd2\x16\xfa\xd1\x48\x2d\x8c\x71\x3b\xc5\x9f\xa8\x5e\xa8\x7c\x51\x38\xf9\x3e\x6c\xb2\xf1\x9a\xfb\xc8\xab\x7c\x14\xa6\xeb\x63\x7d\xf9\xc9\xab\x30\xea\x24\x1b\xc7\x7a\x44\x58\x7b\xa5\xba\xa3\xfb\x35\x63\x4d\x37\x6a\x03\xfc\x5a\x96\x9b\x41\xcb\x3b\xc1\x68\x09\xe9\xfa\x58\x3f\x01\x23\xc1\x81\x3c\x9a\xff\xc7\xc6\xfa\x16\xb3\xd3\x81\xb9\xdc\xff\xbf\x68\xac\x1f\x70\x8b\x2e\xae\x4e\x64\xe1\xfd\x58\xff\xb7\x8d\x75\xe3\x07\xc6\xba\xb1\x1f\xeb\x7f\x97\xb1\x46\xa7\x34\xe5\xf7\x18\xa8\x17\xf2\x1a\x41\x7f\xb5\xf6\x83\xbb\x65\x70\x63\x94\x7f\xd1\x0e\x6e\xcd\x50\x7e\xcd\xf3\x82\xcd\x09\x34\xc2\xec\xdf\x18\xeb\xbb\xb5\x24\x91\x30\x2d\xe6\xb4\xde\x53\xef\x5f\x5b\xec\xee\xf1\x88\x5d\x41\x16\x63\x2c\xd3\xbf\x7f\xf2\xce\x30\x1a\x41\x2a\x13\xc6\xf0\x49\x9c\xf4\x1f\x89\x6f\x9a\xab\x0b\x66\x55\xd9\x31\xb4\x68\x8f\x4a\x2c\x0e\x98\x0a\x74\x83\xd9\x85\xc3\x44\xf9\x63\x4c\xae\xe4\x31\xd1\x12\xab\x8e\xc7\xf2\x32\xb0\xc4\x0a\x9d\x98\xa2\x43\x11\x98\x72\x3c\x66\x98\xd2\x80\xbb\x9a\x4a\x74\x62\x8a\xce\x5c\xa3\x33\x05\x8a\x0f\xed\xe5\x19\xa6\xff\x8a\x99\xc0\x67\x0e\x14\xa1\x03\x03\xa1\x39\x0f\x5d\x70\x8e\x8d\x1b\x3b\xbe\x4b\x35\x30\x8a\x19\x46\x25\xd6\x18\x4d\x81\xa1\x34\x35\x51\x6a\x70\x94\xce\x0c\x94\xa6\x80\x67\xa9\xb0\xad\xfa\xa7\x76\x7f\x9b\x8f\x89\x2a\x98\xc1\xa5\xdc\x82\x4c\x81\x6d\xda\x9a\x6f\x16\x25\x2a\x55\xa7\x70\x3d\xe3\x42\xbc\x29\x6c\x72\xba\x0a\x7b\xed\xb3\x3d\xd7\xb7\xdc\xe4\x10\xee\x80\x76\xa5\x01\x2b\x63\x5f\x19\xb0\xbb\xfd\x24\x94\x94\x09\x23\xef\xc8\x9f\xc1\x2d\x0e\x1d\x47\x24\x53\x28\x71\xe4\xad\xfc\x19\x8c\x41\xde\x30\xb5\xf5\xdd\x6d\x7b\x0a\x53\x6c\x6e\x06\xdb\x0e\x8f\x5f\xe3\xb4\xaa\x6f\x13\x8f\xdf\x60\xcf\xe0\xd0\x17\xdb\x4c\xd3\x72\x9d\x13\x63\x0a\x53\xe2\x6e\xc2\xa8\xb8\xbb\x56\xf1\x45\xe0\x2d\x61\x06\x33\x7d\xb5\x2d\x7f\x64\x13\x53\x98\x04\x91\xe9\xa9\xac\x49\x99\x1a\x5e\xc8\x0e\x97\xf8\xbc\xfe\x75\xca\x8c\x9d\x08\xe0\xfb\xa6\xcb\x1a\x9f\xa0\x9a\x69\xac\x38\x3a\xf2\x27\xcd\xc8\xeb\xe3\xa7\x97\x14\x59\x34\x23\xaf\x8b\x4f\x37\x15\x59\x77\xf4\xe9\xf9\x0d\xd6\xca\xfb\x97\xb4\x72\xd6\x8c\xbc\x1c\x0f\x2f\x36\x14\x31\xed\x5d\x65\x91\xc1\x05\x65\x29\xfc\x41\x35\xd3\x33\x3d\x0a\x98\xe1\x1f\xbe\xb9\x58\xcf\x8c\xfd\xc1\x05\x25\x29\x1e\x5f\xb8\x4a\x4e\x2f\x28\x3b\xe3\x7b\x67\xe6\x92\x67\x3e\x39\x33\x8f\x2e\xe8\x26\x1c\x9f\x3a\x33\x47\x21\x1d\xac\xe3\x0b\xa2\x84\x95\x9b\x12\xaa\xc8\x14\xe8\xd6\xfd\x60\xcd\x30\xa8\xc1\x2e\xdd\xb5\x85\x0c\xbf\x8d\x5d\x19\x3e\xd9\x2b\x0d\x31\x37\x2a\x39\x30\x22\x98\xf8\xe7\xcd\x96\x69\x12\x46\x1c\x41\x0e\x98\x95\x4f\x67\x06\xa7\x91\x9a\x24\x53\x28\xe3\x68\xcd\x83\xfe\x45\x36\x60\x29\x4a\x02\xaf\x3f\x83\x7b\x65\x74\x31\x02\x3d\xf3\x69\x13\x4b\xf6\x61\xf5\x19\x1c\x2b\xb3\x0d\x0e\xd1\x10\xcf\xf1\x01\x70\xf3\xdc\x51\x68\xc6\x11\x78\x5b\x57\x6d\xfe\x55\xd1\xf8\x2d\x3c\x9b\x77\xbf\x56\x7e\x9d\xa2\xe0\x3e\xf3\xbd\x06\xc8\x0b\x86\xaf\x87\xcc\x8c\x23\x5f\x89\x73\xe5\xe4\x06\x6e\xa2\x07\x60\x34\x3b\x8a\x82\x97\x9d\xef\xbd\x8c\x66\x03\x46\xb3\xb7\xa0\xc5\x25\xb3\x99\xd4\x17\x78\x9a\x2b\x3f\xd3\x15\xc9\x0c\x86\x09\x71\xd8\x1e\x4c\xa1\x4a\x02\xaa\xf1\x07\xd0\x51\x07\xda\x43\xf8\x42\x57\x0a\x53\xe8\xa8\x12\x33\xf8\xe2\x9d\xc1\x0c\xee\x2e\x89\xc3\xda\x60\x0a\xa3\xcb\x80\xae\x1e\x4e\xa0\x23\xd3\xd0\x29\x7c\xa1\x8b\x8b\x03\xe8\xa8\x12\xef\xe1\x8b\x37\xf5\xd9\xe9\x90\x98\x3c\x77\xf8\x93\x37\xe7\xf2\x9e\xa0\x25\x16\x27\x4a\xcd\x1b\x18\x27\x9f\xd8\x00\x54\x2d\x71\x8c\x3b\x75\x06\x80\xcc\x2d\xbf\xda\x54\x9f\xf4\xa5\x86\x8d\x76\xc0\x2e\x21\x62\xb7\x7f\xba\xb0\xa3\xbc\xf9\xd4\x32\x86\xba\xed\xf8\xbc\xba\x6d\xe4\x9b\x3e\x00\x92\xea\x7e\x09\x17\xeb\x5f\x58\xd7\x07\x94\x42\x8c\xb0\xa9\x6a\x58\xec\xf9\x01\x5d\x3f\xd6\xfa\xb5\xb6\x62\xaf\xdd\x29\xa5\x08\x55\xd8\x0b\xd1\xe7\x19\xf6\x4a\x6e\xba\x22\x2d\xf5\xd9\xfd\xa5\xcf\x62\x6d\xc9\x45\x84\xb0\xa4\xd5\x16\xfb\x64\x8c\x5f\x72\x5e\x4d\xd6\x3e\xf7\x1e\x3f\x69\x94\x57\x10\xb2\xe5\x76\x53\x32\xdd\x13\x4c\x40\xfa\x5a\x98\xcb\x93\x15\x3c\xd2\x3d\x10\x7e\x82\xac\xb6\x3a\x59\xca\xec\x2f\x6c\xed\xd8\x0f\xed\x8f\x94\x6f\x70\xe8\xb8\x05\x66\x4a\x3a\xad\x5d\xe0\x14\xf5\xb5\x5f\xcf\x7d\xa9\x13\x0a\xa7\x01\x57\xc4\x14\xcb\x90\xa9\xb7\x53\x70\x27\xc7\x97\xe8\x3f\xc2\x13\x10\xe5\xbb\x7a\x0e\x27\xf0\x8c\x7d\xb4\xfe\x06\xf0\x8d\x2f\xa3\x72\xb8\x0f\xdc\x63\xe2\x55\xfe\x21\x4c\x15\x99\x13\x4d\xe6\xa4\x01\xb7\x40\xbc\xd2\x3f\x04\x22\xbd\x50\x12\x4d\xe6\xa4\x01\xdf\xd7\x2b\x4f\xde\xa8\xf2\x23\xf8\x16\x19\xdf\x99\xcf\x1d\x57\xa4\x9d\xba\x11\x58\x58\xbf\x3d\x48\x9e\x0f\x05\x90\x1d\xc3\x17\xc9\x7b\x47\xc0\x16\xb4\x7d\x75\xf5\x14\xaf\x79\x4b\x70\x29\x7b\x83\x5b\xa2\x4c\xbf\xc4\x39\x72\x5b\x9e\xb7\xd5\xe5\x9b\x19\x76\x47\x0d\xcb\x31\x73\x35\xea\x0b\x44\x07\x7e\xe4\x15\xcc\xa1\x5a\x8c\xdf\x2d\xae\x80\xa8\x35\x47\x85\xbf\xa9\x1c\x7f\xe4\xb7\xbc\x02\x3f\xec\x04\xbb\x60\xb0\xc7\x3b\xc1\x1e\xf9\x2d\xaf\x87\xdf\xdb\xb0\x72\x71\x59\x83\x3d\x60\xf5\x8e\xc9\x4e\xfd\x25\x2d\xaf\x8f\x1f\x6c\x58\xb9\x9c\x34\x61\xf1\x55\xcb\x58\x4d\xc4\x0e\x71\x29\x00\x3f\x80\x22\x5e\x3c\xf1\xe9\x52\x64\x09\x8f\x3e\x5d\x8a\xb4\xcd\xc2\xcc\x23\xa6\xaf\x63\xf7\x4a\x07\x70\x6d\xa4\xaa\x4e\x47\x3e\xc0\x37\x99\x78\x0e\xc8\xe4\x3b\x6b\x63\xe3\x8c\x08\xf1\x11\x2e\x24\x17\x9d\x43\x1a\x79\x85\xe1\xc9\x15\x0a\x6d\xdf\x53\xe6\x3e\x0d\x76\xbc\x60\x71\x95\x36\xf7\xcf\xea\x97\x63\xa6\x1f\x40\x46\xd9\xe4\x11\xbb\x56\xe8\x1a\x88\x20\xb1\x3c\x54\x41\xc5\x64\x1c\xa0\x44\x8c\x08\x15\xd8\xf8\xf8\xf9\x6a\x0a\xab\x96\xa5\x59\xcb\x1c\xd3\xce\x7c\xfc\xd1\xce\xac\x30\xdd\xa8\xdc\xfa\xcf\x56\x53\xd9\xd5\x34\x8c\x6a\xf0\x17\x66\x02\x85\x09\x1d\xf8\xb6\x69\x07\x42\x10\xbe\xa2\xeb\x9b\x58\x24\x8a\xb5\x4d\x70\x45\x57\x6c\x2f\x82\x2f\x5f\x02\x1f\x5e\x19\xc6\x10\x3b\xac\xf1\xb2\xba\x58\x6e\x6f\x0a\x65\x22\xf0\xbf\xc1\x9f\x25\xc3\x95\xb8\x27\x98\xbc\xed\xb0\x3d\x51\x81\x10\xd9\xa6\xa9\x27\x09\xb8\x32\x6c\x64\x26\xc6\x73\x15\xfb\x5f\x9e\xb9\xe6\x0c\x03\x11\x5b\x6b\x00\xda\x79\xb9\xa9\xd8\x35\x53\x68\x3a\x73\x3a\xce\x1c\xf2\x11\x02\x63\xca\xed\xbc\x26\x7e\xd6\xa2\x5e\x9e\x9f\xbc\xc1\x72\x18\x07\xc1\x4f\xbf\x96\x6f\x3a\xae\xe5\xb3\xda\xbc\x8b\x9d\xbe\x55\x17\x81\x57\x69\x2b\xcf\xf4\x11\x5f\x22\xe5\x4b\xbb\xc4\x9d\x67\xd6\x0a\xdf\x78\x3c\x21\x70\x05\xd0\xcc\xa2\xba\x85\xef\x0b\x0e\xdc\x7e\x56\x84\x28\x53\x34\x92\x75\xe5\xe0\x3e\xab\x43\x9f\x03\xef\x0c\xc6\xf8\xce\x79\xd8\x35\xc2\x54\x26\x9e\xf0\x83\x7d\x4e\xf7\x31\xbe\xc7\xc8\x71\xee\x75\x79\x29\x4b\x2d\x60\x89\x0f\x0c\x8a\xce\x6a\x26\x45\x0d\x78\xd8\xe6\x63\x16\xa3\x53\x60\xc6\xd4\x68\xe2\xd3\x7f\x25\xfe\x88\x25\xf8\x0d\x6e\x31\xa7\x87\xca\x67\xeb\x71\x7c\xac\x72\xc6\x98\x99\x0c\x1a\xb6\x80\xcf\x2c\x6b\x4f\x31\xbb\x28\xe0\x46\xe9\xb4\xcf\x3e\x1a\xf8\xca\xa0\x69\xe8\xb7\x98\xdd\xb2\x4e\xe9\x32\x63\x26\x12\x1a\x6c\xd8\xb3\x19\x32\x8a\xbc\x23\x1f\x65\xca\x8b\xf2\x73\xcb\x5b\xf9\xa8\x90\x37\x0e\xf8\xf8\x42\x1a\x9b\xae\xb3\x93\xf2\x9b\xae\xc5\x85\xf3\x03\x61\x88\xbe\xf4\x95\x1f\x6d\xfa\x84\xd3\xa0\xe6\xc7\x25\x63\xcb\xae\x70\xe4\xaa\xfa\x73\x24\x1c\xb6\xe6\x18\xe5\xe1\x56\xaa\xdc\xd5\xbd\x9c\xec\x1e\x2e\xa4\x67\x6f\xad\x87\xdc\x0d\x65\x6a\xf7\xd0\x8c\xc4\x27\x43\xe8\x6e\xee\xa1\x0a\x9d\xb7\x43\x0f\x7f\x7f\x1a\x2e\x37\xf7\x70\x25\x2f\x52\x6a\x3d\x1c\x48\x26\xac\xf7\xf0\x60\x2d\x8e\xe1\x64\x4b\x0f\x15\x26\xdb\x7b\x88\x67\xd0\x5a\x3b\x27\xdb\xe8\xcc\x6a\x7a\xc1\x5e\x32\x02\xa7\xe1\xfa\xae\xfb\xf3\x77\x71\x43\xb3\x34\xa2\x4e\xac\xe4\xf1\x6b\xb5\x6e\x09\xba\xf1\x20\xce\x65\x1d\xda\x36\xbd\x94\x49\x28\x75\x58\xfd\x9d\x19\xde\xf1\x73\x44\xb1\xa2\xac\xbf\xc7\xf8\xd6\x8f\x8c\xa0\xdd\x89\x63\x4d\xb1\x71\x9f\xd4\xab\x9b\xeb\x5b\xd7\x11\xcd\x63\x9c\x8b\x23\xf0\xfc\x08\x7f\xd9\xbe\xf1\xd1\x0e\xa7\x1d\xf3\x0c\x9f\xd4\x41\x6c\x3f\x60\xc3\xae\x1a\xcf\xc0\x0c\x45\xca\x5c\x5f\xdb\x3f\xe0\xf9\x6a\xb9\x6c\x67\x4a\xe3\x8a\x7e\xfd\x45\x47\xfd\x1e\x37\xe5\xf5\xa8\xa1\xbe\x32\xb5\xc0\xb0\x13\x75\xec\x63\x0b\xb0\xf3\x7c\x9a\x5d\x97\x51\xcd\x1c\x97\x50\x8f\x4f\x9d\xeb\xc7\x8e\x78\x1c\x73\x7d\x33\x85\x15\x88\x9c\x42\x41\x16\x0a\xb0\x40\xe4\x09\xc4\x29\x52\xd7\xb6\x96\x0f\xc5\x41\x98\x6d\x97\x66\xf0\x65\x18\xd8\x4e\xf1\xff\xd8\x85\xdb\x4e\xbe\xee\xc5\x03\x1e\x4a\x5f\xf7\x64\x81\xe7\x7e\xa0\xcc\xe4\x03\xd3\x03\xe7\x95\x0c\x23\xbb\x73\xc5\x8c\xfb\x3a\x5d\x59\xf9\x97\xbf\xe8\x7b\xb7\x2b\x3d\x6e\xe2\xbf\x0c\xcb\xd0\x9f\x10\x61\x31\xd5\x52\xa7\x5f\x0f\x1e\x51\x82\x72\x7d\x4c\xeb\x3b\x66\x33\xa8\x7d\x28\xfc\x01\xac\x0b\x86\x10\xc5\xf5\x78\xbf\x4d\xf4\xa6\x37\x98\x9a\xc5\x7e\x16\x61\x42\x4d\x98\xac\xbe\xca\x94\x51\x7a\x6b\x84\x59\xfb\x9a\xc0\x25\x8f\xd5\xbe\x02\x59\xf3\xa7\x27\xa0\xf2\x36\x5b\x82\xf4\xbd\x0a\x1f\x41\x28\xe3\x8d\x7b\x76\x4b\x92\x73\xe1\x32\xc4\xb7\x84\x78\x2b\x18\xe0\x05\x11\x54\xe8\xd4\x8d\x4f\x05\xf1\xda\x2c\x18\x4b\x4f\x88\xe9\x21\xbe\x09\xbe\xb0\x62\x93\xa0\x96\x81\x8f\xc3\x6b\xda\xfa\xda\x64\xd4\xf4\x4e\xf0\x85\x19\x66\xb2\x63\x85\xa0\x69\xbf\xc7\xd3\xab\x93\x0b\xaf\x82\x03\x3c\xbb\x3a\xbd\x90\x26\xb9\x64\xed\x88\x2c\x74\x7a\xd7\xd4\x72\xad\x48\x15\x89\xa5\x07\x7a\x0e\xcf\x2a\x2b\x00\x84\xe1\xe0\xe6\x5f\xa9\x33\x43\x22\x3f\xae\x62\x28\xe7\x2f\x94\x7e\x3d\x35\xdb\xbe\x76\x99\x5d\xc1\x3d\xd0\x49\xa8\x02\x7c\x84\xb6\x1d\xf3\x2d\xac\xb0\x37\x20\x08\x7d\x60\x86\x0b\x13\xe9\x58\xa6\x67\xbb\xe5\x40\xaa\x0f\xd7\xf3\xba\xc7\x16\x31\x65\xc1\x13\x0c\x80\xad\x03\x1e\x59\x38\x81\x73\x1d\x60\xc4\x3a\x8d\x7c\x0f\x47\x98\x85\xe4\x7e\x8f\xa5\x73\x61\xa8\x60\x62\xbb\xb7\xdb\xda\x0f\x6d\xed\x88\x1e\xf0\x08\x98\xdf\xe2\x13\x0b\x69\x71\x82\xdd\x44\x08\xd1\x07\x7c\x82\xbd\x03\x1f\xa1\x1b\xe6\xb2\x58\xfa\x89\x01\xb3\x03\x11\x88\xd1\x09\xc3\xc5\x66\xe6\x57\xdc\x05\xff\x81\x05\x53\x68\xf8\x6e\x22\xc4\xe8\xd8\x6f\x60\xaf\x22\x08\x7d\xc4\xde\x19\x46\xe7\xbe\x49\x84\x64\x47\x22\x58\x9d\x18\x48\xf3\x6e\xe1\x52\x66\x45\x5d\xb1\xea\x77\x1e\xa1\xc4\x8f\xf8\x58\x39\xff\x2e\xf1\x9c\x30\xbf\x83\x2c\xb4\x75\xa1\xa5\x23\xf2\xfa\x0d\x71\x42\x1e\x82\xc8\x9e\x93\xe1\xf3\x4b\x90\xc4\x11\x2b\x26\xf4\x5b\xff\x9e\x73\x17\x47\xee\xb9\xfb\x62\x55\x7e\x88\xbf\x4a\x4d\xde\xc0\xd1\x00\x8c\x49\xbe\x92\x8e\x32\x09\x7a\x82\x23\x1e\xcc\xff\x8e\xed\x9c\xd1\x07\xee\xf1\xfb\x91\x79\x63\x9d\x41\x62\x30\xb5\x3c\x92\xfb\x08\x4b\x60\xb0\x1c\x88\x4e\x44\x7d\x55\xa1\x3f\x36\xa0\xbe\xec\x72\x87\x17\xc0\x9a\xe0\x75\x2f\xb7\xc2\xc7\xe8\x10\xd7\x04\x42\xe9\xab\xe0\x20\x37\xfe\x59\x93\xed\x1c\x87\x3e\xdb\x87\xbf\xe7\x11\xfe\x6f\x58\x50\x8a\x49\x6d\x2a\xc8\x1b\xc8\x99\xdf\x00\x06\xcb\x81\x56\x7e\x62\xc4\x3d\xd2\xa3\x35\x92\x7d\x3d\xf6\x57\xc0\x9a\xe0\x75\x1f\x6c\x85\x8f\xd1\x2d\xa9\xc9\x8d\x05\x51\xa1\x21\x1e\xc8\x79\x53\x3a\x35\x97\xaa\x7d\x74\x8b\xa9\x3a\x3c\x22\x26\x5d\xe5\x12\xe1\x94\x1c\xf1\xb6\x39\x50\x19\x24\x72\x38\x6b\x74\x9a\xc8\xbe\x0e\x83\x06\xb0\x26\x78\xdd\xf3\xad\xf0\x29\x7a\x0c\x1a\xa6\xe8\x3a\xab\x45\x7c\x70\x09\x31\xd7\xf6\xae\xe7\xb8\x3a\x5d\x5b\x1e\xdd\x35\xeb\xd2\xac\x19\xca\x72\x87\xcd\x93\x26\x1b\x8e\xb1\xcf\x38\xe2\xa3\x72\x33\x3f\x07\x74\xde\x34\x47\x50\xda\x2e\xbd\x6f\xae\x38\xf7\x70\xa0\xd1\x45\x62\x6c\xc5\xf4\x88\x0c\x24\x55\x66\x17\x4b\x3e\xe2\xbc\xee\xd5\x56\xf8\x18\xb5\x4d\x3f\xda\xb0\xbe\xe4\xb3\x82\x24\x6c\x36\xc0\x4a\x0f\xf1\x87\x0b\x79\xbb\x33\x30\xcc\x3f\x06\xd0\xc0\x8b\x0b\xe6\x36\xd3\x51\x37\x61\x61\x64\x5a\xaa\x84\xca\x19\xaa\x34\xc2\x39\x6c\xdc\x64\x3f\x23\x41\xf5\x9d\x8c\x25\xf8\x63\x11\x1a\xd8\x91\x83\x1f\x63\xe1\x6c\xa8\x63\x8c\x95\xb0\x69\x27\x93\xd5\x8d\xe7\x5c\x8b\x27\x0e\x8c\xbf\x22\xef\x1c\xfc\x8c\x89\xa2\x30\x5c\xdf\x08\xf6\x5c\x1b\xc1\x9e\x63\x23\xd8\x73\x6c\xfa\x36\xa6\xd9\x75\x19\xd5\x34\xb0\x0a\x7a\x58\x5b\x12\xd7\x9d\xcc\x7b\xe2\x0e\x64\x81\xbd\x69\xe0\x93\x27\xfc\x6f\xd9\x7f\x11\xae\x4e\x41\xf1\xaf\x74\xec\xb4\x6f\x30\xa3\xfd\x92\x75\x55\x8c\x3f\x02\x1b\xd8\x11\x96\xf1\x33\x96\x2c\xee\xd0\xc0\x30\x39\xec\xe8\x70\x8c\x27\x46\x55\x03\x23\x46\x76\x47\xf6\x4a\xde\x56\x9b\x20\x0b\x0d\xb2\x04\xfc\x88\xf9\x58\x9c\xc0\x13\xfe\x67\x9a\x14\x8e\x93\x3c\x99\x90\x6d\x07\x51\x04\xfd\x06\x5f\x3b\xd8\xb8\x3c\xe3\x4b\xfc\x1b\x9f\xee\xea\xcd\xc3\x55\xf9\x5b\xfa\x4b\x7f\xc3\xd1\x93\xe5\x5e\xdd\x44\x4d\xf9\x1d\x98\x58\xc5\x40\x59\x98\x81\xdb\x42\x23\xa2\x28\x21\x4e\x4b\x9e\x76\xbd\x8b\xbd\x97\x7a\x05\x12\x19\xd3\x8a\x13\xe8\xe4\xd2\x4e\x39\xbf\xd4\xdf\x3d\xda\xb8\xf6\x74\xc5\x20\x6c\xbe\xe4\x30\xe6\xe5\xdf\x69\x20\x6a\x22\xbb\x56\x8e\x5f\xd9\xad\x54\xf1\xd6\x01\xdd\xd6\xa3\x0c\x84\xc6\x87\x9d\xd6\xcf\x2f\xdb\x2e\x97\xe7\x29\xb0\xb8\xa2\x25\xb7\x39\xb7\x26\x42\xe2\xa0\x64\xbe\xc5\x5f\x9f\xea\x9d\x5b\x7c\x0b\x6c\xc1\x86\x13\x3b\x74\xe6\x6b\xaa\x3b\xa4\xd5\x9d\x01\xfb\x24\x89\xf1\x09\xc3\x81\x8b\x05\x42\x07\x0b\x84\x75\x16\x70\x2d\xd6\xed\x89\x45\x6e\x2e\xb9\xb6\x9e\x02\x87\x1a\x01\xc2\x33\xa0\xb9\x32\xa5\xcf\x12\xfa\x3a\xa1\x82\x0d\x29\x23\xa3\x9e\x39\x4f\xaa\x57\x8d\xfd\x19\x70\xf5\x2c\x0d\x3b\x02\x64\xde\xc3\x0e\xe0\xce\x2f\x41\xdb\x63\x4f\xfc\xaf\x3a\x0b\x5d\x46\x2f\x82\xcd\xd6\x61\x65\x9c\x81\x1f\xaa\xb7\xbb\x0e\x2b\x0f\x64\x5f\x5d\x2f\x8e\x58\x7c\xd4\x11\xa8\xfb\xc0\x31\x23\xf0\x08\xa4\x74\xa1\x09\xb4\xfb\x23\x50\x0b\xa5\x31\x0f\xbf\x3b\x02\x3e\x5d\x79\x4a\xc1\x12\xf8\x67\x3a\x51\x32\x06\x2f\xbb\xf1\xbf\xc8\xf8\x00\xa5\x9f\x47\x5e\x7e\xe3\x5f\xb9\xee\x3a\x4b\x3f\x8b\xbc\xe2\xc6\xbf\x70\xd9\xcd\x95\x7e\x1c\x79\x25\xdc\xf8\xd8\x65\xf3\x5f\xfa\x38\xf2\xfa\x37\x7e\x1c\x3a\x2c\xf2\x4a\x3f\x90\x9f\xdc\x14\x6b\x4d\xf9\x8d\x31\xbe\x32\x7d\x84\x21\x46\xae\x18\x98\x35\x73\xc6\x15\x84\x2c\x91\x28\x87\x1d\x76\x04\x26\x5e\x69\x69\xce\xc7\x44\xb9\xf9\xe0\x80\xce\x19\xa2\x0e\x43\x1d\xef\x7d\xf5\x3e\x65\xef\xba\xfe\x5d\x3c\x86\xe8\xb2\x51\xc2\x9f\xe9\x9c\x73\xfd\x78\x66\x16\x3d\xc5\x2b\x1c\x78\x2b\x38\xc1\x37\x3e\x9b\x7e\x26\x2a\xb9\x85\xca\xc8\x46\xa5\x67\x75\xdd\x7e\xaf\xc0\xc2\xa5\xfb\x42\x5c\x06\xb0\x3b\x32\x8b\x3d\x32\xbf\x39\x32\x8d\xff\x0c\x64\xf0\x95\xe8\x42\x43\xaf\x21\xfa\xca\x12\xa7\x50\x4f\x32\x5c\xa2\xe8\x8f\x0d\x4d\x14\x34\x31\xc3\x1b\x4b\x89\xb1\x1b\x38\x11\x02\x67\x64\x98\x37\xcd\x8d\x8f\xc6\x2c\xf4\x25\xcc\x48\x3f\x4a\x15\x2a\x68\x6f\x3a\x33\xad\x17\xae\xea\x01\x1c\x65\x71\x3e\x56\x9c\x72\xeb\xad\x9b\x6b\xfe\xf9\x5a\xf5\x4a\x19\xf3\x4f\x08\xb9\x7a\x60\x56\xb0\x32\x72\x57\xba\x82\x15\xf3\x55\x61\xb4\x35\x6e\x14\xfb\xf6\x8d\xa2\xc4\x72\x60\x60\x60\x7c\xe1\xb7\x63\x33\xde\xc0\x26\x9c\xb1\x73\x59\x80\x58\x95\x23\xa2\xcf\xdf\xd4\x2a\x75\xaa\xcb\x94\x46\xe6\xd4\x40\xd4\x68\x7e\x09\xd6\xa8\x18\x05\x47\xac\xc8\xd2\x28\x52\x19\xed\xac\xe1\xa0\x4e\x36\x30\xb7\x65\x30\xf4\x3d\x32\x3c\xae\x64\xa1\x41\xbd\xe7\xaa\xa5\xa5\x8d\xf9\xd4\x00\xe4\xa8\x9b\x24\x2a\x8d\xed\xef\x54\x0f\x40\xa9\x4f\x4f\xa7\xc6\xf4\x1c\xe8\x6a\x27\x06\xe6\x7a\xcc\x7a\x1a\xf1\x09\xd8\x03\x36\x71\xb0\x9f\x2c\xc3\xf1\x9e\x1b\x65\x46\xe0\x6c\xc6\xf8\x24\xef\xc8\x18\x13\xf3\xe6\x7a\x62\x3c\x1b\xdf\x92\x96\x27\x07\x44\x96\x99\x1b\x58\x8f\xc0\xbc\xd9\x54\x68\x8f\x0c\xc0\x91\x73\xac\x47\x46\xc7\xe7\x1b\xe6\x5a\x5f\x63\xb8\x30\x00\x4d\xe6\x19\xd4\x78\xca\xaa\x71\x61\x00\x4e\x6b\x3c\x6d\xd5\x38\x70\xd7\xc8\x91\xae\x8c\x59\x5a\x68\x3a\x15\x16\x81\xbb\x96\x44\x35\x9b\x9d\x80\x19\x2f\x5a\x51\xa9\x5c\x9b\xff\x13\xdd\x78\x57\x53\x69\x64\xc0\xad\xb3\x84\x99\xde\xd5\x14\x9b\x6e\xa8\xdc\xb8\xa8\x30\x19\x6e\xb4\x81\x11\xcc\x74\x71\x1e\xf5\x01\x77\xe9\x54\x3b\x63\xfa\xac\x78\x91\x32\xe8\xbf\x48\x19\x8c\x5e\xa6\x0c\xf2\x1f\x51\x06\x25\xfc\xa0\x36\x98\xfe\xa8\x36\x58\xfe\xa8\x36\xe8\xef\xa0\x0d\x4a\xd8\x4d\x1d\xcc\x77\x54\x07\x8d\xd7\xa8\x83\xe5\xcb\xd5\xc1\xd1\x6b\xd4\xc1\xc9\x6b\xd4\xc1\xd1\xae\xea\x60\xfe\x0a\x75\x30\x79\xb1\x3a\x58\xbc\x42\x1d\xac\x5e\xa1\x0e\x96\xaf\x50\x07\xcb\x5d\xd5\xc1\x7c\x47\x75\xb0\xda\x55\x1d\x34\x76\x55\x07\xab\x5d\xd5\x41\x63\x57\x75\x30\x79\xa9\x3a\x98\xee\xaa\x0e\x46\x3b\xaa\x83\xf9\x6b\xd4\xc1\x72\x57\x75\xb0\x78\x99\x3a\x18\xed\xd5\xc1\x5e\x1d\xec\xd5\xc1\x5e\x1d\xec\xd5\xc1\x5e\x1d\xec\xd5\xc1\x5e\x1d\xec\xd5\xc1\x5e\x1d\xec\xd5\xc1\x5e\x1d\x98\xea\xa0\xb1\x57\x07\x7b\x75\xb0\x57\x07\x7b\x75\xb0\x57\x07\xff\xe5\xea\x00\x3f\xe1\xc0\xeb\xe1\x8b\x40\x38\x12\xf8\x21\xf1\x72\xec\x07\xf2\xd3\x28\x3e\x21\x5e\x0f\x63\x99\xfd\x1e\x57\x3e\xf1\x56\x70\x8e\xef\xa8\xfa\xa8\x97\x2b\xc1\x2a\x58\xa8\x82\x25\xfc\xba\x92\x8d\x57\x94\xc4\x97\x81\x11\x9a\x2a\xd9\xf1\x03\x3c\xcc\x9c\xb6\x5f\x2f\xb6\x93\xbb\x64\xd3\x74\x25\x2c\x94\xcd\x5f\xbb\xde\x6e\x2a\xbc\x94\x21\xf0\x32\xbc\xcd\xe0\x2d\x74\x7c\x12\xc8\x8a\x95\xa2\xbf\xfa\x28\xba\xd5\x91\xb6\x4a\x2b\x6d\x04\xdb\x7e\xc6\xdf\x5a\xd6\x98\xea\x2f\x36\xe0\x27\x1e\x5f\x4b\x18\x8a\xf6\x11\x0a\x9e\x79\x6d\xab\xd7\x42\xe5\xb6\xeb\xc0\x1b\x5f\xdb\xea\xb5\x40\x61\x8b\xa2\xdc\x51\xea\xf2\x0b\x7f\xe5\x53\x19\x93\x80\x76\x90\xc8\x9e\x73\x6b\x30\x51\x5f\xb7\xfe\x9a\xd7\x5f\xfb\xf5\xd7\x9e\xf1\x8a\x89\x61\x93\x2f\x32\x88\xc8\xe8\xaa\x0c\x51\xc1\x5f\x66\x0f\xda\x7a\x6e\xeb\x2e\x18\xef\xb9\xf5\xde\xb7\xde\x7b\xe6\x3b\x36\xe0\xb5\x2a\xa9\x75\x84\x67\xc9\x5a\x6a\x5d\x49\xb4\xed\x8a\xee\x4a\x69\x75\xa5\xb4\xba\x52\x5a\x5d\x29\xad\xae\x94\xba\x2b\xa5\xd5\x95\x52\x77\xa5\xb4\xba\x12\x2b\xb1\xab\x7b\x52\xd4\x3b\x52\xd4\xfb\x51\xd4\xbb\x51\xd4\x7b\x51\xa8\x4e\x14\xf5\x3e\x14\xaa\x0b\xc5\x6f\x3b\x2e\xbf\x94\x18\xa9\x63\x9a\xf4\xb6\xce\x8b\x62\xf3\x24\xc2\x1a\x58\x39\xb1\xc8\x1e\xf4\xea\x5f\xbd\xee\xd5\x7b\xd0\xde\x46\x5e\x07\xf9\x8b\x6d\xc3\x85\x0d\x78\xa4\xb2\x6a\x1d\xe1\x59\x85\x35\x1c\xa9\x6b\x9a\xf4\x9e\x99\x16\xc5\xb6\x69\x84\x0d\x78\xa4\xb2\x6a\x5d\x29\x75\x57\x4a\xab\x2b\xf1\xe6\xc1\x5e\x67\x85\x62\x33\xdf\x60\x0d\xac\x82\x1f\xd4\xfa\x50\xa8\x2e\x14\xbf\xed\xb8\xfc\x12\x62\x24\x2d\x6e\x09\xdb\x56\x15\x64\xf5\x39\x9a\xd5\xab\xcf\xea\x7d\xc9\xea\x3d\xcd\x36\xcd\xd1\xcc\x35\x47\xef\xfc\x0a\xe8\xd2\x78\xe2\x7f\xe0\x9e\xcb\x6b\x4a\x2d\xab\x2b\xb5\xac\x3e\x1f\xb3\xfa\xe4\xcd\xea\x53\x3b\xdb\xa4\xd4\xb2\x4d\x4a\x2d\x75\x09\xcf\xcc\x12\x9e\x99\x35\xea\x99\xc5\x25\x99\xc5\x45\xd9\x66\xe1\x99\x6d\x16\x9e\xa9\x4b\xa9\x65\x96\x52\xcb\xac\xd9\x98\x59\xb3\x37\xb3\x66\x77\xb6\x59\xa9\x65\x9b\x95\x5a\xea\x90\xe3\xff\x1c\x8f\xfc\xb6\xe3\xf2\x4b\x89\x91\x3a\xa6\x49\x6f\xeb\xbc\x28\x36\x4f\xa2\x0d\x4a\x2d\xdb\xa4\xd4\x52\x97\xf0\x5c\x27\xaf\x83\xfc\xc5\xb6\xe1\xda\x28\x3c\xb3\xcd\xc2\x33\x75\x29\xb5\x75\xb6\x77\x4c\x8b\x62\xdb\x34\xda\xa8\xd4\xb2\xcd\x4a\x2d\x75\xc8\xf1\xb5\xc1\x5e\x67\x85\x62\x33\xdf\x6c\x90\xe3\xd9\x26\xa5\xf6\x5b\x8e\xcb\x2f\x21\x46\xd2\xe2\xf6\xcb\x5a\xa9\xf5\xea\x73\xb4\x57\xaf\xbe\x57\xef\x4b\xaf\xde\xd3\xde\xa6\x39\xda\x73\xcc\xd1\x12\xf6\x5a\x6d\xaf\xd5\xf6\x5a\x6d\xaf\xd5\xf6\x5a\x6d\xaf\xd5\xf6\x5a\x6d\xaf\xd5\xf6\x5a\x6d\xaf\xd5\xf6\x5a\x6d\xaf\xd5\xf6\x5a\xed\x77\xd5\x6a\x8d\xbd\x56\xdb\x6b\xb5\xbd\x56\xdb\x6b\xb5\xbd\x56\xdb\x6b\xb5\xff\x00\xad\x86\x6f\x71\x8b\x3e\x57\xa0\xe2\xfc\xe1\x5b\x16\x4b\xa8\x02\x4d\xae\x5b\xf0\x0a\x1c\x99\xf6\x31\xfd\xfa\x87\x6d\xdb\x7e\x87\x70\x2c\xba\x0e\x2c\x38\xa7\xe6\x86\x0c\x9c\xf9\x73\x66\xe9\x36\xf5\x1f\x79\x65\x66\xc1\xc2\x2a\xc8\x0d\x40\x45\xf7\x7e\x5d\xc9\xc6\x2b\x4a\xd2\xc1\x15\xe1\x99\xa4\xe1\x9d\x11\xb1\xc9\x4c\xaa\x8c\xa4\x29\xa0\x70\x0c\xcc\x88\x6d\x0e\x2a\x84\xd9\x3d\x0f\xdb\x5f\x4f\xc9\x59\x82\x88\x86\x17\xde\x03\x1f\x66\x6e\x58\x44\x86\x18\x19\xef\x03\xb8\x25\x66\xa4\xa9\x8a\x7c\x55\x39\xe8\x52\x7c\x13\xaa\x06\x39\x15\x06\x80\xaf\x87\xec\xae\x41\x4a\x73\xcd\xd7\xd7\x99\xaf\x41\xca\x58\x8e\x36\x64\x09\x6b\xa0\x32\xe4\xa1\x09\x1a\x0c\xfc\x96\xd7\x6d\x3e\xfa\xc4\x0e\x30\xa7\x0d\xdf\x7a\xf5\xc8\x69\x95\x15\x94\x98\xe0\x20\xf0\xba\xd8\x57\x0c\xee\xa7\x94\x51\x88\x88\x88\x5a\x3c\xf9\x4b\x9f\xf2\xde\xca\x9f\xf9\x8c\x45\x64\x4e\x09\x4f\x82\x2d\x57\xfe\x07\x66\x6d\x6e\xe6\xfc\xb3\x85\x1a\x9b\x0b\x35\x1c\x85\x50\x33\x32\x41\x0b\xd4\x69\x89\xb0\x84\xe2\x9d\x45\x04\xbc\xe0\xec\xac\xc3\x0b\x35\xe5\xb7\x74\x2c\xa8\xb9\x86\x1a\x30\xa8\x13\x17\xd4\x89\x86\x5a\x02\x8a\xa9\x54\xf1\x19\xa5\x79\xe2\xbb\xff\xff\xbf\x01\x00\x00\xff\xff\xb4\x36\xa3\x31\xcc\x09\x01\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xec\xbd\x09\x77\xe3\xb8\xb1\x28\xfc\x57\xf8\x7a\xf2\xde\x9b\xb9\xa6\x5b\x9b\x2d\xdb\x3d\x79\xf7\x5c\x02\x24\x65\x4a\x96\xd4\xb2\xec\xf6\x78\xd2\x39\x69\x9a\x82\x25\x5a\x5c\x24\x2e\x92\xe5\x9c\xfc\xf7\xef\x60\x25\xb8\x49\xea\x9e\x49\x32\xf7\xbb\x9d\x93\xd3\x23\xa3\xb0\x55\xa1\x50\x55\x28\x14\x8a\x7f\x7f\xb7\x41\x51\xec\x86\xc1\xbb\x0f\x1d\xf5\x5d\x1c\xa6\x91\x83\xe2\x77\x1f\xfe\xf2\xee\xfd\xfb\xc6\xfb\xf7\x8d\xd8\x89\xe3\xc6\x53\x18\x26\x71\x12\xd9\xab\xf7\xf8\xcf\x77\xaa\x0c\xfb\x5b\x14\x86\x49\x65\x39\x7a\x92\x20\x33\x37\x4e\x1a\xf9\xbe\x4a\x4d\x36\x28\x98\x85\x51\xe3\x6f\xd1\x73\xcc\x9b\xed\xa9\xed\xbb\xaf\x6e\x10\x37\xfe\xb6\x08\x37\x28\xaa\x9a\x40\xb2\x5b\xa1\x8a\x72\xde\xce\x73\xe3\x24\xae\x6a\xe7\xfa\xf6\x1c\xc5\x7b\x5a\x92\x0a\x7b\xe0\x4f\x61\x34\x43\xd1\x69\x64\xcf\xdc\xb4\x72\x04\x27\x9c\x55\xb5\xff\xdb\x3c\x72\x67\x7b\xfa\x3d\x00\x7e\x8a\x90\xbd\x5c\x85\x6e\x90\xc4\x07\x3a\x39\x7d\x8e\x6c\x1f\x6d\xc3\x68\x59\x49\x37\xfb\xc9\xdb\x8b\x3f\xa9\x70\x1a\x85\xdb\xaa\xd6\xcf\x61\xe4\xef\x6d\x1c\xd9\x41\xec\x26\x6e\x18\xec\xa9\x74\xa8\x93\x39\xa6\x2d\xaa\x46\xf4\x6f\x4f\x69\x92\x84\xc1\xbe\xe6\xf5\x35\xa4\xe9\x55\x82\x67\x51\xb8\x9a\x85\xdb\x7d\x73\x77\xec\x08\x25\x7b\xe0\x81\xbd\x39\x9d\xb9\x1b\x77\x56\xcd\xb5\x74\x6e\xa7\xf3\x28\x4c\x2b\xb7\x9b\x1b\xac\xd2\xa4\x1e\xec\xa4\x71\x12\xfa\xa7\x75\x04\xc4\xa3\xd7\x14\x3f\xd9\x95\xf3\x71\xec\x68\x56\x39\xcf\x08\xd9\x33\x27\x4a\xfd\xa7\x2a\xe8\xca\x9e\xbb\x81\x7d\x60\x95\xf7\x56\xfa\xdb\x93\x3d\xdb\xbf\xcb\x6a\xe0\x7f\x7b\x49\xfd\xa7\x30\x89\xaa\x7b\xb5\x3d\x14\xed\x5b\x9d\x3a\xf8\xdf\x56\x51\x38\x8f\x50\x5c\x49\x54\x1f\xcd\x5c\xbb\x0a\x80\x65\x4c\xed\x5a\xc9\x82\x68\xcf\x82\x7a\x61\x5c\x89\x66\x12\xda\x35\x02\xcc\x0f\x67\xb6\x57\xdd\x24\xf4\x12\x77\xdf\x5c\x22\x14\xa3\xe4\x34\x41\xaf\xd5\x34\x08\x57\x75\xc2\xd6\xb1\xa3\x30\x8d\x91\xb7\x6f\x63\x78\xc8\x8e\x9e\xdd\xd7\xaa\xe6\xf1\xca\x0d\x02\x14\x55\xa1\x93\x26\xae\xe7\x26\x2e\x22\x8b\xe3\xce\x83\xbd\x2c\xe1\x2c\x31\x21\x83\xd9\xe9\xc6\x8e\x5c\x3b\x48\xf6\xf7\x97\xd5\x3f\x50\x8f\x08\xf4\x03\x93\x9b\xb9\xf1\xca\xb3\x77\xfb\x2b\x21\xff\x09\x1d\x18\xec\xd9\x43\xaf\x87\x6a\x84\xf6\x01\xcc\xdc\x20\x41\x91\xed\xd4\xc9\x31\xa9\x26\x5e\xd0\x67\xaf\x52\x96\x4b\xb5\x56\x61\xad\xcc\x96\x6a\xc5\x4e\x84\x50\x80\x05\x43\x35\xb5\xf8\x3a\xd1\x7a\xa7\xb4\xe2\x81\x2e\x17\xf6\x2c\xdc\x1e\xc0\x21\x76\xdf\xdc\x60\x7e\xa0\xce\xca\x76\x0e\x57\x4a\x22\x94\x38\x0b\x34\x3b\xf5\xdc\x60\xb9\xbf\x6e\xcd\x26\x11\x7a\x0e\xbd\x26\xa7\x49\x94\x06\x8e\x9d\xa0\x43\xf5\x90\xbf\x5a\xd8\xb1\x1b\x1f\xaa\xb7\x70\x2b\x0d\x07\x69\x56\x1b\x37\x76\x9f\xf0\x5f\xbb\x6a\x21\xe6\xf2\x3d\xf1\x57\xf5\x5d\x60\xfb\xc4\xd4\xfb\xab\xfa\xce\xb7\x57\x2b\x37\x98\xc7\xef\x3e\xbc\xd3\x34\x4d\xfb\x19\xff\x4f\x83\x9a\xa6\x0e\xb5\x9e\xa5\x8e\x35\x4d\x53\x27\xf8\x9f\x69\xc5\xaf\x0c\x3a\xdc\x5b\x6f\x52\xd1\x62\x9c\x07\x0c\xf2\x65\x8f\xf4\x97\xa5\xa9\xf7\xc5\x32\x4d\x2e\x1b\x57\x94\xed\x19\xd7\xd2\xd4\x39\xc0\x3f\x0d\xfc\x0f\xfd\x39\x3c\xf4\x73\xac\x0d\x4c\x75\x47\x7e\xda\xf8\x1f\x88\xff\x59\x02\xf1\xf3\x5e\xfc\x1a\x8a\x5f\xf3\x0c\x3c\x10\xbf\x1e\xc4\x2f\xb7\xaa\xb5\x0f\xaa\x9a\x4b\x55\x7d\xa0\x41\x4d\xdd\x92\x02\xa7\xa2\xff\x6c\xf8\x49\x55\xf3\x6c\xf2\xf7\x10\x9a\xaa\x01\xd7\x00\xd7\xd4\x35\x75\xaa\xbf\x00\x83\x4e\xef\x41\xeb\x99\xea\x40\x83\x06\x25\xf7\x03\x1e\xf1\x91\x0e\x03\x35\x46\x05\xf2\xf3\x0c\xd0\x35\x19\x9a\x12\x07\x3c\x08\x5a\x17\xfe\x21\x93\xb4\xe8\xd4\xa0\xc1\x5b\xdc\xb3\xa1\xc6\x74\x49\xf8\x50\xff\x6e\x2a\x1b\x6b\xcb\xa2\x2d\x06\x66\x60\xf5\xe9\xa4\x2c\x31\x3d\xf2\x8b\x31\x3c\x64\xe3\x11\x92\xd0\x4e\x06\xbd\x47\x53\x6d\xc2\x6b\x8e\xe6\xa3\x36\x35\xd5\x1e\x46\xf3\x81\xfe\x09\x35\x09\x61\xc6\xac\x36\xae\xa2\x69\x35\xff\xf0\xb6\xa4\x85\x43\x69\x30\x36\xf1\x9f\x25\xc0\x00\x2e\x80\xa9\x36\x81\xde\x06\x78\x2c\xc3\x60\x58\xde\x67\xac\x73\x2f\x56\x65\x2e\xff\x0d\xc5\x52\xf1\xbe\x48\xaf\x6e\x46\x5e\xbe\xfa\x3d\x93\xae\xa2\x23\xaa\x3f\x88\x2e\xe8\x26\x85\x11\x30\xd5\x9e\xbe\x05\x9a\xda\x83\x6f\xf8\x5f\xfd\x0c\x94\xe7\x8a\x7b\x1a\xc2\x57\x80\xf1\x21\x34\x35\x35\x75\xa8\x77\x81\xc1\xc7\xef\x31\xca\x31\xba\xf3\x3f\x19\x09\xf8\x70\xa4\xde\x83\xc4\x48\xfc\x1f\x32\x80\x41\x26\x30\xd6\xdb\x80\xf5\x33\x26\xc3\x1a\x7c\x8d\x2d\x73\xd0\x57\x2d\x78\x05\x34\xd5\xd2\xe7\xd0\xa0\x4b\x32\x35\x3e\x1a\x1c\x3e\x35\xf9\x38\x50\x53\x11\x15\x31\x3d\x13\xb3\xf3\x90\xb3\x38\x1c\xd1\x3f\x2d\xb6\x38\x23\xba\x38\x19\x97\xcc\x41\x81\x4d\x1e\xad\xc5\x8d\xa6\x4e\xfa\xfe\x4d\xb9\xda\xbd\x36\xed\xab\x6d\x50\xd9\x83\xd5\xb8\xc1\x8b\xd2\x5f\x0e\x2b\x80\xb0\x01\xfa\x74\x10\x4b\x4f\xf1\xbf\x30\x81\x9a\x3a\xd0\x9b\x9c\x86\xbf\x4d\x6c\x18\xaf\xba\x20\xca\x99\xde\x57\x2d\xcc\x5f\x6c\x51\x0d\xb1\xa8\x06\xe3\xea\x81\xd6\xe3\xdb\xed\x5e\x9b\x98\xea\x18\xd7\x2e\xad\xd0\x04\x13\x12\x1a\x94\xae\x84\x85\x6c\xb1\x74\x96\xd6\x63\xcb\x31\x16\xa4\x1f\xe3\x16\x43\xdc\x82\xe2\x3c\x15\xec\xf8\x58\xac\x58\xb3\x4d\x6d\x0a\x1d\x63\x66\xe2\xf3\xcf\xaa\xac\x01\x1d\xc0\x60\xdb\xd7\x96\xf6\xdc\x90\x21\xc1\xb8\x73\x62\xe2\xdd\xc1\xf7\xb9\x01\x17\xa6\xa9\x8e\x75\x1f\x33\x31\x7c\x31\xf1\xd4\x74\x3c\x10\xa6\x87\xbe\x36\x4b\x62\x6e\x62\x2c\x06\x8c\x9c\x13\x73\x39\x30\xb9\x82\xeb\x99\xea\x18\x06\x64\x2b\xe0\x56\xd3\x42\xe9\x98\x94\x22\x2a\x6a\x02\xd3\x54\x9d\xeb\x26\xef\x7c\x42\xa7\x08\x59\xb7\x63\x98\x60\x38\x45\x1a\xa3\xa1\xb7\x71\x07\x9a\x65\xb0\x75\x19\xc3\x96\x69\xaa\x5d\xc0\x04\x3a\xd4\xd4\x2e\xd0\xbb\xa6\xa1\xc6\x40\x1b\x70\xed\x0f\x2f\xcc\x91\x3a\x87\x18\x7a\x42\xea\xcc\xa1\xee\xf6\x88\x38\xb0\x38\xee\xd9\xba\xc1\x45\xcf\x54\xd7\x40\xf7\x7b\x44\x7c\x1b\x42\xaf\x40\x8d\xd7\xb5\x4c\x75\xaa\xf1\x8d\x46\xf8\x65\x2c\x56\x72\xaa\x0d\xd9\xe4\x09\x4b\x65\xbd\x8f\x8b\xbf\x06\x0c\xd3\x89\x10\x06\x43\xb1\xc4\xf7\xe2\xd7\xa4\x20\x37\x8d\xab\x31\xdb\xf7\x63\x73\xfe\xb1\xcf\x69\x9e\x63\x95\x4c\x4a\x4c\x05\x67\x4e\x7b\x17\x3d\x53\xdd\x41\x13\x23\x0e\xf5\xf9\x35\xa3\xf8\xa0\x77\xd5\xc3\x4b\x10\x5f\xf3\x35\xc1\x3d\xf8\x4c\x13\x78\xd7\xb8\xcd\x75\xf3\x9a\x13\x9c\xf0\x7b\x97\xec\xec\x81\x18\x8f\xad\x05\xe6\xc8\x0c\x23\x5b\xf0\xf5\x44\xc8\xef\xb1\x60\x85\xa9\x00\x0c\x7a\x8d\x6b\x53\x9d\x5e\xaf\xf9\x5a\x20\x78\x75\x4d\x84\xd3\xa0\xfa\x1f\xeb\xea\xd3\x1b\xd8\xa7\x6d\x0c\x21\x60\x0d\xad\xac\xfb\x2c\x93\x0a\xb9\xde\xf5\x7a\x30\x64\x94\xec\xad\x06\x23\x5e\x1a\xf2\xd2\x41\x2f\xc8\x4a\x7d\x5e\x3a\xe9\x79\x59\xe9\x32\xeb\xe1\x25\x2b\x75\xb3\xba\x8b\xac\x74\x9e\xf5\x7b\xd5\x1f\xa9\xc3\xeb\xcb\xbe\xa8\x76\xde\xef\x4b\xd3\x7b\xb8\xde\xf6\x45\xdd\xa4\x5f\xa1\xbf\x0d\x5c\xc9\xef\x67\x83\xd7\x56\xba\xb4\x44\xa5\x73\xab\xae\xd2\x2e\xab\xb4\xa9\xa8\x74\xd3\xc5\xca\x70\xb0\xe2\x0a\x70\x20\x29\xc0\x1c\x63\x3f\x08\x23\x89\xf0\x22\xea\x77\x1f\x4c\x75\x6c\x45\x0f\x9a\x3a\xbc\x5e\xf6\x38\xdf\xf6\x1a\x26\x93\x15\x56\x7f\xfb\x60\xaa\x43\x52\x63\x20\x24\x96\xa4\x64\x26\x98\xdd\x10\x6c\x18\x06\xdd\x9d\xd9\x30\x03\xdd\x37\x4d\xd5\x86\x2b\xb3\x02\x14\x9b\x26\xde\xbb\x19\x2b\xea\xa6\xea\x43\xcd\xb2\x68\xd5\xa1\x76\xdf\x57\x1f\xaf\xdb\x3a\xd7\xa0\xbd\x37\xdd\xa4\xdc\x7f\x8f\x17\xe0\x31\x33\x0e\xae\x43\xc3\x12\x8b\x69\x8c\x88\x09\xcb\xb7\xec\xf5\x89\x90\x53\xbd\x0b\x68\xf2\x0d\x78\x6d\x62\xd5\x37\xb4\xd8\xd8\x46\x70\xdd\x57\x1f\xa0\x65\xf0\x4d\xdd\xe3\x76\x8a\x4e\x06\xe5\xdd\x8d\x25\x0b\x4c\x90\x35\x23\xe6\xc4\xe0\x6c\x3d\xd6\x3f\x9a\xe5\xbe\x1c\xbc\xd9\x0c\x79\xef\x3d\xd6\x59\x1a\x73\x70\x73\x79\xcd\x51\x1f\x9c\x5f\xf3\x99\xf7\x36\xd0\x54\x07\xb7\xfe\x80\xc1\x86\x93\x97\x81\x29\x89\x95\x7b\x66\x5f\x6b\x74\x97\x33\x00\x36\x3e\x24\x31\x86\xff\xb9\x8d\xfb\x06\xef\x62\xd5\x37\x25\xb9\xc6\x56\x55\x17\x33\x83\x37\x7d\x75\xa2\x4d\x19\xb1\x8c\xdb\x4b\x7e\x62\x1a\x4c\xce\x2d\xce\x80\x9f\xb6\xc3\xbe\x6a\xdd\xbf\x0c\xf9\x28\xb7\x6b\x4b\x0c\x10\x58\x32\xe5\xa7\xb7\x31\xb7\x8b\x26\x93\xab\xeb\x92\x02\x1d\xe3\xf9\xce\x81\x30\x3c\x87\x19\x04\xbe\xe2\x9f\x9f\xb6\xd8\xfe\x74\x01\x46\xd3\xc1\xfa\x8f\xfd\x83\xff\x7c\xb8\x58\x00\x43\xc2\xc6\xc9\xab\xe4\xc2\x2f\x7a\xea\x80\xbe\x6e\xa8\x3b\x60\xbe\xf1\x11\x9d\x4c\xbb\x19\x5b\xd8\x2f\xc0\x8e\xab\x50\x51\xab\x59\x53\x2b\x57\x75\xa2\x9d\x81\x91\x3a\x80\x01\x2c\x1d\x49\x65\x84\x34\x59\x01\xd9\x79\x0e\x1a\xea\x31\xf9\x09\xe5\x6d\xc7\x78\xcb\xc4\x84\xfb\xd4\xa6\x06\xfc\x7d\xb4\x00\x43\xc9\x0e\xa7\xb5\x7b\x89\xde\x2f\x9e\x95\x0b\xa7\xdc\x03\xff\x3c\xcd\x3d\x80\xf9\xdf\x58\x63\xce\xd1\x36\x64\xb5\xfd\x1e\xc6\xfc\x51\xfc\xb3\xb8\xc6\xa5\x0f\x07\xff\x81\x49\x4f\xb5\x35\xf3\x77\xec\x6a\xf9\x7b\x74\x15\xe0\xae\x7e\x3f\x04\xed\xc0\x03\x16\x3b\x16\xe4\xed\x8c\x12\x07\xc7\xc0\xa0\x47\xda\x6d\xe6\x66\xc8\x4e\x3d\xcb\xac\xf0\x5e\x14\x32\x56\x19\x18\xaa\x63\x6e\xc1\x88\x8e\x23\x5b\xc8\xfc\x1f\xb9\x4c\xb4\x33\xde\x30\x97\x54\x35\xb4\x2a\x1a\x5a\xa2\xa1\x55\xdf\xf0\xa1\xa2\xe1\x43\x26\xc0\xfe\x09\x23\xfe\xd3\xa6\x1a\x00\x43\xbd\x37\x61\xff\x68\xa2\x16\x4d\x48\xa3\x37\x51\xc7\xe6\xd3\x6d\xb1\x83\xfb\x8a\x0e\xee\x85\xbb\xea\xde\x98\x56\x37\xab\x9e\xaf\x25\xe6\x5b\xd3\xac\x9a\x3e\x96\xa0\xcf\xef\x3b\xda\xff\xf0\x49\x4e\xbe\x6d\xb4\xdf\xb1\x59\x35\x77\x0a\xcd\x6e\x20\x62\x87\x6d\x01\x35\xb9\x7a\xc2\x70\xe8\x69\xc6\x2b\xc0\xca\x24\xad\x00\xf5\x22\x80\xc7\xe1\xad\x0c\x01\x32\x34\xed\xf5\x7f\x24\xe8\xbe\x9a\x86\xdf\x06\x1a\xaf\x80\x7a\x6f\x2e\xc0\x27\xaa\xcc\xef\x8d\x39\xb8\x97\x0b\x1e\x8a\x05\xd6\xc1\x1a\xbf\x5f\x93\x87\x62\x0d\xb9\x00\x0e\xb0\x81\x05\x3b\xc0\xa0\xc7\xcd\x6f\xd1\x5c\x2e\xf8\x56\xd5\x55\xdd\xf2\x18\x85\x50\xdd\xf2\x18\xe5\xf5\x7b\x8f\xf9\xcf\x9b\x2d\xd6\x5f\xf6\x6f\xd5\x5f\xf7\xdf\xa6\xbf\xee\xbf\x4d\xa0\xdd\x7f\x9b\xd4\xfd\x1d\x47\xfb\x1f\x3e\xc9\x87\x6f\x1b\xed\x77\x6c\x76\x84\xfe\x9a\x83\x7a\x05\x86\xea\x15\xd8\x63\xbd\x34\xff\x1f\x08\xb2\xeb\xb5\xd4\xd7\x83\xb0\x02\xb3\x33\xb5\x60\x10\x3d\x61\x17\x35\x9a\x5d\xd4\x24\x76\x51\xd7\xec\xab\xf1\xfb\x35\x71\x8a\x35\xa4\x82\xc7\xef\x1a\xed\xbb\x46\xfb\xae\xd1\xbe\x6b\xb4\xef\x1a\xed\xbb\x46\xfb\xae\xd1\xbe\x6b\xb4\xef\x1a\xed\xbb\x46\xfb\xae\xd1\xbe\x6b\xb4\xef\x1a\xed\x8f\xa5\xd1\x9a\xdf\x35\xda\x77\x8d\xf6\x5d\xa3\x7d\xd7\x68\xdf\x35\xda\x77\x8d\xf6\xdf\x5e\xa3\xf5\x02\xdd\x94\x22\xbb\x0a\xf1\x21\x34\x8e\x6a\x76\x86\x2b\xdd\x3b\x8d\x40\x27\x41\xd1\x96\x14\xbb\x86\x84\x00\x2f\xc4\x01\x4e\xb4\x4f\x24\xe6\xca\xb1\xa4\xc0\x66\xa7\x58\xe7\xb9\xaf\xfa\x40\xf3\x81\x55\x6a\x8e\x07\xed\xab\xb6\x13\xe0\x41\x6d\xad\x67\xf1\x58\xb3\x29\x0f\xe5\x2a\xc6\xca\xcd\x4e\x7c\xdd\x54\x7d\xe0\x2c\x70\x13\x3f\x8b\x05\x96\xeb\xcc\x71\xaf\x3b\xe0\x44\xb8\xce\x0e\x68\x0f\x43\x35\x24\xfa\xda\x9a\xb9\x81\x3e\x52\x2f\x81\x66\x6a\xea\x1a\x38\x2d\x5f\xc7\xff\x9d\xb5\xf1\x7f\xdb\xc0\x49\x7c\xdd\xe2\x51\x8f\x93\xbe\xba\x83\x9a\x61\xb1\xc8\xb6\x39\xf8\xa5\xa1\x9b\xea\x19\x78\x68\x1b\x96\x14\x7b\x46\xa1\x2e\x80\x81\xd9\x57\xd1\xf3\x32\xd2\x49\x80\xa2\x8e\x4d\x04\x74\xb1\xd6\x87\x3c\x32\xee\x79\x1d\xe9\x23\xb5\x4d\x86\x5e\x02\xb4\x89\x74\x43\x5d\x82\xe7\x2d\x6e\xb0\x05\xe8\x7c\xad\x4f\x68\xa8\xce\xe4\xd7\x9b\x91\xba\x84\x8f\x2e\x10\x6d\xb5\x9b\x91\xba\x86\xcf\x27\x6b\xdd\x54\xd7\x10\x25\x6b\xfd\x5e\x80\xce\xc1\xad\xea\x82\xe7\x6d\xac\x9b\x18\x4b\x5d\x53\x43\x80\x82\x58\x1a\xb8\x1d\xeb\x23\xb5\x4b\x06\x0e\x01\xba\x88\x75\x43\x0d\xc1\xf3\x25\x6e\xd0\x04\xc8\x8b\x73\x03\x87\xa5\x81\x53\xf8\xbc\xc6\x75\x53\x88\xce\xa3\xc2\xc0\xe8\xf9\x32\x91\x11\x7e\x4b\xa4\x71\xdd\x54\x46\x38\x48\x29\xc2\x61\x4a\x11\x7e\x4d\x0e\x23\xdc\x4e\x28\xc2\x5e\x52\x18\xf7\xf1\x39\xdc\x90\x18\x4b\x5d\x53\x11\x6a\xa4\xd2\xa8\xe9\x46\x1f\x61\x9b\xcd\xc4\x90\xb7\x8d\x6e\xa8\xe8\xb9\x89\x2b\xaf\x01\xba\x4a\x73\x63\x9e\x80\xe2\x98\x4b\xf8\xec\xe2\xba\x4b\x88\x5e\xd3\x12\xae\xcd\xad\x8c\x6b\xb4\x95\x46\xed\x6e\x65\x5c\x1b\x5b\x8a\xeb\xfc\x95\xe2\xba\xda\x1e\xc6\x35\xdd\x52\x5c\xaf\x36\x85\x71\x9d\xe7\xf9\x4e\x27\x81\x8b\x3a\x66\x34\xd4\x79\x95\xc6\xf5\x77\xfa\x48\x6d\x92\x71\x5d\x80\xa2\x9d\x8e\x6d\xcf\xe7\x18\x37\x48\x01\x6a\xbd\xe6\xc6\x75\x4b\xe3\x86\xf0\xb9\x8b\xe7\x18\x42\xb4\x7a\x2d\x8c\x6b\x3f\xc7\x6f\xba\x89\xf7\xa1\x8e\xd9\x1f\xbd\xbc\x49\xe3\xee\xde\xf4\x11\xde\x5a\x26\x01\x75\xde\x74\x43\x9d\x83\xe7\x33\xdc\x20\x06\x68\xf1\x96\x1b\x77\x5e\x1a\xd7\x87\xcf\xfe\x1b\x09\xdd\x45\xad\x5d\x69\x6d\xcf\x9a\xd9\xda\x6e\x9a\xd2\xa8\x27\x4d\x69\x6d\x5f\x5a\x64\x6d\x97\x2d\xba\xb6\x49\xf3\xf0\xda\xee\x9a\x74\x6d\x17\xcd\x12\x8d\x97\x6d\x99\xc6\x17\x2d\x31\xaa\x0b\x7e\xed\xf5\xf3\xa4\x73\x01\xa3\xdd\xb6\x45\x69\xd7\xc8\xfa\x73\x81\x7e\x69\x7c\x52\x63\xa0\xf5\x86\xe5\xf0\x58\x11\x8f\x47\x77\x16\x11\x4d\x45\x59\x22\x57\x1a\x8c\x68\x40\x66\xa9\xa3\x99\x8f\xd9\x05\x39\xd1\x16\x53\x69\x16\x6f\x89\x20\x73\x1a\x1b\xdd\xe2\x6d\x3f\x92\x87\x3a\x0f\x42\xa0\xfd\xd2\x57\x43\x5d\x9b\x0b\x2c\x62\xf0\x4b\x64\xf5\xd5\x14\x3e\x9c\x59\xe5\xa9\xa6\xc0\x5c\x98\x7d\xf5\x0c\x18\x6e\x8f\x3c\x3d\x31\xac\xca\xf7\x0c\x59\xdc\x78\x9b\xbd\x4e\xbc\xb9\x56\xd7\x50\x9b\x0e\xe8\xb8\x3d\xb3\xd5\x1b\xfd\xc1\xba\xe9\xfe\xe6\x6e\xb4\xd9\x27\x2c\x08\xc6\x93\x23\x9b\x7f\xba\x55\x97\x50\x73\xee\xd9\x5a\x18\x17\x83\x4f\x34\x78\xb7\xaa\x39\xa9\xd3\x06\xe2\x8d\x08\x55\xc4\xcf\x4d\x1e\xbd\x3d\x40\x9b\xc1\xa1\xa7\x7f\x52\xb8\xf9\x1c\xe4\x1f\xf7\x49\x9a\xf2\x56\xe3\x91\xe7\x53\x93\x45\x18\xdb\xc2\x56\x7d\xc8\xbf\x5b\x1c\xd0\x5e\x2c\x4d\x4d\xa1\x3e\x1b\xa9\x0e\x44\x13\x16\x69\xad\x3f\xdf\x62\x19\x14\x03\xae\x2c\xa5\x97\x84\xc6\x02\x10\xbd\x94\x7b\x30\x26\xcd\xce\x16\x85\xec\x3d\xcc\x40\xbc\xdb\xca\xfd\x43\x1a\x87\xc0\x5c\x80\x11\xd6\xcb\x27\x40\x28\xe1\xec\x2d\xce\x0b\xec\xab\xf3\x3d\xb0\x70\x0f\x6c\xbd\x07\xd6\x06\xf5\xb0\x94\xa0\xb2\x05\x5a\x1b\x5a\x62\x03\x67\x55\xac\xbe\x7a\x09\x16\xe0\xe4\x4a\xd7\xd4\x2d\x7f\xa8\x64\x6a\xea\x25\x98\x83\xb7\x2b\xdd\x12\x8f\x6f\xb4\xec\x21\x5e\x46\x71\xab\xaf\xfa\x10\x9b\x45\x43\x41\xd5\xc7\x0a\xda\x4c\xb4\x3e\x41\xc0\xb6\x2a\x68\x3c\xc0\xd6\xd7\x02\xac\xaf\x88\x65\x30\x07\xc1\x95\x5e\xc1\x76\xf7\x26\x33\xb8\x1e\x29\x9d\x85\xd9\x47\x7f\xd2\x60\xef\x67\xd7\xe0\xe1\xe6\x08\x1b\x43\xd9\xdb\x47\x3f\x6b\xbb\xcc\xda\x2e\xc1\x73\x53\x3c\xb2\x40\xaf\x46\xbf\xba\x85\x9f\xb5\xf0\xc1\xb3\x9f\xb5\x78\xc9\x5a\x4c\xb1\x1e\xad\xdb\x30\xd9\x2e\x31\xa4\xc9\x86\xba\xd8\x2f\x9e\xde\xdf\xb3\x4b\x32\x6e\xcd\xc8\x6c\x8b\x9d\x62\x68\x9f\x4c\xbc\x74\x1a\x59\x40\xc7\x2a\x05\xbe\x6b\x8f\x7d\xdc\x11\x37\x56\x9b\xd9\xc6\xa5\x7d\x3e\xb7\x81\xc0\xe8\x0d\xf0\x89\xdc\xbe\x59\xfc\xa5\xc4\xa4\x6b\xe5\x7a\xd8\x65\x3d\x50\x1c\x9f\xfd\xac\x87\x97\xac\x87\x97\xbe\xe8\x21\xee\x63\x3e\x63\xc3\xf3\xc7\xf1\x84\x7f\xe2\xac\x5f\xf2\xc2\x4b\x7a\x01\x23\xde\xa6\x4e\x0a\xef\x25\x70\xbd\x7b\x2d\x7b\x25\x7c\xdc\x4b\x02\xe9\x69\x84\xd6\x37\x55\xb4\x00\xcd\x0b\xcc\xf5\x60\x0e\xbc\x0b\xdd\xe2\xe7\x82\x8c\xb8\xd3\x3e\x9d\x4d\x16\xbe\x9e\x4d\xc4\x16\xef\xc9\xe8\x6b\x9f\xac\xce\x43\xfe\xd5\xc2\x74\x01\xdc\x0b\xdd\x54\xbb\x70\x0e\x56\x78\xbc\x4b\x88\x0f\x2f\x6c\x8d\xad\x3e\x6b\x9f\xbd\xda\x95\xde\xf9\xf8\x40\x7a\xc1\x9f\x3d\xce\xd4\x34\xe9\xc1\xa6\x9d\x5f\xed\x31\x46\x6d\x4d\x86\xc8\x5e\x7f\x3e\xe4\xeb\x4c\xb3\x7d\x6a\x5c\x0c\xf9\xc6\x9a\x54\xf8\xa4\x28\xb9\x5f\xc0\xfa\x9a\xbf\x75\x76\x41\x90\x3d\x6d\xe9\xb1\x57\x44\x19\xf2\x96\x68\x3a\x10\x63\x4e\xf2\xbf\xaa\x5e\x19\x8e\xf3\x0b\x3c\x7c\x01\xdb\x6b\xbe\x93\x5d\x90\x5c\x9b\xc5\xdd\x21\x19\x02\x3e\xf8\x74\xc5\x97\x7d\x7c\x8f\x0f\x4a\x97\xc0\x03\x97\x81\x81\x4d\x87\x25\x38\x0f\x8c\x21\x7b\x43\xef\x81\x65\x68\x8c\xd8\x06\xd8\x81\x25\x68\xad\x0d\x4b\x8d\xa1\x07\xb6\x6b\x03\x0b\xa8\x25\x68\xe1\xda\x6c\x95\xaf\xa0\xc9\xa4\xa7\x0f\xb5\x50\x37\xc4\x9a\xb3\xd5\xa2\x2f\x3a\xd9\xe9\x6b\x92\x39\x5d\xc9\x7b\xc3\x30\x4b\x85\xb0\x05\x62\x21\xe6\xcc\xb0\x61\xff\x76\xf4\x3e\x3e\xf7\xe0\x2d\x05\xb5\x93\xcc\x32\xca\x96\xac\x4a\xc5\x68\x0b\x83\x1c\xfd\x34\x0d\x37\xde\x19\x8c\x73\x51\x61\x58\xf6\x70\xa5\x65\xf4\xd5\x36\x64\xf3\xf5\x4d\x56\x79\x0d\xb2\xda\x56\x36\x49\x3e\xdf\x95\xd9\x67\x25\x21\xd4\xda\x66\x09\xf5\x25\x14\x73\x3c\x19\xe4\x47\xcc\x9e\x44\x67\xae\xaf\x69\xfe\xe9\xf4\x7c\x92\xaf\x3d\x16\xe0\x58\xa2\xcf\xbd\xd6\x30\x85\xd0\x80\x9a\xdf\x3b\x96\x3c\xab\x5e\x5f\xed\x92\xee\x76\xba\x76\xc6\x95\xd3\xc4\x03\x4d\xdf\x70\x75\x4c\x0c\xf8\xa6\xab\x4d\xb8\x04\x9b\xc4\xb0\xd4\x54\xf7\x40\x9c\x18\x7d\x35\xd6\x97\x20\xf2\x0d\x61\x32\xbd\x5c\xf7\xd5\xb5\x4e\x6c\x66\x43\xdb\x5d\x8b\x3d\xfb\x76\xdd\x57\xbb\xa4\x7c\x67\x68\x67\xd7\x43\x3e\xad\xf3\xeb\x91\xba\x26\x33\x71\x4d\x6d\x69\xf1\x72\x78\xde\x1f\x89\xd7\x67\x4d\xa0\xa9\x3e\xa9\x73\x62\x68\x3b\x6b\xb8\x17\x91\x37\x6b\x84\xbb\xc2\xeb\x6c\x6a\x5d\xd1\xa1\x76\x61\x8d\xd4\x13\x82\x60\x5b\xd7\xd2\xbe\xa0\xcb\xa6\x2f\x4d\xf8\xac\x3f\x3c\x92\x5e\x2f\xfd\x5b\xf9\xc9\xe2\x57\x8b\x00\x17\xfc\x01\x65\xc0\x1c\x7a\xa0\x9b\x92\x8d\xb2\x04\x9d\x54\x92\x01\xee\xc6\x20\x1e\x16\xf2\x62\x7b\x09\xde\x5e\x0d\x4b\x6d\x42\x0f\xa4\xaf\xac\xf6\x5b\x9a\x97\x01\x34\x77\xc3\xfa\xa0\x0c\x68\xdf\x7d\xab\x0c\x38\xa1\xed\xbf\x56\x06\x88\x6d\x7d\x8c\x0c\xa0\x3b\xc2\x85\x5f\x25\x03\x9a\x74\x96\xff\x04\x19\xd0\xbe\x3b\x5e\x06\xcc\x49\xf9\xd9\xd7\xca\x00\xb1\x45\x64\x19\xb0\x4b\x8c\xb5\x8e\x41\xf0\x42\x57\x2f\xe1\x12\x24\xd8\x02\x6c\xeb\x1e\x58\x37\x8d\xbe\xda\xd4\x97\x60\x95\xe4\x65\x40\x4a\xb6\x94\x5f\x92\x01\x27\xa4\xbc\x5d\x92\x01\x29\x99\x89\xbf\x57\x06\x08\x39\x71\x8c\x0c\xf0\x89\x0c\x38\x29\xc9\x00\x97\x4c\xa0\x5b\x92\x01\x62\xc2\x47\xcb\x00\x73\x6d\x7e\x52\xed\xbd\x16\x95\x95\x37\xab\xb2\x4d\x5e\x32\x4a\xae\xc9\x96\x99\x32\x5a\x0d\xfa\x8d\x11\xd6\xb6\x56\x3c\x22\x6e\x56\x34\xac\x1c\xa3\xca\xb4\x71\x0a\xd9\x56\xc6\x52\x7a\x15\x0f\x10\xf7\x4e\x0a\xaa\xbb\x3b\xf6\xfa\xed\x2b\x51\xcb\xc6\xef\x00\xe2\x4e\x9b\xc3\xa1\x94\xeb\x62\x58\x6c\xe9\xc1\x11\x16\x1c\xa9\xa8\xb5\x00\x4d\x6c\x98\x9c\x81\x39\x78\x59\x1b\x26\xde\x60\x67\x50\x38\x37\xce\x21\x41\x6a\xa9\xff\x46\x1a\x0d\xf3\x86\xaf\xa1\x25\xfa\x88\xc8\x09\x7d\x28\xc9\x69\xe9\x8a\xf8\x31\xff\x8c\x5d\x36\x27\xb3\x23\xdd\x05\xf5\xd2\xba\xc6\xf0\xc8\x99\x78\xc6\x08\x9b\x4e\x6b\x83\x3d\xc6\xed\x59\x2f\x9f\x46\xf4\x8d\x27\xa3\x99\xb1\x27\x2f\xd0\x58\xeb\xc9\xe9\x48\xc2\xec\xf0\xe9\x56\x1e\x49\x1f\x8b\x59\x62\x2a\x1c\x0a\x8f\x30\x35\x73\x4e\x8b\x15\x38\xe3\xc7\xb9\x41\x08\x5a\xe2\x3c\xf7\xf4\x6a\x96\x3c\x0f\xc3\x0a\xcf\x83\x0b\x2a\x0a\x8f\x72\x51\xf4\x66\x23\x75\x70\x2d\x5c\x14\xb3\xbb\x91\xfa\xe0\x82\xfb\xaa\xc4\x37\xf8\x48\xc5\x32\x81\xc4\xc0\x92\x74\xe9\x3e\xc1\xb1\x01\x7d\xfe\x06\xbb\xcb\x1b\x59\xda\x05\x20\x27\xf6\x25\x14\xf9\xc9\x9c\xbe\x8a\x56\x60\x77\x69\x60\xa1\x1f\x82\xcd\xa5\x21\xb2\x71\x4c\x35\xd5\x86\x1d\x9d\x63\x6e\x6a\x06\x97\x61\x86\x61\x32\xc1\xe2\x01\x0b\xab\xdf\x25\xd0\xb8\x13\xd0\x1c\x09\x27\xa0\x31\x91\x0f\x4a\x3e\x53\xd5\x9a\x21\xaa\x3e\x65\x55\x51\xe6\x53\xdc\xeb\x60\xd1\x06\xfd\x4c\x45\x18\xc6\x5e\x17\xe6\xd8\x54\x97\x44\x16\x2e\xf5\x08\xf8\x0d\xc3\x54\x7d\xb8\x06\x8b\x06\xbf\x20\xc9\x35\xb3\x44\x33\x4c\x0a\xd2\x6c\xab\x47\x60\xde\x20\x66\xc1\x1a\x74\x4e\x8c\xc9\xbe\x89\xe9\x93\x91\x8a\x8e\x22\xd7\xfa\x28\x72\xad\x01\x53\xd2\xbf\x81\x5c\x6b\x42\xae\x2d\x77\x01\x1d\x26\x57\x48\xf0\x0e\xf5\x08\x6c\x17\x26\x3e\x48\xae\x41\xb4\x30\x0f\x92\xab\x49\x9a\x35\xf5\x08\xac\x17\x26\x36\x4c\xd6\x60\xb1\x30\x27\xfb\x26\x86\xc9\xf5\x47\xe3\x2e\xff\xdb\xb9\xab\xfb\x62\x52\xee\x6a\xbd\x98\x5f\xc1\x5d\xcd\x17\x93\x72\x57\xf4\xb2\x8f\x5c\x3e\x21\xd7\xfd\x51\xe4\x9a\x1f\x45\xae\x39\xbb\x34\xfc\xed\x9b\xb1\x4c\xf8\x5a\x72\x51\x8b\xec\x04\x46\x60\xe9\x9b\xa6\x3a\x87\x6b\xd0\xf0\x0e\x93\x8b\x9e\x69\xd6\x7a\x04\x4e\x3c\xb3\xaf\xc6\x98\xca\x9e\x79\x70\x33\x4a\xdc\x35\x39\x8e\xbb\x26\xc7\x73\xd7\xe4\x77\x93\x5d\x93\x23\xb8\x2b\x0d\x19\x77\xad\x42\xd3\xaa\x68\x56\xc3\x5d\x61\xc8\xb8\xab\x11\x1c\x26\xd7\xe3\x51\xdc\xb5\x3c\x8a\xbb\xa8\x69\xb1\xfc\x1d\x36\x63\x59\x0a\xd6\x92\x8b\x9a\xc3\xae\x1e\x81\xb3\xb5\x69\xaa\x4b\xb8\x06\x6f\xeb\xc3\xdc\x45\xad\xe5\x54\x8f\xc0\x6e\x6d\xf6\xd5\x2d\xa6\xf2\xfa\xf0\x66\x7c\x38\x8a\xbb\xdc\xa3\xb8\x4b\xdc\xda\xfd\x06\xee\xa2\xa2\x9e\x5a\x49\xe1\x31\xdc\x35\x27\x78\xcf\xf5\x08\xb8\x89\x69\xaa\x2e\x5c\x83\xab\xf8\x30\x77\xc5\xa4\x59\xac\x47\xe0\x32\x36\xfb\x6a\x8a\xa9\x1c\x1f\x16\xf5\x7f\x34\xd9\xb5\xfc\x76\xd9\x15\x6f\x98\xec\x0a\x36\x5f\x23\xbb\xfc\x0d\x93\x5d\x57\xe9\x3e\x72\x2d\x81\xee\x8c\xd4\x35\x80\x1f\x65\x8b\x98\xd3\x28\x22\x71\x20\x4b\xb0\xd5\xf7\x4f\xb8\x67\xb2\xab\xbd\x36\x90\x12\x0d\x56\x6e\xb2\x9e\xc9\x9c\x6c\x97\x95\x5c\xf3\x88\x2b\x64\xfa\xfd\x2c\x35\x4d\xa2\xdf\xdf\xd2\x4a\xe4\xa1\x8c\xfc\x9c\xe6\x8a\x35\x48\xb3\xbe\xea\xea\x6b\xb0\x49\x0f\x6c\xad\x37\x30\x52\xd3\x3d\xd8\x77\x8f\xc3\x9e\xba\x55\xbb\xfb\xb1\x5f\x13\xec\xa9\x7b\x61\x0e\x6b\xb1\x3f\x23\xd8\x9f\x61\xec\xb7\xa6\xa9\x76\x31\xf6\xdb\xc3\xd8\x2f\xc9\x40\x4b\x83\x34\xeb\xab\x3e\xc6\x7e\x7b\x60\xa7\x60\xec\xff\xb8\x6b\xbf\xe3\x6b\xbf\xfb\xaa\xb5\xdf\xf1\xb5\xdf\x1d\xb1\xf6\xcb\x3d\xd8\x6f\x8f\xc3\x5e\xb6\x77\xf7\x69\xe3\x02\xa1\x2a\xb1\xcf\xb4\xc3\x59\xd3\x34\x89\x76\x78\x6b\x1e\xc6\xbe\xcb\x5c\x33\xa4\x59\x5f\xbd\x84\x6b\xb0\x69\x1e\xd0\xc1\x5f\xb5\xf6\x93\x7f\xf5\xda\xb7\xf9\xda\xb7\x2b\x75\x44\xdd\xda\xb7\xf9\xda\xb7\x8f\x58\xfb\x70\x0f\xf6\xcd\xe3\xd6\xbe\xc9\x2f\x19\x0f\x63\x2f\x8b\x88\x4a\xec\x77\xd4\xc9\x8f\xb1\x3f\x33\x4d\xb5\x89\xb1\x3f\x3b\xbc\xf6\xd4\x2f\x78\x42\x9b\xf5\xd5\x39\xc6\xfe\xec\x08\xec\xfd\x3d\xd8\xef\x8e\x5b\x7b\xea\xaa\xde\x1d\x23\xf5\x68\x12\xea\xb3\x7a\xec\x33\x33\xf2\xac\x6b\x9a\xc4\x8c\x7c\xeb\x1e\x5e\xfb\x4b\xd2\xec\x92\x36\xeb\xab\x27\x98\xf3\xbb\x47\x48\xbd\x7f\xd5\xbe\x5f\x7e\xf5\xbe\xbf\xe4\xfb\xfe\xf2\xab\xf6\xfd\x25\xdf\xf7\x97\x07\xd4\xfd\xec\x96\x5e\x66\x57\x79\xc2\x98\x0b\xe8\x05\xbc\xe1\x6d\x05\x5c\x70\x66\x54\xe5\x3c\xfe\xd8\xcf\x8c\xa2\x47\x4b\x14\xff\x2a\x59\x38\x2e\x90\x97\x8e\x79\x78\x1e\x78\x85\x09\xfc\x28\xe7\x51\x1c\x48\x7e\xb1\x49\xb5\x5f\x6c\xf8\xe8\xf6\xb2\xd6\xbf\x18\xf2\x25\xce\x31\xad\x9b\xbd\x7e\xf1\x72\x9f\xd1\xd6\x34\xf1\xf1\x68\xc8\xa2\x71\x87\x2b\x10\x5f\x99\xe4\x9e\x54\xc7\xfc\x1a\x82\xc5\x95\x49\xb6\xad\xc5\x57\xc3\xe8\x58\x7d\x75\x78\x33\x07\x43\x9e\x91\x38\xcb\x8a\x4f\x7c\x6d\x83\x15\x18\xa9\xc3\x9b\x35\xe0\xde\xb6\x41\x44\x82\x52\x71\x17\x59\x1c\x8c\x14\x6e\x45\x22\x13\x0a\x77\xff\x85\xc4\xe3\xe3\x1b\xdd\x92\x92\xb6\x0f\x44\xcc\x7c\x0a\x07\xa3\x91\xfa\x78\x33\x16\x83\x7d\x24\xf7\x6b\x63\x8b\x87\x82\x8b\x74\xe1\x37\xa3\x92\x6b\x51\xea\x62\x09\xb2\x3e\x5e\x40\x18\xf4\x6e\xe9\xb5\xd2\xbd\x66\x6a\xea\x43\x0a\x36\x61\x8f\x98\x9b\x62\x92\xe2\x2e\x8e\x3a\x65\x61\x08\x0c\x39\x28\xc5\x96\x12\xf4\xe6\x32\x3d\x4f\x68\xc8\xd8\x02\xf6\x25\x37\xe5\x50\x8a\x9b\xc8\x45\x9e\x38\xf9\xdc\x8b\x32\x74\xad\x1b\xe4\x66\x8d\xcd\xc0\xd0\x5b\x70\x74\x74\x84\xc0\x20\xff\xab\xf0\x30\x66\x98\x0f\x39\x31\xa4\x9c\xbe\x62\x53\x25\xa0\xdd\xe7\xce\xdc\x18\xbc\xf5\xfb\x95\x39\xac\x4b\x49\xe7\xf7\xc7\xa0\xcd\xc1\xf3\x8c\xbb\x82\x51\x0a\x34\x39\x56\x4c\x46\x83\x7a\xec\x38\xc4\x10\x90\xc1\x2f\x8f\x58\x2e\x3f\x04\x40\x53\xd3\xda\xa6\xdb\xaa\xa6\xc3\x7f\x5f\xd3\xe6\xb7\x35\xd5\xc6\x24\x68\xd4\xb0\xa4\x65\x1e\xe7\x29\x9f\x45\x40\x4d\x60\x03\x10\xbb\xfb\x58\x06\x7d\xe3\x7e\x70\x63\x2f\x6f\x0e\xf2\x01\x38\x72\x95\x4b\x68\xa8\x31\x94\x18\xf4\x9e\x84\x83\xf0\xf9\x1a\x79\xc6\x1b\x54\xcc\x9c\x25\xe9\xbf\x80\x24\x2a\xe4\xd8\x99\x7b\x20\xbf\xb5\x72\x51\x5c\x46\x71\xe6\xb9\x50\x3a\x56\x96\x42\x43\xdd\x49\x33\xd7\x2e\x80\xa9\xfa\x50\xf7\x75\x83\xbf\x35\x19\x90\xcb\xa3\xaf\xc0\x85\xdd\x4d\x5e\xe9\xf4\x32\xf7\x48\x5c\xfa\x26\xae\x3d\x07\x42\x54\xf6\xcc\x12\x29\xec\xfa\xe6\x57\x60\x54\x4f\x8a\x6c\xe9\x4a\xf4\x70\xa1\x41\x02\x14\x05\x01\x3e\xe1\x15\xd0\x5d\x5d\xe3\xf8\x8f\x47\x6a\x08\xd9\xcd\x34\x0d\xda\xa1\x17\xde\x03\xab\x18\xbb\x4a\x82\x0e\x97\xc0\xb8\xea\x19\xc5\xe4\xe8\xc3\x82\x94\xaf\x7a\x54\x62\x2e\xaf\xe5\xf4\xc9\x55\xc1\x7e\xe3\x8a\xbb\xb8\xda\x9b\xae\x89\xb8\x07\x1b\x57\x5d\x5f\x19\x2b\x10\x5d\x6b\xc2\x13\x16\x82\xd0\xaa\xb8\x25\xea\x37\x2c\x61\x93\x58\xe1\xb5\xe4\x68\x74\xa1\x4c\x00\x5e\x3d\xe9\xe7\xab\x0b\xe3\x69\x0b\x2b\x0c\x05\x69\x5a\x93\x3e\x13\x81\x0c\x79\x8b\x6b\x9d\x49\x85\x9c\x96\xae\x4c\x13\xa0\x71\x9b\x20\x06\x46\xbf\x9c\x34\xde\x32\xf3\x1d\xd7\xd0\x72\xd2\xeb\xdc\x98\xea\x43\x0b\x74\x3b\x3d\x2c\x8d\x9b\xa0\xd3\xe9\x95\x82\xf4\xaa\x43\xe7\x5a\xc0\x3d\x23\x66\x72\x13\x44\x67\x3d\x42\x8c\xb1\x9c\x9e\xf6\x98\x6b\xe3\x16\x08\xcf\x7a\x7d\xf5\x04\xf4\x82\xb3\x9e\xa1\xc6\x20\x05\xc2\x8c\x68\x81\xf8\xac\x47\x32\xfe\x93\x10\x14\xfc\xef\x09\x68\x82\x97\xf3\x9e\xc6\x42\xc9\x52\xbe\x2a\x4b\x7e\x73\x6d\x68\xc3\xd1\x81\xbb\xf7\x42\x34\xa3\x53\xf8\xca\xce\x83\x76\x4d\x0e\x3e\x43\xbe\xce\x2d\x90\xe2\x29\x6e\x61\x13\x04\x18\xcd\x25\x49\x40\xfe\x28\x4f\xff\x0c\x36\xc1\x2b\x86\xa5\xba\x07\xae\x2d\xf1\x88\x58\xc4\x84\x1b\xb7\xf3\x73\x12\x48\xd5\x04\x57\xb4\x0f\x0f\x3c\x58\x6c\xfe\xa4\x1e\x3d\x6a\x19\x4b\xe0\x83\x3e\xd3\x14\x8e\xa0\x24\x0b\x34\x34\xf1\x21\xb3\x05\xda\x1d\x92\xfb\x1f\xd3\x23\xc6\x93\xea\xf4\x2c\x29\x2b\x38\x95\x6b\xb6\x30\xc4\x9a\x3c\xae\x85\xf7\x58\x3c\xe3\x15\xe1\x63\x49\xe6\x84\x22\x9c\x9b\x7f\x1b\x40\x93\xa5\x10\x92\x44\x0a\x7f\xbb\x5b\xbe\xb9\x26\x21\x0c\x2d\xd0\x6d\xf7\xe8\x02\x26\xed\x5e\x46\xdb\x76\xbb\x87\xcf\xb4\x4d\xe0\x61\xac\xda\x10\x5b\xdc\x0f\x32\x6c\xad\x37\xc1\x06\xc3\xe6\x86\x07\x22\xc3\xe2\x14\x95\x88\x76\xeb\x5e\xf6\xfa\x6a\xac\x37\xc1\x05\xed\xc4\x03\x81\x99\xa3\xee\x96\x53\xb7\x79\x8d\xa9\xdb\x02\xed\x16\x59\x85\x26\x78\x6d\xf5\x78\x90\x6f\x0b\x74\x5b\x6c\x31\x17\x6d\x42\xe2\x16\x58\xb6\xc9\xaa\x92\x87\x56\x7a\x13\xb4\x5a\x3d\xf9\xd2\x7f\xc0\xd2\x72\xf3\x9d\x0d\xdf\xfa\x8c\xfb\x0a\x1b\xe8\x08\x3e\x44\xc5\xef\x4b\x09\x71\xd7\x01\xee\x9c\xf2\x24\xb1\xd9\xdb\x20\x9a\x5f\x63\xc6\xea\x80\x10\xff\x58\xc3\x36\x78\x6b\xf4\xbe\x76\xe7\x89\xfe\x7b\xc2\x2c\x94\xe2\xa9\x3b\xa0\x3d\xc7\xa4\x22\x5c\x46\x79\x6d\x2b\xfd\x6e\x93\x7f\x9b\x50\xeb\xf3\xf2\x26\x6c\x83\xc5\xe2\x1a\x57\xe8\x80\x10\xff\x58\x32\xaa\xe1\x7f\x7d\xbd\x0d\xae\x1a\xbd\x21\xdb\x36\x1d\x70\x36\xbf\x1e\xa9\xb1\x41\x1e\x57\xc1\x36\x68\xe0\x06\x2e\xd4\xce\xb2\x1b\xf9\x73\xd0\x57\x7d\x9d\xc8\xdb\x09\x9b\xd2\x16\x4f\xe9\x12\xa3\xeb\x5e\x6b\x6a\x17\x06\xa0\x09\xab\x36\x91\x0f\x3a\x24\x93\xba\x76\xc6\x1b\x1f\x8a\xfd\xb8\x80\x7d\xf5\x52\xef\x80\xf8\x05\x13\xd4\x98\xb4\x16\x95\xbb\xd8\x07\x17\xa0\xaf\x9e\xe8\x75\x03\xdf\xa6\x8b\xeb\xbe\xea\x9b\xa4\xc8\x24\xcf\xc3\x8c\x36\x78\x59\x62\xe4\x8c\x00\x60\xec\x2a\x44\x43\xd7\xbd\xee\xab\x73\xd2\x28\x25\x8d\x4e\xf4\x36\x78\xc3\x8d\x2e\xf5\xda\x46\xe1\xcb\x35\x56\x1d\x6d\x10\xcc\xaf\xf9\x95\x4e\x11\xd5\x0e\x48\xe7\x64\xf3\xb5\xc1\x1b\xae\xd5\x04\x22\x92\x39\x63\x4d\xa3\x03\x62\x4c\xd7\x13\xd0\x06\x0d\x5c\x6b\x0e\xb5\xc7\xa1\x80\xb5\xf1\x42\xd1\x00\xbf\x36\xc4\xaa\x95\x2e\xfd\x16\x4f\x11\x2f\xda\x09\x60\xcb\x7d\x46\xa0\x67\x94\x49\xf4\x36\x78\x99\x5f\x73\x29\xc9\xce\x83\x5a\x0a\x44\xec\xf8\x06\x90\xdb\x95\x18\xf0\x2a\x93\x04\xc8\x71\x93\x47\x04\xeb\xc8\xe9\xe6\x05\xdf\xb6\x80\xf8\x1a\xc4\xa0\x09\xde\xf4\xa3\x3e\x9a\x35\xce\x1b\x69\x92\x2f\xa2\xf8\x84\x26\x00\x0d\x1e\xb1\x37\xbe\x6d\x07\x64\x87\xb4\xc1\x2b\xc6\x3f\x84\xda\x92\x3f\x7a\xe5\xdb\x07\xd3\xf4\x65\xce\x88\x23\xe2\xfd\xc9\xbe\x35\x33\xe0\x25\xe8\x80\xf5\x9c\x6c\x1d\xbc\xfa\xb1\x4e\xd8\x87\xfc\x4e\xf5\x36\x38\xc7\x43\x4a\xde\x84\x16\xd8\x8a\x07\x02\x4d\x90\x88\x17\x02\x01\x38\x17\x8f\x0c\x6e\xdd\x55\xcd\xf0\xcd\x6f\x1f\x9e\x9a\x74\x2d\x30\xce\x46\xbf\xc9\x06\xbf\x10\xef\x13\x7c\xe0\x0e\xfa\x84\x31\xdc\x39\xe1\x90\x36\x68\x08\xb2\x4d\x38\x53\x12\x6e\x8e\x4d\x0d\x4f\x8f\xfc\xde\x99\x5a\x4f\x53\xb7\x64\x1f\x9c\x18\xa4\x0d\x3e\xbc\x77\xc0\x0e\xff\x08\xf5\xc9\x66\x55\xb3\x29\xb7\x83\xbe\x1a\xc3\x0e\x68\xe2\x8a\xbe\x8e\xbb\x59\xd3\xbc\x1d\xa4\xfb\x1d\xc1\x28\x36\x68\x07\xe5\x5d\x1b\x82\x57\xc8\x5f\x20\x17\x37\x47\xfe\x9d\xc2\x43\x51\x3f\x4a\x8f\xbe\x34\xf1\x89\x05\x61\x30\x0d\x89\xef\xab\xfe\x05\x42\xf6\x81\xa9\xb8\x30\x78\xe1\x34\xdf\xab\x78\x32\x26\xbf\xa2\x1a\x91\x6b\x95\xa9\x55\x8c\x55\x9b\xdc\x75\x80\xe0\xe7\xa9\x0b\xfa\x6a\x53\xd7\x42\xb0\x3f\x48\x72\x05\x46\xea\xd6\xd0\x76\x40\x84\x41\xe2\xa3\x62\xd3\x20\x91\x4f\xfb\x3c\x76\x0d\xc0\x23\xa6\x63\x9d\x44\xe9\xb1\x6d\xb6\x81\x23\xe6\xca\xbb\xd4\xb5\x26\x9c\x88\xa6\xf7\xb7\x25\xc4\x1d\xf1\xc5\x25\xf6\x0c\xbd\x4f\x1c\xeb\x53\xab\xe8\xf4\x18\x0b\x32\x4d\xf2\x6b\x34\xac\x38\x2b\xa3\xfc\x79\xa2\x77\xe0\x13\x2d\xe4\x84\xd9\x05\xda\x16\xfc\xb6\x61\xb3\xc1\x1e\x44\xbe\x81\x2c\x90\xd7\x12\x5f\x58\x3b\x81\x2b\xf0\xc2\xcd\x90\x71\x08\x5c\x6c\x85\x18\xda\x58\xbc\x40\x1d\x69\x1f\x49\xe0\xaa\xcd\x23\x50\xef\x5a\xd7\xa6\x58\xd7\x6e\xaf\x8f\x39\x7d\x29\xde\x7a\x5e\xf6\x49\x44\x67\x6c\xde\x5d\xf4\x2c\x11\xd4\x4d\xea\x9d\x15\xca\xdc\x3e\x36\x78\xb4\x9e\x78\xb0\x73\xdd\xc7\x5b\x73\xc2\xbb\xea\xf6\xb5\x5b\x3c\xf4\xdd\x4b\x5f\x6a\xb5\x1b\xf4\xe9\x91\x8d\xad\x3c\x79\x91\xa3\x0d\x86\x3c\x38\x39\x27\x62\xd9\x42\x1a\xc2\xd4\xbe\x1b\xe1\x21\x6d\xf6\x91\x3a\xfa\x1e\x6c\x90\xc5\x50\x0f\xd9\xf5\x3d\x27\xa5\x0b\x64\x76\x13\xdd\xfc\xe2\xdd\x30\xba\x7e\x43\xd8\xe0\x43\xe1\xcb\x8e\x03\xc9\x86\xcd\xe5\x87\xf9\x8d\xc1\x89\xbf\x73\x87\x35\xd3\x26\x4e\xce\x87\x76\x1f\xd3\xf5\x97\x56\x9f\xbb\x39\x1f\x9a\xfd\x5b\xbc\x6f\x9b\x82\x31\x06\x59\xa4\xaa\x9f\x7d\x72\xd1\x07\x24\x00\x37\x34\xef\xde\x06\xd2\x22\xc7\xa3\xbe\x74\x2e\xb7\x8f\x78\xb5\x2a\x69\xe4\x0e\x38\x87\x5c\x0f\xb7\xc1\x09\x3c\xa4\x87\x51\xde\x3f\x30\x38\x36\x10\xfe\xbe\x6a\xff\xae\x40\x32\x32\xc4\x6e\xda\x8d\xcc\xfd\xef\x2e\x9f\x89\xb3\x71\x09\xac\xaf\x7d\x9e\xaa\xbd\x02\x72\x3c\x75\xe1\xb0\xe2\x29\xa6\x47\xe3\x8f\xe9\x6b\x87\x2d\xb4\x8a\x5f\xb5\xcc\x7d\x28\xaa\x05\x89\xd3\xe0\x12\x56\x5d\x09\x35\xe8\xab\xd4\x50\x17\x5e\xa2\x95\x4e\x1e\xf3\xec\xf4\xc3\x8f\x45\xc5\xa3\x38\xe9\xbd\x62\x95\x43\x8a\x2a\xaf\x0e\x68\xf1\xef\x7b\x4d\xda\xe0\xb2\x37\x92\x1b\xef\xb2\xc6\x43\xe9\xf8\x27\x34\x59\x07\x78\xd7\x59\xe3\xf6\x75\xf5\x59\xa8\x9e\x93\x8a\xcf\xf6\xaa\x94\x71\x65\xc3\x71\x85\x9f\x89\x35\xf9\x68\x62\x61\x73\x7f\xe4\x53\x87\x73\xb0\x0e\xb1\xe1\x04\xcf\xc0\x62\x85\x6d\x61\x9d\x5c\xf5\xf0\x85\x78\x01\xf8\x98\xa9\xc5\xdc\xdb\x30\xd5\x12\x30\xc2\x3a\xb5\xcd\xcf\x2d\x4b\x40\x9e\xf1\x56\x3d\xe2\xc9\xa6\x6f\xd4\x3d\xe7\xa9\x7e\x0b\x2e\xe1\x55\xf5\x21\xbc\xba\x97\xe0\xe5\x5d\xe1\x7d\xca\x76\x45\x78\x4f\x4e\x48\x7e\x59\xc5\x15\xe6\x39\xae\x7b\x76\x34\x14\xd0\x75\xd5\x8c\xab\x66\x47\x89\x76\x77\xf1\x90\x19\x25\x27\x0f\xdc\xd8\x5f\x81\xe0\x41\xf0\x40\xee\x5b\x51\x46\x08\x2e\x1f\xfa\xf4\x09\x7d\x61\xfd\xc7\xf9\x89\x49\xde\xbe\xbd\x5b\xfe\x86\xb8\x35\x26\xe2\xb0\x79\x4b\xfc\x24\x8f\x97\xa0\x92\x39\x32\x75\x0d\xf7\x08\x83\x5f\xaf\x80\x1a\x43\xcd\xfe\x4d\x9d\x3c\x5d\x01\xf5\x04\x68\xce\x6f\xea\x64\x76\x05\xb0\x58\xc2\x12\x6d\xcc\x1f\x78\x90\xf7\xf0\x31\xb0\x2a\x0d\x15\xea\x38\xbd\xf3\x7e\xcd\xd6\x25\xfc\x35\x73\x98\xbe\x3e\x72\x97\xc5\xd4\xe4\x9e\xa0\xdf\xa4\x0e\xbf\xa5\xf1\xc3\xe5\x63\x4e\x8e\x53\xd0\x2f\xad\x47\x83\x24\xb5\x78\x18\xa9\x21\xfc\xa5\xf3\x30\x29\xd5\x19\x3e\xb4\x1f\x6e\xd5\x36\xbc\x6b\xfd\x22\x76\xf2\xb4\xf9\x0b\x79\xc4\x15\xc3\x12\x41\x32\x6b\xee\x31\x6f\x6b\x17\x0d\xde\xc7\x15\x78\xfb\x95\x13\x86\x72\x28\xd6\x05\x7a\x99\xc4\x77\xe7\x76\x46\xd8\x4b\x3b\x23\xac\x67\xcb\x84\x9d\xff\x9b\x08\xbb\xb5\xcd\xf2\x16\xf9\x65\x65\x0b\xc2\xce\x29\x61\xe7\x95\x84\x4d\xcb\x84\x9d\x43\x6d\x6e\xfc\x26\xc2\x06\x4f\x79\xc2\xee\x80\xd6\x36\xf6\xf0\xae\x51\xf5\x85\xbb\xbb\x37\x27\x23\x7b\xdb\xc9\xc8\xde\x78\x92\xc9\x8e\xfe\x3d\x54\x5f\x3b\x26\x27\xf5\x8b\x23\x48\xbd\x03\x84\xd4\xa8\x8a\xd2\xf3\x32\xa5\x77\x40\xeb\x9a\x5f\x4b\xe9\xec\xec\xf9\x28\x91\x2d\xe8\x11\x93\x62\x2b\x4e\x07\xd8\x8c\x9a\xe5\x97\xe1\x12\x68\x5d\xfe\x6a\x50\x3e\x04\xae\xc0\x79\xa1\x66\x17\x6a\xe1\x75\x96\x90\x67\x75\x3d\xc2\x8a\x73\x7b\x3d\xe4\xb3\x79\xbd\x26\x99\x3d\xce\xa4\x4a\xe7\xb4\x68\x6e\x89\x4a\x0b\x6b\xa4\x2e\xa1\x16\x5a\x59\xa5\xc1\x48\xbd\x04\xe7\x60\x8e\xb5\x33\x4b\x25\xe1\x82\x56\xc8\x1f\xfe\x7d\xfb\x13\xa2\x87\xf5\x33\xed\x3a\x5d\xd1\xaf\xe4\xd2\xae\xcf\x45\xd7\xc3\xc7\x05\xb8\x95\x1e\x5c\x1d\x9b\x29\xc1\xc8\xdf\xf3\x3f\x88\x43\xff\x7d\xdd\x3d\xcf\xa0\x05\xc4\xdd\xd2\x1c\x34\x41\xcf\x10\x7b\x8f\x3e\xfb\x7b\xa8\xbe\x54\x62\x54\x9b\xf4\x69\xd7\xa5\xd4\x6c\x34\x67\x98\x65\x49\xe9\xe0\xf6\xbc\xee\x8a\xc0\x13\xbf\x61\x19\x67\x3e\xf4\xf1\xcd\xaf\x59\x5c\x58\x13\x74\x85\x2b\x4a\x72\x04\x64\xff\xfc\x4a\x1e\xb9\xcd\xc1\xb0\x3a\x0d\x07\x65\xc2\x0b\xe0\xaf\xad\x91\xea\xc3\x2e\x88\x22\x8b\x18\x40\x5b\x60\xed\x4d\x20\x93\x51\xbe\x05\xc8\x2e\x38\xe1\xae\xb7\x41\x04\x12\xa8\x55\xf8\xfe\xd7\x60\xae\xf3\xb0\x94\x07\x61\x9b\x50\x91\x10\x81\x0b\x9d\x5b\xe5\x6b\xd0\xd4\xfb\xea\x19\xb8\x00\x97\x2b\x32\x99\x2e\x88\x56\x56\x85\xe7\xe3\x02\x34\x57\x56\x5f\x0d\x41\x17\xbc\xe0\x9a\x21\xc9\xc5\x71\xac\xeb\x9d\xba\x92\x2e\x40\x88\xfb\xd8\x81\x2e\x58\xe0\x3e\x76\xa4\x8f\xe3\x73\xd0\x32\x87\xd4\xb4\xcf\x02\x05\x18\x51\x4c\x82\xe8\x80\xa7\x3b\x82\x6f\xbd\x3e\xcd\x6e\xfb\x8d\xd7\x12\x55\x8f\x13\x27\x99\x65\xe5\x14\xd8\x57\x23\x27\xae\x2b\x10\x6e\x29\x4a\xda\x96\x7c\xc8\x5b\xdb\x00\xf9\x3f\x6b\x5c\x78\x09\xde\x36\x56\xc7\xfc\x9d\xa7\x13\x82\xbe\x94\x70\x29\xbb\x83\x9f\x4a\x1f\xce\x17\xa7\x96\x0b\xd0\x15\xa7\x96\x2e\xe8\x5c\xcb\xdf\xe2\x7e\x64\x87\xd9\x96\x78\x33\x19\x82\x36\xe8\xc2\x6c\x43\xf2\xb4\x26\x55\x08\x54\xde\x99\xed\x91\x09\x37\xc4\x11\x38\xa9\x48\x3a\x73\x47\x0e\x80\xb6\x9c\x86\x64\x28\xc6\xb7\x2b\x30\x95\xcf\x67\x8f\xfc\x4e\x79\x5b\xb2\x83\x2b\xf9\xaa\x57\x41\x66\x2b\x97\xd8\x64\xcc\x98\xf7\x52\xcf\x08\x77\xce\x7d\xed\xc6\x01\xb9\x92\x80\x57\xe1\x43\xbf\xa1\xe1\x69\xe4\x12\x17\x1f\x37\x33\xba\x0e\xfb\x2c\x02\xa8\x70\x66\x1c\xe6\xb5\x5c\x29\x22\xa2\xec\x6c\x1b\x48\x6c\x24\x8e\x96\xc5\x08\x26\x0f\x24\x86\xa1\x9e\x81\x25\x98\x9b\x50\xed\x82\x2b\xb0\x4e\xac\x6b\x12\xf6\x70\xd6\x23\x41\xed\x01\x94\xff\xb3\xc3\x85\x97\xc0\x4b\xac\x4d\x69\xb9\x7a\x1e\x78\xe9\x8d\x48\x94\x69\x97\x64\x08\xd4\x42\x60\x49\xd2\x78\x9c\x7f\x1c\x3d\xae\xbe\x85\x8e\xc0\x35\xd1\xc7\x60\xc0\xf8\xc8\x12\x7c\x64\x69\xaf\xe0\x06\xab\xd8\x36\x18\xf3\x2d\xdd\x01\x1f\xd5\x2d\xd4\x4e\xc0\x58\xfa\x56\x34\x53\xed\x0b\xf8\x91\xa0\x74\x99\x1e\x81\xd2\x6b\x2c\x50\xca\x26\x3a\xd6\x12\x78\xa3\xae\xa1\xb6\xd6\x07\x74\xc4\x89\x16\xe9\x37\xb8\xb3\x9d\x3e\xa0\xb4\x8f\x33\xef\x36\x22\x9e\xfc\x12\xb7\x9d\xeb\x37\x24\xda\xc5\x60\x2d\x86\x1e\x58\xf4\x47\x39\xaa\x2f\xb7\x47\x4c\xb1\xb1\xf9\xef\x44\xf5\xf6\xeb\x11\x28\x45\x9b\x7f\x27\xd5\x4f\x76\x47\x4c\xf1\x7c\xf7\xdf\x89\xea\xdb\xe6\x31\xdb\x77\xf7\xaf\xa6\x7a\x57\xa2\xfa\x59\xeb\x88\x29\xbe\xb5\xea\xa9\xde\xfc\xc3\x51\x7d\xdd\x39\x66\xfb\x36\xff\x75\x54\xd7\x22\xe3\x93\x8a\xb4\x1d\x98\x7c\x35\x79\x5a\xe0\x56\x6d\x62\x2b\xe6\xdc\x22\x97\xe2\x9a\xdf\x23\xaf\x1c\x16\x50\xfe\xcf\x1c\x17\x5e\x82\xf3\x33\xeb\xed\xba\x42\x6f\x7f\xc2\x7a\xbb\x0b\xee\x2b\x28\x7c\x01\x3e\xa9\x4d\xa8\xcd\xe1\x23\xa7\xf0\x02\xfe\x4a\x32\xe3\xc0\xc7\x32\x85\x23\xf8\x2b\x99\xcd\xb6\x7b\xc4\x6c\x2e\x3a\x62\x36\x32\x85\x3b\xf0\x13\xa6\x4e\x53\xbf\xe7\x14\x6e\xe9\x9f\x70\x67\x97\xfa\xfd\xb1\x14\x7e\x31\x3e\xa9\x27\x40\x5b\x1b\xf7\xdc\xd0\xb1\x3f\x91\x87\x0f\xcc\x42\x46\x1d\xf0\x3a\x32\x59\xd4\xe0\x12\xb6\x41\x7b\xc4\x21\x34\x8d\xaa\x48\x82\x8a\x3a\xe0\x65\xcc\xe3\x93\x9a\xb0\x0d\xc2\x31\x87\x68\xb3\x5b\xcc\x7c\x4b\x30\x61\x05\x57\xa0\xdb\xb6\x6e\x59\x8c\x41\x9b\x05\xa2\x5c\x82\xc5\x99\x45\xae\xaa\x9b\x40\xb4\x6c\x01\x12\xae\x20\x32\x38\x22\x41\x43\x44\x62\xb2\x7d\x4c\x5f\x7e\xc4\x5d\x4e\xb4\x15\xf5\xad\x8b\x38\x3d\xa4\xbd\x42\x72\xf9\xd7\x84\xd9\x3c\x17\x93\x3e\x8b\x80\xf4\x61\x1b\xf8\x13\x31\xda\xf8\x96\x3c\x7b\xb0\x44\xa4\xce\xf9\xc4\x54\x5d\x16\x2b\xd9\x06\x27\x13\x71\x6e\x20\x69\x70\x05\xee\x6b\xd0\x01\xd1\x2d\x4f\x3c\xb6\x83\x6d\xb0\xbd\x65\xa0\x18\x60\xec\xcf\x24\xec\x63\x70\x05\x76\x18\x7d\x1a\x80\xd1\x64\xd1\x38\x97\xe0\xbc\x63\x91\x5b\x7b\x81\xfe\x80\xa0\xdf\x95\xd0\xa7\xae\x59\x9b\xfd\xc4\x04\x58\xca\x04\xd8\x52\x02\x34\x25\x02\xac\x01\xa1\xc0\x99\x44\x81\x41\x07\xac\xee\xfa\xd2\x9a\xa6\x77\x1c\x02\x83\xfb\x5b\xcc\xa7\x87\x8e\x16\x95\xa6\xf0\xbd\xb8\xec\xbd\x17\xe1\x63\xa5\x30\xf2\x87\x0a\x1b\xd2\x05\x1b\x30\xe0\x36\x64\x0a\x66\x7d\x75\x8a\x8d\x63\x3b\x1f\x58\x6c\x68\x33\x72\xf7\x21\xc2\x32\x26\xd2\x69\x21\x00\xc4\x9d\x11\x8b\xbb\x31\x63\x03\xb2\x14\x75\x20\x3b\x38\xfa\x20\x05\xaf\xf4\x3e\xb8\x0d\x78\x6a\x71\x63\x03\xee\xf9\xbb\x17\x5a\xb9\x29\x2a\x27\xb0\xaf\x9e\x80\x06\x70\x93\xbe\xa6\x9e\x80\x13\x70\xb1\xee\xf3\xb8\x10\xcd\xea\xab\x0f\x1a\x0f\xb0\x3c\x74\x4c\xec\x69\xd2\x49\x95\x1d\x7a\x2d\x39\xa9\xe3\x58\x24\x0d\x7c\x28\xde\xa0\x8b\xa0\x02\xfa\xf7\x39\x79\xfa\xe3\x82\x33\xd0\xd4\x33\x23\xdb\xec\xb3\xc7\x21\x8f\xc2\x73\x60\xe7\x8d\xfc\x49\xfe\x52\x9e\x67\x47\xaf\xc8\xfc\xee\x02\x7c\x7e\xd9\x81\x0d\x58\xf0\x04\x5a\xbe\x74\xd3\x48\xf1\x4a\xc1\x99\x51\x31\x46\xa1\xe7\x87\x52\xcf\x7d\x53\xdd\x82\x0d\x38\x37\x2c\xe9\x82\xc0\x90\xc7\x48\xc1\x99\xc9\x6f\xba\xec\x3c\x31\x26\xf9\xf3\x5f\xf1\x96\xa9\x90\xc5\x71\x8a\x49\xbc\x3c\xe2\x02\x67\x5c\x77\x95\x33\xd9\x64\x51\x42\x78\x62\xfe\x75\x5f\xbd\x6f\x80\xee\x8a\x06\x09\xeb\x9a\xea\x9c\x80\xb7\x55\xdf\xa8\x4e\x1a\x34\xcc\x1c\x44\xac\x91\x33\xb9\xda\xf6\xad\x1a\xde\x5c\xd3\xde\x2f\x69\xef\x93\x04\xd7\xac\x66\xcc\x93\x1e\x49\x3c\xca\x69\x38\x08\x40\xc3\xc4\xe7\x73\x1f\x74\x4d\xcc\x96\x43\xeb\x1b\x12\x56\x15\x9d\xae\xf8\xa8\xea\x02\xcd\x1e\x16\x59\xbc\x57\xc1\xe2\xbd\x7c\x3a\xd1\xc2\x63\x98\xa1\x76\x4f\xae\x1f\xad\x6c\xc2\x9d\x6b\x3a\xe1\x94\x9c\xd2\x27\x5f\x3d\xe1\x3b\xc2\x22\xce\xf1\x93\x63\x53\x7a\x26\x89\xc8\xb1\x44\x7e\x2c\xca\x98\x00\xdc\xaa\x3e\xdc\x80\x97\x7e\x75\xdc\x6f\xb3\x6f\xaa\x73\xfd\x04\x2c\xa2\x3e\xc9\xaa\x70\x09\x1e\x79\xbd\x06\x88\x57\xfd\x4f\x04\xba\xc2\xd0\x50\xd7\x7c\xf8\x28\x02\x5c\x03\xf8\xab\x1a\xc2\x0d\x08\xac\xca\x58\xc3\xcb\x37\xd2\xe1\x09\x38\xc7\x6d\x97\xba\xd6\x85\x8f\xbc\x5e\x03\xf8\xb8\x67\x0c\x5d\xc4\x7d\x53\x5d\xeb\xda\x52\x7f\x64\x4d\x7b\x9a\xfd\x2b\xc9\x6a\xc0\x8d\xb0\x00\xbc\xde\x50\xba\xc6\x37\x7d\xd5\xc1\x8c\xb0\xce\x38\x53\x62\xd2\x4c\xc0\x4a\xa1\x4c\xf3\xec\xe7\x43\xf1\xfe\x3c\xdb\x26\x77\x24\xd0\xfd\x71\x58\x3e\xcf\xdf\x8f\xe8\xd3\x35\x2e\x94\x68\x66\x76\x4b\xf8\x3a\xfa\xe4\xea\x6a\xcc\xd2\x5e\x19\x1b\xb0\x19\x9b\x15\x41\xc0\x29\x38\x19\xf5\xd5\x35\xdc\x80\xab\x71\x55\xec\x6f\x0a\xba\x63\x2c\xf2\x37\x60\xf3\x91\x4b\x91\x14\x6c\x27\x3c\x3f\x2e\x6c\xdd\x8e\xea\x5d\x39\x55\xbe\xa8\x89\xf4\x5e\x2d\xab\x62\x94\x1f\x45\x4d\x5e\xc1\x03\x97\xd8\x5b\xf0\x91\x68\x52\xee\x46\x1f\x6a\xd7\xc4\x06\x1a\x0e\x8b\x9f\xeb\x18\x56\xdc\x9d\x5a\xda\xdd\x48\x9d\xeb\xc4\xdc\xe7\xef\x12\x57\xa0\x8f\x8b\xb6\xa2\x68\xa0\x61\x7d\xb5\x05\x24\x9a\x96\x76\x00\x37\xb0\xc6\x4f\x75\x0e\x7a\xf2\xba\xd2\xa9\xf7\x6c\x3e\xdd\x1d\xf8\x95\xbd\x2c\xac\xca\xdb\x5b\x78\x9a\xf0\x58\x4c\x0c\x9c\x21\x60\xec\x0f\xb8\xba\x23\x6b\xfe\x68\x15\x2f\xfa\x73\x99\xbb\x2a\x83\xce\x16\x80\xc8\x9b\x30\x97\xca\xeb\xb8\xa4\x5e\x16\x5d\x08\x16\x94\x6c\xbc\x01\xdb\x94\xfd\xdd\x94\xaf\xc6\x3b\xf0\x82\x87\x80\x6f\xc0\xb0\xe4\xcc\x93\x6d\x0e\xbe\x26\xb6\x81\x63\x55\x06\x29\x94\x27\x8c\x7b\xc3\x06\x74\xd5\x0b\x52\x43\xe6\xa7\x92\xd7\x1b\x6e\xc8\x37\x3c\x0a\x5e\xb8\x17\x38\xbf\x11\x99\x3d\xe1\xd5\x40\x64\xf6\x1c\x18\xaa\xab\xb7\xc0\x5a\x58\x35\xc3\x0c\xab\x61\x13\xbc\xe0\x2d\xa7\xb7\xc0\x12\x98\x22\x57\x65\x16\xce\xd8\x04\x0b\x58\x1e\x6c\xf8\xcf\x19\xac\x0d\xae\x40\x9f\x7e\xb2\x26\x93\x0e\x92\x3f\xd9\x83\xdd\x3e\x1b\xd5\x5a\xc2\x4e\xdf\x2c\x06\x41\x18\x75\xa1\xbc\xd4\xd7\xdb\xc9\x8c\xc5\x7f\x52\xfe\xb9\x25\x78\x1e\xa9\x63\x0f\xcc\xc5\xa3\xd8\xd9\xcd\x88\x65\x8c\x9b\xc3\x5e\xb6\x33\x67\x23\xd5\xce\x98\x95\x3c\x9d\x7a\xac\x7c\xd2\x39\xce\x27\xef\x96\x62\x6c\x36\x80\x07\xda\xb6\xc1\x1c\x9a\x2a\x82\x2f\x7a\x05\xcb\xbd\x40\x27\x4b\xff\xe9\xc2\x4f\x55\xb1\x9b\xd7\x56\xf6\xb0\x69\xd2\x3f\x66\xdb\xf8\x40\x5f\x43\xbc\xe3\xf6\x0c\xca\x1f\x3f\xd5\x0f\x2a\x9e\x47\x1d\x37\xe8\x9a\x0e\xfa\xef\x40\xf4\x71\xcf\x98\xdc\xf4\xac\x1f\x53\x18\xc0\xc7\x8d\x19\x96\xf0\x9c\x1c\xc6\x73\xf2\xbb\xe0\xe9\xec\xc1\x93\xbf\x95\xab\xc7\x53\xe4\x95\xfa\xaa\x31\xed\x3d\x78\xf2\xcb\x96\x7a\x3c\x45\x72\xa6\xaf\xe2\xa1\x7f\xe9\x7a\x2e\x01\x7c\x1a\x49\xef\xf2\x07\x15\xb6\x82\xb8\x4c\x74\xf8\xae\xb6\x9a\x24\xa1\xfa\x8e\xdc\xa8\x3c\x08\x23\x97\x05\x43\x8a\x8f\x07\x14\x7d\x4d\x17\x80\x47\xff\x1b\x97\xf8\x44\x3c\xae\x50\xda\x85\x23\x5d\x95\x2e\x7e\xbc\x02\xf7\x5c\x58\x5e\x82\x9b\xbe\x8a\xa4\xac\x0e\xfc\xf0\xc9\xc4\xef\x84\x1f\xa1\x1c\x61\xb9\x35\xc9\xb5\xe3\xfe\x83\x53\x41\x4f\x8f\xf3\xcf\x9d\x26\xda\x3d\x96\x69\x0d\x98\xc5\xad\x0d\x44\x86\xab\x10\x5c\x9b\x72\x52\x20\x32\x3a\x5f\x20\x9a\x89\x42\x7c\x7a\x44\x8f\x21\xb6\x2a\x8e\xeb\x29\x2c\xf6\xd4\x2d\xf6\xf4\xbb\x4d\xe9\xf1\xb8\x8e\x50\xa1\x9f\xed\x3f\x6d\x42\xce\x71\x1d\xb9\xc5\x8e\x9a\xc5\x8e\xec\xe3\x3a\x9a\x17\x3b\xda\xfd\x13\x48\x04\x6f\x4d\xf6\xc2\x79\xa0\x69\x63\x39\xe1\xad\xa1\xc1\x8f\xf8\xc0\x37\xe0\xbe\x1c\x7a\x26\x32\x3f\xb2\xd7\xf3\x47\xd6\xb7\xee\xea\xbf\x9a\x31\xce\xa7\x4e\x96\xf2\xfe\x6e\xe0\x96\x7f\xd8\x67\x9c\xc2\x64\xd0\xe7\xf3\x5f\x40\xbe\x7d\xc7\x73\x08\xe5\xeb\xeb\x63\x3c\x69\x95\x89\x8b\xa7\x15\xcf\xa6\xf7\xbc\x77\xda\x80\x5f\x2c\xc9\x36\xb2\xa4\x04\x1a\x29\xd0\x47\xaa\xb3\x01\x3c\x67\xeb\x30\x05\xe4\xed\x46\x04\x1e\xf9\x02\xb8\x83\x35\xf8\x94\x0b\xb5\xa4\x6d\xc9\x92\x2c\x81\x38\x64\x8f\x45\xfa\xf2\x75\x16\x81\x5e\x86\xf4\x0c\x35\x85\xf8\xe8\x97\x02\x6d\x30\x94\xc3\xdd\x69\x02\x0b\xd8\x82\xb7\x92\xc5\x58\xf5\x5c\x4c\x7e\x97\xda\x33\x25\x33\x2b\xf3\xb8\x19\xd0\x34\xbf\xe6\xfa\xbe\x57\xbe\xbe\xf7\x20\x3f\x41\x8e\x97\xd0\xe8\xcb\x3c\x38\xa8\x7a\x9d\xbe\x81\x1f\x35\x91\x2a\x2a\x85\x0f\xc6\xb1\x47\x9e\x4f\xe4\xd8\xe0\x54\x69\xc3\x69\xbf\xf4\xd9\x80\xaa\x57\xdf\x13\x3c\xff\xfa\x53\x98\x0b\xb4\x8f\x58\xee\x79\xf0\x05\xf0\x03\xf4\x24\x3b\x40\x4f\x96\x70\x0e\xfa\xea\x19\xf0\xe0\x35\xf7\x30\x4d\x32\x23\x7f\x42\xb0\x17\x09\xa3\x7c\xb0\xef\xdd\xfb\x40\x8b\xe8\x09\xb5\x09\x8e\x3d\x36\x5d\x00\x72\x5a\x73\x85\xeb\x9a\x7e\x90\x69\x07\xb5\x10\x0e\x4b\x27\x6e\x4b\x73\xf8\xcb\xab\xf2\xc5\x8b\x6e\xaa\xa1\xee\xc1\x04\x88\x33\x9e\xf6\x6b\xf6\x44\x18\x2e\xf1\xd2\xeb\x1e\xf4\xb2\x98\x27\xed\x31\x7b\xa0\x0d\x63\xa0\xa9\x27\x50\x43\xe2\x15\xd5\xf3\x48\xdd\xe9\x9a\x2f\x3c\xc9\x96\x1c\x56\xb1\x02\x23\x75\x6e\x68\x29\x77\x1d\x49\x31\x17\xd6\x15\xe8\xe8\xb7\xea\x0e\x5c\x02\x9f\xd2\xb1\x6e\xba\xe9\x81\xe9\xc6\x07\xa6\xbb\xd4\xf3\xd3\x3d\xdb\x3b\x5d\xbf\x7a\xba\x83\xef\xd3\xfd\xe7\x4f\xb7\xf9\xdf\x65\xba\x9a\xf3\xab\xba\x04\x1e\x0c\xae\xb9\x33\x6d\x09\xfd\x6b\x72\x4d\x66\x89\x9b\x98\x2c\x6c\xbd\xdf\x57\x2f\x89\x13\x8f\xe9\x50\xf8\x46\xc2\xde\xaa\x3e\x14\x37\x79\x85\x0f\xa6\xc8\x8c\xba\x85\x1f\xab\x3e\x9a\xf8\x71\xa4\xa6\xba\xb8\x4e\xab\x91\x19\x4f\xa3\x9c\xb1\x53\x1c\x82\xe7\x64\xab\x1f\x62\x77\xcc\x10\xff\x02\x2c\xe2\x3d\x43\xf8\xf4\xfb\x14\x7b\x86\x08\xff\x20\x58\x6c\xf7\x0c\xc1\x33\xbb\xd6\x0f\x11\x1f\x33\x44\xba\x67\x08\x9e\x8d\xbd\x7e\x88\xf5\x1f\x60\x2d\xe0\x02\xdc\x4a\x5f\x6f\x1e\x76\xa0\x7f\xc3\x0d\xc6\x36\x7c\xb9\xe9\x57\xfa\xbe\x0a\x79\x71\x0c\xe9\x7b\x76\xf9\xc7\xa8\x6f\x70\xa0\xa9\xf6\x0e\xe6\xf2\xff\x31\x6b\xe3\x0d\x5a\x26\xfb\x0c\x4e\x1b\xee\x20\x14\xdf\x39\x78\x90\x53\xaa\x54\x86\xf7\x19\xda\x90\x07\x19\xb2\x4c\x18\x09\x34\xb1\xc1\x64\xc8\xdf\xc1\xc9\x3e\xe6\x46\x8d\xb8\x73\x38\xe7\xb8\x4d\xce\xe0\x85\x30\x86\x63\xb0\x3f\x8b\x18\xca\x9f\xba\xc7\x92\x99\x26\x8e\x97\x11\x1c\x73\xbb\x6c\x0d\x3d\x6a\x6d\x20\x11\x75\xf2\x8c\xcf\xb5\x7e\x66\x7c\x04\xe4\x15\x7d\x0a\xac\xa2\xe1\x64\x10\x5f\xfa\x63\x96\x98\x82\x24\x33\x70\xbe\x3a\x4f\x41\x31\xed\x4e\x46\xc4\x12\xb2\x4e\x31\x65\x5a\x04\x7f\x35\x2a\x2f\xff\xd6\x10\xc9\x5e\xfd\x31\x21\xfa\x23\x3e\xaf\x33\xd3\xdf\x34\xd9\x47\xb3\x1f\x8a\xcf\x2b\x07\xb2\x83\x60\x98\x3f\xa9\x1f\x9b\x4a\xae\x74\xca\xe9\x09\xa2\x8d\x4d\x4a\xa3\x69\xfe\x3d\xb0\xfc\x44\xc1\x10\x66\x61\x0f\x2b\xa8\x0b\xd0\xe1\xd7\xf4\xcb\x4c\xeb\x4d\xf3\x2f\x68\x6b\xcb\x26\x85\x87\xb1\xb4\x62\x17\x74\x81\x59\xf5\xde\xf5\x02\xbc\x01\x7c\xc0\xe8\x82\x14\xf4\xc9\xe0\x09\x7f\x14\x3f\xec\x82\x26\x18\x31\xfd\x5b\x3c\x76\x0c\xc8\xdd\x30\xcc\x40\x8f\x02\xf4\xa8\x09\x85\x56\xc5\x18\x1c\x31\x92\xfd\x52\xac\x08\x5d\x4e\x4a\xbd\x2b\xe8\xb7\x6e\xfa\x6a\x0a\x2f\xe1\x5b\xeb\x06\x9f\xba\xb4\x07\xab\xe2\x86\xf8\x17\xf2\xf1\x4f\x64\x49\x5f\x0d\x4d\xbf\x2a\x6f\x06\x9f\x0a\xc9\x01\xa1\x8d\xad\xe2\x6b\x3e\x3f\x7b\x52\x19\x66\x27\x20\x17\x48\x5d\x65\xe1\xb6\x9f\xc8\x97\xa1\x90\xf5\x15\xc7\xd2\x71\xf6\x1d\x96\x4b\x29\x1b\xc1\x80\x98\x1b\xa9\xae\x6d\xf9\xeb\xca\x81\x36\x2c\x25\x3c\x3c\xfa\x44\x3c\x14\xbc\x85\xbe\x2e\x45\x21\x4a\xa0\xc7\x6f\xef\x87\x31\x8c\x7b\xa6\xc8\x6a\x69\xca\x49\x22\x8e\xd8\x34\x55\x01\xcb\x7c\x0e\x1f\xc9\xa3\xe3\xfb\x07\xde\xf9\xa7\x5f\xf0\xdf\x0f\x0f\x9c\xb0\x83\x5f\x0e\x48\x99\xaa\xb4\x4b\x95\x31\xf9\x83\x8a\x8b\x71\x2a\x84\x12\x98\x5c\x73\xc9\xb2\x94\x24\xcb\x12\xc4\x70\x7e\x4d\x02\xb0\xa7\x56\xae\x13\x43\x7e\x8a\x3d\x94\xee\x51\x06\x2c\xaa\xa3\x70\x85\x6f\x69\x03\x33\x77\xc1\xd1\x3b\x3e\x39\xd1\x44\xec\x38\xe7\x6b\x6e\x65\x6b\x5f\x08\x58\x19\x71\x64\x8f\x68\x45\x4a\xba\x04\xbe\x59\x06\x3b\xe2\x2e\xa5\x20\x0a\x4c\x97\xa5\x45\x52\x85\xd8\x16\x17\xe9\x03\xbe\xed\x0b\x4e\xcf\xc9\x7e\x61\xe9\xc1\x8d\x65\xa8\x3b\xb0\x84\x6f\xe4\xb1\x42\xca\xdd\x42\xc3\x7c\x32\xce\x81\xe6\xf5\xc9\x08\x31\x0f\x22\x0a\x81\x96\xf4\xfb\x58\x8c\xec\xfa\x6c\xef\xac\x81\x96\x58\xc4\xfa\x69\x5b\x59\xad\x8e\x45\x5c\x06\x97\xfc\x3d\xd5\xfa\xf0\xc6\x26\x4f\x87\xb4\x47\x66\x6f\x78\x70\x33\xf8\x44\xe6\xd8\x1e\x98\xea\xfd\x15\x6c\x36\x6f\x34\xf5\xfe\x12\xbe\x36\xf9\x2d\xe0\xd8\x83\x17\x03\x92\x4f\x1a\x2e\x6f\x4c\xa9\xf1\x04\x5e\x8c\x67\x98\x1c\xa5\xdd\x3b\xa8\x78\x41\x6c\xc0\x3e\x5b\x2f\xbb\x20\xc9\xa1\x58\x5d\x98\xcf\x01\x30\x07\xf9\x08\x7f\x58\x75\x97\x57\x68\xed\x83\xaa\xe6\x52\x55\x1f\x88\xfb\xfb\xc2\x23\xe6\xec\x57\xe1\xe9\xc0\xb0\xe0\xaf\x79\xac\xc8\x3a\x52\xc8\x6e\x50\xf0\xbf\xd9\x05\xe5\xdc\x80\x6b\xce\x0c\x93\x4b\xf8\x36\xe8\x4b\xe1\x71\x4c\x5a\xfc\x82\x37\x85\x2d\x84\xc5\xd3\x2f\x78\x06\x73\x60\x55\x7a\x80\x4a\x62\x28\xa0\xe6\x50\x0c\x86\xc5\xfa\xbd\xca\xa7\x81\x83\x11\x8b\x7e\x9c\xcb\x19\x05\xc9\x44\x74\x9e\x40\x2e\x25\x21\x1b\xcc\x18\xec\xf7\xd9\xe7\x56\xb0\x82\x19\x4a\x52\xd2\xce\xcb\x0d\x23\xf7\xe9\x6a\xf2\x75\x37\x4d\x93\xd3\x40\xb1\xbb\x14\x9d\x3c\xe2\xa7\x19\x08\x2c\x4b\x92\xb5\x25\xd4\x46\x7d\x66\xe7\xbb\x50\x9b\x0e\xa5\x51\xec\x0a\xb1\x65\xc8\xef\xc4\x07\x23\x35\xe6\x3c\x50\x46\x92\x7e\xf0\xb1\x49\x86\xb7\x04\x92\xf4\xd4\xb2\x24\x07\xdb\x71\x31\xf6\x57\x93\xa7\x17\x66\xa3\x84\x9c\xe9\xca\x48\x52\xe3\x7b\x9b\x65\x63\xae\x45\x92\x9e\x34\xe6\x04\xc9\x41\x05\x92\x85\xe1\xb9\x21\xb3\x06\x4c\xa3\xde\x57\xf8\x07\x87\x75\xae\x62\xb6\x42\x1b\x78\x25\xbe\xe3\xb6\x23\x36\xf5\xb4\x2e\x4a\xae\xd6\x84\x94\xac\x7f\xfd\xe6\xfb\x96\xaf\xda\xf2\x73\xfd\x35\xb7\xe5\x8f\xb3\x5a\xde\xa0\x30\x5a\xe8\xda\xcc\x69\x50\x4c\xad\x40\x28\x3c\x17\x1e\x4b\x5c\xf3\x0a\xa4\x2f\xdd\x9f\x95\xa5\xc4\xf0\xeb\xe4\x85\x23\xf8\xbb\x24\x2a\x7c\x50\x94\x15\xe3\x23\x64\xc5\x1c\x68\x77\xfc\x83\x9d\x97\x24\xd6\x70\x9c\xff\xda\xf8\x71\x12\xe6\xb1\x5e\xb8\xf8\xa0\x62\xe3\x0d\x8a\x79\x6d\x3f\x4a\xc2\xe6\xbe\x7a\x1f\x56\x0a\x9b\x39\xd0\x7e\x1d\x65\x5b\x78\x0e\xf8\xf7\x74\xbf\x45\x50\x3d\x08\x2c\x4a\x32\x8a\x52\x57\x16\x52\x56\xbd\x90\xca\x4b\x2a\x4a\x62\x81\x1d\x4f\xd6\x64\x1d\xd1\x74\xa0\x3d\x8f\xd8\x87\x0b\xda\x90\xc4\x39\xd5\x4a\x08\xab\x8e\x2f\x1f\x2b\x9e\xf5\x95\x9e\x33\x5b\xfd\x9c\x2c\xb5\xeb\xc5\xe8\xd1\xcb\x29\xd6\xe4\xbe\x5a\x77\x54\x8a\x55\xba\x9c\x82\x89\xc5\x6b\x67\xeb\x28\x91\x1c\x83\x51\x49\xaf\x4a\x09\x0d\x17\x7a\x93\x3f\xb1\x1e\xcc\xf5\x0d\xe8\xcb\x2e\xa3\x22\x49\xde\x60\x60\x55\x1b\xf4\x3b\x78\x46\xb3\x18\xdf\x57\xfb\x31\x86\x05\xff\x04\x89\xb2\xba\x97\x0d\x77\x7e\xbd\xea\x96\xf2\xdd\xf5\xcc\x52\xf2\xbc\x61\xc1\xda\x85\x1b\x91\xff\xbc\x36\xcb\x73\x4f\xdf\x82\x7e\xe5\x79\xaf\xe0\x77\x18\x56\x04\x1f\x9f\x65\x56\x2c\xb3\x6d\x5f\xa0\x57\xe1\x50\x78\xac\x70\x1e\x54\x95\x3d\x54\x39\x14\x58\xb0\x97\x0b\x27\x23\x15\xbd\xc0\x8f\xd9\xf7\x04\xe6\xed\xe1\x2d\x89\x21\xc0\xc3\x2f\xf5\x45\x6b\x48\x1c\x3b\x22\x71\xa3\xa7\x2f\x5b\x43\x53\x3d\x03\x4b\xbd\xd1\x1c\x6a\x78\xab\x1a\xdc\x87\xe0\x66\x9e\x09\x17\x78\xba\x8f\x2b\xb6\x79\x27\x97\x52\xc5\x65\x56\x71\x09\xb4\x09\x49\x8c\x67\xc8\xf7\x67\x61\xc6\x19\x25\xcf\x85\xa7\x9f\x34\x87\x7d\x96\xdd\x31\xd5\x97\xfa\x0a\x77\xbf\x86\x82\x21\xe4\xd0\x8c\x5f\xfa\x6a\x13\x7a\x7a\x13\x57\x69\xc3\xa5\xde\x6a\x0e\xcb\xb5\x5e\xe0\xb9\x6e\x48\xdf\x88\xe8\x51\x3a\x31\x12\xa5\x70\x44\xfa\x58\xb6\x87\x86\xda\x86\x2e\x78\x3d\x1b\x0e\x05\xbd\x2e\xcf\x86\xb7\x6a\x0a\x96\xfa\x05\xa6\x46\x0a\x84\xcf\xaa\x20\x25\x4a\xc9\x87\x0c\xed\x77\xf8\x98\xaf\x55\x97\x52\xea\xa1\x78\x24\x2c\x4f\xa1\xf7\x02\x13\xd3\x2a\x7e\x1a\x83\xdd\x93\xbf\x80\xb8\x3b\xec\x13\xc4\x56\xed\xa1\xa9\xa6\xe0\x05\xbe\x18\x19\x9b\x9c\x75\x87\xb7\xec\xdb\x1b\x5d\xd0\x5b\x5c\x0c\x0d\xf1\xdd\x9c\x13\xd8\x36\x2b\x7c\xb2\x15\xf1\x32\x3d\xad\xc7\x5d\x3e\x4c\xe3\x0c\x4c\xd9\xf1\x6d\x78\xfa\x8e\x33\x9b\x87\x57\xf0\x2c\x4b\x0e\x6b\xd7\x1d\x4a\xf7\xbc\x99\x36\xc8\xe7\x6d\xc4\xce\x5f\x0f\x8b\x25\xf1\x50\x9b\xf2\xef\x35\x14\x44\xc0\xfe\x87\x12\xbd\xbd\x89\x08\x8a\x4b\x67\x0b\x0e\xb0\xeb\x4d\xb4\x5f\x4d\xe6\xe8\x7d\x10\x46\xc9\x57\x25\x43\x96\x2f\xc6\x61\xf5\x48\x8f\x79\x4f\xd6\xa4\xc6\x46\x33\xb4\xca\xcc\xfc\x55\x9f\x26\xe0\x8c\xd5\xe8\xcb\xfb\x49\x0e\xc0\x70\xe1\xc9\xf5\x48\xdd\x82\x17\x78\x75\xcd\xd9\xc9\x85\x97\xd7\x84\x9b\xb2\x14\xc9\xda\xb4\x5f\x7a\xba\x32\xcc\x73\xf2\xa0\x42\xf9\xf6\xea\x8c\xd8\xe2\xce\x30\xbc\x21\xf7\x7f\x92\x80\x18\x2a\x65\x90\x90\x32\x73\xa0\xe9\x1f\x99\xef\xb4\xae\x42\xef\xa3\xac\xee\xec\xbd\x29\x3b\x27\x79\x15\x3d\x14\x2d\xfc\x8c\xc8\x4e\xe1\xda\x72\x90\x8f\x25\x41\xf9\xf4\x8b\x32\x40\xbc\x00\xaa\x1a\xdf\x16\x61\xb8\x73\x86\xaf\x70\xfa\x4e\x45\x97\x53\xbc\x15\xac\xfc\xd5\x48\x29\x54\x05\x1f\xd7\xb6\xe0\x37\xf6\x61\x95\x12\x5a\xec\x27\x1a\x65\x48\x3b\x4f\xa0\xca\x01\x32\x8a\xd8\x75\xa4\xb2\xb3\x8f\xe1\x94\x46\x25\xec\x49\x9f\x6f\xac\xf4\xad\x3b\x32\x55\x27\xd4\x13\x77\xc4\x43\x44\x06\x52\x3a\x5c\xd8\xd1\x89\xad\xa3\xad\x01\x9d\x2a\x26\x7f\x44\x32\x9d\xf1\x12\x87\x14\x38\x59\x81\x0b\x6a\x4a\x7c\xa9\x9f\x98\x16\xe5\xbb\x86\x66\x00\xa8\xef\x91\x3d\xf6\x04\x81\x7e\x9f\x7d\x7c\xf6\x3a\x0d\x46\x44\x58\x90\x4f\x62\xc5\x7a\x27\x18\x0d\x45\x4d\xbc\x66\x4e\xa9\x29\x0f\x73\xbd\x76\xc3\x11\xcf\xc7\xde\x04\xb1\x1e\x85\x85\xa6\x7b\x46\x6d\x87\xb9\x51\x1b\xc5\xa6\xd3\x52\x53\x9e\x07\xe8\x7a\xbd\x1a\x91\x39\xe8\x78\x0e\xb1\xfe\xb6\x3a\x7e\xd4\x93\x55\x6e\xd4\x60\x5d\x68\xfa\x50\x6a\xca\x4d\x8e\xeb\xdd\x7a\x44\xd4\x8b\x8e\xf5\x74\xac\x5f\x14\x9b\xde\x97\x9a\xf2\x0f\xb0\x5e\xfb\xd1\x88\xbc\x42\xd4\xf1\x0a\xc5\xfa\x26\x3a\x1e\xd7\x6e\x94\xc3\xf5\x25\x96\x9a\x42\x38\x92\x47\x45\x99\x01\xca\x6f\xd4\xe0\x2f\xc4\x69\xbf\x04\xc5\x63\x32\x16\x8e\x1e\xc9\x39\xbe\x04\x45\xb7\x2f\x83\x39\x04\x66\x57\xc2\x10\x81\x39\x95\x30\x9b\xc0\x1e\x4b\x30\xc3\x03\x78\x53\xf9\x40\x5c\x9e\x04\xa4\x0b\x1f\x08\x1d\x15\x50\xd6\xf5\x81\x38\x4a\x07\x80\xe0\xe2\xb3\xc1\x68\x09\x22\x05\x8f\xec\xab\x6a\x2f\x80\x21\x6d\xb3\x81\x74\x53\x7e\xfe\x48\x0b\x4a\x35\xec\x43\x15\x50\xe1\x6f\x67\x5f\x07\x5c\x2a\xb1\xf7\xd5\xb9\x37\x0b\x73\xf2\x69\xb8\xa9\xf8\xdb\x25\x7f\x93\xe6\x29\xc8\xf2\xfa\x6e\x41\x06\x44\x59\x92\x1a\x0a\x6c\x4b\x40\x3a\xd3\xb6\x04\x6d\x4a\x50\xa7\xd8\xaf\x0c\x2c\x4e\x4a\x72\x4b\x38\xa2\xb1\x04\x7f\x10\x7f\x3f\xde\xbc\x1a\x5a\xe9\x8b\x2c\xc5\x83\xcb\x70\x4c\xa0\x5b\xc0\x5f\xce\x6b\xaf\x64\xcd\x79\x01\x5e\xca\x57\xba\xc6\xbc\x28\xa5\x45\xd3\xac\x64\x5e\x57\x62\x67\x25\x21\x2d\x71\xb2\x92\x35\x2d\x91\x46\xcf\x3d\xe1\xc7\x30\x94\xc1\xba\x19\x2c\x06\x17\xd0\xd5\x5b\x40\xdd\x81\x2e\x7c\xa1\x86\x7c\x1e\x01\xbb\x84\x80\x5f\x46\xe0\xb1\x34\xdd\x72\x89\x8c\x37\xc3\xc0\x05\x25\x14\x1e\xf6\xa0\xb0\x04\x95\x38\xa4\xdf\x71\xf8\x63\xe1\xd0\xfc\xef\x8c\x83\x76\x7f\x85\x27\x4a\x5f\xc5\xae\xb3\xe9\x67\x86\x85\x98\x7f\xc4\x32\x98\x49\xf3\x8f\xc8\x46\x5b\x4b\xb3\xad\x2c\xf1\xa5\x66\x21\x2d\x0a\xa5\xa2\x35\x2d\x92\x26\x90\x9f\x7f\x04\x48\x95\x75\xd5\xfc\x61\x04\xde\x40\xc9\xfc\xaf\x95\x5a\x72\xba\xe4\x1b\x93\x7d\x1b\xa4\xe4\xde\xbd\xeb\xab\x3b\xd8\xd2\x9b\xee\x58\x63\xf6\xc3\x8e\xf8\xcb\x77\x4c\x78\x37\xf5\xce\x62\x6c\x1d\x38\xbb\x0f\xea\xb2\x37\x0f\xa4\x7a\x13\x62\x69\x1b\x16\x77\xc7\x98\x7d\xf9\xef\x31\xfe\xfb\x04\x88\xbf\xad\xc2\xdf\x03\xf8\x06\xc8\xf5\xe3\x1c\x32\xab\xc7\x11\xd6\xbf\xa3\xc1\x05\xc4\x2c\x28\x60\x6e\x76\x2c\xc1\xb2\x7d\x01\x09\x57\x08\x70\x9c\x81\x63\x0a\x5e\xcb\xe0\x5d\x06\xc6\xc4\x58\x40\xcc\x6f\x97\x40\x1a\xf1\x9e\x05\x23\x11\x86\x12\xa0\x9c\xa3\x87\x00\x71\x7f\x1c\x9a\x66\xd0\x94\x42\x69\xaf\x85\xe3\x2b\xaa\x38\xbe\xca\x23\x95\xe3\x52\x0e\xc1\x50\x11\xf6\x78\x18\x66\x5c\x01\x32\xe1\x10\x0a\xbd\x29\xfe\x5d\x03\x0d\xae\x28\xc9\x38\x58\xaa\xe3\x53\xe8\x56\x82\xba\x52\x63\x97\x82\x77\x12\x78\x29\x81\xb7\xe5\xd6\x6b\x09\x9c\x02\xcd\x58\xd1\x65\x72\x21\x25\xd5\x3c\x9b\x3b\x9e\xd8\x0b\x24\xc3\x71\xa8\x23\x80\x3e\x05\x86\x12\xd0\xcd\x9a\xba\x14\x1a\x4b\x50\x1f\x14\xdb\xae\x25\xa8\x44\x32\x6c\x03\x32\xe8\x12\x66\x37\x00\x7c\x74\x3c\x2b\x8f\x96\x2f\x73\xbc\xcb\x53\x68\x60\x68\x2c\x43\xdd\xac\x8e\x4b\xc1\xa9\x0c\x5e\x66\xe0\x6d\x45\xeb\x75\x06\x4e\xf7\xb7\x26\xc6\x2b\xa5\xd7\x1c\x32\xe7\x22\x12\xce\x51\x24\xef\x9b\x10\xc8\x99\x93\x18\x56\x0b\x48\x4a\x04\xd8\x11\x50\x9f\x42\x7d\x19\xea\x02\x39\x9f\xae\xb4\xe9\x42\x29\x7e\x4b\x6e\x1d\xca\xe0\x65\x06\x5e\x82\x06\x7c\x5c\x60\x1e\x3a\x81\x9e\xae\xe5\x36\x7e\x51\x28\xcc\xc1\x5e\xa9\xb0\xde\x2f\x15\xb6\xfb\xa5\x82\x53\x2f\x15\xe6\x60\x9f\x58\x88\xf7\x8a\x05\xe7\xeb\xc4\x02\x1b\xaa\x7a\xef\xef\x05\x2e\xc1\x1e\xc9\x50\x0b\xc4\xa2\xa1\xb9\x5f\x34\x6c\xf7\x8a\x86\xf6\x7e\xd1\x70\xb6\x5f\x34\xb4\xf7\x8b\x86\x78\xaf\x68\x08\xf7\x89\x86\x74\xaf\x68\xd8\xed\x15\x0d\xdb\xbd\xa2\x61\xbb\x5f\x34\xc4\x7b\x45\xc3\x6e\xbf\x68\x68\xee\x17\x0d\xbb\xfd\xa2\xa1\xb9\x5f\x34\x84\xfb\x44\xc3\x7a\xbf\x68\xf0\xf7\x8a\x86\x78\xbf\x68\xd8\xee\x17\x0d\x69\x8d\x68\xf0\xbf\x8b\x86\xef\xa2\xe1\xbb\x68\xf8\x2e\x1a\xbe\x8b\x86\xef\xa2\xe1\xbb\x68\xf8\x2e\x1a\xbe\x4a\x34\x34\xbf\x8b\x86\xef\xa2\xe1\xbb\x68\xf8\x2e\x1a\x64\x30\x6c\x61\x38\x75\x54\xf3\xc7\x89\xc2\xe1\xcd\xf3\x49\x43\xe1\xcb\xa6\x55\x16\x7a\xa8\xbf\x02\x75\x07\xe6\x7a\xa2\x6b\xec\x86\x46\x6a\xcd\xbc\xdc\x72\x73\x24\x97\xfc\x41\xda\x37\xbf\xb5\x3d\xbc\x69\x51\xbf\xfd\x0e\xc8\xeb\x25\x31\xdb\x23\xfb\x45\x3d\xda\x59\x3d\x54\x90\xab\xf3\xec\xe7\x23\xfb\xf5\xd5\x4d\x20\x6e\x82\xc8\xc7\xa8\x79\xc8\x48\x42\xa7\xc7\x4b\x5c\x00\x61\x22\x66\x3c\xe5\x1d\xbe\x51\x0f\x2e\x2f\xf2\x6b\x8b\xe6\x52\xd1\x9c\x16\xc9\x7d\xed\xb2\x90\x10\x17\x68\x83\x0e\x90\x32\x2e\x0e\x8f\xfc\x7e\xe0\x40\x5c\x64\x4e\xf3\x1e\xff\xfd\x21\x58\x03\xcd\x3a\x03\x6a\x5b\xd7\xf4\x2b\xcc\xa2\x86\x25\x45\xcd\x64\xf9\x63\xac\xc2\x97\xff\xc8\x9b\xa5\x29\x34\xf6\xc4\x19\x59\x15\x59\x40\x0b\x19\x71\xb2\xaf\xe7\x17\x42\xaa\x0c\xed\x9e\x5f\xe0\xee\x80\xf4\x9c\x75\xdf\x83\xaa\x89\xe8\x51\x0a\x20\x86\x17\xa0\x8f\x37\xaa\x2d\xbd\x16\xce\xde\x3b\xb4\x81\x06\x9f\xf0\xdf\xf7\x12\x38\xcb\x0b\xd8\x04\x1a\xfc\x54\x6c\x9d\x45\x8f\xd1\xd6\xb6\xa6\x21\x26\xa3\x20\xfc\x05\xb7\x4e\x19\x97\x3b\xe4\x43\x37\x87\x0b\xc6\x59\x01\x22\x05\x93\x62\x01\x6d\x32\x2e\xf6\xb1\xaf\x60\x9c\x15\xc8\x9d\xb2\x02\xab\x03\x28\xda\xdc\x80\xf8\x24\x51\x01\x69\xd6\x27\x4c\x3e\x47\x44\x6c\xc1\x19\xfd\xfb\x81\xfd\x6d\xcc\x68\x75\xb1\xbd\x59\x73\x16\xb0\x07\xef\x4c\x4c\xa1\x39\x14\x01\x0f\x0b\xa8\x0e\x57\x86\x3f\x9f\xdc\xaa\xc3\xd0\x78\x99\x4f\xee\x79\xe8\x83\x61\x62\x48\xc8\x20\x1e\x86\xd8\x32\x64\xcd\x20\x01\x86\x38\x32\x24\x66\x90\x15\x86\x30\x4b\xe1\x39\x37\x30\x93\xec\xc3\x95\xd1\x5e\xd0\xba\x6f\x0b\x3e\xb2\x0b\x58\x37\x67\x0c\xd4\x5a\xf0\xa1\x05\xa8\xcb\x40\x9d\x05\x1f\x5b\x80\x2e\x19\xe8\x7c\xc1\x07\x77\x41\x61\xf4\xb9\x18\xdd\x7f\x61\x78\xbf\xf0\xd1\xe7\xbc\x9f\x90\x81\xbc\x17\x3e\xba\x00\xad\x19\x28\x78\xe1\xa3\x0b\x50\xcc\x40\xab\x17\x3e\xfa\xbc\x38\x3a\x12\xa8\x2f\x19\xea\xcb\x89\x58\x5f\x86\x39\x83\xb4\x96\x7c\x6c\x0e\xe9\x32\x48\x67\xc9\x87\xe6\x90\x4b\x06\x39\x5f\xf2\x91\x51\x2d\xd1\x7d\x9f\xa1\xed\x97\x88\x1e\x32\x90\xe7\x97\x88\xbe\x66\xa0\xc0\x2f\x11\x3d\x66\xa0\x95\x5f\x4b\xf4\x0c\xed\x80\xa1\x1d\x94\xd0\x66\x90\x56\x50\x42\x9b\x41\x3a\x41\x09\x6d\x06\x39\x0f\x2a\xd0\x9e\xe4\x99\x7c\xc5\xb0\x5e\x65\x6c\xc9\x90\x66\x10\x6f\x55\x64\xe5\x35\x83\x04\x18\x82\x72\x4c\xce\x20\xab\x55\xb6\x31\xf2\x03\x4b\x4c\xbe\x66\x28\xaf\x25\xf2\x30\x9c\x19\xa8\xb5\x2e\x11\xb5\xcb\x40\x9d\x35\x1f\x3b\x63\x72\x06\x3a\x5f\x4b\xab\x94\x1f\x5d\x62\xf2\x98\xe1\x1d\x4b\x3c\xc9\x10\x67\x20\x2f\x2e\x71\xf2\x9a\x81\x82\x98\x8f\x9e\x31\x39\x03\xad\x62\x69\x6b\xe4\x47\xcf\x56\x3b\x61\xa8\x27\xd9\xfa\x30\xcc\x19\xa4\x95\x14\xd7\xb4\xcb\x20\x9d\x84\x0f\x2d\x56\x9b\x41\xce\x93\x8c\x43\xea\x88\xee\x6f\x18\xda\x9b\x12\xd1\x43\x06\xf2\x36\x25\xa2\xaf\x19\x28\xd8\x94\x88\x1e\x33\xd0\x6a\x53\x4b\xf4\x0c\xed\x2d\x43\x7b\x5b\x42\x9b\x41\x5a\xdb\x12\xda\x0c\xd2\xd9\x96\xd0\x66\x90\xf3\x6d\x86\xf6\xc4\xc4\x42\x7e\xcb\x14\xc7\x92\x5a\x72\x63\xd6\xff\x98\xf5\xcf\x9f\x58\x18\x26\x06\x75\x19\xa8\x23\xba\x11\xa0\x4b\x06\x3a\x17\xb3\x12\xa0\x13\x06\xba\x10\xa8\x2c\x09\xda\xd2\xe8\xae\x18\x3d\xdc\xd1\xca\xde\x2e\x2f\x59\xc6\x2b\x63\xcd\x40\xc1\x2e\x2f\x59\xc6\x2b\x23\x66\xa0\xd5\x2e\xbf\x1e\xe3\x95\x91\x32\x50\xb4\xcb\x4b\x16\x69\xf4\x79\x86\xfb\x1b\xc3\xfd\x2d\x2f\xce\x31\xee\x0c\xd4\x79\xcb\x8b\x73\x8c\x3b\x03\x9d\xbf\xe5\x37\x01\xc6\x9d\x81\x2e\xde\xf2\xe2\xbc\x92\xf2\x61\x8b\xe1\xde\x2a\x51\x7e\xcd\x40\x41\xab\x44\xf9\x98\x81\x56\xad\x12\xe5\x53\x06\x8a\x5a\xb5\x94\x97\x70\x6f\x33\xdc\xdb\x65\xdc\x19\xa8\xd3\x2e\xe3\xce\x40\xe7\xed\x32\xee\x0c\x74\xd1\x96\x70\x1f\x8e\x30\xa3\xfb\xc2\x5c\x81\x01\x50\xa7\xa4\x6e\x5f\x9d\x92\xba\x43\x49\xa6\x4f\x57\xc6\xbc\x43\x21\x57\x18\x62\xcb\x10\x97\x41\x1a\x18\xe2\xc8\x90\x25\x83\x2c\x3a\x13\x96\x00\x1c\xbd\xea\x77\xa6\xba\x03\x5b\xdd\xa3\x1f\x5a\xcf\x5b\x30\xd3\x95\xe1\x5f\x4c\x46\xb8\xcd\xcb\xc5\x64\x22\x59\x30\x45\x88\x5d\x0b\x71\x6a\x21\x99\x05\x33\x29\x29\xd3\xe9\xca\x88\x2f\x69\xdd\xd5\x25\x1f\x99\x32\x6f\x11\x64\xd7\x83\x9c\x7a\x90\xc4\xf2\x93\x92\x05\x33\x5d\x19\xbb\x2b\x5a\x79\x73\xc5\x47\x9f\xf3\x7e\x72\x20\xbb\x1e\xe4\xd4\x83\x24\x96\x9f\x14\x55\xf9\x74\x65\x9c\x9d\xd0\xba\xad\x13\x3e\x38\x5f\xc2\x1c\xc4\xae\x85\x38\xb5\x90\x4c\x95\x57\x12\xfd\xa4\x41\xeb\x5e\x34\x4a\x44\xcf\x81\xec\x7a\x90\x53\x0f\xaa\x26\xba\x40\x7b\xb9\xb8\x25\x75\x17\x8b\xdb\x02\xda\x39\x88\x5d\x0b\x71\x6a\x21\x45\xb4\x27\x39\x26\x5f\xbb\xb4\x6a\xe0\xde\x4e\x24\x0b\xa6\x08\x71\x6a\x21\xa8\x16\x62\x17\x98\x7c\x92\xa7\xf7\xf6\x85\xd6\x4d\x5e\x6e\x27\xb2\x32\x2d\x82\x9c\x7a\x10\xaa\x07\xd9\x45\x7a\x4f\xf2\x4c\xde\x5e\xd2\xca\x6f\xcb\xdb\x89\x6c\xc1\x14\x41\x4e\x3d\x08\xd5\x83\xec\x22\x93\x4f\x72\xab\x7d\xe9\xd1\xba\xe7\x5e\xb6\x3e\xb4\x97\x1c\xc4\xa9\x85\xa0\x5a\x88\x5d\xb5\xda\x19\xd1\xdd\x80\xd6\x6d\xf8\x25\xa2\xe7\x40\x4e\x3d\x08\xd5\x83\xaa\x89\x2e\xd0\x0e\x43\x5a\xd7\x0b\x8b\x68\xe7\x20\x4e\x2d\x04\xd5\x42\x32\x0b\x66\x5a\xd2\xa3\xf7\x2b\x63\x8e\xeb\xde\x87\xc6\x55\xc0\xb7\x17\xd5\x88\x45\x90\x5d\x0f\x72\xea\x41\x92\x1e\x9d\x96\x2c\x98\x7b\x7c\x4a\xa0\x95\x5f\x56\xb7\x39\xc9\x52\x04\xd9\xf5\x20\xa7\x1e\x24\x49\x96\x69\x49\x8b\xdf\xaf\x8c\x78\x4d\x2b\xaf\xd6\xb7\x39\x71\x5e\x04\xd9\xf5\x20\xa7\x1e\x24\x89\xf3\x4a\xca\xef\x22\x5a\x79\x13\x95\x28\x9f\x03\xd9\xf5\x20\xa7\x1e\x54\x4d\xf9\x0c\xf7\xb3\x98\x56\x6e\xc5\x25\xdc\x73\x20\xbb\x1e\xe4\xd4\x83\x24\x0b\xe6\xa1\x68\xc1\x3c\xae\x8c\x66\x7c\x6b\xaa\x8f\xa1\xf1\x1a\xdf\x5a\x92\x4c\x2f\x42\xec\x5a\x88\x53\x0b\x61\x23\x1f\x34\x61\xce\xb6\x74\x8f\xb4\xb6\xb7\x05\x13\x26\x07\xb1\x6b\x21\x4e\x2d\xe4\x80\x09\x73\xf2\x4a\xeb\x5e\xbc\xde\x96\xb4\xa9\x0c\xb2\xeb\x41\x4e\x3d\xe8\x90\x09\xb3\x7c\x63\x0a\xf0\xed\xb6\x68\xc2\xe4\x40\x76\x3d\xc8\xa9\x07\x1d\x30\x61\xd6\x4d\xa6\x04\x9b\x45\x5d\x9e\x83\xd8\xb5\x10\xa7\x16\x72\xc0\x84\xd9\xb6\x98\x06\x6c\x95\x88\x9e\x03\xd9\xf5\x20\xa7\x1e\x74\xc0\x84\x69\xb7\x99\x02\x6c\x17\xd1\xce\x41\xec\x5a\x88\x53\x0b\xd9\x6f\xc2\x5c\x76\x98\xfe\xeb\x14\x4d\x98\x1c\xc4\xa9\x85\xa0\x5a\xc8\x01\x13\xc6\x3d\x67\xca\xef\xac\xac\x4d\x65\x90\x53\x0f\x42\xf5\xa0\x43\x26\x4c\xd8\x65\x0a\xb0\x5b\x32\x61\x72\x20\xa7\x1e\x84\xea\x41\x07\x4c\x98\xf4\x82\xd6\x8d\x2e\x8a\xba\x3c\x07\x71\x6a\x21\xa8\x16\x72\xc0\x84\x69\x5e\xd2\xba\xaf\x97\x25\xa2\xe7\x40\x4e\x3d\x08\xd5\x83\x0e\x98\x30\xdd\x2b\x5a\xb7\x73\x55\x44\x3b\x07\x71\x6a\x21\xa8\x16\x72\xc0\x84\xd9\x5d\x31\xbd\x77\x55\x56\xa4\x32\xc8\xae\x07\x39\xf5\xa0\x43\x26\xcc\xd9\x09\xd3\x7b\x27\x25\x13\x26\x07\xb2\xeb\x41\x4e\x3d\xe8\x90\x09\x73\xd2\xa0\x95\x2f\x1a\x25\x35\x9e\x03\xd9\xf5\x20\xa7\x1e\x74\xc8\x84\x59\x2e\xa6\xa4\xf2\x62\x31\x2d\x52\x3e\x07\xb2\xeb\x41\x4e\x3d\xe8\x90\x09\xb3\x76\x69\xe5\xc0\x9d\x16\x71\xcf\x81\xec\x7a\x90\x53\x0f\x3a\x60\xc2\xf8\xee\x94\x18\x1d\x2f\xee\xb4\x60\xc2\xe4\x20\x76\x2d\xc4\xa9\x85\x1c\x6b\xc2\xac\xfd\x29\xd5\x7f\xfe\xb4\x60\xc2\xe4\x20\x76\x2d\xc4\xa9\x85\x1c\x30\x61\xb6\x01\xad\x9b\x04\xd3\x92\x36\x95\x41\x76\x3d\xc8\xa9\x07\x1d\x32\x61\xda\x21\xad\xfc\x16\x4e\x8b\x26\x4c\x0e\x64\xd7\x83\x9c\x7a\xd0\x01\x13\xe6\x72\x45\xeb\x9e\xaf\xa6\x05\x5d\x9e\x83\xd8\xb5\x10\xa7\x16\x72\xc0\x84\x71\x23\x5a\xb7\xb1\x2e\x11\x3d\x07\xb2\xeb\x41\x4e\x3d\xe8\x80\x09\x13\xc6\xb4\xae\x17\x17\xd1\xce\x41\xec\x5a\x88\x53\x0b\xd9\x6f\xc2\xa4\x09\xad\x1a\x25\xd3\x82\x09\x93\x83\x38\xb5\x10\x54\x0b\x39\x60\xc2\x34\x53\x5a\xf7\x35\x9d\x96\xb4\xa9\x0c\x72\xea\x41\xa8\x1e\x74\xc8\x84\xe9\x6e\x68\xe5\xce\x66\x5a\x34\x61\x72\x20\xa7\x1e\x84\xea\x41\x07\x4c\x98\xf9\x2b\xad\x7b\xb5\x9d\x16\x74\x79\x0e\xe2\xd4\x42\x50\x2d\xe4\x80\x09\xe3\xef\x68\xdd\x97\x5d\x89\xe8\x39\x90\x53\x0f\x42\xf5\xa0\x03\x26\x4c\xfc\x46\xeb\xae\xde\x8a\x68\xe7\x20\x4e\x2d\x04\xd5\x42\x0e\x98\x30\xcb\x37\xa6\xf7\xde\xca\x8a\x54\x06\xd9\xf5\x20\xa7\x1e\x74\xc8\x84\x59\x37\x99\xde\x6b\x4e\x8b\x26\x4c\x0e\x64\xd7\x83\x9c\x7a\xd0\x21\x13\x66\xdb\xa2\x95\x93\x56\x49\x8d\xe7\x40\x76\x3d\xc8\xa9\x07\x1d\x32\x61\xda\x6d\x5a\xf9\xad\x5d\xa2\x7c\x0e\x64\xd7\x83\x9c\x7a\xd0\x21\x13\xe6\xb2\x43\x2b\x9f\x77\x4a\xb8\xe7\x40\x76\x3d\xc8\xa9\x07\x1d\x30\x61\xce\x3a\xd4\xe8\x68\x75\x8a\x26\x4c\x0e\x62\xd7\x42\x9c\x5a\x88\x6c\xc2\x34\xf7\x98\x30\x97\x17\x4c\xff\x5d\x14\x4d\x98\x1c\xc4\xae\x85\x38\xb5\x90\x03\x26\x8c\x7b\xc5\x94\xdf\x65\x59\x9b\xca\x20\xbb\x1e\xe4\xd4\x83\x0e\x99\x30\xe1\x09\x53\x80\x27\x25\x13\x26\x07\xb2\xeb\x41\x4e\x3d\xe8\x80\x09\x93\x36\x98\x12\x6c\x14\x75\x79\x0e\x62\xd7\x42\x9c\x5a\xc8\x01\x13\xa6\x39\xbf\xa3\x1a\x70\x7e\x57\x24\x7a\x0e\x64\xd7\x83\x9c\x7a\xd0\x01\x13\xa6\xbb\xa0\x75\x3b\x8b\xbb\x02\xda\x39\x88\x5d\x0b\x71\x6a\x21\xfb\x4d\x98\xf9\x0b\xad\x7a\xe5\xde\x15\x4c\x98\x1c\xc4\xa9\x85\xa0\x5a\xc8\x01\x13\xc6\x5f\xd2\xba\x2f\xcb\xbb\x92\x36\x95\x41\x4e\x3d\x08\xd5\x83\x0e\x99\x30\xb1\x47\x2b\xaf\xbc\xbb\xa2\x09\x93\x03\x39\xf5\x20\x54\x0f\x3a\x60\xc2\xec\x7c\x5a\x77\xe3\xdf\x15\x74\x79\x0e\xe2\xd4\x42\x50\x2d\xe4\x80\x09\x73\x16\xd0\xba\xad\xa0\x44\xf4\x1c\xc8\xa9\x07\xa1\x7a\xd0\x01\x13\xe6\x24\xa4\x75\x2f\xc2\x22\xda\x39\x88\x53\x0b\x41\xb5\x90\x03\x26\x4c\x1b\xd7\xc5\x7a\x2f\xbc\x2b\x29\x52\x19\x64\xd7\x83\x9c\x7a\xd0\x21\x13\xe6\x72\x45\x2b\x9f\xaf\xee\x8a\x26\x4c\x0e\x64\xd7\x83\x9c\x7a\xd0\x21\x13\xc6\x8d\x68\xe5\xc6\xfa\xae\xa8\xc6\x73\x20\xbb\x1e\xe4\xd4\x83\x0e\x99\x30\x61\x4c\x2b\x7b\x71\x89\xf2\x39\x90\x5d\x0f\x72\xea\x41\x87\x4c\x98\x34\xa1\x95\xa3\xa4\x84\x7b\x0e\x64\xd7\x83\x9c\x7a\xd0\x01\x13\x66\x9d\xdc\x11\xa3\x23\x48\xee\x0a\x26\x4c\x0e\x62\xd7\x42\x9c\x5a\x08\x1b\x19\xbe\x18\xe4\x7b\x12\xc6\xa1\x8f\xf9\xd6\x46\x96\x1b\xd2\x17\x7e\xb2\x7c\x32\xe2\x8b\xc7\x0e\xfc\x44\x72\x94\x8b\xa4\x69\x4e\x45\x6e\xf7\x2c\xf5\xfb\xa4\x2a\x75\x7b\x96\x38\x3e\x04\x9a\x45\x73\xb7\xb9\x40\xf0\x02\x7c\x21\xbf\x5d\x20\xbd\xab\x21\x2f\x33\x0a\x25\x08\xde\xc9\x21\xe6\x8e\xc0\x97\x06\x91\xeb\x88\x27\x34\x7a\xc8\x5e\x38\x3c\x66\x05\x8c\x27\xec\xac\xc4\x05\x2d\x7d\x0d\xc9\x03\x8b\xa6\xbe\xa1\x5d\xe6\x9b\xa3\x52\x73\xf6\x64\x82\xcd\xfd\x0f\xd2\xbe\xf9\xad\xed\xb5\xe1\xb9\xc8\x69\x87\xd8\x02\x49\x69\xee\xe4\x22\x57\x2a\x5a\x03\xcd\x0a\xe8\x0b\x8a\x54\xb0\x05\xdc\xd0\xa4\x47\xbc\x04\xaf\xec\x86\x3e\xee\xc8\x57\x5a\x96\x4a\xe4\x3a\x2e\x6d\x66\x93\x12\x2e\x2a\xad\x0d\xa0\xb1\xed\x34\xdc\xde\xd8\xc0\x5f\xe9\x23\x0a\x96\xbd\x2f\x32\xa4\xb4\x8f\x6b\xe3\x66\x28\xd2\xfa\x8d\x78\xd6\x6e\xb9\x66\xca\x5e\x86\x15\x6b\x1e\xdd\xe5\x43\xb1\x22\x4f\xc3\xf8\xcd\x3d\xda\xc5\x8a\xfc\xbb\xe9\xc5\x8a\x8f\xc5\x8a\x3c\x79\xe4\x37\xcd\xd1\x4c\xe1\x2d\x7d\x3b\x21\x72\x24\x3e\x49\x94\x5e\x92\x57\x04\x88\x6c\xc5\x21\x7b\xe7\x41\xb6\x62\x56\x72\x02\x34\x0b\x6f\xe0\xde\x46\x37\x24\x91\x00\xa5\x27\x89\x50\x4e\xa2\xfb\x58\xf8\xcc\x93\xf4\x71\xba\xeb\x54\x27\x79\x28\x31\x83\xf2\xd7\x3f\xc6\x2b\x4b\x0e\xfa\x90\x7d\x1a\xe7\x9e\xfd\x24\xdf\x2c\xca\xa6\x6a\xbd\x18\xec\x4b\x36\x9c\xbb\x79\x8e\x40\xc6\x46\x10\xcb\xa2\x73\x63\x6c\xaa\x06\x74\xe7\xf7\x86\x3a\xd1\x74\x4d\x9d\xb6\x8d\x97\xf9\xbd\x25\xcc\x11\xf1\x96\x8d\x64\x24\x34\x2c\x36\x95\x7b\x6d\xda\x97\xbf\x39\x32\x10\x0f\x93\xac\x73\xe3\xf2\x66\xa4\x5a\x67\x46\x63\x30\xe4\xaf\xff\x3a\xc6\xbc\x71\xd7\x57\x1f\xda\xc6\xd5\xc9\x9d\xa1\x5a\x9a\x61\x14\x93\x5c\x4a\x09\xc0\x87\xac\xba\xd5\x36\x2e\x70\xf5\x5e\x96\x4d\x7c\xd8\x31\x4e\x4e\xee\xfa\x34\xf9\x6f\x8f\xc1\x0d\x91\xb2\x5c\x16\xee\x3d\x53\xed\x75\x8c\xf6\xc9\x9d\x89\x2b\xbe\x9d\xdc\x59\x22\x0b\x3c\x89\x10\xe6\x99\xa8\x7b\xe7\x46\x00\x47\xea\xe0\xcc\x88\xe1\x50\x3c\x1f\x31\x18\xb1\xd8\xdf\x17\x30\x32\x46\xea\xa4\x0b\x9b\x06\xff\xce\xd7\x2b\x4c\xcc\x91\x3a\xde\xc2\x9d\x39\x2c\x22\x33\xb8\xd0\x5b\x18\xd8\xd5\x2f\xcd\x61\xf6\xae\x53\x37\xd5\xfb\x8e\xb1\xc6\x53\xba\x6f\x1b\x8b\x93\x3b\x9e\x1e\x14\x75\x8c\xf0\xe4\x6e\xa4\xfa\xc0\xb9\x5a\x10\x2e\xee\xea\xae\x31\x29\x27\x02\xbd\xd0\x43\x70\xab\x3e\x76\xf5\x67\xfe\xa9\xc6\x8e\xe1\x62\x82\x6c\x81\x66\x6a\x2a\x42\xe7\xcb\x7b\x4d\x45\xcf\x5d\xfc\x9f\x35\x68\x1b\xad\xab\x3b\x16\x5d\x3a\xb9\xd0\xef\x6e\xd5\x18\x74\x75\x47\xfe\xcc\x23\x86\xbd\x53\xdf\xc5\x61\x1a\x39\x28\x86\x61\x90\xa0\x20\x79\xf7\xe1\x2f\xef\x1a\xff\xf1\xbf\x3e\x07\xca\x7f\x28\x20\x0c\x93\x38\x89\xec\x95\xb2\x39\x7b\xdf\x7d\xdf\x56\x7e\x5c\x24\xc9\x2a\xfe\xd0\x68\xcc\x51\xf2\xc4\x81\xef\x9d\xd0\x6f\xfc\x44\x1a\xc0\x70\xb5\x8b\xdc\xf9\x22\x51\xda\xcd\x56\xeb\xb4\xdd\x6c\xb7\x95\xbb\x05\x92\x3a\xd2\xd2\x64\x11\x46\x71\x7d\xed\xad\x9b\x24\x28\x52\x15\x2b\x70\xde\x93\x5a\x37\xae\x83\x82\x18\xcd\x94\x34\x98\xa1\x48\x19\x5a\x77\xd2\x34\xdc\x64\x91\x3e\x91\x09\x24\xdb\xa7\xb8\x21\xe6\xd4\x78\xf2\xc2\xa7\x86\x6f\xbb\x41\xe3\xc6\x82\xc6\x68\x6a\x90\x09\x36\x3e\x07\x9f\x83\xff\x72\xfd\x55\x18\x25\xca\xe7\x77\xcf\x69\xe0\x24\x6e\x18\xc4\x9f\xdf\xfd\x2c\x97\x6f\xec\xc8\xb5\x9f\x3c\x54\x2c\xf7\xdd\x57\xb7\x54\x39\x0a\xc3\xa4\x58\x84\x9e\xca\x85\xc9\x6e\x85\x0a\x45\xae\x6f\xcf\x4b\x83\x38\xe1\xac\x58\x6f\x1e\xb9\xb3\x62\x6f\x55\xf3\x7b\x0e\x23\xbf\x58\xf6\x94\x26\x49\x19\xc3\x24\xb2\x83\xd8\xad\xc2\x7d\x16\x85\xab\x59\xb8\x0d\x2a\xbb\x39\x9d\x47\x61\xba\x2a\x62\x11\xac\xd2\xa4\x12\xe2\xa4\x71\x12\xfa\xa7\x55\xd3\x0a\xec\x4d\xb9\xe4\xc9\x8e\x8a\x3d\xd8\x51\x11\xf3\xa7\x08\xd9\x33\x27\x4a\xfd\xa7\x02\x60\x65\xcf\xdd\xc0\xc6\x38\x15\x5b\xd8\xb3\x79\x91\xa4\x2f\xa9\xff\x14\x26\x51\xa9\xae\xed\xa1\xa8\xb8\x72\xab\x28\x9c\x47\x28\x2e\x71\x03\x9a\xb9\x76\xa1\xcc\x73\xe3\x1a\x52\x78\x61\x5c\x9c\x43\x12\xda\x71\x52\xea\x35\x9c\xd9\x5e\xa9\x62\xe8\x25\x6e\xb1\xcb\x55\xb8\x0a\x37\xa8\x82\x62\x61\x1a\xa3\x62\x17\xf1\xca\x0d\x02\x14\x15\x47\x4b\x13\xd7\x73\x13\xb7\xc4\x49\xab\xc8\x0d\x28\x19\xde\xa9\xef\x3e\x60\x16\x57\xfe\xfe\x39\x50\x94\x46\x43\x81\x64\x51\x15\xbe\x47\x94\x8d\xed\xa5\x28\x56\xc2\xc0\xdb\x29\x71\xba\x22\x1d\x4c\xed\x38\x9e\x3a\x91\xbb\x4a\x14\x37\x88\xdd\x19\x52\xbe\xfc\xf0\xf7\x7f\x7c\xc1\x1b\x5a\xf9\x2f\x64\x3b\x0b\xe5\x4f\x4e\xe8\x85\x91\xaa\xfc\x89\x34\x57\xdc\x80\x95\xc4\x74\x1c\x45\x39\x3d\xfd\xe1\xef\xb4\xe8\x1f\x1f\x94\x1f\xfe\x4e\xeb\xfd\xe3\x67\x0c\xfc\x07\xde\xc5\x7b\x3a\x4a\x16\xc8\x47\xa7\xdf\xd8\xdd\xd3\x2a\xd7\x17\xde\x7a\xa7\x98\xe5\x96\xab\xd0\x0d\x12\xa9\xbf\xac\x10\x77\xfd\xb4\xaa\xeb\xb7\xd1\x50\xee\x63\xa4\x7c\x71\x83\x78\x85\x9c\xe4\x8b\xf2\x1c\x46\x0a\xe6\x93\x58\x89\x43\x25\x59\xd8\x89\xb2\x4e\xc3\x04\xcd\x14\x37\x41\x7e\xac\x2c\x11\x5a\x29\xc9\x02\xd1\xd2\xf8\x3d\xeb\x63\x8a\x90\x52\x21\xf6\x62\x3b\x8e\xe9\x3f\x6e\x1c\xa7\x28\x6e\xb4\x3b\x97\x9d\x1f\xc8\x6f\x27\xf4\x7d\x14\x24\xa7\x9d\x4e\xb7\x73\x76\xd5\xba\x68\xe3\x9e\x4e\x4f\x9f\xc3\x20\x39\x7d\xb6\x7d\xd7\xdb\x9d\xc6\x76\x10\x9f\xc6\x28\x72\x9f\xf1\xe4\xd9\x0c\x7f\xfc\x53\x75\x95\x9f\x28\x5a\xf9\x1e\xfc\x30\x08\xe3\x95\xed\xa0\xda\x0e\x44\x0d\xd2\xfe\x1f\x84\xa3\x1a\x0d\x25\x4e\x76\x1e\xf2\x30\xf5\x66\x6e\x4c\x18\x69\x86\x1c\xcf\x8e\xc8\x06\x3e\x0d\xc2\x53\xca\x8b\x76\x90\xa8\x4a\x8c\x3c\xe4\x24\x61\x84\x8b\xd7\xa9\xed\xb9\xcf\x3b\x37\x98\x9f\x62\x89\xaa\x2a\xab\x28\x5c\xa1\x28\xd9\x61\xe0\x06\x05\xb3\x30\x3a\x5d\x45\xe8\xd9\x7d\xc5\xe4\x6f\x34\x94\x5b\x2a\x8c\x83\x46\x83\xfc\x39\x0a\x23\xdf\xf6\xdc\x37\x32\x8e\x12\x3e\x2b\xd7\x77\xc3\x1b\x05\x79\x08\xd3\x2a\x56\x15\xdf\x0e\x52\xdb\xf3\x76\x78\x99\x96\x68\xa6\x3c\x47\xa1\x2f\x1a\xa1\xf7\x4e\x1c\x2b\x49\xa8\x44\xc8\x0f\x37\x88\x74\x48\x10\x89\x95\xc4\x8e\xe6\x28\x71\x83\xb9\xe2\x46\x11\xf2\xd0\xc6\x0e\x12\xe5\x29\x0a\xb7\x31\x8a\x62\x65\xbb\x70\x3d\xa4\xd8\xab\x95\x87\x67\xae\x04\x68\xcb\xda\xbd\x2f\x4d\x0c\x29\x6e\xac\x78\x5c\xe9\x0d\xad\xbb\xf7\x55\xeb\x1e\x20\x27\xf4\xec\xb8\x11\xc8\x33\xc3\x18\x93\xbe\xf4\xd0\x49\x31\x3e\xa2\xf3\xd6\x7b\x05\x2e\xec\x60\x8e\x28\x3e\x5f\x9e\xc2\xd7\xd3\xd8\x7d\x73\x83\xf9\x07\xc5\xa1\x8a\xff\xf4\x29\x7c\xfd\x22\x58\xf2\xcb\xd6\x9d\x25\x8b\x2f\x78\x2e\x41\x98\x28\xf6\xf3\x33\x72\x30\x8f\x3e\xed\x94\x2f\x2b\x7b\x36\x73\x83\xf9\x17\x25\x8c\x70\x4f\xd1\x0c\x45\x5f\x08\x1e\x4a\x5b\x0c\x83\x19\x78\x86\x9e\xed\xd4\x4b\x14\xcc\x0d\x0a\xe5\x06\xbc\xa7\x6c\xcf\x13\x84\xa1\xcd\x3a\xef\x15\x18\x46\x11\x72\x12\xd2\xce\x73\x03\xa4\x2c\x10\xb1\x0c\x2a\xeb\x9f\xbd\x57\x3e\x46\x68\x83\x82\x44\xb1\x67\x2f\x69\x9c\x90\xb5\xc3\x8b\x49\x86\x8a\x31\x11\xed\xe7\x04\x45\x4a\x18\xb9\x28\x48\xe8\x5a\x3b\x64\x66\x31\xee\xd2\x32\x94\x30\x50\x1e\xdc\x60\x16\x6e\x63\xe5\xe3\x22\x0c\x90\x62\x07\x33\x0c\x72\xc7\x53\x3a\xc8\x79\x25\x2e\x89\xbd\x52\x16\xee\x7c\xe1\x91\xd9\x25\xa1\xf2\x84\x14\x27\xf4\x57\x1e\x4a\x90\xb7\x53\x88\x5e\x5d\xd9\x11\x9e\x9a\xe8\xec\x73\xf0\x1f\xea\xe7\xe0\x3f\x3e\x7c\x78\x42\xcf\x61\x84\xe8\x6f\x3a\x3f\x22\x4d\xe4\xc5\xa0\xe4\xc4\x6b\xf1\x33\xde\xf5\x2d\xb2\x63\x3e\x07\x8b\xc4\xf7\x68\x65\x69\x6b\x7d\x50\xb2\xcd\x49\x6a\x93\x1d\x8e\xa9\x77\x4a\xa9\xf7\x41\x69\xbd\x6f\x9d\x13\x50\x87\x6c\xdd\x2d\x7a\x5a\xba\xc9\x69\x82\x5e\x13\x3c\x22\x3a\xa5\xe4\xfb\xa0\xb4\x9a\xcd\xff\x4d\xea\x9d\xe5\xea\xd9\xab\x53\x81\x2c\x15\xa8\x1f\x94\x68\xfe\x64\xff\xf8\xa7\x27\xcf\x76\x96\xaa\xd2\xfc\x89\xb4\x3a\x67\xd3\xc4\x72\x6a\xe1\xfa\x44\xc4\x7d\x7e\x17\xa0\xed\xe7\x77\x64\x7f\x9d\x2b\x71\x12\xa5\x4e\x92\x46\xb6\x27\xf6\x1a\xa6\xde\xcc\x8d\x57\x9e\xbd\x53\x1c\xba\xfc\xde\x4e\xf9\xd1\x32\x5a\x4d\x55\x09\x3d\x6c\xec\xf1\x65\xff\x89\x74\x7d\x37\xd6\xc7\x1f\xd8\xd6\xc3\xd4\xdd\x9c\x67\x1b\x50\x96\x24\xa7\x01\xc6\x8f\x70\x91\x90\x1c\x44\x31\x63\x89\x68\x9f\x06\x68\x4b\x68\x44\x56\xe0\x73\x60\x47\x89\xeb\x78\x48\x55\x6c\xac\xa8\x54\xe5\xd9\x9d\x3b\xf6\x0a\x73\x0c\xf9\x9d\x46\xb8\x2c\x0c\x89\x51\xba\x40\xf6\x8c\xfc\x97\xa8\x78\x2c\x2c\xdc\x40\x55\x02\x7b\x83\x65\x14\x31\x25\xe9\x22\x31\xb4\x3e\x28\x4f\x5e\xe8\x2c\x7f\xce\xa8\x03\xc2\xd9\x4e\xde\x94\xb7\x14\x19\xcc\x61\xbe\x1d\xcd\x31\xcb\x54\x31\x7c\xfb\xbd\xa2\xc5\x8a\xad\x3c\xa1\x38\x51\x56\x91\xed\x24\xae\x83\x67\x8c\xe5\x89\x62\x0b\xe6\xfc\xf2\x64\x3b\x4b\x3c\xb5\x60\x46\x57\xeb\x8b\xd8\x5f\x53\x94\x28\x76\xa0\xa0\xd7\x95\xe7\x3a\x2e\x66\x4e\x37\x71\x6d\x4f\x21\xac\x60\x7b\xee\x3c\xa0\x8a\x5c\x08\x80\x2d\x52\x1c\x3b\x50\x3c\x1b\xb3\x69\x1a\x53\x59\xa7\x28\x64\xaa\x5f\xdc\x60\x81\x22\x37\xf9\xc2\xda\x84\x81\x92\x2c\xdc\x60\x8e\xe5\xd6\x12\x29\x5f\xfe\x9c\x2c\xfe\xf3\x8b\x58\x67\xb2\x03\x9e\xc2\xd9\x8e\xd2\x86\xe2\xf9\x41\x69\x72\x06\x2f\xf0\x74\x4e\x79\x3c\xd9\x31\x22\x5a\xe7\xbf\xdc\xc0\xf1\xd2\x19\xa2\x75\x31\xef\x32\x2d\x43\xd8\x18\x57\xfb\xe9\x67\xd1\xd5\x96\x71\xff\x9f\xa4\xbf\xb2\xae\x72\x1b\xe4\x4f\xd2\x5f\x59\x15\xc6\xea\x7f\xc2\xb3\xa6\x94\x24\xc5\x19\xb1\x3e\x28\x1e\x7a\x4e\xb2\x9d\x55\x24\x3c\x6f\xfb\x34\xe7\x1b\x93\x73\x80\x99\x26\x69\x84\x4e\x57\x51\x18\x3e\x2b\x51\xea\xa1\x0f\x78\xc9\x85\xa2\x20\xb4\xe7\x66\xd4\x87\xe7\xd0\x49\xe3\xd3\x8d\x1b\xbb\x4f\x98\x43\x71\x39\x36\x44\xc9\x22\x10\x98\x12\xa6\x09\xc6\x80\x74\x1d\x06\xd2\xde\xc2\xfd\x10\xc3\xd5\xf6\x7d\x3b\x71\x1d\xa2\xd3\x22\xe4\x20\x77\xc3\xdb\x3e\xa5\x89\xb2\x0d\x53\x6f\x16\xfc\xdf\x44\xa1\x8a\x04\xdb\x70\x8b\x70\xab\xd8\x0a\x1b\x94\x74\x9c\x1b\xea\xbd\x62\x05\xca\x1c\x05\x28\xb2\x3d\x15\xaf\x7b\x4c\x3b\x51\x7c\x64\x07\x74\x5c\x3c\x3d\x56\x1b\x2b\x10\x62\x1a\x62\x5e\x75\xb1\x91\xf3\x8c\xc1\xa4\x5b\x37\x48\x10\xe1\xe5\x90\xb5\xf3\xd0\x0c\x0b\x05\xdc\x9c\x21\xc2\x66\x8c\x75\xa6\x8c\x0c\x9b\xd1\xd6\xc6\x9b\x62\x89\x76\x4f\xa1\x1d\xcd\xe4\xfe\x54\x4a\x90\x88\xf4\xc5\x88\xab\x2c\x6c\x6c\x72\xf9\x08\x23\x38\x43\x09\x8a\x7c\x37\xc0\x23\xf2\x29\xa7\xb8\x92\x1b\x2b\xab\xc8\xf5\xed\xc8\x25\x5b\x4b\x74\x4e\x80\x76\x30\x6b\x84\x11\xe9\x7b\x6b\x63\x32\xe7\x28\x43\x24\x9a\xed\x6d\xed\x5d\x8c\xd5\x02\x5e\x2a\x14\x24\x68\x96\xe9\x78\xd9\x88\x9b\xa1\x0d\xf2\xb0\xe9\xf2\xde\x0f\xdf\x5c\xcf\xb3\xdf\x87\xd1\xbc\x81\x82\xd3\xfb\x69\x63\x16\x3a\x71\xe3\x01\x3d\x35\xe0\x74\xda\xc8\x73\x01\xe9\x07\xeb\xaa\x72\x3f\x2b\xdb\x71\x91\xe7\x85\x44\x38\x11\x2b\xe1\xc9\x0b\xe7\x8d\x76\xb3\x75\xd9\x68\x76\x1a\xb9\x6e\x4e\xed\x60\x76\x8a\xb9\x76\x6b\x47\xb3\x18\x4b\xc6\x95\x9d\xb8\x4f\xf8\x34\xb0\x6b\x7c\x0e\xfe\x92\xd8\x4f\x6e\x30\x43\xaf\xff\xef\xf3\xbb\xd3\xd6\xe7\x77\x7f\xa5\x93\xf8\x10\x84\xc9\x8f\xf9\xf9\xfc\x44\x77\x35\x23\xc1\x07\xa5\xa9\xfc\x2f\x61\xb9\x71\xc1\x47\xe6\xcc\xfc\x0b\x0a\x99\x9d\x1b\xcc\x65\x31\xa8\xcd\x66\x64\x05\x98\x1a\xc0\x1a\x51\xa1\x1a\x11\x6f\x0e\xd3\x8d\xd0\x73\xf8\x2a\x44\xe1\x14\x2f\x20\xe1\xb1\x0d\x8a\x9e\xbd\x70\x8b\x2b\x19\xb3\x39\xd5\xe1\x96\x41\x04\xce\xa2\x42\xb9\x4a\x96\x4e\x26\x7c\xb8\x24\x90\xe4\x11\xef\xf7\x03\xdf\x05\xb9\x4d\x2c\x26\x7e\xb7\x5b\x61\x96\x5c\x2d\x98\x48\x67\xe6\x26\x95\xe8\xe1\x8a\x49\xba\x98\x9a\x5c\x58\x75\x60\x11\x29\x5a\x83\x1d\x97\xdb\xaa\xf2\xe5\xcf\x8b\xd6\x7f\x7e\x39\xfd\xf2\xe7\x45\xf7\x3f\xbf\x10\xf9\xcf\x77\x2a\xee\x07\x63\xf5\x14\x26\xf8\xd4\xc5\xba\x7c\xaf\x3c\x20\x25\x48\x97\x54\x73\x24\xe1\x8a\xf4\xc8\x34\x08\x56\xbe\xc8\x8e\x5d\x14\x11\x84\xa3\xd0\x53\xb6\x2e\x96\xcf\x0a\x36\x98\x95\xd8\xb1\xb1\xbd\x6a\xc7\x8a\x9b\x28\xf6\x26\x74\x67\x31\x6f\xe9\x84\x9e\x67\xaf\x62\x37\x98\xbf\xff\x3d\x34\xeb\xa2\xa5\x2a\x8b\xb6\xaa\x2c\x3a\xaa\xb2\x38\x53\x95\xc5\xb9\xaa\x2c\xba\xb2\x16\x38\x4d\xc2\x15\xa6\xbc\x54\x42\x11\xfd\xa0\xfc\x89\x13\xec\x34\x07\x90\x74\xe9\x2d\x8a\x51\x22\x88\x1c\x06\xca\xca\x8e\x6c\xb2\x1e\x19\x91\xa7\xae\xef\x7a\x76\xe4\xed\x54\x4e\x29\x8e\x6b\x18\x28\x5f\xfe\xbc\xfa\xcf\x2f\xb1\x32\x47\x58\xcc\xc4\x28\x79\xaf\x5c\x87\x5b\xb4\xc1\x0a\x7e\x8b\x14\xdb\x8b\x43\x5a\x2e\x04\x56\x6e\x11\xf0\x66\x4f\xf1\xc1\x2e\x42\xfe\x17\x25\x0d\xdc\x04\x9b\x96\x71\x82\xec\x19\xb6\x44\xbf\x20\x1f\x6b\xdf\xd5\xb1\xe8\x8a\xc9\xd7\xe2\xab\x3d\x3d\x45\x68\xe3\xda\xd4\x6b\x23\xed\x1e\x3d\xc5\x4a\xdd\x4e\x90\xf2\x84\x16\xf6\xc6\xc5\x62\x8f\x4a\xd1\x99\x9d\xd8\xa7\xff\xa1\xd8\x49\x12\xb9\x4f\x69\x82\x08\x6f\x84\x29\x86\x13\x8f\x82\xb2\xf2\xd2\xb9\x1b\x08\x1b\xa3\xb0\x0d\xb1\xbe\xc3\xc7\xb2\x90\x9e\xca\xf0\x36\x83\x8b\x28\xf4\x91\x4a\xb6\x9b\xaa\x58\x86\xaa\x8c\x57\x28\xb2\x55\xc2\xa4\x53\xfb\xd9\x8e\x5c\x61\x73\xe0\xee\x84\xc1\xe1\xa4\x51\x4c\x27\xe6\x06\x33\x3a\x5b\x6a\x90\xcf\xc4\xac\x85\x71\x2f\x59\x45\x8c\xe4\xd4\x2c\x96\x84\x81\xd2\xb9\x3a\x15\x76\x3a\x3f\x0c\x90\x25\xc6\x1c\x2a\xcd\x99\x9a\xe8\xf1\xd2\x5d\xad\x88\x24\xfe\x1c\xd8\x4f\x4f\xd1\x5f\x12\x37\xf1\xd0\x5f\x55\xf6\x17\xa1\x53\x18\xb9\x73\x37\xb0\xbd\x53\x0a\x53\xfe\x2e\xe4\x41\xa1\xcf\x0f\xd4\x15\x89\x59\x3d\x33\xbb\xeb\xeb\x28\xb3\x30\x49\xd0\x2c\xab\x4a\x49\xf1\x41\x59\x20\x6f\x25\x99\x10\xdc\xf2\xa7\x0c\xd1\xcc\xcc\xf1\x42\xd7\xa7\x18\x99\x53\x37\x58\x7e\x50\x82\x90\x4d\x81\x1b\xe0\xf6\x6c\x46\x0c\x84\xbf\x57\xb0\x58\x2b\x42\x7e\x66\x23\x91\xbd\xfd\x81\xa9\xfd\xb2\x5d\xc4\x2c\x3c\xce\x7e\xa1\xa7\x7e\x0e\x52\xfc\xcf\xcc\x3b\x92\xa3\xd9\x70\xac\xb9\xc2\x7a\x50\x48\x27\x21\xfb\x6f\x8a\xcb\x2b\x27\xdb\xe4\x4d\x67\x89\x74\xee\x11\x86\xdd\x2c\x39\x95\x0a\x44\xdd\x59\x65\x5f\xef\xcf\x39\xe6\x0c\x80\x6d\x37\x4e\xe1\xfb\x60\x16\x0a\x0b\x81\x09\x64\xd6\x1d\x31\xde\x89\x17\xa6\x60\xb9\x2a\xcd\x1c\x76\x4f\xea\xe7\x20\x4e\xa2\x30\x98\x57\x4d\x35\x67\x83\x92\x63\x0d\x19\xb7\xb8\xd7\xc8\xc9\x75\x2b\x0e\xbd\xf9\x7d\x96\x6d\x2e\x36\x64\x8c\x6d\x35\x3a\x5a\x85\x65\x7c\xd9\xfc\xdf\x3f\xd5\x0f\x42\x8e\xc7\x85\x63\x86\x90\x32\x64\x4b\xf1\xfd\xf4\x25\x4e\x9f\xbe\x90\xc1\xbf\xc4\xe9\x2a\xb3\xe8\xa9\x46\xa3\x3e\x01\xac\xa3\xcb\x87\x76\x6a\xa5\x14\xcf\x31\x64\xe6\x29\x21\x57\xca\x04\xe3\x2a\xa4\x6e\x68\x7c\xae\xf3\xec\xc4\xdd\xd4\x9a\xfb\x17\xe7\xff\xfb\xa7\x32\x9f\x52\xd6\xdb\xa0\x88\x98\xb8\xdc\x38\xc7\x86\x3c\xd9\x9e\x9c\x5c\xe9\x93\xf2\x77\x85\xf3\xc3\xe9\xfb\xf6\x39\xf2\x7f\x56\xfe\xc1\xe6\xa1\x10\x26\x3e\x7d\xcf\x0b\x25\x4a\xdc\xb8\xc1\x32\xe6\x53\xb7\xe9\x94\xb9\x81\xef\xb9\xc1\xb2\x78\x38\x90\x05\x00\xad\x90\x95\xfc\x5c\x7d\x50\x90\x5c\x06\x64\xcd\x24\xe1\x37\x8f\xec\x9d\xd4\x02\xeb\x2c\x6c\xde\x6e\x08\xb5\x97\xdc\x93\xd1\x6a\xbe\x67\x1e\x4c\x4e\xb4\x05\x36\x60\x7e\xfc\x89\xfb\x2a\x73\x13\x26\x30\x69\xda\xb5\x13\xa7\x15\x0b\xd3\xff\x87\xa4\x8e\x02\x72\x25\x43\x14\x4d\x8c\xb8\x1b\x0c\x2b\x98\x95\x67\x3b\x68\x41\x4f\xf0\x64\xa2\x8d\xc0\xf6\xd1\x4c\xb1\x03\x67\x11\x46\xb1\xf2\x23\x36\x47\xc2\x34\x51\x16\x11\x7a\xfe\x89\x4a\x71\x8b\x1d\x45\xb0\xb0\xf6\xc3\x08\xf7\x17\xd9\x78\x89\x9f\xc3\x08\x9b\xa8\x58\x8e\xbf\xa4\x71\x42\x54\xae\xfd\x17\xdc\xf2\xaf\x18\xff\x15\x56\x89\x21\x3e\xcc\xe0\xcd\xaa\x92\x33\x0d\x36\xe8\x49\xa7\x8e\x9d\xc6\x28\x56\xe2\x15\x72\xdc\x67\xac\x85\x76\x0a\xf5\x92\xe2\x96\xbe\x1d\xec\x94\x30\x59\xa0\x48\xb8\xf0\xf0\x41\xc0\x8e\xb0\x99\x10\x32\xa7\xce\x2b\x1e\xf7\xd9\x65\xb6\x67\x8d\x0f\xb6\x70\xf5\xc4\x1c\xb1\xad\xab\xb3\x66\x9b\xb0\x0d\xb1\x9a\xe9\x94\x7f\xa2\xbf\x1d\xcf\x8e\xe3\xbf\xfe\x94\xe3\xa7\x4c\xe2\x56\x2c\x09\x11\xf4\x47\xad\xb2\xdc\x4d\x7d\x47\xd9\x4a\x0a\x56\x87\xe1\x0c\x71\x4e\x5f\x11\x2f\x95\x13\xce\xf0\x7f\x96\x4f\x33\xbc\x63\x6d\x7f\x55\xe1\x81\xaa\x76\xf5\xd6\xed\xe1\x16\xf2\xa9\x60\x92\xdd\x7d\xe1\x6c\x46\xac\x25\x21\x9d\x98\xd9\x5f\x10\x1f\xff\x60\x13\x13\x17\x11\x6c\xa3\x14\x64\xb7\x64\xe3\x55\xab\x29\x61\x39\x16\x1b\x62\xa3\xad\x85\xe7\x21\x1b\x76\xf1\x3e\x45\x4a\x3c\xad\xf8\xf0\x6c\x7b\xf8\x14\xc2\x8e\x17\xc4\xe4\x88\x90\xbd\xc4\x87\xa2\xd8\xc5\x54\x95\x8f\x14\x76\x9a\x84\xa2\x35\x73\x7d\xe3\xb2\xd3\x85\x8b\xed\x5d\x25\x76\xa2\xd0\xf3\x9e\xec\x88\x6d\xef\xff\xa3\x78\x68\x6e\x3b\x3b\x7a\xc2\xc1\x27\x4c\x6c\xb3\x93\x0e\x3d\x7b\xa5\xb2\x9e\x7c\x7b\x49\xc8\x96\x28\xf8\xf4\x15\x93\x53\x0b\x35\xb6\xe8\x99\x98\x1c\x01\x98\x2e\x20\xb3\x24\x7e\x3e\x3f\x3e\xe5\x13\xe3\x06\x81\x18\xfe\xe7\x22\x83\x98\xc4\x19\x26\xa4\x21\xf5\x8d\x89\xd5\xd0\x98\x2f\xca\x09\x83\xd8\x8d\x09\x1d\x98\x9d\x8c\x77\x45\x82\xe6\x3b\xe5\x47\xdf\x4e\x9c\x05\x8a\xa9\x05\x4a\xce\x22\x64\xe3\xfd\xf4\x7e\x9f\x76\x15\xe3\x5b\xe4\xb6\x94\xa8\x23\x81\x03\x9d\x8a\xeb\x33\xcd\x5b\xd4\x03\xbe\x3b\x9b\x79\x94\x1b\x99\x79\x25\xcc\x1e\x66\x38\xe5\x4c\x4d\x62\x63\x62\x3b\x97\x8e\xc4\xae\xae\xf2\xb2\xf6\x94\xb3\x62\xbc\x99\x0b\xe4\x1f\xc2\x68\x69\x53\x19\xfd\xcc\x9c\x0e\xd3\x4f\xbd\xec\x7c\xfa\x94\xce\x69\x07\xad\x66\xa3\xd5\x52\xdc\x58\x89\x13\x97\x9c\xf2\xd6\xa9\x1b\x11\xbb\x74\xdf\x25\x4f\xb5\x80\x69\x77\x2f\x2f\x2e\xf3\xbc\xb5\x70\x67\x33\x14\xfc\xbc\x97\x14\x85\x33\x2c\xbd\x47\x66\x84\x24\xb7\xca\xfc\xdc\x4c\xe8\xc5\x8e\x84\xe8\x03\x3f\x1c\x52\xb2\x71\x0b\x61\x16\xa6\xb8\x05\xad\xcc\xad\x08\xe6\x3e\x65\x0a\x9e\x5e\x16\xd0\x1d\xf8\x27\x32\xc0\xa9\x83\x3c\xef\x94\x01\x7e\x96\x2b\x89\xd3\x50\x4d\x3d\xae\xc9\x18\x98\x8e\xb3\xcf\x41\x47\x1a\xb1\x6a\x78\x31\x3f\x28\xa5\x63\x95\xf0\xc2\xc6\xb2\xe1\xa6\x60\x53\x4d\x79\xda\x71\x79\xca\x1c\x16\xf8\x94\x34\x64\x5c\x2c\xbc\xae\x7f\x4e\x66\xe4\xd4\xee\xce\x03\xe2\xb3\xca\xb5\x52\xbe\x64\x93\xca\xdc\xb1\xa6\xfb\x2a\x35\xc0\x3c\xc3\xcd\xbb\xcf\x41\xb2\xa8\x32\x23\x29\xca\xc9\x22\x67\xf7\xe6\x4f\x28\x0c\x71\xae\x01\xf2\x47\x13\x06\xe4\xae\x7d\xb2\x15\x4f\x25\xb3\xa3\x53\xda\xee\xe4\xd6\x9e\x31\x86\x67\x3f\x21\x2f\xdb\xeb\x44\xdc\x91\xb2\x58\x48\x4b\xba\x7f\xe9\xf5\x26\x56\x02\xd4\x8b\x20\xf9\xc2\xdd\x80\x58\x6e\xdc\x25\x5e\x3e\x02\x93\x0e\xf7\x1c\xf7\xc5\x4e\xcd\xfc\xdd\x94\x49\x23\x7b\xe6\xa6\xf1\x17\xaa\xc0\x7d\xdb\x19\x4f\x99\xfd\xac\xd8\xb3\x99\x74\xc5\xa6\xa3\xc4\x76\xbd\x58\xb1\x93\xaf\xd8\x65\x67\xcd\xab\xce\xe7\x80\xc6\x3f\x08\x0a\xec\xf3\x8c\x88\x0b\x49\x0c\xc2\x94\x42\x33\xe2\x24\x91\x76\x15\x9d\xb0\x74\xca\x69\x34\x14\x83\x9d\x94\x89\x9b\x96\xa0\x9a\x73\x2e\x8a\x43\x81\x9b\xfa\xca\x76\x81\x02\x2c\xeb\xe3\x05\x77\xdf\x3e\x51\x0f\x05\xf3\x57\x29\x3f\xa2\xf7\xf3\xf7\x8a\x1d\x2b\x11\x8a\x99\x6e\xf3\x43\xbc\x4c\x8e\xe7\x3a\x4b\xe2\x18\x0d\x53\x67\xa1\x24\xf6\xea\xa7\xf7\xd8\xf8\xb2\xbd\x08\xd9\xf4\x6e\x82\xf5\x8a\x2d\xb1\x59\x48\xcd\x7b\x37\x26\x2a\x4a\x38\x92\xa9\x9d\x15\x23\xe4\x93\xf5\x77\xd2\x08\xf3\x91\xb7\xe3\xd3\x70\xc2\xe0\x39\x8d\x89\xc9\x37\x63\x9e\xdf\x58\x71\x93\x18\x4b\xa5\x9d\x98\x64\xb2\x0d\x4f\x93\x30\xc8\x7c\xc5\x76\xb0\xdb\xda\x3b\x7a\x5f\x40\xe8\x7d\xbc\xd7\x91\x13\x92\x04\xa3\xa8\xbc\x3d\xb6\x5b\x88\x9f\x0a\x9f\x39\x57\x09\xbd\xb5\xf9\x1c\xe0\x0d\x61\x47\xc8\xae\xba\x90\xa8\xbc\x91\xe1\x4e\x07\xf9\x1c\x56\x30\x84\x64\xbb\xab\xc2\xf2\x61\xe0\x9f\x0e\x9e\xb4\xc5\xc4\x09\x26\x0c\xcd\x4a\x7f\x64\xad\x1b\xb4\xd8\x13\x25\x01\xed\x8a\xc8\x02\x72\xe4\x78\x0e\x23\xbf\x5a\x11\xb2\x19\xd9\x81\x83\x30\xe3\x10\x2f\x90\x68\x22\x91\x43\xba\xf4\xa3\x4e\x32\xee\xe4\xc1\x22\x20\x08\x83\xd3\x2f\x7f\xa6\x73\xf8\xcf\x2f\x0a\x0f\x43\xfa\xa6\xad\xb8\x4a\x3d\xaf\xd1\x69\x9e\x77\xdb\x9f\x83\xbf\x44\xa1\x87\xfe\x1f\x0f\x48\xfa\xfc\xee\xaf\xcc\x88\x66\x3e\x15\x12\x90\x81\xa2\x6a\xb9\x51\x40\x6c\x1b\x46\xb3\xd3\x6d\x64\xaf\x30\x4e\x92\xef\xea\x37\xc8\x8a\xab\xab\x66\x9e\xde\x62\x0c\xc9\xd5\x92\xf9\xc4\x5b\xd2\x45\xb6\xf2\x80\x9e\x06\x6e\x42\x6c\x85\xed\x02\x45\x48\xf9\xb1\xfd\x93\x32\x43\x71\x12\x85\xbb\x58\x09\xc8\xe1\x58\xf9\x62\xa7\x33\x37\x64\x87\xf2\x8d\x3b\x43\xe1\x17\x7e\x33\xc7\x9c\xbd\xc4\x54\xd1\x82\x59\x84\xad\xc4\xb3\xec\x5e\x5e\xb2\xb8\xdd\xc0\xa6\x9e\x7e\xbc\x79\x89\x28\xa3\x72\x81\x68\x7f\x6c\x98\xc5\xec\xf2\x3a\xef\xd5\x13\x0c\xf5\x17\x5c\x47\x5e\x03\x95\x29\x22\x0e\x20\x6e\x53\x5c\x9e\x15\xc5\xe9\x93\xef\x26\x62\xbd\xb8\x1e\xb2\x57\x2b\x64\x47\x78\x45\x3e\x30\x1e\x29\x5e\x98\x8d\x57\x6e\xe0\x86\x81\x9d\xa0\xd9\x07\x2c\xcf\x95\xcf\xef\x16\x76\x30\xfb\xfc\x4e\x72\x29\x62\x66\x63\x82\x78\xc6\xba\x91\xaf\x1f\xff\xcb\x7d\x56\xfe\x84\x02\x22\xa7\x19\x83\x9c\xd2\xc6\xa7\xcf\x61\x74\xca\x78\x93\xd9\x3d\x1c\x49\x45\x29\xa3\x29\x97\x4a\x38\x66\x85\x05\x2c\x15\xe5\xff\x50\xe1\xc5\x27\x27\x4e\x6b\x55\x1c\x8b\x4b\xff\x51\x38\x65\xdf\xf2\xdb\xee\x00\x45\xdc\x42\xc5\x8b\xc2\xac\x22\xea\x89\x61\xfb\x91\x4a\xe5\x19\x39\x91\x44\x28\x4e\xf0\x31\x5a\xbe\x8a\x23\x97\xb3\x59\x28\x8b\x10\xb2\x1f\x4e\xfd\xf0\xed\x94\xca\x57\x32\x50\xd5\x12\xef\xad\xc5\x69\xb1\xb7\x92\xa0\x4d\xb9\x56\xce\x54\xe4\x07\xb5\x0a\x8b\x5d\x16\xf2\x62\x6c\x7b\xe6\x86\x74\x1d\x72\xe5\xce\x02\x39\xcb\xa7\xf0\x55\x2c\xc6\xbe\x30\x8b\x43\x57\x50\xd4\xf4\x2f\x4c\x52\xa1\x3b\x4b\x12\x30\x7c\x55\xa4\x16\x6c\xb3\xe7\x55\x4e\xe1\x34\xa8\x54\x9b\x37\xdc\x84\x2f\x1e\x09\xf9\x69\xe1\x8e\xf5\x19\x73\x8d\x1d\x21\x72\x83\x4b\xee\x5b\x23\x44\xfc\x7c\xbc\x0f\x6f\x47\x6f\xf6\xd1\x8e\x31\x08\x3d\xa1\x26\x0b\xe4\x46\xca\x8f\x8b\x30\x72\xdf\xc2\x20\xb1\xbd\x9f\x88\x18\xb1\xdd\x80\x1e\xba\x15\xd6\xcf\x07\xd1\x11\x5f\x83\x67\x17\x79\x33\x7c\x8c\xe6\x26\x11\xe0\x57\xd8\xb8\x50\x8a\x49\xf0\xdd\xe0\x94\x04\x13\xe1\x33\x08\x36\xd6\xc9\xd1\xed\xe7\x2f\xf8\xa0\xc5\x3b\x89\xf9\x31\x36\x0d\x08\x93\x12\xeb\xe5\xcb\x9f\x67\xee\xe6\x3f\xbf\xc4\xaa\xb2\x5d\xb8\xce\x42\x59\xd8\x58\xfe\x49\xdd\x35\x7f\xfe\x82\x6d\x6d\x36\x92\x38\x43\x85\xca\x16\x89\x8b\x1b\x9b\x1c\xc7\x51\x10\xe3\xb3\xaa\x18\x8e\x5e\x39\x30\x4f\x13\x19\xd1\x56\xe2\xc4\x0e\x66\x76\x34\xa3\x9e\x24\x2e\x3e\xbe\xe9\x64\xd6\x6a\x77\xce\xaf\x58\x43\xf9\xaa\x76\x91\xf8\xde\xfb\x78\x85\x9c\xf7\xdb\x85\x9d\x6c\xe7\xe4\xc6\xd7\x4f\xbd\xc4\x5d\xd9\x73\xd4\xf8\x21\x59\xa0\x53\x3e\x47\x72\x41\xeb\xa1\x39\x0a\x66\xa7\x5c\x94\x11\x6b\x45\xc6\x3f\xe7\xcf\x90\x59\x87\x6f\x79\x71\x21\x14\x3e\x4b\xd8\xe7\x39\x81\xfa\x71\x15\x3c\x05\xc5\xb3\x77\x61\x4a\x91\x2e\xec\xc6\xcc\x4a\xca\xf6\x66\xde\x80\x6d\xe5\x95\x0c\x31\x1b\xb0\xe6\x5b\xb1\x1d\x91\xbf\xa1\x2d\x6b\x25\x72\x8c\xcb\xe9\x68\x1a\xab\xc6\xe7\x2d\xf9\x9f\xf9\x36\xa0\xf4\xa9\x89\xb9\x51\x14\x46\x27\x12\xdc\x44\x71\x78\x3d\x95\xcb\xc4\xf1\xa9\x12\xd7\x8a\xfb\x83\x2a\x97\x16\x81\xee\xb5\xeb\x4a\xbe\x39\x71\x32\xdb\x2e\xdc\x04\x9d\xb2\xf8\x49\x66\x1f\xc8\x61\x5f\x3c\xf2\xb8\xda\xbb\x21\xbc\xdc\x55\xae\x7e\x21\x3c\xb2\x63\xa6\x74\xad\x20\x34\x06\x5e\x0f\x72\x83\xf7\x3e\x5b\xc8\xdc\xa2\x50\x1d\x4b\x8d\x84\xf0\x59\x71\x03\x27\xa2\x91\x19\xb8\xe5\x0c\xf1\xbf\xb8\x0e\x15\x63\xbc\xcf\x04\x7f\x90\xfa\x4f\x28\xa2\x82\x9f\xa9\x7d\x22\xf5\x4f\xe3\x15\xa6\x72\xd1\xaa\xa8\xa8\x1e\xa6\x49\xbe\x3a\x25\x08\x27\x35\x73\xa9\x91\xf9\x0b\x6d\x83\xec\xc8\x59\x08\xe1\x8f\xc5\x25\x3e\xc6\x60\xc9\x1b\xb9\x33\x44\x63\x68\xd0\x6b\x12\xd9\x0a\x71\xdc\xa0\x19\x26\x1d\x16\x7b\x58\x30\xd1\xd6\x0a\x51\x28\xc2\x18\xe2\xa1\x51\x61\x1a\xb1\x2e\xbf\xbc\xc7\x26\xf1\x29\xb3\xbc\xbe\x28\xc4\xaf\x4b\xe2\xa6\xe8\x21\x10\x4b\x5d\x42\xb9\x64\x81\xfc\xf7\xca\x28\x4c\x10\x0f\x37\x71\x49\xbd\x20\x4c\x94\xd8\xf5\x57\xde\x8e\xf5\xf8\x44\xce\xac\x34\x0e\xa6\xd8\x3b\xb9\xb2\xff\xbf\x34\x20\x93\xfb\xb4\x15\x14\x84\xe9\x7c\xf1\x1e\x1f\xd7\x95\x19\xb5\x59\x55\x7c\x32\x63\xfd\x1d\x2f\xb3\x5a\xe7\x97\xdd\xf7\xd2\xa1\xea\x34\x7c\x7e\x8e\x51\xf2\x41\x39\x6d\xaf\x5e\xb9\xae\xcb\xf9\x6d\x99\x8c\xa1\x18\xca\x26\x74\xb5\x79\x27\x6b\x70\x66\x64\xe7\x6c\x73\x6c\x07\x48\x0a\x94\x9f\xe0\x85\x05\x8a\xd7\x85\x1c\xee\xc5\x5d\x52\x69\xad\x33\x8e\xa1\x45\xf2\x45\xf0\xdf\xbf\x62\x5e\xad\xdf\xc5\x5e\xce\x05\xc4\x12\xe7\x36\x73\x0d\xb8\x34\x54\x28\x0b\xa3\x2b\x9e\x3f\x3e\x07\x19\x26\xcf\xae\x87\x4e\xd3\x95\x17\xda\xb3\x1c\xf3\xe3\x0e\x2b\x44\xca\x01\xc3\xba\x95\x47\x94\x63\xc9\xc3\xad\x98\x10\x15\x7e\x9f\x30\x4d\xc4\x29\xb4\xce\x91\xc3\x6e\xd8\x7c\xdf\x8e\x76\x85\x9a\x24\x36\xc4\x4d\x90\x5f\x29\xa2\x78\xf0\x67\xe9\x2e\xb2\xf6\x38\x97\x20\x7f\xe5\xd9\xfc\x3e\x56\x0c\x23\x0e\xb1\x7b\x46\xb0\x0c\xe9\xea\x8a\xc6\x68\x2d\xdc\x19\x22\x41\x91\x0c\x79\xe1\x22\xff\x42\xfd\xa8\x5f\x68\x6c\x78\x16\x3d\xf1\x23\x51\x48\x1f\xd3\x08\xc1\xe9\x94\x5d\x5c\x8d\x10\xc2\xdb\x95\xdc\x7b\x91\xd5\xcd\x0f\xca\x3c\xc6\x7f\xa1\x3d\xfe\xb5\x62\xe2\xa5\x78\xa9\x77\xea\xff\xaf\x1f\x60\x49\xaf\x49\x4e\x4f\x9f\xbc\x14\x7d\x50\x7e\x68\x36\x2f\x9e\x9e\x9f\xd9\xf3\x02\x37\x98\xb9\xf3\xf0\x83\xf2\x43\xb7\xdb\x6a\x3e\xb7\x59\xe9\x2a\x8d\x56\xf8\x1c\xf0\x43\xf7\xf9\xac\xed\xb4\x78\x29\x09\x83\xf8\x01\x5d\x76\xd0\xa5\xc3\xca\x22\x7c\x50\xfc\x61\xe6\x74\xce\xcf\xce\x59\x51\x18\xe1\x3d\xf8\x41\xf9\xe1\x79\x76\x81\x5a\x67\xac\x74\x87\x3c\x62\x83\xff\xf0\xfc\xec\xb4\x9a\x17\xac\x74\x1e\x21\x14\x7c\x50\x7e\x68\x5f\xda\x17\xa2\x83\x04\xd9\x1e\x2e\x6b\x3a\x57\x57\xbc\xa2\xb3\xb3\x71\xbd\xd6\x85\xdd\x7e\xba\x64\x65\x44\xa1\x93\x1e\x9f\x45\x77\x78\xa1\x7f\xe8\x3a\x17\xe7\x17\x33\xa9\xec\x74\x66\x47\x78\xea\x9d\xb3\x8e\x7d\xd6\xe4\xe8\x90\xc8\xc3\x5d\x91\x22\x31\x72\x42\x6c\x9b\x96\x3a\x8a\x53\xc7\x41\x71\x5c\x9c\xad\x1b\x3c\x87\xa5\x99\xd9\x51\x40\x4c\x9c\x3c\xb6\x33\x4c\x98\xa8\x48\x2f\x8f\xea\xd5\x1f\x9e\x2f\x9f\xaf\x9e\x6d\x51\xb5\x3c\x61\xe9\x11\xcc\x6b\xcc\xcd\xa7\x5c\x71\xec\x7f\x50\xce\x2f\xba\xab\xd7\x32\xc8\x9f\x7d\x50\x2e\xba\x97\x55\x20\x6f\xfe\x41\xb9\xba\x6a\x57\x81\x5e\xbd\x0f\x4a\xab\xdd\x6c\x0a\x58\xdd\x83\x16\x2c\x02\x3d\x74\x1a\xef\xe2\x04\xf9\xaa\x02\x3c\x37\x58\x0e\x6d\x67\x4a\xfe\x36\xc3\x20\x51\x95\xcf\xef\xa6\x68\x1e\x22\xe5\xde\xfa\xfc\x4e\x55\x6e\xc3\xa7\x30\x09\x71\xe9\x35\xf2\x36\x08\x9b\x4f\xca\x08\xa5\x08\xc3\xb4\xc8\xb5\x3d\x0c\x1a\x85\x49\xa8\x4c\xed\x20\xc6\xa5\x9f\xdf\xdd\xb8\x4f\x88\x29\x18\x5e\x98\xcd\x01\x57\xd0\xf0\x24\x14\x48\x6c\x5b\xc3\x0f\x5f\x5c\xda\x8e\x8f\x5b\x59\x36\xdd\xf9\x4f\xa1\x47\x0b\xc9\x78\xb9\xe6\xfb\x5f\xe1\x4c\xcd\x61\x18\x84\xa7\xb7\x68\x9e\x7a\x76\xa4\x2a\x43\x14\x78\xa1\xaa\x0c\xc3\xc0\x76\x42\x55\x81\x61\x10\x87\x9e\x1d\x17\xe6\x8e\xdb\xd0\xf1\x60\x98\x46\x2e\x8a\x94\x11\xda\xe2\x02\xf9\x4a\xf7\x1f\xdf\xfc\x94\xe1\xe8\x57\x0c\xd5\x0f\x18\x8e\x78\xbb\x70\xdc\xb3\x85\xa6\xaa\xb0\xff\xff\xc4\xe7\xf4\xaf\x0b\xff\xaf\x0a\x81\xff\xff\xd8\x7b\x17\xe5\xc6\x71\x24\x51\xf4\x57\xb8\xd5\x5d\x5b\xe5\x6e\x51\x45\x52\xa2\x24\xbb\xb6\x3a\xe6\x71\x77\xef\x99\x88\x9e\xb9\x37\xa6\xcf\x46\x9c\x88\x71\x9f\x3b\x94\x08\xc9\x9c\xe2\x6b\x49\xda\xa6\x7b\xa2\xce\xb7\xdf\x00\x08\x92\x78\x24\x1e\xa4\x2c\x55\xef\xec\x6e\xcf\x96\x6d\x10\xf9\x40\x22\x91\x40\x26\x1e\x29\xc9\xe2\x1f\x5a\x69\x07\xaf\x49\x3c\x8c\xd6\xef\x72\xad\x3d\x0f\x52\x81\x90\x75\xa2\xbe\x09\xfc\x20\x0c\x6e\xd5\xfb\x7d\xf2\x11\x1b\x6a\x8e\xa9\x7f\xf0\x9a\x27\x9b\x4d\xa7\x8c\xf9\x03\xc6\x70\x2c\xbf\x47\x75\xce\x69\x59\xaf\xf7\x51\x3b\xb7\x71\xc6\x11\x3d\xeb\x53\x91\x86\x03\x91\xd2\x58\xd5\x9e\x89\xb4\x3b\x39\x29\x1d\x9a\x04\xcf\x4b\x6a\x28\x8b\x47\x26\x2d\x4e\x55\xfe\xd7\x3a\x50\xb9\xf5\xbc\xb9\x87\x28\x5f\xf3\xb0\x24\x3d\x1f\x29\x1f\x72\x64\x2c\xc7\x8e\x58\xfb\x2f\xf6\x67\x09\x19\xd8\x6d\xf8\xf6\xac\x23\x84\x9d\xde\x71\xa7\x08\x87\xcf\x94\x09\xe6\x2c\x61\xaf\x42\xdc\x31\x2f\x76\x65\xa7\x3e\x9d\xa5\x3f\x26\xd8\x23\xbe\x23\x47\xc0\x44\xf4\xe1\x66\xbf\xfa\x68\x1c\xa5\x5f\x5e\xf9\x68\x9a\x01\x1f\xc0\xaa\x35\x56\xfb\xd3\x68\x17\x5c\xfc\xf0\xb3\x17\x63\x6b\x2b\x34\x6d\xfc\x82\x67\xc1\xac\x4e\x62\xb1\x27\xae\x54\xc3\x6b\xe6\x51\x28\xf1\x4c\xd3\x8c\x23\x45\x56\x67\x87\x8c\x27\x84\xbc\xe5\x76\x30\x34\xe2\xa9\x20\xf6\x5b\xaf\xee\x8c\x3b\x34\xf9\xf0\x4f\x7f\xd0\x06\x3a\x3c\x63\x75\x6e\x86\xe2\x61\x0e\xc7\x58\x1f\x76\xe1\x27\x6c\x36\xae\xa3\x3a\x22\xf2\x55\x4e\x44\x68\x8f\x39\x30\x03\x82\x2d\x3e\xff\x74\xc3\xe4\x03\x0c\xfd\xda\x6e\xd2\xd9\x00\xab\x6d\x7a\xcd\x9e\xf7\x2b\x6d\x77\xf3\xdd\xcb\xef\x16\x83\x1b\xb1\xca\x2a\xc3\x2e\xac\xb2\xc6\xb8\x05\x0b\xed\x4a\x2b\xe4\xf4\xdf\xbb\xc4\x74\x21\xcf\x51\xfe\x62\xdc\xd5\xb5\xdf\x3d\x95\xf6\xf4\xa6\xed\xbd\x9d\xb9\x0b\x36\x65\x03\x8c\x9d\x03\xc7\x52\xdb\x7d\x2f\xd5\x96\xd7\xb4\xdd\x2e\x61\xa3\xe7\xd7\xb0\xbb\x04\x6e\x99\xd8\xec\x37\xbc\xfe\x0e\xc6\xd4\x8d\x03\x3b\xeb\xf4\x6a\xfb\x00\x33\x83\xfb\xbd\xb8\x26\x84\xd1\x55\x1e\xf5\xe2\x3e\x5f\xe2\x2f\x4b\xfc\x69\x89\xbf\x2d\xf1\xc7\x25\xfe\xba\x14\x1c\x6e\x69\xb6\x16\xfc\x95\x10\x8e\x57\x04\x2c\x07\xcb\x07\x5f\xf2\x61\x02\x6e\xf6\xef\x18\x09\xe4\x5a\x6c\x1d\xc2\xe7\x4a\xaa\xe3\x0f\x6b\xa2\xae\x1a\x69\xc9\x1a\xa8\xc6\xd5\x22\x4d\x0d\x81\x5a\x01\x57\x6d\xc3\x48\x44\x8e\xdd\x90\x3a\xcb\x14\x45\xb1\x06\x91\x20\xb0\xd5\xe8\x67\x2e\x69\xf7\xb9\xb2\x78\x36\x1a\x58\xb5\xb0\x07\x84\xb2\x24\xc3\x65\x78\x1e\x4a\x59\xf0\xeb\x73\x51\xca\x9d\xb4\x9a\x89\xb2\x0f\x42\xb1\x1e\x88\x2f\x78\xeb\x92\x13\xc2\xce\x22\xc3\x2c\xda\x81\x96\xad\x53\x17\x69\x12\x8b\x31\xd3\xa5\x7f\xc3\xb9\xe6\x78\x24\xc1\x3e\xba\xb7\xdc\x6d\x43\x75\x80\x8f\xa0\xc8\xa2\xea\x33\xc6\x80\x7f\x8a\x33\xfb\x32\xe8\xb9\x04\x62\x79\x87\xe3\x0e\xad\x46\xfd\xc3\xa6\xe5\x31\x27\xf3\x7f\xcc\x3b\x14\x63\x84\xc2\xe9\x2c\x10\xb0\x48\xe8\xe0\x3b\x4b\x76\x1e\x34\xb1\x6f\x16\x16\x52\x82\xe9\xd6\x62\x69\x54\x37\xee\xe1\x21\x49\xfb\xd5\x18\xed\xb8\x8a\x06\x29\xb8\x01\xbc\xa4\xcf\xb7\x24\x75\x26\xc9\xfe\x96\x4e\xe9\xe2\x42\xf9\xb1\x2c\x51\x75\x88\x46\x27\x6c\x09\x87\x6c\x54\xe1\x2d\xc8\x42\x30\x28\xdc\x2e\x48\xae\x5c\x85\x28\xb4\x43\xf2\xe3\x14\x78\xfb\x1d\x87\x3e\x82\x40\x42\xac\x77\xce\xfd\x9b\xfb\xfb\xc0\xf3\xd7\xf7\xf7\x9e\xf7\x5b\x8f\x84\x99\xa9\x80\xb2\x93\x7b\x4c\x1f\x93\x21\x98\x25\xaf\x79\xa0\xf9\x9d\xc0\x35\x0f\x8f\xd9\x3e\x8f\x92\x54\x56\xcb\x61\x80\x2a\x83\xcc\xe3\xc8\x1a\xc7\xd1\x37\x31\x42\x01\xda\x7c\x84\xdc\x3b\x06\xa7\x35\x93\x6c\x20\x40\xaf\x6b\x5d\x4d\x77\x88\x0a\xa8\xe7\x35\xde\xb8\x88\x08\x38\x87\x1d\x50\x36\xb8\x1b\x0f\x45\x8c\xe4\xf8\xdd\x76\x19\xf2\x40\xcc\xee\x2d\xe3\x87\x91\x2d\x3f\x17\x17\x8c\x81\xb4\x1f\x9c\x11\xa5\xb4\xb6\x24\x75\x3e\xef\x63\xb9\xd7\x2a\x94\x39\xde\x72\x0d\xe8\xb3\xcc\xcc\xd0\x8b\x72\x07\x33\x1b\x0f\x72\x2f\x32\xa3\x02\xf3\x00\xf0\x21\x8d\xa5\xbe\x8f\x55\x91\xd8\x52\xea\x63\x70\x38\xc9\x6d\x18\x18\x1d\xd0\x80\x3d\x61\x5a\xa9\xe3\xbe\x20\xbd\x20\x2e\xd4\x97\x65\x85\xdc\x2e\x3c\x35\x06\x7d\xb0\xf6\xf6\xfa\xb3\x5a\xf7\xdb\xb3\x43\x50\xeb\xa5\x0f\x68\x0d\x48\x86\x83\xa6\x0b\xf6\x8f\x6e\xd4\xf2\x45\x75\xc6\xff\x9d\x09\xdf\xd3\x13\xff\x77\x4b\x47\xae\xc2\xcb\xe9\x6d\xaa\x1f\x96\x9c\x63\x47\x4d\xfe\x50\xcc\x5b\xe0\xc1\xa7\xe3\xe2\xdf\xec\xb8\xfc\x0d\x79\x11\xd4\x79\xcf\xb8\x73\x64\xe7\x9b\x1a\x74\xa6\xc1\x0e\xd7\xb8\xfe\x4c\x38\x33\xfe\xc3\x41\x80\x5f\xd4\xc8\xc9\xde\xb9\x09\x39\xf7\x67\x16\x03\xb4\xb6\x81\x05\x2d\xb2\x19\x3f\x91\x16\xf7\x67\x7a\x02\x48\xdf\x6e\x2c\x48\x77\x9b\xfd\xe7\xd1\xe6\xfe\xec\xd5\x83\xb7\xb8\xbe\x24\xf2\x65\x55\x3c\x0b\x03\xd0\xcd\x6a\xf7\x98\xa2\xb6\x0f\x09\x0c\x1f\x70\xe1\x10\xc9\xc5\x7f\x50\x2b\x86\xff\xed\x06\x2c\x50\xc6\x2b\x98\x2b\x2a\x5e\xa7\x61\x7d\x71\xc7\x52\x5e\xb8\xa7\xc7\xa6\x41\x55\x0d\xae\x12\x34\x1b\x34\x2c\xe8\x0f\x58\x1c\x64\xfd\xc6\x15\x76\xc1\xfa\xef\x3e\xdd\xbf\x39\x14\xa9\x3b\x78\xb7\xc2\xb0\xf1\x3e\xc2\xcb\xa4\x7e\x54\xa7\xae\x4f\xc4\x9d\xba\x01\xfd\xb9\xa2\x3f\xd7\xf4\x67\x48\x7f\x6e\xe8\xcf\x2d\xfd\xb9\xa3\x3f\x6f\xe9\x4f\xdf\xeb\x7f\xe9\x31\xfa\x14\xe5\x82\x52\xc2\xc3\x8f\x7e\xaa\xb3\x81\x6e\x9d\x0d\xa4\xeb\x6c\xa0\x5e\x67\x03\x03\x75\x36\xf0\x50\x67\x03\x1b\x75\x36\x70\x52\x67\x03\x33\x75\x36\xf0\x83\x49\x78\xcc\xef\x0c\x3d\x7f\x24\xd8\xf3\x56\x67\x2c\x7b\x59\x3c\xb0\x97\xc5\x03\x7b\x59\x3c\xb0\x97\xc5\x03\x7b\x59\x3c\xb0\x97\xc5\x03\x7b\x59\x3c\xb0\x97\xc5\x03\x7b\x59\x3c\xb0\x87\x49\x78\xcc\xef\x0c\x3d\x7f\x24\xd8\xb3\x97\xc5\x2c\x7b\xe9\x69\x60\x2f\x3d\x0d\xec\xa5\xa7\x81\xbd\xf4\x34\xb0\x97\x9e\x06\xf6\xd2\xd3\xc0\x5e\x7a\x1a\xd8\x4b\x4f\x03\x7b\xe9\x69\x60\x0f\x93\xf0\x98\xdf\x19\x7a\xfe\x48\xb0\x67\x2f\x3d\xb1\xec\xb5\xa3\x52\xb5\xa3\x5e\xb5\xa3\x6a\xb5\xa3\x76\xb5\xa3\x82\xb5\xa3\x8e\xb5\xa3\x9a\xb5\xa3\xa6\xb5\xa3\xb2\xb5\x8c\xbe\xb5\x8c\xca\xb5\xa3\xd6\xb9\xed\xa0\x78\x6d\xa7\x7b\xda\x8d\xc7\xb3\xa6\x9f\x61\x34\xd1\xb0\x4f\x6f\x56\xca\x0a\x1d\x51\x55\xa1\xb8\x5f\x4c\x8f\xd6\x65\x1f\xd5\xc9\x78\x08\x6b\x00\x20\xcc\x3d\xa1\x6e\x55\x47\xab\x9e\xaa\xe2\xb9\x2f\x90\x97\x9d\x83\xf5\xc3\x4b\x9f\xda\xf5\x9d\x1f\x9c\xef\x78\x36\xe8\xc6\xd3\xb0\x82\x91\x8b\x8c\x58\x03\x15\xd6\x50\x42\x1a\xca\x38\x43\x08\xe5\x4a\x85\x72\xb5\x5a\xae\xc8\xff\x89\x98\x85\x0f\x0c\x01\xee\x8b\x40\x67\xad\xa2\x13\x84\x22\x81\xbe\x84\xc1\xdc\x15\x09\x28\x43\x25\x4a\x49\x1a\x81\x2c\x8d\x00\x92\xc6\x46\xd9\x6d\x9b\xe5\x06\xff\xdf\x56\xea\x3c\xfe\x03\xdb\x85\xec\x97\xd1\xd0\x8f\x43\x80\xa7\x30\xac\x95\x80\x22\x8a\x91\x59\x4e\xc1\x8a\x42\xcc\x3d\x84\x7c\xa7\xe8\xcb\x9d\xaa\x2b\x77\x52\x4f\x92\xc9\xe9\xb2\xa2\x59\xbd\x8a\x7e\x90\x59\xf3\x72\x1a\x4d\x26\x63\x08\xfd\xda\x57\xc8\x41\xf8\xc0\xa0\xe7\xbe\x8c\xe8\x37\xaf\x32\xc4\xc9\x2a\x01\xc4\xa4\xd2\x86\x50\xa9\x0e\x21\xac\x0f\x3b\x08\xfd\x46\xa5\x0f\x1b\xa5\x3e\x6c\x60\x7d\xb8\x85\xd0\x6f\x25\x7d\xd8\xca\xfa\xb0\x15\xf4\xc1\xf7\xc0\x51\xa1\x52\x88\x9d\x52\x21\x76\xb0\x42\xf8\xe0\xa8\xbb\x55\x69\xc4\xad\x52\x23\x6e\x61\x8d\xf0\x83\xd7\x9a\x4b\x3a\x27\xfc\x98\x54\x75\x23\xcc\x92\x34\x04\xe3\x76\x33\x1c\xfb\x17\x0b\x99\x46\x2a\x40\x7f\xc5\x02\xfa\x2b\x01\xd0\x83\xa1\x3c\x16\xc8\x13\x60\x7c\x05\x25\x8e\x90\x00\x13\xc0\x30\x01\x0b\x13\x08\x30\x2b\x18\x86\x6b\x90\xd8\x9e\x35\x0c\xb3\x66\x61\xd6\x02\x4c\x08\xc3\x84\x2c\x4c\x28\xc0\x6c\x60\x98\x0d\x0b\xb3\x11\x60\xb6\x30\xcc\x96\x85\xd9\x0a\x30\x3b\x18\x66\xc7\xc2\xec\x04\x98\x5b\x18\xe6\x96\x85\xb9\x15\xfb\x54\xa1\x08\x3e\xa7\x09\xbe\xa4\x0a\x2a\x5d\xe0\x95\x41\xd4\x06\x5f\xa1\x0e\x3e\xa7\x0f\x3e\xa3\x10\x64\x3b\xb2\xd7\x3c\xce\x2d\x94\x6d\x20\xad\x1c\x00\x95\x81\x29\x8e\xd6\x5e\x01\xb5\xd9\xf9\x8b\x56\x5b\x03\xd5\x80\xe9\x88\xd6\x0e\x81\xda\xc0\xec\x42\x6b\x6f\x80\xda\xec\xd4\x41\xab\x6d\xa1\x6a\x4a\x29\xec\x80\xda\x1b\xa5\x14\x6e\x81\xda\x5b\x59\x0a\xbd\xb6\xf0\x1d\xa1\x14\x83\x0f\xf5\x9b\x6c\x53\xcd\x51\xa7\x94\x89\x31\x19\xfc\x08\xc8\x93\xd0\xf8\x12\x80\x37\x01\x87\xb1\xc9\xb3\x06\xe3\xd2\x14\x3b\xcc\xe3\xea\x54\x39\x15\x80\x93\x81\x2d\x81\x40\x4d\x20\x04\xf0\x87\x10\xfa\x50\x89\x7d\xa5\xc6\x2e\xac\xc0\x34\x8b\x33\xf5\xf2\x0c\x22\xb9\x56\x93\xec\x57\x91\xd0\xca\x12\x58\x5b\x42\xd8\x43\x0d\x76\x40\x5c\x01\x24\xae\x40\x29\xae\x8d\xa6\xb7\xf9\x95\x94\x66\xd1\xad\x5e\x76\xf7\x24\x99\xb0\x0b\x4c\x6c\xf0\x3a\x40\xd7\x44\x76\x4e\x74\xca\xd6\x47\x7e\x60\x4a\x3b\xa5\x12\xec\xd4\x3a\xb0\x03\x54\xa0\x0f\x68\x5d\x4d\x7a\xab\x57\xd5\xb1\x3e\xf2\x76\xf9\xb1\xd2\x07\xf6\x60\x4a\x82\xe3\xa2\xf1\x69\xd4\x5e\x8d\x40\x69\xf3\xaa\xd6\xa5\x8f\x40\x2a\x90\xaa\xf5\x29\xd4\x28\x54\xa8\xd1\xa8\x1d\x4c\x69\xa3\xd6\xa8\x8d\x46\xa3\x36\x1a\x8d\xba\x85\x29\x6d\x01\x8d\xda\x42\x1a\xb5\x85\x34\xaa\x9f\x4d\x0d\x8e\x90\xc6\x15\x52\x3b\x43\x22\x29\xc5\x18\xbf\x55\xeb\xd4\xad\x46\xa7\x6e\x35\x3a\xe5\x07\xaf\x3d\x27\xd2\xf3\x91\x19\xeb\x27\x29\x3d\x25\xde\x57\x92\x50\x8c\x0e\x93\xd2\x65\xe2\x9d\x26\x09\x83\xa7\x02\xf7\x78\x68\x0f\x02\xf6\x95\xb4\x05\xd2\x10\x70\xa0\x02\x0e\x78\xe0\x00\x02\x5e\xa9\x80\x85\x46\x83\x6d\x5e\xab\x80\xd7\x3c\xf0\x1a\x02\x0e\x55\xc0\x21\x0f\x1c\x42\xc0\x1b\x15\xf0\x86\x07\xde\x40\xc0\x5b\x15\xf0\x96\x07\xde\x42\xc0\x3b\x15\xf0\x8e\x07\xde\x41\xc0\xb7\x2a\xe0\x5b\x1e\xf8\x16\x54\x12\xa5\x8a\xf9\x82\x8e\xf9\xb0\x92\xa9\xb5\x4c\x54\x33\x50\xcf\x7c\xa5\xa2\xf9\x82\xa6\xf9\x9c\xaa\x75\x8b\x7e\x76\x88\x48\xfb\x78\x72\x5d\x1f\xac\x0b\x19\xfd\x11\x26\x00\x61\xc0\x15\xc1\x08\xb4\x02\x81\xf8\xa9\x7e\xac\xbd\x06\x6b\x83\xb3\xf6\x08\x14\x82\x40\xe0\x04\x3c\x02\x6d\x40\x20\x7e\x66\x1d\x6b\x6f\xe1\xda\x7a\x79\xed\x40\xa0\x8d\x5e\x5e\xb7\x20\xd0\x56\x21\x2f\x1f\xee\xf3\x9d\x5e\x60\x3e\xdc\xfb\xf2\xf4\x62\x79\x80\x20\x65\xce\x07\xfc\x3a\xfc\xc4\x2c\xbe\xb0\x9f\x98\xc5\x97\xf4\x13\xb3\xf8\xea\x7e\x62\x16\x5f\xd2\x4f\xcc\xe2\x4b\xfa\x89\x59\x7c\x4d\x3f\x91\xee\x7f\x5f\xc7\x4f\x24\x8a\x7c\x79\x3f\x91\xa8\xf3\xb5\xa4\xf7\xfa\x7e\x22\x51\xde\xab\xf8\x89\x44\x91\xaf\xe2\x27\x12\xa5\x7e\x6d\x3f\x31\x8b\xaf\xe5\x27\x66\xf1\xb5\xfc\xc4\x2c\xbe\x80\x9f\x48\x8e\xc4\x5c\xc7\x4f\x24\x27\x6e\xae\xe3\x27\x92\x03\x3d\x97\xf1\x13\xb3\xf8\x6c\x3f\x31\x8b\xcf\xf5\x13\xb3\xf8\x0c\x3f\x11\x32\xb5\xd6\x7e\x22\x64\x40\xad\xfd\x44\xc8\x26\x5a\xfb\x89\x90\xed\xb3\xf6\x13\x21\x73\x66\xed\x27\x42\x16\xca\xda\x4f\x84\x2c\x91\xb5\x9f\x08\x19\x17\x6b\x3f\x11\xb2\x17\xd6\x7e\x22\x68\x17\x26\xf8\x89\xe0\x60\x9f\xe0\x27\x82\x23\x78\x8a\x9f\xc8\x0e\x11\x93\x9f\xc8\x8e\x08\x5b\x3f\x91\x1d\x08\xd6\x7e\x22\x3b\x00\xcc\x7e\x22\xab\xf1\xd6\x7e\x22\xab\xe9\xd6\x7e\x22\xab\xe1\x66\x3f\x91\x55\x69\x6b\x3f\x91\x55\x65\x6b\x3f\x91\x55\x61\xb3\x9f\xc8\xe9\xac\xb5\x9f\xc8\x69\xea\x4c\x3f\x51\x38\xfc\x9d\x32\x87\xb9\x7f\x1d\x7e\x62\x7a\xba\xb0\x9f\x98\x9e\x2e\xe9\x27\xa6\xa7\xab\xfb\x89\xe9\xe9\x92\x7e\x62\x7a\xba\xa4\x9f\x98\x9e\xae\xe9\x27\xd2\x83\xc8\xd7\xf1\x13\x89\x22\x5f\xde\x4f\x24\xea\x7c\x2d\xe9\xbd\xbe\x9f\x48\x94\xf7\x2a\x7e\x22\x51\xe4\xab\xf8\x89\x44\xa9\x5f\xdb\x4f\x4c\x4f\xd7\xf2\x13\xd3\xd3\xb5\xfc\xc4\xf4\x74\x01\x3f\x91\xdc\x4d\xb8\x8e\x9f\x48\xae\x3e\x5c\xc7\x4f\x24\x37\x2b\x2e\xe3\x27\xa6\xa7\xb3\xfd\xc4\xf4\x74\xae\x9f\x98\x9e\xce\xf0\x13\x21\x53\x6b\xed\x27\x42\x06\xd4\xda\x4f\x84\x6c\xa2\xb5\x9f\x08\xd9\x3e\x6b\x3f\x11\x32\x67\xd6\x7e\x22\x64\xa1\xac\xfd\x44\xc8\x12\x59\xfb\x89\x90\x71\xb1\xf6\x13\x21\x7b\x61\xed\x27\x82\x76\x61\x82\x9f\x08\x0e\xf6\x09\x7e\x22\x38\x82\xa7\xf8\x89\xec\x10\x31\xf9\x89\xec\x88\xb0\xf5\x13\xd9\x81\x60\xed\x27\xb2\x03\xc0\xec\x27\xb2\x1a\x6f\xed\x27\xb2\x9a\x6e\xed\x27\xb2\x1a\x6e\xf6\x13\x59\x95\xb6\xf6\x13\x59\x55\xb6\xf6\x13\x59\x15\x36\xfb\x89\x9c\xce\x5a\xfb\x89\x9c\xa6\xce\xf4\x13\xc5\x9b\xba\x29\x73\xd5\xf6\xd7\xe1\x28\xb6\xe9\x85\x1d\xc5\x36\xbd\xa4\xa3\xd8\xa6\x57\x77\x14\xdb\xf4\x92\x8e\x62\x9b\x5e\xd2\x51\x6c\xd3\x6b\x3a\x8a\xdc\x95\xd0\x4b\x3b\x8a\x6d\x7a\x15\x47\xb1\x4d\xaf\xe5\x28\xb6\xe9\x05\x1c\xc5\x36\xbd\x96\xa3\xd8\xa6\xd7\x72\x14\xdb\xf4\x02\x8e\x62\x9b\x5e\xcb\x51\x6c\xd3\x6b\x39\x8a\x6d\x7a\x01\x47\xb1\x4d\xaf\xe6\x28\xb6\xe9\xd5\x1c\xc5\x36\xbd\x98\xa3\xd8\xa6\x67\x3b\x8a\x6d\x7a\xae\xa3\xd8\xa6\x67\x38\x8a\x90\xa9\xb5\x76\x14\x21\x03\x6a\xed\x28\x42\x36\xd1\xda\x51\x84\x6c\x9f\xb5\xa3\x08\x99\x33\x6b\x47\x11\xb2\x50\xd6\x8e\x22\x64\x89\xac\x1d\x45\xc8\xb8\x58\x3b\x8a\x90\xbd\xb0\x76\x14\x41\xbb\x30\xc1\x51\x04\x07\xfb\x04\x47\x11\x1c\xc1\x53\x1c\x45\x76\x88\x98\x1c\x45\x76\x44\xd8\x3a\x8a\xec\x40\xb0\x76\x14\xd9\x01\x60\x76\x14\x59\x8d\xb7\x76\x14\x59\x4d\xb7\x76\x14\x59\x0d\x37\x3b\x8a\xac\x4a\x5b\x3b\x8a\xac\x2a\x5b\x3b\x8a\xac\x0a\x9b\x1d\x45\x4e\x67\xad\x1d\x45\x4e\x53\x6d\x1c\xc5\x25\xf3\x32\xbc\xfc\x16\x31\xfc\xe4\x20\xfc\x92\x19\xc5\xd4\x3c\x2c\xc6\xdf\xe5\xe7\xde\xc6\x47\xe2\xc5\x27\x84\x9b\xa2\xd4\xbc\x76\x39\xbe\xd2\xc7\x13\x43\x51\xec\xf4\x4f\xc5\x4b\x8f\x12\xf7\x0f\xca\x4b\xf9\x48\x02\x13\x5e\x92\x0e\xe8\x7b\xfa\xf3\xef\x22\x5b\x06\x70\xb7\xce\x58\x31\x90\x3f\x65\x49\xac\xd8\xa7\x1a\xbb\x8a\x1d\x8d\xfe\xa5\x4c\xdd\x53\x85\x20\x14\x4b\x73\x2c\x9c\x8f\xad\x93\xed\x42\xf9\x89\xc3\x4c\x65\x3b\x2c\xf7\x99\x77\x72\x58\xe8\x14\xd5\x35\x80\xb4\x2b\x8e\xe1\x62\x05\x23\xdd\x47\x55\x4f\xb1\x77\xfc\x69\x37\x34\x55\x52\x62\xee\x49\xd5\xa6\xba\xcb\x9b\x07\xb7\x38\xba\xcd\x4b\x89\xde\x17\x71\xff\xb4\xa7\xfc\xb6\xa0\xf8\xd2\xaa\x17\xde\x08\xa8\xbb\xfc\x19\x03\x62\x20\xf3\x07\xfb\x3c\xa1\x99\xc0\x56\xa2\x40\x93\xcf\x2d\xc4\x02\xe7\x07\x4e\x32\x4c\x69\xac\x6a\xce\x37\xfb\x5d\x1c\x8d\x39\x97\x04\x48\x08\x1b\xdb\x31\x63\x3d\xb1\x57\x86\x2f\xca\xc1\xd3\x33\xb0\x8d\xf6\x32\x03\x9d\xd0\x78\x5c\xac\x24\x81\x86\xdc\x1e\x0f\xf1\x14\x3c\x3f\x70\x2d\xd1\x57\x7c\x98\x46\x75\xc8\x02\xb8\x90\x8b\x84\x3e\xe2\xca\xd5\xbd\x14\x6f\xe2\x5d\xbc\x57\x91\x51\x60\x64\xdb\xc7\xd6\x15\xfb\x8a\xf9\x66\xec\xad\xfd\x6a\xbf\xdd\xef\x75\x52\x1e\x53\x20\xea\xfb\xeb\xb0\x3b\xec\x0f\xc7\x29\x98\x34\x3d\x06\x54\x7d\x98\x46\x99\x26\x68\x5c\x88\x05\x62\x7f\x8d\xa5\xea\xde\x3a\xac\xd0\xe6\xb0\x87\x09\x80\xd8\xb8\x9e\x1a\xea\x49\xfd\xd4\x7f\x31\xf6\xd2\xee\x18\xfb\xb7\x48\x2b\x5b\x9a\x8f\x52\xdf\x47\x7b\x3f\x3e\x1a\x7a\x9b\xc3\xa3\xeb\x21\xb1\xe2\xc3\x34\xaa\x49\x7e\x2c\x16\xdc\x5f\x42\xcf\xf4\x45\x1a\x53\x87\x50\x88\x20\xbc\x32\x1e\xb6\x19\xb4\x86\xd8\x1b\x5d\xb1\xb9\x2b\x36\x87\x63\x1c\xe9\x44\x48\x72\x80\xea\xfb\x21\xda\xc7\x31\x0a\x2d\x91\x68\x3a\x81\xaf\xf5\x30\x8d\x1e\xcd\x4b\xba\x10\x0b\x84\x7e\x60\x4a\xd5\x5d\x71\x3c\x22\xb4\x8f\x60\x02\x20\x36\xb6\x49\x63\x3d\xb1\x4f\x86\x2f\xc6\x6e\x39\x1e\xe3\xe3\x56\x3b\x42\xfa\x34\xac\xfa\x9e\x39\x1e\xd1\x2e\xf2\xed\xf1\x68\x3a\x47\xaa\xf8\x30\x8d\x6a\x97\x20\x76\x21\xfc\x2d\xf4\xce\x58\xa8\xe9\x9c\xf0\x20\x9b\x2f\x0a\x08\xe0\x62\x1b\x34\xd4\x12\x7b\xa6\xff\x60\xec\x18\x14\xdf\x6e\xf4\xa6\x8b\x26\xc2\x35\xf4\x8b\xbf\xf7\xf6\x5b\x6b\x34\x9a\x6e\x11\xeb\x3d\x4c\xa3\x49\x52\x9b\x2e\xf8\x3f\x85\x3e\x19\xca\x34\x5d\x12\x1f\xe3\x23\x82\x50\x03\x98\xd8\xa6\xf4\x75\xc4\xfe\xa0\xe5\xe6\x71\xb2\x3f\x1e\x8e\x07\x9d\x1c\xbb\x0c\xc4\xfa\xde\x40\x07\x74\x38\x6e\x6c\xb1\x68\x3a\x43\xa8\xf6\x30\x8d\x62\x4c\x13\x19\x8c\x7f\x49\xa3\xa3\x2b\xd2\x4c\xed\x9b\xc3\xee\x10\x01\x78\x65\x3c\xfc\xb8\x20\x35\xe4\x51\x81\x8b\x8d\x9d\x70\x1b\xde\xde\xde\x1e\xf4\xca\x5c\x7d\x36\xcd\xe5\xb7\xfb\xfd\x1e\x59\x22\xd1\x8e\x07\xb6\xd6\xc3\x34\x7a\xd1\xa1\x49\x9e\xd0\x42\xf8\x5b\xe8\x85\xb1\x30\xb6\xf6\xc2\xb6\x0a\x37\x8c\x43\xa9\x97\xd0\x59\x38\x35\x02\x13\xeb\x3d\xcc\x67\xc0\x59\x12\x1d\xea\xd5\x89\xf7\x2a\x35\xef\xe1\x33\x99\xc0\x05\xd5\x5a\x87\xeb\x38\x0c\x61\x2a\xbd\xed\xe0\xc9\xac\x6f\x43\x2f\xdc\xaa\x28\xa1\x5b\x74\x40\x47\x88\x12\x18\x60\x88\x87\x94\x22\x53\x5a\x71\xc6\xd8\x03\xc7\x17\x24\x04\x02\xa6\x0d\xc5\x78\x6a\x80\xf3\xa2\x0b\x41\x18\x2e\x9c\xf1\x1f\x28\xc6\xc0\xd0\x32\x87\x1b\xd4\x22\x55\x90\x63\xf4\x6e\x38\x3b\xc2\x6c\x18\x6e\xc3\xe5\x2d\x73\x1d\xbd\x63\xa3\x42\x75\x59\xe4\x75\xf2\x84\x98\x37\xcc\x80\x74\x08\x72\x64\x91\x49\x3d\xd0\x72\xfb\xea\x43\xd6\xaf\x21\xdd\x26\x49\x4b\x40\x42\x66\x4d\xf1\x78\x78\x60\x42\x9e\x10\x13\x3f\x38\x60\xff\x89\x19\x75\xbe\xa8\x9b\xba\xdd\x6c\xf5\x4d\x1d\xaf\xe1\x7f\xc5\xa6\x66\xf1\x2b\x34\xf5\xf6\xd6\xd7\x37\x75\xbc\x49\xf2\x15\x9b\x9a\x9e\x5e\xa1\xa9\xbe\x7f\x7b\xab\x6f\xeb\x78\x18\xea\x2b\xb6\xb5\x4d\xa7\xb6\x55\xc2\x61\x9d\x69\x10\xe4\xdf\x86\x7b\x05\x5d\x05\xe3\xb2\xe9\x3c\x16\x55\xe6\x1e\x8a\xbc\xa9\x8a\xd4\x9a\xdb\x3e\x79\xc9\x21\x4a\x0f\xef\xfd\x65\x88\x32\xe7\xfb\x7e\x3b\xc1\xf9\xde\x09\xca\xf6\xe6\xa3\x18\x60\xef\x3e\xb2\x7b\x0e\xaf\x93\xe3\x5e\x3f\x1d\x42\xa6\x37\x4d\xca\x3b\x26\x63\x6e\xab\x4a\x45\x74\x40\xf1\x9a\x44\x0e\xb4\xa9\x88\x48\xde\x28\xfa\xa6\x3d\x3b\xad\x39\xde\xd2\x0f\x6b\x07\x45\x35\x76\xfb\xdd\xe2\xb1\x59\x74\x19\x33\x1f\xa2\xb8\x78\x96\xbf\x8a\x06\xbf\x3b\xfc\x57\xbb\x15\x8a\x1f\x0f\x28\x76\xb3\xa2\x7f\x37\x1f\xff\xdd\x8f\x1c\xb9\xfb\x78\x8e\x86\x34\xd9\x5f\xa0\x0e\xbf\xbb\x73\xb3\xda\x45\x6d\x19\xe5\xca\x95\x1e\x9f\x4d\xdb\xa4\x42\x5d\xa6\xdd\x29\x0b\x16\x3e\x17\xd4\x18\xb6\xf1\xf6\x31\xfd\xc2\x25\xea\x75\x18\x21\x76\x27\x2c\xbc\x3e\x6f\x51\xbf\x7c\xf3\x83\xd5\x30\x95\x06\xcc\xcc\x2d\xb4\x7c\xc8\x80\x59\x3e\x36\x6e\x99\x46\x07\xf4\x40\x72\xaa\xf3\xcc\x33\x59\x93\x8b\x32\x3a\x24\xcd\x0b\x97\xf3\x49\x10\x66\xf1\xcb\xab\x60\xc2\xbd\xf2\xaa\x7c\xbd\x2a\xba\xd7\x40\xd2\xe7\xd3\x5d\xf0\x2a\xfc\x97\x0a\x45\x71\x91\xa7\x2f\x3f\xab\x1d\xcb\x71\x81\x2b\x13\xe1\x12\xd6\xc6\x51\x83\xee\xdf\xfc\xcc\x11\x10\x93\xda\x36\x49\x66\xac\x83\xf1\xe0\x7a\x6e\x5a\x1c\xa2\xd4\x54\x3b\x2b\xf2\xe6\x41\xac\x64\x4c\x48\xea\x38\x44\x79\xc0\x2f\xaa\xfc\xa5\x5d\x56\x66\x51\x73\xfa\x44\xc0\x55\x92\x9f\xb8\xee\x11\x07\x32\xc9\x7a\xc7\x0f\xa4\x71\xa8\x2a\x09\x74\x49\xb5\x89\x4a\x3d\x45\xe9\x23\x9a\x3e\xd4\x65\x6d\x20\xf9\x57\x17\x62\x61\x15\xe5\x27\xdb\x09\x74\x7c\x32\x9d\xa0\x60\xd2\x8c\x73\x29\xd3\xc9\x7c\x35\xcc\x45\xdf\x63\x63\x7f\x03\xe6\x4f\x57\x56\x14\xb3\xc2\x59\x67\xf7\xee\xa6\x2d\x88\xcf\x61\x61\x07\xb1\x6a\xc9\xa8\x58\x4d\x91\x60\xd4\x96\xa3\xde\x81\x80\x38\x0a\x2c\x59\x0a\x34\x3c\x91\xb4\x86\x46\xa6\x38\x6d\x28\xd3\x28\x21\x49\xa4\xad\x17\x29\xc0\xe2\xc3\xaa\x0b\x7d\x0d\x63\x96\x5b\xc8\xaa\x39\xb3\x5b\x58\xc0\x5f\x87\xc5\x71\xd9\x2a\xe6\xd6\x51\x06\x7c\x31\xc9\xe8\x65\x53\x51\x54\x34\xab\x2c\x55\x02\x29\x3e\xe1\xb3\xb0\x00\xd4\xac\xff\x02\xba\xfc\x83\x56\x7f\x26\x75\x30\x24\x11\x84\x1b\x09\xb2\xe8\xab\x19\x24\xfc\xe9\x13\x79\xda\x32\xc7\x1e\x26\x01\x6c\xe8\x5f\x30\xde\x9f\x17\x0e\xf4\x29\x7b\x4c\x9b\xa4\x4c\xd1\xcf\xea\xc4\xda\x7d\x26\x75\x60\x82\x81\x53\x60\xe2\x6a\x58\x3f\x4b\x5d\xee\x52\xa6\xae\x76\x94\xb1\x99\x73\x3d\x21\xc5\x29\x81\xbe\x72\x26\x38\x38\x11\x1c\x9b\x18\x6a\xe0\x6a\x4c\xe5\xc6\x14\xd9\x25\x72\x83\xf3\x4f\x49\x54\x48\x8a\x7c\x6d\xa2\x2b\x40\xa2\x42\x4e\x2b\x48\xa6\x04\x6f\xb7\x84\x13\xb1\x47\xfb\xba\x48\x1f\x1b\x04\x74\xce\x4a\x48\x6c\xdc\x27\xc9\x33\x50\xf8\x4b\xbf\x36\xfb\xd9\xf9\x3f\x0e\xfb\x95\xcc\x0d\x0b\x00\x62\x58\xcd\x41\x00\x8a\x25\xa2\x44\x9b\xa9\x0c\x58\x68\x80\xd5\x31\x0f\x31\xa7\x69\x34\xb9\x2b\xa8\x70\xcc\x37\x5e\xef\xe8\x19\xb5\x03\xa2\x59\xd6\x1d\x87\x94\x90\xa4\xc3\x35\x57\x0e\xe5\x3c\x16\xf3\x0f\x6f\xd5\xf2\x25\x4c\x1b\x3b\xb5\x6e\xa2\x26\x39\xc8\x5d\x0a\x52\x5b\xf9\x6c\x5e\x5c\x30\x9f\xe1\x53\x94\x26\xb1\x7b\x44\x28\xc6\x73\x15\x9c\x35\x5e\x79\xe2\x50\x18\xea\xc6\xfc\xc4\xc1\x2e\xda\xae\x43\x81\x76\x53\x14\xd8\xb0\x69\xb5\xb7\x3b\x64\xd8\x53\x67\x05\xfc\x8b\x9b\xe4\x31\x6a\xfb\x13\xd4\x32\xeb\xd0\xd1\x7a\xdd\xe4\xc3\x36\x6d\xe9\xcf\x9a\x92\x2c\x83\xbb\x6b\xec\x90\x6e\xb6\x0b\x67\x73\x8b\xfd\xd1\xdb\x1b\x7d\x3c\x01\x34\x59\xf8\x07\x27\x46\xa3\x0d\x13\x01\x3a\xb9\xcb\x56\xeb\x39\x22\xcb\xf8\x04\xbb\x38\xb1\x73\x47\x7e\xc5\x83\x98\x57\x98\x85\xb1\x26\xc3\x57\x42\xeb\xc1\x68\xe4\xaf\x1c\x87\x92\x79\x84\xd8\xe4\x1d\x12\x52\x2e\x2c\x80\x46\x32\xd0\x6e\xc3\xa0\xa0\x92\x99\x87\xe2\x59\x37\xce\x3f\x25\x59\x59\x54\x4d\xd4\x2f\xd7\xc6\x8e\x4e\xb2\xe8\x84\xee\x9c\xc7\x2a\x7d\x4f\xdc\xc4\xe8\x8e\x94\x7c\xa8\x9f\x4e\xdf\xb7\x59\xba\x78\xbb\x3a\xd4\x4f\x27\xa7\xcd\xd2\xbc\xfe\xf4\xee\xa1\x69\xca\xbb\x0f\x1f\x9e\x9f\x9f\x97\xcf\xab\x65\x51\x9d\x3e\x04\x9e\xe7\xe1\xca\xef\xba\xb1\xf7\xe9\xdd\xee\x1d\x9d\xc3\xc9\xaf\x4f\x09\x7a\xfe\x5d\xd1\x7e\x7a\x47\x2e\xc6\x38\xbb\x77\x6f\x57\xe8\xed\xea\x50\x46\xcd\x83\x73\x4c\xd2\xf4\xd3\xbb\xb7\xc1\xaa\x6b\xcd\x3b\x27\xfe\xf4\xee\x8f\xc1\x72\xe5\x6c\x96\xdb\xd5\x8f\xcb\x8d\xb3\x5e\x86\xab\x83\xbb\x5c\xbb\xfe\xd2\x5b\x2f\xd7\x1b\xd7\x5f\xae\x1d\x7f\xe9\xbb\xcb\x5d\xea\x2f\x7d\x07\xff\xb9\x5a\xae\xdd\xd5\x72\x77\x58\x6e\xdc\xe5\x66\xe5\xf8\xf8\x67\xb0\xc5\x73\xd0\x72\x9b\xba\x6b\x67\xbd\xdc\x60\x14\xab\x65\xe8\x2e\x77\x04\x95\xbf\xf4\x7f\x79\xf7\xa1\xe3\x03\x73\xfe\x76\x85\xee\xdf\xdc\x88\x72\xa9\x50\x89\xa2\x06\x8f\x4f\xfa\xab\x58\x81\x99\x1d\xc9\x1e\xd7\xe8\x6f\x51\xd1\xfb\x3b\x2a\x7c\xc6\xf4\x32\xf0\xdd\x20\xa5\x50\x03\xd0\xaa\x87\x81\xcb\xed\xd5\xa9\xf3\x72\x55\x4a\xc5\xc6\xb8\xd4\xaa\xa5\x0f\x53\x09\x66\x81\x0d\x53\xf1\xdc\x41\x3e\x38\x55\x79\xe0\x93\xa0\xf8\x82\x7a\xe3\x05\x81\x46\x9b\xc5\x4e\xf1\xbb\x35\xf1\xd0\x03\x10\x7b\xe0\x62\xb4\x67\x10\xfc\xa8\x67\x11\x1c\x81\x6a\x46\x9b\xa2\xd4\xe8\x8e\x41\xb7\x54\xfa\x70\x78\xac\x9b\x22\x73\x3b\xf1\x0e\xf6\x85\x2b\x3d\xcb\xc0\x0c\x9a\x19\xf4\x73\xb7\xc6\xc6\xbc\xa6\x75\x59\x8f\xd6\x25\x14\xac\xcb\xda\x09\x41\xeb\xd2\x6d\xf9\x52\xeb\xe2\x78\x3f\x7a\x4e\xf0\xb0\xfe\x25\xf3\x9c\xf0\x47\xcf\x59\x3d\xac\x01\x63\x40\xc5\xde\x6f\x07\x74\xea\xf3\x61\x57\xb6\x8e\xef\x95\xed\x68\x13\x16\x64\xee\xfc\x6f\xe3\x49\x25\x34\x0c\x3a\x22\xb6\x0f\x13\x6d\x1b\x67\x6a\x6d\xb5\x7a\x30\x73\xb0\x6e\x5f\xd5\xce\xc9\x4e\xc5\xb0\x4e\x90\x5c\x10\xb9\x32\xb7\xae\xd0\x7b\x20\xc2\xf2\xd4\x9a\x0b\xd3\x92\xc8\x08\xda\xaf\x91\x0c\xdc\xcb\x74\x2c\xaa\xcf\x58\x44\xd1\x3e\xef\xc3\x26\x02\xcb\xc2\xd7\x5e\xee\x10\x10\xc7\x0e\x04\x37\x45\xfe\xd3\xb9\xba\xbb\xdb\xa3\x63\x51\xa1\xb9\xdc\xf5\xf0\x7a\x3d\x9f\xc8\xec\x1d\xe9\x2e\x74\x36\xd3\xb6\x78\x40\xe6\x57\xeb\x03\x52\x07\xe3\x87\xaf\x53\x9b\xd6\x59\x85\x73\x1b\x66\x85\xa5\x6f\xd6\xeb\x58\x18\x53\x9b\xee\xf2\xa2\x79\xdf\x4b\xfc\xe6\x75\x5a\x38\x0d\xe7\x7c\x1d\x3c\x26\xe4\x74\x39\x34\x5a\xc8\x27\x61\x00\x8f\xd5\xa1\xf1\x31\x42\xbc\x1e\x43\x52\x87\x5b\xb2\xa5\x81\xbb\xd8\xcc\x94\xe4\x57\x0d\x98\xc4\x87\x55\xc8\xc8\xb3\xa7\xfe\x5f\x36\x64\x12\x04\xde\xc2\x09\x57\x67\x87\x4c\x04\x41\xda\x04\x4d\x40\xd9\x1b\xc3\x26\x14\x0a\x2b\xa9\xa8\x3a\x0b\xab\xda\x7c\xf8\xc4\x80\x0e\xae\x71\x6e\x18\x85\xe2\x01\x7c\xde\x9e\x18\x34\xda\x06\xd5\xfd\xf5\x85\x52\xfc\x60\x74\x07\xf0\xef\xdd\x9a\x1f\xab\xff\x3b\xa7\x6e\xaa\xe2\x33\x22\x1e\x40\xd7\x02\xc1\x5d\xf0\x03\xc7\x0f\xa8\xc3\x70\x48\xaa\x43\x8a\x9c\x43\xfb\xe9\xdd\xe6\x9d\x73\x78\x21\x3f\xaa\x4f\xef\xd6\xcb\xb0\x5f\xcb\x13\x9f\xa2\xc3\xe9\x62\xc5\xff\x5b\x91\xe4\x9f\xde\x91\x76\x75\xae\x45\xb8\xdc\x39\xab\xe5\xe6\x61\xb9\xfe\x71\xe3\x6c\x96\xe1\xe0\x05\xc8\xc8\x77\xcb\x80\xa0\x5f\x6e\xde\x8d\x6e\x4a\xcf\x64\xcf\x37\x69\xc5\x3f\x72\x14\x86\xea\x9c\x32\x0e\xc3\x7d\x37\x69\xa6\x7e\x1e\x10\xac\xcd\xb4\x48\xcc\x30\x6a\x14\xb1\x18\x6e\xec\x7c\xad\x68\xcc\xc0\xa4\x32\x1e\xa3\x63\xf3\xd7\x17\x91\x19\x4d\x95\xe4\xb7\x9e\x61\xab\xfe\x3b\x2a\x73\x99\xa8\xcc\x7f\x3d\x3b\xfc\x55\x02\x3a\xa2\xc5\x54\x0d\x8d\xab\x9a\x4c\x39\x26\xc2\xac\x5c\x2c\xc3\x3a\x1a\x08\x3e\xb0\x20\x2c\xa3\x27\x70\x62\x5e\xb4\x59\x81\xeb\x03\x3c\x06\x7a\x96\x20\xaf\x15\xe8\x61\x50\x4f\x0c\xf5\x18\x20\xa7\xf4\xc9\x1c\xce\x2c\xdc\x6f\x4b\x0c\xfa\x31\x30\x99\xe1\x57\x08\xf9\x4c\xc4\x04\x5f\xdf\x5d\x6f\xbc\x4d\xac\xbc\x1d\xd6\x7f\x9d\xde\xbc\x73\xc3\x3e\x93\xf0\xd8\x04\x7e\xec\xad\x90\xb9\x5d\xaf\x16\xfa\x39\x03\xeb\x7c\x7d\x64\x62\x2d\xb2\xee\x9b\xe3\x2c\x3a\x98\xd7\x64\x6a\x46\x08\xc8\x0c\x79\xb1\x99\x8c\x18\x64\xe5\x29\x23\xcb\xf3\x6c\xc7\x14\xd3\xad\x8a\x67\xe1\x4c\x1b\x50\x3e\xf9\x2c\x92\xcc\xa6\x74\x08\x0d\x38\x24\x0d\xbc\x45\x1d\x6e\x37\xe3\x55\x2c\x16\x1f\x23\x60\x4d\xf3\x21\x01\x68\x9b\xa3\x3e\x5c\xc5\x3e\x63\x1d\x1d\x3e\x0b\xdf\xfe\xf6\x58\x37\xc9\xf1\x85\x8c\x1e\x94\x37\xc2\x57\xf0\x58\xef\x17\xa9\x4d\xd2\x71\xc8\xd9\x2d\xb3\x7b\xad\x58\xa7\x0a\x6a\x65\x98\x2d\xbf\x49\x52\x10\xee\x0d\x89\xc7\xe4\x80\x1b\x77\x4c\xc3\xc4\xf7\xdd\xb2\x24\x8e\x53\x64\x43\x4f\x3c\xcb\xad\xa3\x0c\xa0\xea\x6e\xb2\x90\x1e\x5c\xc8\x5f\xb9\x75\x6f\x8f\x5f\xe4\x5e\xc9\xe0\x38\x74\x7e\xfd\x0a\x2f\x77\x09\x74\x36\x51\xdb\x54\xf6\xf4\xa1\xf2\xc8\x2a\xc3\x63\x8e\x4e\x51\xf7\xb6\x3c\xf7\x14\x7d\xfd\x50\x25\xf9\xe7\xb1\x50\x3e\xb3\x28\x9f\x5a\x1c\xa3\xe3\x9a\x47\x34\xa1\x9e\x15\x94\xf6\xca\x62\x37\xf2\xe5\x72\x46\x53\x35\x1c\x3b\xdb\xbd\x6f\x72\x61\x6a\x91\xf4\x1f\xbc\x0f\x09\xdc\x41\x20\x97\x79\x64\x11\x68\x06\x69\x7f\x19\xe9\xb1\x46\x55\xef\x44\x0a\xb7\x91\x54\x9f\x6a\xc5\x17\xb8\xd4\xfe\x7a\xc4\x78\xf7\x52\xac\x31\xfd\x22\xa9\xe5\x35\x02\xf0\x1a\xa7\xfa\xfe\xa6\xd0\x14\xf8\x8e\xe7\xb5\xef\x80\x0e\x6a\x64\xba\xfa\xb9\x6f\x72\xc3\x6b\x88\x44\x8d\x62\x74\x28\xaa\x88\x43\x32\xc2\xf7\xf1\x85\x7d\x83\xd7\x1e\x43\x28\xe1\xb5\xee\x68\x62\xb4\xcc\xdd\x40\x4c\x71\x38\x5c\xfe\x77\xee\xce\x9f\xb7\xdc\x84\x1c\x67\x64\xb1\xdd\x57\xbe\x21\x7f\x0e\xa8\xa8\xa8\x0e\x8f\x55\x8d\x9b\x5c\x16\x09\xbb\x88\x8a\x78\xb2\xf7\xf9\x31\x41\x69\x5c\x23\xe6\x60\x7b\x34\x4a\x99\x02\xbb\xe8\x09\xe5\x4d\x2d\x8b\x68\x78\x7a\xd1\xf6\x59\x0d\xcf\xdb\xee\xe1\x4b\xb0\xc3\x17\x09\xf9\xb4\x67\x26\xbe\xf1\xbc\xcd\x6d\x7c\x0b\x93\xd8\x04\x87\x03\x48\x82\xe9\xea\xbe\x6c\x09\x5c\xef\x3d\x8f\xac\x49\x57\x56\xbb\x85\xe3\xaf\x47\x65\xe1\x75\x65\xe0\x8b\xd7\x99\xa1\x09\xbc\xee\x5c\xaa\x2f\xb4\x9a\x77\x47\x9f\xdc\x71\xec\x41\x96\xe3\x2b\x3d\xf5\x43\xb7\xa5\xc9\xb5\xb5\x2a\xca\xb8\x78\xc6\x13\xec\xe9\x94\xa2\x29\xbd\x31\xca\x5c\x68\x5b\x78\xd8\xcf\x6f\x1b\xa4\x29\x56\x2d\xa4\x80\x76\xed\xe4\x23\x97\x67\xe8\xcc\xf8\xdc\xa6\xad\xe4\x98\x8b\xcd\x82\xe4\x84\xfb\x2c\x1c\xfa\x89\x63\x34\x8c\x36\xc1\x66\x07\x11\x09\xd7\xe1\x7e\x13\x28\x88\xb0\xb2\x1f\x4a\x27\x8e\x53\x0b\xd2\x26\x99\xfb\x2b\x6c\xd5\x3b\xc9\x6b\x85\x2e\x0e\xd5\xb1\x25\x93\x07\xeb\xcc\x6e\x99\x30\x5c\x2d\x81\x14\x03\x96\x69\xf3\xcc\x21\xcb\x89\x9f\x7f\x32\x09\x85\x61\xb8\x3f\xa3\x85\xb0\xe2\x9c\x31\x6c\x95\xad\xb5\x1f\xb8\x46\x25\xa2\x0f\xb0\xda\x8a\x8f\x3b\x0c\xa4\x3b\xc3\xc4\x20\x9f\x38\x6a\x03\x7f\xb7\x5b\x81\x43\xc7\x47\x5b\xb4\x5a\x83\x24\x38\xd1\x77\x65\x13\x47\xac\x05\x59\x93\xb0\xb7\xc1\xc2\xf1\x77\xde\xc2\xb9\xdd\xaa\x45\x2d\x8d\x56\xda\x82\xc9\x63\x75\x56\x57\x4c\x19\xa9\x36\x20\xaa\x71\xda\xb7\x75\xe6\x28\xe5\x44\xce\x77\xc6\x61\xbb\x5e\x79\xb3\xdb\x06\x29\xca\x39\x23\x14\x6e\xa7\xfd\xf8\xd4\xab\x0c\x79\x90\xd7\x5a\x66\xdb\x28\xd8\xc3\x0a\xdc\x7f\xe1\x31\x4f\x1c\x97\xfe\x6a\xb7\xbe\xdd\x80\xf8\xfd\x6d\xb4\xdb\xcb\xf8\x59\x59\xe3\x82\x89\x23\xd2\x82\xa0\x49\xbc\x21\x36\x7c\xdb\xcd\xc2\xf1\x6f\x43\x85\x7c\xc5\xf1\x48\x38\x9f\x3c\x18\xa7\x0b\x7f\xc2\x48\x34\xd7\x57\x0c\xc3\xae\x7d\x73\xc7\x20\x2b\x64\xbe\x49\xde\xd6\xdb\x1e\xe7\x35\x49\x52\x8a\x33\x46\x1f\xd4\x3c\xfb\xa1\x67\xd0\x8d\xfe\xe1\x65\xfb\x34\x07\xdf\x1c\x8f\x07\xdf\xdb\x7e\x04\xdf\x66\xa6\x5f\x24\xfc\x93\x93\x29\x7c\x83\xbc\x68\xe7\x81\x2f\x5f\xc6\xab\x5b\xe4\x79\x20\x15\x56\xea\xb4\x0c\x1a\x8d\x67\x53\x36\x6f\x0f\x61\x83\xb7\x25\xf1\x0a\xb5\xd0\xc5\x31\xd9\xb7\x02\x1e\x96\x17\xe8\x94\x09\x83\xd3\x0a\x44\x31\x3e\x87\xe6\xea\x86\xa8\xbe\x79\x9c\xe4\xb9\xe6\x1d\x36\xb7\xa1\x42\x1b\x26\x0f\xd4\x29\x8d\x84\xc7\xaa\xa2\xa9\xf6\xc3\xd5\xa0\x39\xf4\x35\x6e\x5b\xe3\xc6\xed\x67\xea\xb6\x62\x47\xdc\x13\xa7\xcb\xc3\x2e\x58\xad\x56\x10\x85\x7d\x1c\xf8\xc2\x12\x86\x52\x60\x45\xde\x15\x4d\x9c\x32\x2d\x88\x9a\xe5\x1c\x2e\x9c\xdd\x4a\xb1\x22\xa1\x5c\x09\xe3\x93\xb2\x3f\x79\xd6\x9c\xd3\x0b\x13\x86\xa6\x0d\x84\x62\x64\xf6\xed\x9c\x39\x77\x72\xd2\xe6\xfb\x21\xf0\x8f\x41\x3c\xb7\x61\x80\x86\x9c\x31\x26\xe1\x46\x4e\x19\x92\x3a\x55\xe9\xde\x5a\x9e\x62\xa9\x77\xc7\xdb\x63\x04\x5a\xea\xfe\x8b\x80\x7d\xc6\xe4\x19\xa0\x0d\x02\x69\xc4\x11\xf2\x50\x08\xd0\x60\x45\x4e\x4a\x66\x4c\x9c\x66\xaa\x46\x59\xfb\x9b\x85\x13\xf8\x5b\xfc\xcf\xad\x4a\xda\xe2\xb8\xec\x1a\x30\x6b\xd6\x9c\xde\x17\x13\x06\xa6\x05\x80\x62\x5c\xd2\x66\x9e\x31\x5f\xb2\x02\x17\xd6\x30\xf1\x6d\x7c\x9c\xd9\x30\x59\x4b\xce\x18\x97\x60\x23\x27\x0c\x4b\x83\xaa\xcc\x7b\xa1\x1c\xb8\x0c\xc9\xbd\x5d\xde\x63\x9e\x1a\xed\x59\x05\xdb\x00\xf6\x32\xe2\xc0\x0f\xd6\x32\x7e\xde\x04\x56\x9f\xa7\xc6\x79\xcc\x04\x4d\x02\xde\x05\x0b\x67\xb7\x5b\x38\xb7\x2b\x85\x74\xe5\xf9\xb1\xfa\x3c\x7d\x76\x9c\x2e\xfa\x49\x73\xa3\xa9\xbe\x72\x66\xc4\xed\x9b\xeb\x53\xb2\x22\x16\xdc\x64\x3f\xf2\xe3\x79\x4d\x92\x54\xe2\xac\x39\x51\x6e\x9e\xfd\xd0\xd3\x6a\x06\xdd\xd1\x85\x77\x33\x27\x6d\x93\x09\x98\x26\x6f\x5d\x9e\x41\x8a\x15\xb5\xf0\x6d\x69\x2d\x26\x61\xbb\x5a\x2f\x27\x71\x30\x89\x1c\xc1\xe3\x8a\x6d\xa4\xe1\xb8\x84\xba\xb1\x13\xc6\xd3\x24\x50\xc5\xd0\x92\x1a\x3e\x7b\x5b\xf2\x8c\x0e\x9e\x3c\xe0\xe6\xb4\x1c\x1e\x7b\x86\xf6\xdf\xbd\xb2\x7e\x29\x76\x2d\x27\xed\x81\x49\xb8\x26\x8e\xc5\x33\x89\x41\xfd\x00\x6e\x59\x1a\x76\x89\xbc\xdd\xc2\xf1\xf1\x8a\xc1\x0f\xac\x24\xa6\x1a\x93\xa6\xad\x47\xb6\xb9\x93\x47\xe5\xac\xfd\xc6\x89\xc0\x86\x91\x79\xfe\xfe\xe3\x99\x1d\x3e\x7b\x74\xbe\xc6\x7e\xa4\x51\x0a\x77\xaf\xaf\x71\xd0\xfe\xe4\xa4\x9d\x2f\x01\xd3\xd4\xe5\xe9\x39\xa4\xc0\x7e\x90\x37\x27\x27\xbd\xaa\xa0\x97\x93\x72\x5c\x6a\x37\x19\xd9\x46\x4e\x1f\x95\xd3\x77\x16\x27\x81\x9a\x46\xe4\x99\x3b\x8d\x67\x75\xf0\xfc\xd1\x78\xf6\xce\xa3\xa1\xfd\x77\xaf\xac\x5f\xf2\x4e\xe4\xa4\x1d\x2f\x16\xcd\xd4\x6d\xc7\xd9\x74\x20\xc1\x8b\xdb\x90\x06\x4f\x7a\x85\x65\x43\xb6\x68\xd7\x06\xe1\xa8\x46\x9e\x66\x3b\x91\x6d\xd9\xe4\x61\x37\x75\x0f\xd1\x1e\xce\x30\xe0\xce\xdb\x53\x9c\xdd\x99\xb3\x87\xda\x99\x7b\x8c\xba\x66\xdf\xbd\xb6\x22\x81\x7b\x8e\x93\x36\xb0\x04\x4c\xd3\x03\xa4\x67\x51\x83\xe4\x0f\xec\x36\x1a\x64\x85\x17\xed\x3e\xf6\xa0\xb7\x66\x51\xa9\x86\x9d\x7e\xc7\x90\x6d\xe4\xe4\x91\x37\x63\x8f\x70\x12\xa8\x61\xfc\xbd\xc2\x9e\xe1\x59\x7d\x3c\x7b\x20\x9e\xbf\x87\x68\x10\xc1\xdd\x2b\xab\x18\xb4\xa5\x38\x69\xc7\x8a\x47\x34\x71\xde\x3b\x87\x12\x24\x7e\x79\x3f\x71\xd2\x45\x4e\xad\x8c\x54\xa3\x50\xbb\x2f\xc8\x36\x70\xf2\x20\x9c\xbe\x19\x38\x05\xd2\x30\x04\xcf\xdc\x1c\x3c\xa7\x67\x67\x8f\xbe\xb3\x37\x0b\xf5\x8d\xbf\x7b\x65\xbd\x02\x36\x0f\x27\x6d\x49\x71\x78\x66\xcc\x82\xf3\x69\x41\xc2\x97\xb6\x0d\x0d\x22\x5a\xef\x16\x4e\xb0\xbe\x5d\x38\x41\xe8\x99\x84\xa4\x1a\x7b\xba\xbd\x3f\xb6\x79\x93\x87\xde\xe4\xdd\xbe\x09\x80\x86\x81\x77\xf6\xee\xdf\x19\xfd\x3a\x7b\xe4\x9d\xbb\x1b\xa8\x6d\xfc\xdd\xab\x2b\x95\xbc\x3b\x38\x69\x1f\x8a\x45\x33\x71\xc6\x9b\x4f\x07\x36\x78\xfc\xd6\xa0\xe1\x30\x60\xb0\x70\xc2\xdd\xc2\xd9\xac\x0d\xa2\x51\x4f\x75\xca\x2d\x3e\xb6\x5d\x33\x26\xba\x69\xfb\x7a\xf6\x70\xc6\x49\xee\x8c\x7d\xbe\xf9\x5d\x79\xc6\x04\x77\xd6\xbe\x9f\xae\xd9\x77\xaf\xa3\x46\x69\x92\xd3\x91\xa5\xbd\x83\xcc\xec\xde\x18\x2f\x8f\x12\x9c\xd0\x30\xf3\xbc\x70\xb3\x5f\xc1\x48\x1e\xf3\x18\x55\xb8\xb1\x32\x26\xfe\x14\x43\xce\x0d\xa0\x29\x78\xa4\x73\x28\xf9\x38\x70\x94\x3b\x02\xc6\x6b\xa0\xe9\x89\xe2\x23\x4f\x15\xd0\xcc\xc9\xe3\x2d\xd2\x8b\x67\x1e\xeb\x8e\xfc\x67\x1c\x13\x5d\x52\x6e\x88\x89\x4b\xe6\x67\xc3\xf4\xc9\x95\xf6\x49\xd9\x1c\x47\xa8\xef\x1d\x11\x05\xff\xd2\x2e\xfb\x10\x2c\x97\x8b\xb3\x7e\xdc\x67\x49\x73\xff\xe6\xe7\x11\x5e\x4c\xd7\x59\xa1\x1a\xe9\x6b\xec\x1f\x9b\xa6\xc8\xb9\x2a\xca\xd7\x55\x96\xc7\x28\xa6\x76\x87\xbd\x8a\x4d\x2f\x2d\xd3\x0b\xdf\x58\x82\x51\x35\x33\xdf\xef\x80\xdf\x98\xe7\x37\x8a\x51\x67\x52\xb0\xe1\xb8\x11\x6f\x4f\xb3\xa9\x1f\xd3\xa8\xac\xe5\xba\xe2\x93\xc1\x5c\xf5\x21\xee\xa3\x78\x34\xa2\x57\x10\x8f\xcb\x6e\x7d\xe7\x3c\x24\x71\x8c\x72\xe9\xc6\x7d\x57\x1d\x2b\x30\xbd\x10\x3f\x4f\x3a\x22\x73\x26\x19\x8d\xf5\x97\xa4\x33\xb9\x7e\xf5\x3e\x02\x29\xf5\x78\x8c\x1d\xd0\xeb\x71\xcd\x72\x61\xe2\x1d\x5b\x7d\xf2\x02\x0a\xf9\x8d\xbc\xab\xd1\xff\x81\x27\x83\xfe\xf7\x14\x1d\x1b\x4d\x4f\x8d\xb8\xa4\x89\xf3\xf9\x21\x69\x90\x5b\x97\x51\x97\x77\x96\xbe\x4d\x03\x02\xdc\xdd\x45\xc7\xa6\x37\xea\xea\xc7\x2c\xf8\x77\x3e\x96\x41\xd8\xbf\x84\x2d\x3e\x53\xc1\x7e\x1b\x5e\xe1\xb8\x7f\x73\xff\x86\x35\x36\x7d\x96\x3b\x94\x75\x8f\x46\x70\x86\x68\x48\x8e\xd6\x7f\x55\x65\xdd\xe4\x9f\xe6\xa0\x85\x3d\x87\x2a\x68\x58\x08\x28\x2b\x9b\x17\x4e\x14\x8a\x74\x6c\x03\x60\x86\xf2\xc7\x73\xdf\xf7\xf6\x3d\x3a\x23\xcb\x4f\x7c\x1f\xd3\x22\x6a\xee\x08\x58\x27\xff\xf1\xcd\x27\xdf\xeb\xed\xb9\x38\x11\xb1\x49\xe6\x70\xa1\x4f\x67\x06\x4d\xa2\x54\xc3\x7b\x24\x03\xfd\x34\xa9\x1b\xb7\x6e\x5e\x52\xa4\x7d\x1e\xe4\x9c\xa4\xed\xfd\x81\x0a\xfa\xbf\xa5\x1f\x5a\xbd\x1e\xce\xf5\x88\x3b\x8e\x99\x4a\x18\xfc\xda\x9e\xec\xb4\x8e\x03\xf4\x18\x28\x36\x29\xa7\xe9\x15\x2e\x1e\x6f\x9d\x31\x2c\xc9\x4c\xf1\x8a\xf1\x05\x46\xc0\xf0\x26\x70\x27\xf0\x37\x9a\x18\x80\xc9\xed\x66\xa7\x62\x32\x8b\xcf\x64\x32\x8b\x5f\x89\xc9\xdb\xdb\x40\xc5\x64\x7a\x3a\x93\xc9\xf4\xf4\x4a\x4c\xfa\x81\xe7\xa9\xb8\x6c\xd3\x33\xb9\x6c\xd3\x39\x5c\xd2\x29\xc5\x81\xec\x13\x31\x44\x03\xc4\x90\x3b\x16\xcc\x7c\x00\x66\x59\x5e\xfa\xf2\x88\xe3\x68\x7d\xf5\x99\xe4\xcc\xf9\x03\x9e\x88\xec\x67\x12\x48\x18\x93\x66\x94\xae\xc7\x95\x9d\xd7\xb5\x0f\x36\x68\xe6\x7e\xec\xdb\x01\xf4\xa2\x48\xf7\x57\xb4\x24\x50\x75\x1a\x37\x1e\xd4\x1d\xa9\x02\x97\x3a\xd5\x46\x1e\x67\xf5\x25\x20\x53\x49\x40\x1c\x02\x62\x3f\xec\x74\x41\x58\x5e\x0c\xaa\x61\xce\x3c\x0b\x28\x83\x40\xf7\xfa\xba\x30\x8b\x15\xce\xc3\xd1\xc0\xb2\x0f\xb5\x1a\xdb\xc1\x3c\x75\x77\x55\xa5\x86\x0d\x91\x59\xbd\x4d\xad\x9f\xa4\xc0\x16\x02\xd4\x2b\xf0\xa0\xb6\x7f\x69\xdd\x32\x8d\x0e\x28\x43\x79\xf3\xbf\x3f\xdd\xbf\x69\x8a\xf2\xfe\xcd\xcf\x0b\x47\x5f\x8b\x08\xc3\xa2\x5e\x27\x16\x8b\x8a\xb8\x41\x43\x76\x70\xd1\x8a\xf6\xc2\xe5\xf2\xae\x0f\xe8\xe2\xe4\x29\x89\x7b\x99\xf1\x8e\xf1\xb8\xcc\x66\xd6\xde\xa0\xb7\xcc\x2a\xc3\xb8\xdc\xfd\x06\xdd\xa2\x03\x3a\xca\x34\x93\x06\x65\x96\xd1\x16\x20\x0c\xe4\x8f\x61\xa0\x43\x8a\xa2\xea\x0e\xb7\xf0\x61\xf6\x83\x84\x49\xfe\x80\xaa\xa4\x53\x56\xd8\xab\x9c\xf2\x4a\xa0\x07\xb7\xb6\x8b\x2b\xb2\xdd\x48\x4a\x81\xeb\x36\xfe\xc6\xdf\xf9\x7b\x6d\xc8\x12\xbe\x17\xa7\x91\xf5\x72\x08\x6b\xf3\xe4\xbb\x62\x38\x12\x3d\x89\xb8\x70\x16\x9e\x27\xce\x04\x30\x79\xf2\x70\x14\x33\x8a\xf7\xe1\x5e\x1b\xc5\xb4\x8d\xfd\x73\x43\xa6\x8b\x50\xeb\x5e\xa6\x1f\xaa\x3f\xa0\x28\x96\xac\xb0\x94\x12\x7f\x0c\x8e\x4a\x69\xa8\x78\xb7\x5d\x15\xab\x04\xc2\xb6\x56\x51\x0d\x2c\x3b\x77\x7c\xa0\x56\xcf\xa1\x3c\x64\xc4\xd1\x30\xc6\x33\xfb\x57\x6b\x99\x90\x6c\x6f\x06\xb5\xe1\xb4\xd9\x19\xee\x95\x0f\x80\x0a\x3c\xd1\xb0\xb0\x82\x35\x2e\x66\x0c\x73\x38\xbe\x8a\xec\x3b\xfe\x68\x19\xa5\x22\x98\x2e\x1d\xbc\x3a\xea\xec\xbe\xc1\x18\xfc\x50\x63\x64\x37\x07\xb8\x0f\xdc\x06\x14\xfb\x85\xd9\x62\x52\x73\x31\x6c\xc7\xa8\xab\x58\xa0\x59\xb2\x76\x41\xd1\x9a\xa6\x28\xd2\x7d\x54\xcd\x7f\x7c\x1c\xeb\xf6\x9d\xf0\xf0\xb8\x50\x26\x3c\x83\x5b\x37\x51\xd5\x19\x5b\xe9\x0d\xdc\xee\xa1\x5f\xfa\x5d\x66\x92\x7d\x95\x99\x8b\xa2\xea\xbb\x9d\xec\x80\x1d\x93\xaa\x6e\xdc\xc3\x43\x92\xc6\x37\x0b\xa0\x56\xf7\x87\x5c\x17\x58\x84\xb8\x3e\x93\xa5\x0d\xa6\x96\x46\x03\x02\xba\xe3\xc6\x2f\x52\x8c\x2c\x30\x08\xb8\x81\x31\xce\xd0\xdd\x52\x6c\x0c\x36\xc9\xeb\x30\xa0\xc6\x45\x24\xa4\xe0\x0f\x0b\x4b\xcb\x9e\x54\x01\x8c\x78\xba\x75\x99\x26\x0d\x98\x35\xca\x5b\x86\x9b\x71\xf3\x4a\x78\x98\x9a\xf9\xa6\xc1\x4b\x97\x9a\x0b\xb5\x7f\x0c\xd6\x83\x5d\x27\xae\xea\xbc\xd5\x6b\x8f\x82\x5d\xc3\x0a\x4b\x7d\x61\xeb\xcd\xf9\x5e\x81\x44\xb1\x27\xa7\xaa\xae\x90\xf0\x6a\xab\x14\xf0\xf0\x89\xdd\x8e\xb4\x63\x67\xdc\xa7\x9c\xc8\x8e\x9a\x1b\x99\x19\x68\xea\x1b\x6c\x51\x9c\x54\xe8\x30\xbc\xc4\xfc\x98\xe5\xa3\xf9\x82\x3f\x89\x6f\x80\x8f\x66\x8c\x7b\x00\x9c\x33\x61\xba\x27\xc0\xd5\x0f\x80\x2b\x5b\x60\x31\x7d\x02\xc6\x51\xda\xef\x84\x27\x14\xbd\x0d\x80\xe9\x18\xcc\x25\xf1\x23\x60\x6b\x09\x93\x9f\x66\x36\x75\x3c\x19\xec\xa7\xd2\x40\x5a\xda\xa8\x8b\x8b\x71\xb2\x4d\x85\x67\x04\x91\x5b\xba\xf5\x06\x29\x12\xf7\x89\x33\xfc\x5c\x9f\xb2\x6b\x62\x2d\x76\x87\xdf\x01\x8f\xe2\xa4\xc0\x1e\xb0\x2d\x00\x49\x1d\xb0\x2f\x5a\x3d\x0c\xcf\xe7\x54\x8a\x1a\x68\x86\xbc\x76\xef\xac\xdb\x32\xc2\xf6\x82\xd9\x10\xba\x31\x9f\xdd\x90\x56\x32\x36\x6b\xf2\x0b\x2c\xc9\x06\x63\x56\xa1\xe6\xf0\x20\x9b\x33\xf6\x03\x64\x4f\xd8\x76\xfc\xc0\x67\xe0\x58\xe8\x3f\x8f\x09\x3a\x80\x8a\x5c\x82\x0d\xf5\xf7\x63\xd2\xef\x23\x9f\xe9\x30\x8c\x8d\x7b\x2b\x6e\x62\x7a\x1f\xb5\xda\xaf\x69\x21\x9e\xdb\x26\x08\x04\x57\x37\xb5\x5b\x51\x1f\xcb\xc1\x5a\xdc\x13\xd9\xe2\x01\xa7\x30\x08\x42\x2a\x58\xe5\x33\xaa\x98\x39\x94\xea\x5b\x6a\x8c\x04\xa0\xe7\x87\x28\x98\x35\x37\x7d\xed\x29\xda\xfb\x3d\xa0\xcc\x6a\x6f\x43\x23\xed\xd1\x69\xd4\xb5\xdc\x54\x8b\x30\x01\x64\xd7\x32\xe5\xc6\x1a\xdc\xcb\x95\x8a\x57\x2b\x02\x3c\xae\xb5\x55\xbb\xc1\x19\x57\x2b\x03\xc5\xaa\xe5\x15\x7c\x17\x93\x99\x9a\x63\xce\xa7\xa5\xea\x52\x73\x20\x2f\x8c\x80\x14\x69\x67\x63\xe0\xbc\x9f\x57\xf1\x56\x4d\xfc\x70\x1d\x69\xc8\xdd\xf6\x4a\x7d\xdb\x2d\x4e\x1f\xc6\x94\x74\x49\x91\xdf\xc0\x8a\xc9\x48\x6b\x61\x89\x04\x50\xd6\xf9\x58\x66\xf6\xfc\x6b\xa1\xbd\xa8\x3a\x08\xfc\xc9\x1d\xd0\x3c\xb8\x23\x7b\xef\xb1\xb3\xb9\x12\xe5\x07\xe0\x10\xe4\x7f\x16\x92\x4e\x4e\x10\x0a\x73\x1f\xbc\x12\xd6\x8b\x76\x81\x5b\x56\xa8\x44\x79\x2c\xb0\xee\x46\x25\x2e\x9d\x68\xf4\x94\xd8\x07\x77\x05\x20\x61\x0c\x1a\x0f\xd3\x49\x60\x24\x01\xce\x8e\x2c\x21\x70\x9a\x5a\x19\xf1\xd2\xc3\xc5\x0b\x43\x15\xf6\x1b\xb0\x30\x1e\xeb\x8b\x15\xcf\x06\x36\x88\xd7\xaa\x86\x89\x81\xbe\xfa\x1c\xe6\x75\xb0\xa2\x87\xaa\x5f\x36\x0d\x72\x00\x42\x6b\x4a\x18\x56\x9b\xed\xa8\x00\xfb\x3a\x17\x98\xf2\x4d\x39\xcb\x4c\xfb\x58\xfc\x7d\x00\x71\xc3\x15\x3c\x84\x3f\xa4\x06\xb9\x0d\xbd\x70\xab\x4b\x0b\x67\xbf\x09\x3b\x6e\x7a\x42\xa7\x2d\xbf\x39\xa0\x78\x1d\x47\x36\x27\x2c\xa5\x1e\x50\x46\x04\xf4\x35\x25\xef\x5f\x3c\xa6\x22\x93\xeb\x22\x9a\xd2\xfc\x8f\x71\x47\x15\x8a\xc4\x19\x83\xd6\x07\x12\x49\xf6\x02\x27\x29\xdb\xfd\x65\x97\xb1\x1d\x77\x94\xf3\xbd\x13\x94\xed\x8d\x25\x75\x0b\x7a\x70\x15\x68\xac\xfc\x60\x1e\xa1\x32\x30\x1d\x34\xb3\x60\x19\xc2\x80\xe1\xd1\xd1\xba\xe6\xdd\x17\x96\x83\x2e\xc0\x6e\xdf\xff\x5d\x7d\xdb\xfe\xa7\x6d\xd0\x68\x80\x4c\xdf\x82\x22\x5c\x65\xa6\x06\xc8\xc0\xf6\x1a\xa0\x25\x0c\x68\x80\x8e\xd6\xb5\x2f\x1e\x4d\x1c\x65\xca\x8e\x17\xf6\x3a\x7c\x61\x47\x43\x70\x83\xac\x65\x35\xbf\x47\x95\x3e\x80\x2c\x77\x55\xd0\xfd\x95\x31\x1a\x18\x06\x16\xcc\x10\x62\x70\xdd\x0c\xf2\x7b\x26\x42\x03\xbb\x0a\x74\x23\xaa\xe9\x7b\x23\x53\xb1\x8b\x1c\xca\x52\xbf\x98\x1f\xaf\x1c\xbc\x0b\xdb\xba\x13\xc5\x4b\x15\x5f\xb9\xd9\x72\x0e\xf8\x4c\x56\x18\x34\xda\xfd\xa3\xe9\xa8\xe0\x8e\xbd\x48\xcc\x0b\x4a\x99\x6c\x72\xc5\xfc\x8f\x8a\x23\x4f\x59\x92\xb3\xe6\x17\xde\xec\x65\x3e\xf4\x09\x86\xcb\x2a\xc9\x9b\x6e\x3d\xe9\x46\xf1\xdf\x1e\xeb\xe6\xce\x41\x6d\x74\x68\xc6\x45\x2b\x50\xae\x83\x82\x1a\xa7\x4e\xd5\x3f\xe5\xb8\x14\xef\x74\xf8\xac\x91\x97\xc8\x0d\x99\xb3\x15\xfb\x4f\xe0\x6d\x2d\xd7\xe7\xb6\x34\x7a\x59\x8d\x72\x1d\x57\x3d\xd0\x5d\x4d\x80\x87\x3b\xb2\x22\x46\x31\x13\x01\xe6\x52\x51\xf3\x07\x16\xa4\x2b\x56\x8a\x17\x77\x6d\xce\x20\x82\xdc\x88\xd1\x68\x0d\x2f\xb3\x93\x04\xab\x09\x77\x63\x89\x4a\xe4\xc6\x96\x0d\x4e\x04\x3b\x6f\x1f\x9b\x1a\x29\x5c\xdc\xa7\x87\xb9\xe6\x75\x00\x90\x8e\x63\x15\x6f\xe1\xee\x19\xbe\xa8\x79\xfb\x4b\xcf\xd6\xcf\x2a\x7e\x16\x0e\xdc\xa8\xe1\xac\xe8\xff\xd1\xe5\x34\x57\xbc\xff\x3a\x8f\x95\x5e\x34\x73\x59\x12\x3a\xd2\x78\x64\x57\xdd\x2c\x85\x55\x04\xbd\x74\xf1\x4c\x65\x53\x94\x5a\x0a\x3c\x97\xba\x9b\x9e\x6c\x42\xf2\x3e\x8a\x31\x1a\x54\xcd\x49\x6e\xc9\x8e\x0c\xd6\x59\x75\xbe\x17\xb8\x6e\xa0\xb9\x88\x29\x7b\xfe\xc3\x19\x62\x5d\xbb\x99\xe8\xe6\x75\x9b\xad\x6b\xdd\x9d\x13\x7a\x6f\x9d\x0f\xe4\x5f\xfc\xff\x79\xe1\xe2\x89\x3a\x92\x67\x16\x1a\x6a\x98\x60\x44\x54\xd1\x0f\x13\x46\x4b\x4b\xce\x46\x8b\xc7\xde\x4a\xb2\xe8\x84\xee\x9c\xc7\x2a\x7d\x7f\xff\x26\x8e\x9a\xe8\x8e\x94\x7c\xa8\x9f\x4e\xdf\xb7\x59\xba\x78\xbb\x3a\xd4\x4f\x27\xa7\xcd\xd2\xbc\xfe\xf4\xee\xa1\x69\xca\xbb\x0f\x1f\x9e\x9f\x9f\x97\xcf\xab\x65\x51\x9d\x3e\x04\x9e\xe7\xe1\xca\xef\x3a\xb9\x7e\x7a\xb7\x7b\x47\x25\x4a\x7e\x7d\x4a\xd0\xf3\xef\x8a\xf6\xd3\x3b\x6c\xa1\x77\xce\xee\xdd\xdb\x15\x7a\xbb\x3a\x94\x51\xf3\xe0\x1c\x93\x34\xfd\xf4\xee\x6d\xb0\x3a\x1e\x8f\xef\x9c\xf8\xd3\xbb\x3f\x6e\x96\xe1\x66\xbd\xdc\x86\xa9\xbb\x5a\x86\xb7\xce\x6a\xb9\xf1\x03\xdc\x9b\xab\x1d\xfe\x37\xfc\xd1\x73\xd6\xcb\x60\x93\x06\xcb\xdb\xed\xda\x09\x96\xb7\xb7\x3f\xee\x9c\x60\xe9\xdf\xae\x7e\x79\xf7\xa1\x43\x8c\x59\x79\xbb\x42\xf7\x6f\x6e\x26\x8a\x0f\x4f\xb1\x0d\xaa\xb2\x24\x8f\x1a\x34\xcb\xf6\xcf\x9a\xfe\x5e\x85\xa9\x2b\xf5\xec\x7a\xec\xd9\xb5\xd0\xb3\x6b\x67\xcd\xf6\x6c\xdd\x54\xc5\x67\xc4\xf7\xad\xe7\x04\x0f\xeb\xb3\xbb\xa9\x37\xea\xd3\x16\x2e\x72\x7f\x18\xde\xce\x9f\xc8\xcc\x1c\xe5\x99\xc9\x12\x09\x76\xce\x30\x2a\x21\x73\xb8\x47\x8b\xea\xd7\x65\x4d\xfc\x60\x54\x3a\xfc\xfb\xa0\x75\xee\xda\x71\xd7\x8c\x45\x39\x24\xd5\x21\x45\x4e\xf5\xe9\xdd\xea\x1d\x6f\x59\x8c\x2a\xa7\x93\xc3\x75\xf5\xad\x7e\x4e\x9a\xc3\x03\x1f\x36\xea\xe6\xb4\x00\x9e\x13\x28\x80\x05\x4b\x74\x6a\x0c\x98\xd9\xb2\x9f\x08\xd9\xc3\xb7\xc2\x8c\x1f\xa5\x29\x1c\x29\x9b\xce\x0c\xa3\x30\x64\xde\x26\x71\xd0\x3e\x82\x37\x04\x40\x7b\x46\xc9\xd7\x9e\x5b\xf6\x33\x65\xba\x8b\xa2\xe2\x6f\xae\xb3\xee\xbf\xf1\x21\x56\xe1\x23\x60\x93\x99\xab\x4c\xaa\x06\xf2\x0f\xa9\x88\x38\xe8\x9b\x3c\x28\xaa\x91\x9b\x90\x87\xb5\x16\xdc\xac\x00\x7f\xef\x1d\x17\xe8\x6b\xef\xf7\x12\xaa\xc7\xa2\xca\xe4\x4a\x12\x57\x9a\xba\x8b\x8b\xb3\xfc\xeb\xe2\xc6\x56\x80\x73\x1e\xda\x99\xa8\xe4\xc6\xe7\x83\xb4\xf8\xce\xb2\xc2\xe2\x0a\x5c\x92\x09\xed\xa5\x34\x6a\xd0\xff\x7a\x4f\x37\x16\x6f\xc6\x9e\xd4\x55\xb1\x67\xfe\xca\xa6\x93\x89\xb8\xab\x6f\x57\x8b\x97\x57\x15\x9b\x32\x5b\xd1\xea\xc8\xdb\xb1\xd4\x6a\xc2\xfb\xb3\xaf\xbe\x15\xab\xbc\x89\xc7\xfb\x26\xb8\xc7\x2f\xb3\xe0\x0b\xa5\x05\x5f\x08\x2e\xe5\xbb\x37\x0f\xbb\x15\x5f\xe0\x78\x3f\x92\x55\xdf\x2f\x99\xe7\xe0\xc5\xfb\xea\x61\x0d\x2c\xd4\xbb\x0b\xd1\x83\xd4\xbb\x9d\xe6\x0f\xbb\xb2\x75\x7c\xaf\x6c\x39\x0f\x6b\xf6\x36\xf2\x38\x06\xa2\xb2\x44\x51\x15\xe5\x07\xf6\x19\x21\x37\x2b\x7e\x81\xbf\x00\x85\x80\xda\xf1\xaf\x26\xc2\x11\x21\xc7\xa1\xef\x2e\x8e\x41\xd8\xf3\x22\x58\x2c\xe9\xbb\x3b\x37\x23\x3b\x1a\x8f\x42\xa4\x88\xd1\x21\xa5\x81\x00\xb0\xfe\x25\x7b\x4c\x9b\xa4\x4c\xd1\xcf\x0b\x61\x4f\xeb\x2f\x58\xad\x7f\x26\x41\x2c\xf2\xeb\xa7\xfb\x37\xfe\xfd\x9b\x9f\x6f\xf8\x4d\xce\xe1\xf8\xb5\xe6\xa2\x8f\xbc\x6c\xd4\x08\x78\x46\x8e\x25\x45\xfc\x86\x22\x24\x02\x43\x6d\x19\x49\xa7\x99\x34\x5c\x10\x3d\x21\x02\xaf\xc4\xdc\x05\xe2\x85\x73\x72\x78\x82\xef\xde\xb1\x33\x00\xdc\x6e\x9d\x4d\xd8\x27\x1e\x05\x2b\xc5\x40\xc6\x67\xae\xfa\x37\x1b\x34\x57\xe9\xf4\xdb\xa6\x10\x9b\xe9\xc9\xfa\x38\x83\xc4\xa4\x86\x47\xd5\x8e\x80\x76\x73\x9f\xe3\xcf\x78\x67\xe0\xf5\x67\x05\xe5\xe5\x01\xe9\x18\xb4\xfd\x41\xb6\x73\xb9\xd1\xbe\x9a\xa8\xde\x15\x98\x70\x24\x5c\x6d\xe0\xce\xb5\x68\x23\x13\x60\xf4\x97\x3f\x50\x29\x33\x0e\x04\x7c\x25\xde\x6d\xad\x04\x83\x36\x8d\xf2\xd3\x7b\x94\xdf\x80\x68\xb9\x25\x18\x13\x38\xfc\x5d\x55\x3c\xd7\x88\x79\x54\x46\x56\x09\x08\xdd\x5f\xf0\xb4\xed\xee\x09\xf0\xcf\x30\xee\xa8\x69\xaa\xf7\x4c\x35\x58\x8a\x60\x74\x1a\x08\x9e\x7e\x54\xbc\x37\xe7\x41\xfb\x7a\xf3\x57\x4b\xac\xdd\x07\x35\xf3\xac\xd5\xd1\xb4\xe0\xb3\xfd\xb1\x33\x7d\x6f\x4f\x94\x2b\xbf\x0d\xc0\x1d\x32\x05\xc3\xd4\x3a\x61\xdb\x88\xd9\x56\x78\xb0\xd2\xda\x1d\xe7\xa3\x56\x9a\x7d\xa2\x45\x14\x29\x73\x48\x27\x18\x9e\xa9\x11\xc2\x2f\xf9\x09\x41\x37\x5b\xd9\x9d\xcd\xb5\xfc\xe2\xa4\xe5\xcb\x2f\x17\x5a\xf8\x11\xae\xd9\x75\x1f\xb7\xba\x53\x55\xbd\xbb\xeb\xd9\xa9\xd3\x84\x6c\xd0\x3f\x3c\x66\x7b\xd5\x8e\x26\x56\x5a\xac\xc9\x8b\x59\xd6\x94\x27\x8b\x1b\x4a\x4a\xae\x48\xb2\xbe\x3c\x2d\x66\x49\x86\x5d\x7b\xfe\x38\xbc\xb2\x2f\x34\xbd\x60\xdc\x1d\xe2\xee\x40\xb3\x8b\x2b\x9b\xec\xb4\xe2\x4b\x81\x74\x94\xf8\xa2\x97\x72\xcd\xa0\xd3\xd5\xa3\x5c\xe6\x61\xa9\x1a\x7c\xb3\x22\x36\xc6\x2e\x87\xc5\x3e\x30\x63\x19\xc8\xd1\x90\xe1\x1e\x72\xd2\xed\xd9\x5b\x20\xac\x1e\xf3\x1c\xaf\x72\x30\xaf\xf0\x5b\xe2\xcc\x33\x61\xd2\xb3\x42\xa2\x71\x3c\x3c\x56\x35\x2e\xa7\x71\x5f\x65\x1a\x1f\x84\x02\xb4\x01\x0e\x15\xa8\x5e\x93\xe3\xf5\x5a\x39\x6e\x25\x83\x64\x1c\x7d\xaf\x32\xc8\x30\xe9\xff\x02\x23\x6c\xf2\xdc\x76\xd6\xf0\x02\xfb\x13\x10\xf6\xdc\x71\x25\xe0\x3f\x6f\x4c\x31\xc8\xfe\xb3\x0f\xa3\x7a\xf6\xec\x05\xbf\xcb\x19\x08\x55\x87\x17\x35\x5f\x77\x08\xd6\xff\x05\x46\xe0\x65\xc6\x59\x2d\x0e\xb0\xfa\x75\xc6\x57\xfd\x2a\x03\xab\xbe\xe6\x88\x52\x8c\x1b\xfd\xd7\xfe\xfd\x07\x70\x0f\x93\x69\xc7\x31\x49\x53\x37\x2d\x9e\x35\x1b\x2c\xf2\x80\xb6\x1c\xb2\x04\xf7\x63\x59\x0a\xcf\x49\xf5\x47\x47\xc3\xb2\xfd\xf8\x8a\x24\x87\x9d\x18\x9d\xf7\xa1\xd9\x1e\x9d\x82\x12\x5a\x9f\xf4\x9d\x19\xa3\x63\xf4\x98\x36\x46\x8c\xb0\xaf\x32\x9b\x41\xd0\xd8\x4f\xe6\xa9\x9e\xc5\x0c\x7c\x62\x11\x8a\x2d\x2c\xe0\xbd\xac\x2b\x1b\xad\xf9\xf6\x49\xd5\x52\x07\x8e\xdf\x39\xe0\x5d\x19\x93\xcd\xca\xa3\xa7\x8b\x3e\x69\x28\x04\xc8\xd5\xc7\x38\x81\x6c\x14\x03\x87\x4c\xf6\x2b\x9b\xe7\x49\xd9\x61\xdb\x43\x0f\xef\xd1\x0e\x05\xba\xec\x54\x20\x03\xb3\x93\x50\xa9\xc7\x06\x46\xdd\x44\xfb\x1a\x78\x72\x8b\x8b\xb0\x0d\x36\x4a\x00\x13\x84\x23\x08\x96\xde\xb9\x9d\xf2\x9a\xef\x48\x53\x61\xeb\xe5\xfb\x0f\xac\xc3\xae\xbc\xfd\x22\xc4\x01\xe5\x06\x70\xfd\x23\x7c\x62\x7a\x2a\xa9\x8b\x94\xf6\x51\xf7\x2b\x82\x0e\x66\x77\x61\xb5\xf1\xa7\x51\x7c\xcb\x19\xbb\x61\x53\xa6\x4a\x25\xdd\xf1\x71\x52\xfe\x23\x79\x47\x98\x3c\xe0\x2b\x74\xf1\x9c\x60\xad\x30\xd5\x8d\x3f\xd9\xdd\xca\x91\x3e\xf0\x4c\x3d\xf0\x4c\xdd\x2b\xbc\xb6\x86\x49\x96\x49\x9a\x4a\x7a\xcc\xee\xc0\x8f\x4f\x20\xeb\xd6\xc1\x90\x82\x09\xa8\x05\x59\xd3\xaf\x7d\x1a\x3f\x58\xca\x47\xeb\xe3\xa7\x18\x1e\xaf\x41\x58\x5c\x0b\xb6\x7c\xe8\x56\xfe\x79\x45\xf3\x7b\x5b\xe0\xa5\xf1\x91\x68\xf7\x3a\x62\x82\x62\x88\xf2\xf8\x51\x41\xde\xed\x66\xa4\x0a\xc5\xfd\x66\xe5\x68\xc9\xf7\x51\x9d\x0c\xdd\x39\x02\x90\x20\xfd\x13\xea\xb7\x30\x48\xe1\xa9\x2a\x9e\xfb\x02\x0d\xbf\x4d\xb4\xef\x5f\x71\xc4\xdc\xe2\x3f\xcb\x48\xba\x25\xc4\x19\x5f\x01\x84\x5d\x4a\x2b\x5e\xb5\xce\xa3\xa7\xe1\x9d\xde\xaf\xfb\x56\x9c\xc5\xab\x04\xc2\xab\x97\xf4\xa9\x4b\xf8\xd9\x4b\xf2\x40\x80\xbb\x47\xcd\x33\xa2\x7b\x3c\xa6\x99\x8f\x3c\x05\x8c\xe1\xa3\x24\xef\x9e\x64\x95\x0a\xdd\x63\xfa\x98\xc4\x9d\xdd\x15\xbe\x90\x64\x85\x72\x71\x06\xd7\x26\xf9\x15\xe5\xe2\x36\xbd\xce\x8b\xc9\xd7\x11\x39\x2b\x59\x77\x5f\xc9\x47\x1d\xa4\x9d\x70\x61\xc3\x7e\xe5\xeb\xce\x15\xb0\x5f\xc1\xbb\x6f\x76\x77\xf2\xcd\x0f\xfc\xcb\xed\x60\xe7\xdf\xb1\x70\xca\x1a\x09\x43\x9d\xb5\x9a\x9c\xfc\xd0\xec\xab\xac\x2d\x7b\xb6\x85\x19\x40\x3c\x66\xa3\x20\x28\xa3\xd1\x66\x93\xab\x9b\xa8\x49\x0e\x6c\x36\x38\x88\x1d\xe0\x49\x14\x93\x5e\x99\x0f\x82\x70\x14\xfa\x2c\x93\x86\xc9\x60\x08\x33\xb0\xf3\xc1\x50\x68\x3f\x25\xcc\x7c\xa1\xad\x17\x07\xb9\xb5\x5d\x29\x9f\x2a\x80\x4f\x09\x2a\x1f\xac\x78\xed\x15\xb1\x66\x09\xc2\x70\x2f\x8e\xaf\xbe\x78\xea\x08\xa3\x70\x6e\x72\x28\x72\xdb\xb3\x99\xcb\x50\xba\xd7\xaa\x4a\x81\xc3\x1c\x83\xb4\xb9\xb4\x85\x75\xa1\xfb\x47\xbe\xb6\x35\x0e\x0a\xb7\x3e\x54\x45\x9a\xf6\x4b\xc9\x76\xe8\x8b\x6d\xf8\xf4\xc0\x9d\x60\x70\x5f\x14\x89\xf9\xa2\x76\x4c\xcc\x17\x2e\x6f\x99\xb4\x77\x94\x4c\x77\xf0\xac\x7f\x33\x82\x99\xf2\x4c\x55\x84\x09\x50\x55\x8b\x99\x0c\x55\x55\x32\x33\x16\x66\x92\x54\x55\xe9\x27\x4c\x85\x09\x82\xad\xde\x17\xcb\x44\x86\x12\x69\x26\xe4\x49\x06\x68\x77\x8c\xa4\x2a\x9e\xd9\x77\x88\xe8\x88\x56\x7c\x53\x26\x2d\x30\xa5\x2d\xe8\x93\xe5\x49\x4c\x49\xb3\x09\x3c\x49\x54\xc5\x33\xcb\x1e\xf0\xc5\x02\x3f\x64\xaf\x95\x27\x51\x6c\xf0\xf1\xd3\x08\xf4\x12\x7f\x6f\x96\x34\xa7\x07\xbf\xfc\x83\xab\xb6\xb0\xc4\x93\x75\x4d\x2a\x37\x8b\x9e\xb3\x32\xec\xa1\xa8\xa7\xa4\x4e\xf6\xa9\x55\x0f\xf2\xf3\x22\xbc\x8c\x71\xfe\x29\xc9\xca\xa2\x6a\xa2\xbc\x57\x73\x6e\x4d\x23\x7f\x56\x4e\xaf\x4c\x0a\x49\x76\x82\x65\x33\x41\xea\x98\xe5\xe6\x45\x28\xe1\xec\x17\xb5\x15\xdd\x6e\xb6\x1a\x2b\x9a\xc5\x46\x55\x13\xaa\x28\x54\x4d\xac\x05\xa8\x9a\x58\x25\x33\x63\x01\x54\x4d\xac\xf2\xda\x56\x94\xcb\xb4\x2a\x91\xfe\xf5\x59\xd1\x2c\xbe\xac\x15\x15\xf0\x9f\x6d\x45\x45\x7c\x17\xb3\xa2\xff\x48\xaa\xfd\x3a\x56\x94\x17\xfd\x6c\x2b\xca\xa0\xf9\xf5\x5b\x51\x86\xd9\x73\xac\xe8\xed\xad\xaf\xb1\xa2\xf4\x89\x33\x9d\xaa\x09\x55\x14\xaa\x26\xd6\x02\x54\x4d\xac\x92\x99\xb1\x00\xaa\x26\x56\x79\x6d\x2b\xca\xa5\x82\x96\x48\xff\xfa\xac\x68\x7a\xba\xac\x15\x15\xf0\x9f\x6d\x45\x45\x7c\x17\xb3\xa2\xff\x48\xaa\xfd\x3a\x56\x94\x17\xfd\x6c\x2b\xca\xa0\xf9\xf5\x5b\x51\x86\xd9\x73\xac\xa8\xef\xdf\xde\x6a\xcc\x68\x9b\x1a\x75\x4d\xa8\xa2\xd0\x35\xb1\x16\xa0\x6b\x62\x95\xcc\x8c\x05\xd0\x35\xb1\xca\x6b\x9b\x51\x3e\x59\xbd\x44\xfb\xd7\x67\x47\xdb\xf4\xb2\x76\x54\xc0\x7f\xb6\x1d\x15\xf1\x5d\xcc\x8e\xfe\x23\xe9\xf6\xeb\xd8\x51\x5e\xf4\xb3\xed\x28\x83\xe6\xd7\x6f\x47\x19\x66\xad\xed\x28\x8f\x42\x88\xe3\x83\xa3\x5a\xfd\xe5\xac\xb4\xa3\x3c\x1f\x3f\x80\xfb\x8d\xd0\x57\x58\x91\x4d\x5a\x6c\x52\x61\x93\xfe\xc2\xca\x3b\x67\xb3\x87\xe2\x93\xec\x9a\xce\xaa\xc1\xe5\x26\xb4\xfa\x2d\x25\xc6\x98\x19\x11\xe9\xb7\xb8\x96\xa6\x5b\xcd\xff\x38\x1d\xae\xb6\x55\x50\xa9\x41\xae\x9c\x91\x82\x4c\x94\x0e\x9e\xb7\x4e\x36\xb6\x49\x6b\x99\xcc\x76\x09\xb0\x4a\x3a\xfe\x38\x83\x04\x1f\xd1\xa0\x35\xd3\x2e\xd3\xab\xbc\x39\x2e\xbc\x3a\x42\xff\xb7\xbc\xbd\xb1\xc0\x20\x6e\x9b\x41\x55\xe4\x9c\xf2\x53\x49\x01\x83\x43\x81\x29\x9c\x82\x49\xcf\x3c\x5f\xd5\xdc\x88\xed\x14\xd2\xf0\x81\x36\x11\xe5\xca\x06\xa5\x78\x42\x6a\xa1\xad\x4d\x0f\xe8\x58\xd7\x1f\x18\xc6\x64\x2c\xab\x02\x59\xfc\xa7\xf6\x38\xa7\xd6\xba\xbe\x16\xcf\xd0\x89\x95\x7c\x3b\x42\xcc\x7e\xed\x25\x1f\x77\x5b\x79\xe3\x03\x33\xf8\x77\xee\x85\x99\x15\xfe\x1f\xf4\xa8\x20\x6e\xd3\xdb\x60\xc7\x36\xfd\x6d\x70\xfb\x8e\x7e\xc7\x32\x47\x87\xa8\xfc\xf4\x8e\x30\x3d\x14\x67\x49\x83\xaa\x34\xc9\x92\xe6\xd3\x3b\xdf\x1b\x8a\x29\x27\x41\xf7\x62\xcd\xda\xd9\x3e\x04\xc1\x1f\xd7\x8e\x1f\x76\x3f\x83\xd5\x43\x10\x68\x5e\x90\x83\x85\x38\x1c\x88\x98\x39\x2c\x09\x82\xe8\x3c\x8d\x21\x28\xf4\x43\x9a\xd6\x99\x63\x90\xe2\xa8\xfa\xac\x31\x9e\xe2\x51\x4d\x18\x44\xe4\x0e\xa8\x21\xf3\x66\x44\x6d\xb0\x8e\xe4\x42\xf1\xf8\x0f\xd4\x19\x6a\x74\x5a\x8e\xad\x2c\xa4\x44\x7e\x3b\x85\xbe\xc6\x4e\x4a\x88\x03\x1b\xc4\x1a\x6b\x29\x57\xd6\x1a\x4b\x0d\xd3\x82\xad\xd4\xd4\x04\x4c\xa5\xb1\xbf\x95\xb6\x11\xee\x69\xd0\x42\x4a\x55\xfd\x1b\x1b\x9a\xff\x19\xcc\xa4\x2c\x85\xaf\x6d\x2c\x79\x49\x82\xb6\x72\xea\x20\x05\x0c\xa6\x59\x6f\x40\x0b\x09\x55\x31\x18\xa1\x43\x54\xc5\xaf\x7e\x7e\x77\xf2\xe9\x42\x29\xb3\xf1\x73\x51\xc5\xd4\x35\xd8\x57\x28\xfa\xec\xe2\x02\xe3\x09\x7c\xe6\x13\xc9\x80\x3d\x5c\xf2\x68\x15\xc7\xcc\xa4\x15\x46\xc0\x0f\x33\xe5\xdb\x2a\x58\x6a\x3f\x38\x0f\xe0\x05\x38\x0f\xb8\x80\x2a\x42\x2e\xc9\x31\x49\x26\xd3\xf6\x78\x84\x1f\x7c\x91\xa4\x3f\x62\x38\x7e\x52\xa1\xe3\x72\x6e\x88\xd9\x34\x38\x19\xab\xee\x14\x70\x6f\x9b\xba\x58\x5a\x37\xfa\x5b\x06\x30\x80\x92\x41\x26\xd9\x0b\x90\xfd\x1e\x62\x11\xcc\xe1\x62\x60\x13\x4a\x0f\x62\xc3\x28\xfe\xe9\x3e\xa0\x28\x46\x95\xf3\x3d\xcb\xf7\x02\xee\xbd\xef\x29\xc8\xb1\x28\x80\x7c\x96\x62\xd7\xbb\xfb\x22\x7e\x99\x7a\x2b\x81\x4b\x3f\x42\x2f\x84\x0c\x67\x33\x7d\x40\x35\xdd\x26\x69\x84\xb4\xcd\xe3\x19\xd5\xad\x5c\xbd\x7e\xdc\xcb\x10\xfd\x1b\x21\x2b\x6d\xe6\x3e\x96\x28\x6a\x1b\xa9\x73\xf5\x20\xe3\xb2\xc4\xe6\x58\xe6\x00\x32\x08\x5d\xba\x8e\xd5\xa7\x62\x01\x64\x42\xfb\x54\x3c\xd9\xda\x3f\x88\x19\xe8\xf3\x13\xaa\x5f\xf6\xec\x6d\x87\xb7\xba\xf9\xa8\xbd\x59\xa6\x30\x36\x12\x8b\xca\x11\xac\x51\x63\xb0\xcc\x13\xc5\xcd\xea\xa8\x56\x04\x93\x5b\x4b\x94\x65\x4a\x53\x3b\x56\x54\xb6\x80\x79\x80\xc9\xb6\xb5\x90\x24\x99\xfb\x7e\x42\x4e\x4d\x6f\xb9\x51\x76\xb8\x0b\x24\xab\xa4\x0f\x50\x73\x60\x42\x47\x7b\x20\x07\xdd\xd5\x27\x5b\x16\x64\x32\x0c\xc6\x24\x3b\xb9\x78\xa8\xa4\xd1\xcb\x2b\xbc\xe1\xc5\xee\x7f\x01\xc6\xc4\x46\xe9\x24\xf6\x16\x2c\xab\x4d\x51\x72\x7f\x77\xe4\x85\x98\x60\x8e\x4e\x51\x77\x9c\x9d\xb9\x0c\x55\x3f\x54\xd8\x2e\xf4\x4b\x01\xee\x1a\xbe\x9e\xa0\x3e\x7d\xd4\xab\x4f\x6c\x12\x0b\x6c\x1b\xaf\x3c\x77\x61\xb3\xf9\xd9\x61\xd6\x73\x82\x56\xd3\x6b\xf9\x56\x47\x97\x47\x7c\x9a\x7d\x1c\x68\xf3\xe6\xa3\x72\x3b\x54\xbd\x19\xca\x7c\x11\x13\xdf\xf6\x2f\x09\x48\xf9\x6d\xfb\x0f\x5f\x04\x76\x99\xe6\xf3\x13\xac\xe7\xd0\x8b\x14\xe3\x04\xcb\x14\x29\x1e\x30\x50\x4c\x05\xe2\x64\xc3\x30\xc3\x74\xc7\x98\x1a\xfe\xd5\x7a\x84\x59\x2e\x5e\xa9\x4b\xbe\x88\xc4\x7f\x38\x53\xc4\xbc\x24\x95\xe8\xbf\xe7\xc9\x48\x6b\x69\x5c\xc8\x3d\xe2\xa7\xc7\xa7\x48\x20\x68\x4c\x21\x68\x4e\x22\x38\x85\xa6\x68\x1a\x27\x81\xb1\xab\x17\x23\xdf\x73\x78\xea\x9a\x38\x95\x2d\x76\x45\x71\xbe\xb4\xe4\x4c\x80\xa6\x9b\xcf\xc6\x6c\x80\x93\x48\x4e\xe8\x21\x00\x4e\xd9\x45\xaf\xc5\x94\x4d\x17\x01\xa0\xba\x3e\x82\x59\x63\xcc\x58\xe7\xa4\xd7\x1a\x33\x26\x78\x14\x56\x96\xac\xc7\x2a\xbc\x60\xd7\x15\xbb\x87\xe2\x31\x6f\xfa\xc7\x45\xe9\x23\x5c\xf0\x27\x05\x00\x8f\xee\x14\x95\xfc\xca\x86\x47\x09\x7c\x56\x7f\x29\xaa\xf2\x21\xca\xeb\xfe\x6a\x1b\x59\x9d\x14\xcf\xc3\xdf\x5f\xe4\x26\x72\x86\x4c\x7d\x7f\x4c\x7e\x6e\x68\xe8\x87\xe8\x70\x28\xaa\x38\xe9\x83\x75\xc3\xfd\xad\x28\x3f\x3c\xe0\xa5\x39\xe7\x23\x8d\x95\x39\x53\x0d\x3c\x5b\xab\xa8\xcf\x8c\xf4\xe2\xe8\x36\x2f\x25\xba\x01\x5f\xcc\xb0\x4b\xb2\x6a\x99\xad\x53\xc1\x45\xa7\xcc\x20\x1b\xf3\x5f\x42\x90\x25\xf4\x03\x30\x80\x45\x47\xe4\xa3\xfa\xcd\x8f\x0e\xed\xbe\x42\x51\x7c\xa8\x86\x47\x76\x2e\xfb\xc6\x0b\xe3\xb6\x29\xbc\x18\x7f\xbc\x91\x29\x5d\xc8\xb5\x7c\x1f\x57\x15\xfd\x1a\x9b\xda\xbd\x72\xf0\xbd\x23\x15\xfd\xdd\x78\xb4\xc1\x8c\x84\x4f\xad\x41\xef\xf0\x62\x5c\x1f\xf5\x27\x2a\x80\x17\x45\x98\xfb\x95\x1f\x98\x67\xad\x2d\x78\x20\xc1\x09\x9e\x13\x29\x48\xf1\x98\xc7\xa8\xc2\xe3\xf9\xb5\x11\x73\x23\x5b\x40\x00\x6e\x37\x08\xa9\x29\xcb\xe8\x94\xe4\x5d\x92\xe8\xa9\x3a\x09\x1d\x93\x84\x35\x49\xaf\x2b\x65\x74\x42\xec\x39\x18\x43\x90\x59\xfd\xd2\x90\xda\x29\xef\x43\x62\xc2\x9b\xd1\x01\xff\x68\xb4\x3e\xc1\x9d\xe6\xc5\x6d\xe1\x41\x9b\xa1\x41\x6c\xdc\x4a\x78\x04\x7f\xa4\x19\x6e\xf6\xab\x8f\xba\xbe\xb5\x1c\x8a\xd2\x03\x6a\x22\x33\x4c\x98\x5f\x78\x9d\xfb\xb5\x12\x77\x10\x5a\x44\x75\xd9\xf8\x94\xd8\xc1\xc0\x52\x7d\xc2\x6b\x46\xe0\x2c\x01\x69\x14\xe1\x83\x09\x1e\x89\x6c\x58\xbc\x8e\x64\x98\xbc\x54\x54\xfb\x71\x27\x52\x14\xa4\x3e\xe5\x55\x1b\x75\x32\x46\x91\xf6\xb0\x83\x2a\x52\x9f\xf3\x40\xd6\x10\x5f\x9e\xfa\xa8\x11\x60\x5f\xc8\xf9\x74\x71\xac\xcb\x11\xc6\x69\xaf\x07\x90\x67\xdf\xd5\x94\x8c\xba\xa8\x56\xbc\x95\x95\xde\xad\x04\x05\x80\x39\x98\xa7\x85\x2b\x3b\x25\x54\xb1\x50\x67\x3a\x71\xf7\xaf\x35\x18\x32\xa4\xd8\xc9\x7b\x20\x75\x86\xbc\x03\xbb\x71\x6e\x6a\xec\x39\xa3\xde\x72\xd0\x73\x4b\x94\x28\x3e\x21\xcb\xc7\x41\x3a\xb1\x13\xa9\xaf\x65\xa1\x6f\xc3\xb7\x72\xa2\x88\x2d\x98\x28\x42\xfd\xae\x93\xea\x81\x19\xf9\x65\x89\x7d\x54\x23\xba\x1e\xd1\xa6\x95\x62\x9f\x2b\x54\xbf\xb9\xf8\xab\x7c\xb7\x91\xe9\x1b\xc3\xb3\x8b\x51\x57\xb7\xdf\x2b\xef\xff\xb4\x7e\x0c\xa4\xab\x8e\xb2\xb2\x79\xd1\x9d\xcc\xdc\x37\x39\xc7\x95\x62\xa5\xc3\x3e\xeb\xc6\xe0\x27\xfb\x04\x8a\xa3\xc2\x1b\xc5\x49\xe1\x0d\x1c\xa8\xf7\x3d\x49\x87\xdd\xb2\x4a\xb2\xa8\x7a\x99\xf9\xe0\x5a\xc4\x63\x11\x24\x39\x14\x2b\x4f\x1a\x28\x48\x6c\x82\xc3\x41\x45\x82\xe0\x92\x48\x2c\x55\x19\x2b\x26\x2e\x6b\x98\x55\x4d\x87\xbf\x46\x87\x22\x8f\xa7\x48\x88\x5f\x69\x47\x22\x1e\x51\x46\xe3\x87\x69\x52\x0a\xd7\xe1\x7e\x13\xa8\xc9\x08\x72\x1a\x3e\xcc\x96\x94\xef\xed\x16\x8e\xef\x6f\xb1\xc0\x14\xb2\x7a\x3c\x1c\x50\x6d\xdf\x84\x60\x17\x6d\xd7\xa1\xd4\x84\x0e\x8b\x24\x27\x5a\x3c\x4d\x4a\x3e\xda\xa2\xd5\x5a\x45\x42\x94\x51\x57\x3c\x5b\x42\x6b\xac\x4c\x9b\xed\xc2\xd9\xdc\x82\xf2\x49\xf2\x63\x61\xcf\xf9\x36\x0a\xf6\x3b\x91\x73\x8c\x42\x94\x0c\x29\x9b\x28\x16\x7f\x1b\xed\xf6\x20\x72\x41\x26\xb8\x6c\xb6\x40\xf0\xc0\xf2\x37\xc1\xc2\xf1\x77\x6b\x50\x22\xcf\x51\x95\x8b\x19\xe7\xbe\x09\xfc\x20\x0c\x6e\xd5\xeb\xcf\x83\xef\x6d\x45\xd6\x29\x22\x51\x34\x7d\x31\x20\x1d\x3d\x95\x78\x75\x8b\x3c\x4f\x45\x45\x90\x11\x2d\x9e\x2f\x26\x6c\x7b\xfc\xdb\xd5\xc2\xd9\x82\x52\x8a\xa3\xfc\x24\x9c\x04\xd4\x75\x6e\x7c\x58\x85\xf2\xb0\xea\x90\x88\x02\xa2\xa5\xd3\xb4\x67\x1f\x07\xfe\xca\x53\x10\x10\x64\xd3\x95\xce\x17\x4d\xe0\x2d\x9c\x70\xa5\x1c\x52\xdd\xc9\xdf\x29\xea\xb3\x3b\xde\x1e\x23\x91\x77\x82\x46\x94\x4d\x57\x38\x5d\x75\x22\xe4\xa1\x10\xa6\x20\x08\x87\x14\xce\x97\xcd\x7a\xb7\x70\x82\xf5\x2d\x9e\xbc\x3c\x85\xe2\x54\xf6\x4f\xa9\x76\x29\x4e\xe5\x5e\xad\x3e\xcb\x4a\x53\x7d\x9e\x6a\x70\xe2\xc0\x0f\xd6\x20\x72\x49\x61\xaa\xcf\xb3\x45\x12\x06\x0b\x27\xdc\x2d\x9c\x8d\x68\x6e\xfe\xf6\x98\xed\x8b\xa6\xea\xc3\x5d\xc3\xd2\x3c\xd0\x05\x4a\x75\xa9\x21\x74\x31\xd1\xd5\x84\x4d\x0f\x81\x31\x86\xb5\x35\x66\x2d\x60\xee\xad\x0a\x2d\xe9\x6e\x72\x4d\xba\x3a\x07\x06\xaf\x69\xec\x3b\x45\x95\x3e\x9d\xe3\x94\x93\x51\x3e\xef\x53\x9d\xf1\x7e\x1f\xe1\x8b\xc4\xdf\xc5\x79\x42\x3c\xf0\xd8\xd5\x1c\x5d\x3e\xc0\xa3\x62\x2b\xc6\x49\x9d\x25\x35\xb9\x1c\x06\xca\x70\x2d\x73\xc1\x82\x2c\x0f\x69\x51\xa3\x59\xa7\x6d\x84\x90\xa0\x56\xae\xda\xb6\x82\x6b\x77\xcf\x5b\x7b\xbb\x50\xa5\xb6\x87\x03\x0a\xe1\x00\xce\x7e\x17\x47\x4c\x64\x89\xa7\xf0\x20\x1d\x5f\x1c\xe0\x6e\x8f\x87\x58\x09\x27\x75\xca\xc8\x65\xb0\x0d\x03\x01\x4a\xb1\xd6\x5e\xed\x56\xf1\xda\x57\x0e\xc4\x00\xad\x50\x08\x86\xa4\x36\xf1\x2e\xde\x2b\x69\x68\xda\x74\xd8\x1d\xf6\x87\xa3\x12\x52\xd9\xaa\xc0\x0b\x56\xc1\x46\x84\x83\x56\xc5\x7e\x18\x6e\x89\x3d\x84\xa7\x90\x35\x8a\xf9\x54\x8e\x03\x67\x2b\xb4\x39\xec\x15\x14\x34\x2d\xda\xfb\xf1\x71\xaf\x82\x53\xf7\xd2\x3e\x40\xfe\x4a\x80\x92\x57\xb1\xde\x21\x5c\x6f\x3c\x65\x63\x7c\x74\x38\xfa\xa0\xca\x21\x14\xa2\x3d\x84\x5e\xd3\x92\x68\x1f\xc7\xe3\xf4\xca\x02\xa9\x9b\xb1\x09\x0e\x2b\xb1\x19\xe0\xd2\x73\x17\x6e\xd6\xde\x5a\x13\xfa\x5c\x1d\x62\xa8\x25\xc7\x23\x42\xfb\x48\x41\x41\xd3\x98\xe3\x11\xed\x22\x5f\x01\xa7\x6c\x4f\xb8\x5a\x1d\x3d\xb1\x3d\xd0\x22\x71\x1b\xf8\x07\xb5\x96\x1d\x77\xf1\x16\xd6\xb2\x63\x78\x90\xb5\x8c\x12\xd0\xb5\xc6\xdf\x7b\xfb\x2d\x0c\xa6\x6c\xcc\xfa\xd6\x0f\xfc\xad\x64\xc5\xa5\x65\xdd\xce\xdf\xf9\xbb\x40\xd9\x16\x84\xff\x03\xdb\x12\x1f\xe3\x23\x02\xf1\x6b\x9a\x82\x0e\xe8\x70\xdc\x80\x50\xca\x96\x6c\x76\xf8\x3f\xa9\xf9\xe2\x12\xcc\xdf\xfb\x28\x50\x9a\x33\x62\xb4\x6e\xc1\xa1\xbf\x39\xec\x0e\x11\x84\x5e\x37\xee\x6f\xf7\xfb\x3d\x82\x80\xd4\xa3\x65\xed\x85\xde\x30\xc0\x7e\xd3\x1f\x99\xf8\x8c\x5e\x8e\x55\x94\xa1\xda\x29\xab\xe2\x54\xa1\xba\x76\xf7\x51\xe5\xd6\x4d\x95\x94\x88\x5a\xb7\x63\x55\x0c\x8f\x99\x32\x6d\x1b\xe7\x47\xbf\xcf\x94\x4a\x0f\x44\x34\x85\xb6\xba\x27\xbe\xc2\xf2\x6b\x60\x62\xd9\x93\x9e\xbc\x73\x2a\x65\x2d\x03\x53\x06\x73\x41\x5f\x4f\x0e\xd2\x6f\xc3\x99\xcb\x52\x61\xdb\x8a\x11\xe0\x15\x5f\x0b\x17\x5e\xb9\x60\x42\xd8\xd2\x33\x17\xcc\x37\x50\x50\xa2\xdb\x31\x31\x34\xae\xdf\x77\x63\x03\xc7\x64\xdd\xee\x78\xcb\x4d\x17\x9d\x9e\x17\x96\x96\xe5\x6d\x4a\x0a\x04\xa8\x78\xac\xba\x95\x87\x95\x26\xaa\xdc\x13\xee\x6d\x94\x37\xef\xd7\x61\x8c\x4e\x0b\xd5\x2d\xc0\xf0\xc6\x09\xc2\xb7\x0b\x76\x2d\x2e\x17\x84\xde\x5b\x1d\x02\xc3\xe7\xad\x88\x4e\x2c\xb8\x11\x3b\x81\xee\xf9\x49\x19\x14\x38\x31\x44\x79\x92\x45\x4d\x2f\x87\x21\xd9\x2a\x29\xed\x06\x77\x4d\x65\xe1\x24\xf9\x31\xc9\x93\x06\x81\xa6\xa2\x7b\xf5\x7c\x0e\xd8\x99\x5d\x2f\xb4\x00\x6c\x03\x93\xea\x0e\x2a\x1d\x14\xa4\x63\x62\xf6\xd8\xa5\x43\x65\x7c\x68\x86\x7b\x05\x1e\x78\x64\x86\xd0\x83\xef\x29\xb1\x17\x94\x86\xfa\xe2\x4d\xb6\x5f\x57\x3a\x02\x83\x7d\x1c\x99\x27\x12\x71\xa3\xc3\x78\x5a\x46\x3c\x90\x07\xa4\x03\x62\x8d\x91\xe8\xbd\xc1\xa8\x87\x2b\x9b\x8a\xcf\xd0\x39\x0e\x5f\x4b\xde\xf6\x50\x09\x1f\x13\x53\xd1\x87\x4e\x15\xe9\x23\x61\xc3\x64\x04\xe2\x3d\xe3\xd8\x8f\xcd\xb5\x24\xcd\xc1\x1d\xed\x1d\x24\x81\x4b\xed\xa5\x49\x6e\x97\x1a\xb8\x9b\x29\x6f\x37\x1b\x54\xc1\x70\x03\x52\x85\x4b\xbb\x7b\x6e\x20\x39\x9c\x1c\x91\x35\xef\x6e\x7e\xaa\x35\x65\x7f\xc0\x3c\xb0\xba\xa5\x38\x31\xf5\x1a\xc7\x65\x44\x0d\xfc\xde\x81\x95\x12\xbe\x17\x6b\x8b\x83\x6b\x8d\x29\x67\x57\x6f\x4a\x98\x6d\x5f\x06\xdd\x43\x51\x25\xbf\x14\x79\x13\xa5\xe7\x3d\x6b\x05\xa3\xfc\xc1\xb1\xd6\x76\xfd\xf1\x2b\xab\xd3\xb5\xd6\x3c\x28\xc6\xc0\x94\x13\x5b\x8a\xc3\xc4\xb6\x2c\x28\x7b\x70\x3a\xaa\x09\x3a\x26\x68\x07\x69\x83\x4e\xfd\xa6\xd2\x85\x5a\x25\x1c\x94\x04\x48\xfb\xf6\x57\x91\x40\xde\xa0\xfc\x16\x33\x9e\x9a\x54\xe2\xb6\x51\x62\x6b\x35\xb6\xbc\x3f\x33\x85\x19\x51\x9b\x2d\xf5\xd9\xfa\xfa\xca\x04\x5e\x38\x05\x80\x72\x66\x4f\xc6\xa8\xd4\x6e\x9d\x7e\x2b\x35\xfc\x75\x18\x80\x5b\x29\x28\xba\x46\xd5\xed\x33\x10\xc0\x7c\x02\x99\x08\x5e\x4d\xdf\xb3\xf8\x57\xa4\xef\x30\x33\x5f\x47\xdf\x41\x5e\xce\xd2\x77\x10\xe3\x35\xf5\xdd\x96\x81\x8b\xea\x3b\xf7\x56\x3c\xcc\x27\xf0\x66\xfc\xab\xe9\x7b\xf7\x5e\xf8\xaf\x44\xdf\x61\x66\xbe\x8e\xbe\x83\xbc\x9c\xa5\xef\x20\xc6\x6b\xea\xbb\x2d\x03\x17\xd5\x77\xfe\x51\x6f\x98\x51\xe0\xb1\xe5\x57\x53\xf8\x36\xfd\x15\x29\x7c\x9b\xfe\x7a\x14\xbe\x4d\x5f\x5b\xe1\xdb\xf4\x2b\x2b\x7c\x9b\x5e\x5b\xe1\x59\xcc\xc7\xf4\xb1\x7e\x50\xde\x68\x54\x54\xff\x41\xef\xcc\xf4\x4d\x77\x3c\x95\x43\xab\x42\x63\xff\xf4\x13\x1c\xa3\x9a\x71\x14\x42\x38\xf0\xa0\xc0\x38\x35\x58\x67\x00\x03\x4e\x4d\xe9\xb9\x14\x8e\x57\x4c\x23\xa7\x79\x78\x50\x11\x48\x19\x59\x11\x03\x29\xf4\x0b\xcc\xc6\xac\x93\x1b\xc2\xf9\x0c\x25\xce\xa9\x5d\x60\x04\x04\x3a\x41\xcf\xa9\x70\x1e\x64\x2a\xc1\xa9\xdd\xc0\x32\xc3\x77\xc3\xf0\x45\xc1\xc8\xf4\xa3\x26\xc2\x81\x12\x05\xc6\xc9\x5d\xa0\x07\x03\x3a\x40\xcf\xa5\x70\x7c\x65\x1a\xb9\xa9\xe2\x67\x59\xe1\xc5\x3f\x7c\x81\xd9\x98\x7a\x32\x46\x38\xff\x02\xa1\x9b\x2a\x78\x1d\x0c\x64\x7b\xb4\xfc\x09\x47\x6d\x26\xd0\x9a\x6c\x78\x18\x3e\x04\xc3\xd3\x7f\x81\x79\x98\x75\x8a\x87\x3b\xab\xa3\xc0\x38\x55\xf0\x06\x30\x40\xf6\x46\x2e\xd9\x93\x41\xd3\xc8\x4d\x15\x3f\xcb\x0a\x2f\xfe\xe1\x0b\xcc\xc6\x8c\x43\x47\xfc\xd1\x22\x18\xe1\x54\xe1\xeb\xa1\x00\xd9\x1b\x78\xe4\xcf\x31\x4d\xa2\x36\x55\xf4\x2c\x27\xbc\xe8\x87\x2f\x30\x17\xd3\x8f\x48\xf1\x07\xa1\x40\x7c\x53\x05\xaf\x05\x82\x74\x5e\xcb\xa1\x70\xe8\x6a\x0a\xb1\xc9\x1a\xcf\x30\x22\x68\x7c\xff\x45\xd5\xf9\xd3\xce\x73\x09\xa7\xb6\x20\x74\xd3\xb5\x5d\x0d\x03\xcd\xac\x5a\xfe\x84\x03\x62\x13\x68\x4d\x9e\x56\x19\x3e\x84\x69\xb5\xff\x42\x5f\x17\x1a\x4f\x56\xd3\xa7\x3d\x88\x57\x29\xdf\x0e\xe7\x2f\x31\x5b\x5c\x9e\x1d\x57\xb3\xde\xb8\x4b\x3e\xde\x26\xf0\xcb\xd6\xf1\xc6\x36\x14\x65\x74\x48\x9a\x97\x3b\x87\xb9\xfd\x4c\x78\x63\xdf\x77\x00\x51\xaa\xdf\x29\x25\xe0\xe4\x05\x9b\x7e\x6f\xf5\x86\xfc\xb9\x1c\xff\xec\xbb\xdd\xa6\x2e\x7b\x4f\x62\xe0\x76\x3b\xb0\xbb\x7f\x6c\x9a\x82\x13\xe8\xb8\x89\x3e\x31\x01\x3f\x73\x31\x84\xa0\x13\x9e\x6c\x57\x6c\x04\x77\xad\x6e\x8a\xa8\x6e\x84\x0d\x4c\x31\x33\xca\x2a\xf4\xa8\xb3\xca\xa6\x46\x19\x4b\x99\x4c\x75\x4c\x55\xc5\xe5\x75\xc5\x23\xa5\xd2\x41\xa5\x5d\x78\x03\x3f\x0f\xdd\x1f\x22\x99\xf0\x3e\xf4\x0d\x74\x3d\x65\xb8\x6f\xdf\x9d\x58\x50\x00\x0d\x5d\x67\x75\x30\x85\x48\x53\xf1\x6e\x9d\xe1\x49\x5f\x02\x4a\xde\xad\x1f\xd6\x4c\x03\x6d\x1f\xa8\x25\x1c\xdb\x19\xcf\x62\x28\xa1\x1e\x92\x18\xe9\xee\x42\x93\x5a\xdc\x73\x4a\x67\x9c\x5c\x62\x0e\xf9\x71\x47\x97\x98\x72\xe0\xe9\x83\xad\xee\x39\xa0\x0b\x69\x8e\xc5\x9b\xbf\x5e\x78\x73\xbd\xb7\xb7\xbb\x6e\x18\x4f\x72\x89\x67\x6b\xc6\x23\x5f\x45\x1c\xa5\x6e\x51\xa2\xdc\xf0\x5a\x18\x53\xb1\xfb\x5d\x78\x92\xac\xe5\x8e\x6e\x0e\xc5\x2f\x42\xfa\x23\x06\x74\x3c\x19\x74\x4c\x5a\x14\x8b\x57\x6a\xd8\xf3\x5d\xe3\x79\x28\x2f\xf4\x3e\x42\xda\x27\x9f\xd9\x1a\x66\x86\xbe\x00\x3c\x63\xca\xdd\x3e\x63\x5b\x1a\x27\x51\x5a\x9c\xb4\x67\x98\x28\xc5\xf1\xb1\x6e\x32\x38\xf9\x14\x5f\x3a\xb3\x49\x08\x2d\x8f\x51\x8c\x1c\x80\x28\x7b\x76\xb4\x3f\x43\x48\xca\x8e\x45\x85\xd5\x7c\x45\x9f\x52\xe8\xde\x51\xe0\xeb\x9f\x59\x6f\x61\x45\x50\xaa\x43\xf1\xa5\x51\x83\xb0\xe2\xbb\xd8\x8c\xdf\x8c\x34\x75\x55\x66\x1c\xba\xd4\x4b\xcf\x74\xf6\xb6\x83\x26\x36\x10\x80\x06\x9a\x36\xa0\x90\xcb\x58\x8c\x1d\xae\xba\x89\x9a\xe4\x60\x89\xb9\x3e\x44\x29\x7a\xef\x2f\xbd\x40\x12\x16\xff\x49\x56\x4f\x9a\x13\x2d\x1a\xee\xb8\x4d\x30\xb6\x78\xc2\xed\xc7\x08\x31\x25\x78\xa0\x60\x3b\x52\xa1\xcc\x4c\x8d\x7e\xa0\x67\xb9\xfb\xc9\x49\xc6\xf8\xf4\xc0\xa0\x34\x9a\x17\x25\x9d\x6e\x42\x59\x98\x2b\xb2\x2f\x5e\xda\x3f\x35\x6d\xc5\xc3\x68\x4d\xf5\xd6\xad\xc7\xd0\xcd\x52\xfd\x02\xea\xb2\xd3\x20\x9b\x27\xc0\xb2\x33\x7b\xf6\xf8\x87\xe8\x80\xb5\x80\xa1\x4b\xfb\xcf\xbd\x66\x63\x56\xa8\x5a\xf0\xdf\xb3\xe2\x17\xe5\x47\xb1\x9c\x79\xb5\x8f\x79\xb4\x0f\xe4\x5f\x3f\x20\xae\x7d\x91\x41\x98\x75\xe6\xf0\x6d\x1a\x5a\xb2\xd5\xb1\x45\xcd\x77\xf5\xc0\x3e\x80\x90\x23\xfe\x35\xd3\xc3\x88\xb3\xba\x38\xa1\x5a\xbd\x64\x76\xfe\xea\x3f\xb8\xd1\xde\x04\xd7\xac\x23\x30\xf1\xb8\xea\xdf\xa7\x9f\xb7\xe6\x59\x8b\xcf\xe1\x3f\x3d\x8b\xca\xf6\xf4\xa0\xde\xf3\x51\xb1\xd4\x4d\x9e\x7f\x97\x3c\x14\xb0\xee\xe8\x2e\x8c\x75\x19\xbf\x99\x35\xd3\x57\xb9\xb1\x20\x0d\x50\x3a\x2a\xe1\x11\x4a\x6e\x07\xb9\x7b\xd4\x3c\x23\x94\x0b\x89\x0f\xb8\x17\x02\x94\xcb\xf9\xf1\x01\x3c\xe3\x12\x7e\x35\x71\x05\xbf\x02\x16\xf0\x9c\x3c\x41\x07\xdf\x07\x5e\x36\xb8\x73\x5c\x52\xcc\xfe\x0b\x4c\x50\x9a\x1c\x31\xfa\xb7\xe1\xc4\x89\x50\x61\x19\xec\xf3\xdb\x70\xad\x11\xc8\xb0\x53\xf9\x85\x9e\xd4\x9d\x31\xd3\x0a\x5a\x87\xf2\x58\x93\xc3\xb9\xff\x0a\xb8\x5f\xaa\xfc\x29\x80\x9e\xe9\xf2\x48\xac\x26\xa7\x91\x50\x6b\x1b\x15\xf8\x0f\xce\x77\xac\x6e\xc8\x01\x0a\xba\xc6\x25\xd3\xca\x3e\xaa\xdc\x0c\x45\xf5\x63\x65\xf1\x56\x82\x7b\x7b\x7b\x7b\x4b\x43\x3b\xfd\xf9\xe2\x3e\xd4\xd3\xab\xdb\x50\x30\x2e\x15\x3b\x4a\xb6\x87\x94\x21\x5f\x80\x09\x2e\x85\x9e\x27\xe4\x78\xc0\x2a\xde\x85\x6f\x84\xf4\xe1\xda\x85\x85\x7a\x01\xbd\x22\xee\xdf\x8d\x05\x22\x68\xb2\xd5\x2c\xa3\x0d\x88\xf9\xf5\xa6\x7a\x4d\x68\x89\x86\x5f\x2c\x28\x96\x81\x2c\x2e\xf3\x52\xd0\xb0\x18\x54\x2f\x07\x59\x36\xc7\xe3\xe6\x6c\xc8\x70\xe8\x55\xdb\xb3\x8e\x1d\xb2\xf4\xb4\x60\xfe\x1a\x0f\x7e\x31\xa8\x77\x36\xa8\xf9\x63\x65\x1a\x6c\xbe\xbf\x16\xd1\x2d\x9b\xa2\x48\x9b\xa4\xd4\x8e\x1f\x66\x35\xb0\xf5\x54\x37\xa8\x86\x01\x3b\x06\x4f\x8f\x51\x96\xa4\xd8\x6e\x46\x65\x99\x22\xb7\x7e\xa9\x1b\x94\x2d\x9c\xdf\xa5\x49\xfe\xf9\x8f\xd1\xe1\x27\xf2\xf7\xbf\x15\x79\xb3\x70\xee\xdf\xfc\x84\x4e\x05\x72\xfe\xfd\x0f\xf7\x6f\x16\xce\x9f\x8b\x7d\xd1\x14\xb8\xf4\x7f\xa0\xf4\x09\x35\xc9\x21\x72\xfe\x84\x1e\x11\xfe\xf6\xdb\x2a\x89\x52\xfc\xe9\x4f\x45\x53\x38\x3f\x45\x79\x8d\x4b\xef\xdf\xfc\x98\xec\x51\x17\x16\x1f\x0a\xeb\x28\xaf\xdd\x1a\x55\xc9\x11\x57\xf8\x2d\x66\xc2\xf9\x3d\x79\x2b\xf2\x5f\xb3\xe2\x6f\x49\x07\xd7\xd3\x05\xcb\x7e\x7a\xc9\xf6\x45\xda\x15\x12\x7a\x1c\x38\x13\x26\xee\x5f\xa7\xae\xb2\x28\x95\x77\x0d\xd6\x9e\x72\x6e\xe3\x2f\xf3\x0d\xcf\x8c\xb3\x85\xe3\xaa\x43\x7d\xf1\x8e\xdb\x6c\xe0\x4b\xa1\x38\x42\x8a\x1a\xbc\x90\xc5\x2b\x13\x32\x35\x30\x8c\x93\x14\x88\x24\xf9\x21\x5f\xcc\x5f\x74\xe6\xab\x43\x78\xba\xf7\x4a\x3b\x3c\xe3\x2c\xac\x88\xa9\xab\xf3\x2e\x02\x8b\x43\xaa\xb2\xf0\xaa\xf0\x56\xac\xe6\x2c\xa3\xaa\xea\x2b\x2a\x14\x1c\x50\xe7\xfe\x50\xd8\x72\xd7\xf3\x38\xdc\x9a\x5f\xae\xf9\xb0\x37\x4b\x86\x37\x5c\x0a\x72\xa2\x83\x29\xee\x59\x29\x5e\x31\xa2\x4a\x46\xa6\xea\xf1\x2d\xae\xda\xa5\x1c\x90\xe4\x21\x0e\x5b\x80\xc5\xfe\x97\xd6\x2d\xd3\xe8\x80\x32\x94\x37\xff\xfb\xd3\xfd\x9b\xa6\x28\xef\xdf\xfc\x2c\x05\x66\xd7\xfd\xb3\x05\x10\x56\xda\x36\x6b\xe4\xac\xc4\xe5\x34\x65\x20\xee\x5e\x6e\x13\x69\x08\x0f\xd9\x8f\xce\x8c\x70\x66\x90\xb6\x6f\x6c\x26\xf8\x9e\x05\xeb\xad\x30\x5c\x90\xb5\x8f\x99\x31\x52\x0d\x90\xad\xa8\x30\x22\x66\x6b\xe9\x0e\x04\x58\xf9\xb2\x5e\x1b\xd7\x5a\x41\x67\x77\x16\x2c\xd8\x77\x82\xc0\x0a\xdf\x0d\x42\xf6\x37\x4d\x47\x00\xfd\xd1\x2d\x34\x0d\x3d\x42\x33\xd2\x18\xd9\xec\xea\x4d\xd3\x77\x9a\x4b\xcd\xb6\x53\x46\x12\x6c\xaf\x08\xf7\xf9\x54\xe8\xed\x05\x2e\x92\xe1\x25\x0e\xde\x3d\x1f\xcf\xcb\xb2\xd2\x06\x16\xea\x06\x61\x63\x0d\x33\x33\x88\x6b\x4d\x53\x7e\x0c\x61\x2d\xe6\x1e\x3d\x2b\x64\x4e\xcf\xe6\xe8\x3e\xc3\x81\x7d\x4f\xf0\x9c\xf0\xfd\x00\x3c\x86\x27\x28\xbe\xba\x33\x88\xbb\x04\x75\x45\xcf\x4c\x92\xe7\xa8\x1a\x23\x72\x14\x71\x30\xac\x10\x75\x0f\xb1\x5b\xbe\x66\xa2\x8c\xe0\x98\x1f\x7c\x29\xca\xf1\xd8\x82\xf9\xc9\x3a\x45\xac\x69\xa3\x59\x5d\x8e\x2d\xc6\x0e\xd7\x7f\x2f\x32\xff\x7b\x91\xf9\x7a\x8b\xcc\xaf\x1a\xbf\xe5\x07\xd0\x59\xab\x55\x5f\xb6\x7d\xa1\x18\xa4\xf3\xf4\x94\x19\x43\x28\x7e\x88\x8e\x8d\x61\x84\x03\x9c\xbd\xf2\x5a\x97\xf2\x34\xae\x75\xfb\x02\xd3\x5a\x57\x3a\xbc\x12\x0a\x93\x02\x83\xd9\xf9\x81\x9b\x97\x2c\x48\xfc\x00\xae\x79\x49\xb4\xc2\xa5\x89\x84\x84\xa8\x97\x82\x22\x3f\x0f\x4d\xa0\x3c\x61\x41\xb0\x64\x66\x07\xe5\x62\x58\x52\xe2\xd0\x82\x77\xa2\x21\x33\x58\x67\x34\x8b\x09\x7e\xcf\xe6\x9d\x7b\x0d\x84\xe1\x85\x59\xc8\xeb\xd8\xe3\x17\xf2\x7c\x66\x21\xa5\xda\x74\xeb\x68\x7b\xc5\x19\x88\xfc\x00\x2c\xe7\x61\xc5\x61\x16\x39\xa1\x38\xd0\xa5\x58\x3c\x8d\xb5\x7a\x66\x5e\xed\x55\x4e\xe2\xd9\x7e\xf5\xc3\x75\x1b\xd0\x7b\xdc\xb2\xdf\x52\xf7\xc4\x66\x58\x6a\x1f\xd0\x0a\x46\xff\x68\x72\x5d\x1b\xed\x33\x35\x43\xa5\x86\xac\xf7\xa2\x63\x54\xf0\x5e\xb8\x0b\x88\x4a\x3d\xa4\xfe\x85\xbd\x22\x8e\x54\x7e\x90\x5d\x18\x4b\x0b\x26\x10\xb5\xd7\x28\x99\xb8\xad\x47\x0f\x76\x86\xda\xb9\xb1\x54\x29\xa9\x21\x96\x3a\x05\xb5\x83\x51\xaa\x7e\x9b\xe5\x15\x1a\xa2\x57\xaa\x61\xd2\xee\x73\xfa\xcf\xe8\x09\x05\x8a\x69\x4b\xfb\x90\x6e\x99\x5b\xac\x55\xc4\x1c\xf4\x8c\xd3\xa2\x58\x3a\x00\x1b\xa4\xc7\x2d\xfe\x0f\x12\xcc\xe8\xbe\xea\x9a\xcf\xb9\xaf\x7c\x5e\x6e\xf5\x58\x23\xfe\xa3\xfd\x48\xeb\x69\xfc\x00\x79\xb1\x17\x36\xf9\x1c\xab\xf6\x5a\x21\xb2\x3c\x21\xd0\x13\xf6\xfe\xae\x42\xad\x59\x7f\xd7\x72\x74\x0a\x8d\xb0\x1c\x9b\x72\x1b\x98\x91\xd9\xe7\x5e\xd7\xda\x7b\xbb\x46\x70\x23\x93\x1f\x43\x52\xf8\x49\x95\x5a\x92\x5f\xb7\xb1\xf7\x11\x74\x6f\xd1\xf5\xba\xaf\x1b\x20\x68\x8f\xff\xbb\xd6\x09\x02\xc1\x84\x18\xb3\x58\x8d\x56\x0c\x38\x34\xac\x3c\x5a\x3d\x3c\x10\x38\x24\x8e\x2e\x1e\x6b\x94\x6a\x8e\x07\xf0\x15\x97\xdc\x81\x9e\xf1\xcc\x56\x53\x3c\x1e\x1e\xfa\x4b\x2f\x4e\x19\xe5\xee\x0b\xb5\x72\x50\x39\x8f\x93\x0d\xd3\xe8\x8f\xee\xea\xce\x06\x43\x38\x39\xbd\x85\x3c\xad\x14\x45\xd5\x1d\x5e\x40\x3f\x68\x8e\xb1\x8d\x38\xad\x5f\x49\x1c\x1c\x7a\x31\x17\xae\xd8\x10\xde\x6e\xba\x43\x79\xbf\x25\x8b\x75\xf7\x18\x1d\x90\xfb\x94\xd4\xc9\x3e\x49\xc9\x96\x0d\x73\x1e\xda\xf4\xdd\x74\x2a\x79\x23\x26\x78\x53\x1f\x38\x9e\x5d\x75\x61\x47\x79\xc6\x99\x62\xa0\x67\x4c\x07\x89\x39\x10\x7a\x65\x6a\x21\x96\xbb\x39\x6a\x1b\xb9\xb4\xac\xd0\x93\x42\x97\x00\xe4\x04\x49\x77\x41\x88\x2f\xc7\xca\x70\xb3\xb8\xef\x2f\x6c\x09\x5f\xab\xf1\x1e\xa1\xee\xc4\xf6\xff\x22\xc7\x03\xd4\xc7\xb5\xc7\xef\x10\x6b\xb8\x25\x10\x6b\x84\xb8\x9a\x37\x32\x9b\x58\xb0\xe6\x9a\x78\x73\x15\xcc\x75\xc7\xc3\x81\x6e\x15\xae\xe4\x8c\x7d\xec\x96\x55\x51\xa2\x0a\x7f\xa2\x75\x3e\xce\x3d\x11\xae\xe3\x02\xd2\x14\xa0\x1a\xe9\x73\x40\x68\x46\x38\xdc\x21\x6a\x45\x10\xde\x97\x05\x6e\xfb\x08\xc8\x95\xbd\xb7\xb0\xac\x0b\x11\xf7\x3e\x6a\x7b\x62\xe8\x00\xc7\xab\xc9\xf8\x3e\x73\x4c\x9b\x5b\x62\x59\x9b\x69\x8b\xb5\x75\xc0\x33\x41\x55\xa4\xa4\x5f\x16\xd0\x07\xdc\xd1\xb6\xeb\x7b\x7e\x89\x22\x74\xe6\x65\x0f\x9a\xcf\x3b\x15\xdd\xcf\x52\x34\x17\xaa\x70\x49\x71\xf2\xce\x88\x94\x83\x5c\xd6\xa5\x3e\xe6\x0e\x69\xd3\x90\x86\xf4\x4c\x85\x12\xfa\x14\xfa\x34\xf6\xea\x2c\x4d\x19\xef\x8a\x82\x5f\xbb\xcc\x5a\x2a\x6d\xa2\xc0\xca\xcf\x9a\x04\x5f\xea\xfd\x07\x21\x5b\x17\x78\xea\x03\x64\x56\x8c\x4f\x29\xaa\x8e\x02\x63\x3c\x1b\x0d\x5a\x37\x39\x14\xb9\xb2\x8d\xe4\xab\x29\x8d\xef\xb0\x8b\x27\x9c\x44\x1c\x0a\x58\xc5\x0b\xbd\xb7\xce\x07\xb2\xdc\xea\xfe\xc9\x0b\xb7\x42\x25\x8a\x1a\x0b\x36\x55\x6f\xfb\x3f\x56\xe9\xfb\xfb\x37\x71\xd4\x44\x77\xa4\xe4\x43\xfd\x74\xfa\xbe\xcd\xd2\xc5\xdb\xd5\xa1\x7e\x3a\x39\x6d\x96\xe6\xf5\xa7\x77\x0f\x4d\x53\xde\x7d\xf8\xf0\xfc\xfc\xbc\x7c\x5e\x2d\x8b\xea\xf4\x21\xf0\x3c\x0f\x57\x7e\xe7\x1c\x93\x34\xfd\xf4\xee\x6d\xb0\x3a\x1e\x8f\xef\xba\x16\x7d\x7a\xb7\x7b\x47\xdb\x42\x7e\x7d\x4a\xd0\xf3\xef\x8a\xf6\xd3\x3b\xcf\xf1\x9c\x9d\xb3\x7b\xf7\x76\x85\xde\xae\x0e\x65\xd4\x3c\x38\xf1\xa7\x77\x7f\x0c\x97\x41\xe8\x78\xa9\xbb\x76\xba\xff\xfc\x65\xe8\xfa\xcb\xf0\xc7\x35\x2e\x5f\xa7\xc1\x32\x74\x83\x65\xf8\x63\x57\xed\x97\x77\x1f\x3a\x70\x4c\xfe\xed\x0a\xdd\xbf\xb9\xd1\xf7\xe9\x7f\x02\x01\x04\xcb\x2d\x11\x80\xbf\x0c\x71\xe3\x7f\x5c\xe1\xbf\xd7\x29\x6e\xb5\x83\x5b\x4e\xbe\xef\xd2\xb5\x4b\xfe\xb3\x92\x40\x92\xc7\xc9\x21\x6a\x8a\xaa\xd6\x9a\x76\xc1\x89\xe7\x8e\x62\x83\xbb\xb4\xe1\x6c\x4b\x3f\xc9\x6c\x6b\x9e\xda\xef\x9d\xf6\xf0\xad\x1c\x40\xea\x0b\xc9\xb3\x02\xc3\x8e\x29\xb4\x30\x62\xe4\x93\x26\xfd\xe6\x43\x8b\xfd\x6d\x32\x3d\x50\x9e\x86\x7d\xbe\xf1\x5c\xb9\x27\x9f\x2b\xe7\x8a\x86\x63\xa1\xc2\x98\x5e\x0d\xb7\xcd\xd9\x56\x08\xa5\x5d\x2b\xfa\x42\x62\x0b\xb1\xe0\xb1\x70\xdc\xf1\x00\x73\x9f\x4b\x9f\x3a\xb0\xaf\xb4\x89\x49\x8f\x83\x7b\xa6\x74\x7a\x43\x78\x41\x5d\x93\x7f\xde\x40\x35\x17\x6e\x5e\x65\x2a\x04\x3a\xd2\xde\x71\x1a\x61\xb9\x27\x27\x74\xab\xd2\x43\x54\x8e\xd9\x1a\xf4\xa3\xaa\xd7\xc6\x21\xe9\x63\xaf\x13\xbc\xb2\x32\x47\x20\x38\xdd\x27\xfd\x11\x08\x07\x3c\x5c\x09\x99\xd5\x1a\x46\x95\x70\xa9\x2e\x49\x74\xc1\xed\xfa\xb6\x8f\x57\x8b\x09\x44\x18\x37\xa3\x2a\x9a\xa8\x41\xef\x57\x1b\x2f\x46\xa7\xfe\xf4\xb5\xfe\x3b\x90\x62\xe9\x9a\x64\x97\x10\x31\xf3\x9c\x2c\x06\x5c\x87\x02\x31\xef\xbd\x4b\xb2\x3c\x08\x49\x29\x69\x5e\xfe\x6e\x78\x1c\x1e\x2b\x3c\x34\x48\x47\x29\xf7\x8b\x0c\xc9\x2b\x43\x21\x9a\xc2\x64\x6f\x59\x6e\x43\x39\xc5\x0c\xdf\x68\x31\x27\x8d\x1d\x08\x24\xbe\xe1\x10\xbc\xea\xd0\x81\x78\x9f\x69\x88\xa6\x06\x4c\xe6\x52\xb5\x22\x9e\x86\xd0\xb8\xf7\x56\xa3\x0f\xdd\xf5\x64\x0f\xd0\x04\xee\x0b\x39\xbd\x1f\x8e\x98\xb8\x81\xad\x40\xcd\xa4\xc8\x81\x4a\x35\xda\xfc\x9f\x86\xf7\xa5\xcc\xf1\xc5\x06\x84\x34\x2f\x29\x47\x83\xa0\xe9\x82\x77\x3e\x55\xf1\x4f\xfd\x9b\xb8\x13\x01\x64\x01\xd9\xaa\xfc\x8c\x59\x8c\x1f\x5b\x0b\xae\x6c\xec\x1b\xa0\xf1\x6e\xfc\xd8\x3b\x48\xfe\x32\xac\xc5\x94\x4e\xd0\xe7\x2f\x63\xa6\x3e\xec\x60\xef\xa3\x1a\x61\x51\x74\x24\xc4\x3e\x1c\xbe\xfe\x53\x92\x95\x45\xd5\x44\x39\x9b\x21\x16\xc3\x37\xfd\xc5\x52\x11\x14\x7f\x50\x42\x65\x49\x1c\xa7\x0a\x9a\xf4\x9b\x12\x96\x6e\x72\xc2\xfc\x76\xdf\xd4\xdc\xe2\x49\x51\x87\x80\xad\xa0\xc7\xa2\x6e\x78\xff\x15\x80\xdf\x9f\xf8\x77\x64\x95\xa9\x66\x00\xe0\x88\x81\x66\xf2\x65\x8f\x65\xbd\x33\x4e\xdf\x64\x92\x6a\x43\x5f\x18\x17\x1c\xe4\x65\x13\x1c\x0e\x8a\x86\x08\x2f\xb2\x02\xe0\xdd\xab\x37\xaa\xa6\x0c\xf0\x5c\x63\xc6\x52\xb9\x39\x22\x04\xfc\x4d\xdf\xa4\x70\x1d\xee\x37\x81\xaa\x49\xec\xeb\xa6\x00\x70\xb0\x8b\xb6\xeb\x50\xd9\xa0\x0e\x9a\x6f\x0e\x2d\x03\x1a\xc3\xd5\x86\xbe\xe8\x1b\xe2\xa3\x2d\x5a\xad\x15\x0d\x19\xdf\x09\x85\x20\xb7\x51\xb0\xdf\xa9\x5a\x81\x41\xb9\x26\x90\x02\x99\x7f\xa6\x9e\x54\x6c\xe0\xdc\xdf\x46\xbb\xbd\x82\x73\xee\xb9\x4d\xd0\x9b\x39\xf8\xde\x56\xc5\x3c\x85\xe6\xf8\xef\xcb\xe4\x26\xf0\xb5\xa1\x2f\xfa\x86\xc4\xab\x5b\xe4\x79\x8a\x86\xb0\x0f\x57\x42\xb0\x87\x55\xa8\x56\xa5\x0e\x98\x6b\x06\x2d\x92\x5b\xc1\xd5\x05\x3e\xe8\xdb\xb0\x8f\x03\x7f\xa5\x6a\x03\xf3\x02\xa4\x32\xa9\x9b\xaa\x09\x04\x96\x6b\x41\x57\x22\x37\x80\xad\x29\x97\x1b\xba\x20\x42\x1e\x0a\x95\x5d\xd0\xbf\xa4\x08\x3d\x81\xbc\x5e\x45\x6b\x4f\xdd\x01\xd5\x67\x41\xfc\xd5\x67\x50\xf8\x43\x3d\xa9\xd8\x30\x0a\xe2\xc0\x0f\x54\xe3\x97\x9c\x81\xd6\x8c\x81\xa3\x02\x8e\x4d\x87\xf9\x77\xe3\xf3\x7b\x20\x12\xc6\x3b\x92\x4f\x35\xd3\xbb\xe1\x6a\xc0\x71\x5a\xd4\x5e\x2e\xd7\x20\x60\xf6\x36\xd8\x92\x69\x48\xd8\x29\xde\xf4\xa0\x82\x06\xcd\xb8\x3b\xc8\x14\x4c\x43\xe1\xf1\xa2\xf4\xf4\xa2\xe3\xab\xd3\x63\x7e\x26\x61\x09\x40\x7d\x2c\xcf\x28\x1e\x01\x6e\x08\xfb\x19\x04\x22\x80\xd1\xd0\x9c\x06\x88\x5f\xf1\x40\xe9\xf3\x34\xc0\xe2\x2a\x83\x07\x57\xae\x30\x06\x70\x6e\x46\xe7\x81\x95\xb3\x79\x0f\xcc\xcc\xa2\xc2\x73\xa2\xaa\x19\xb4\x87\xe4\x67\x31\x31\x93\xbb\x62\x06\xeb\x81\xb9\x99\x83\x87\x55\xce\x1a\x43\x07\x49\xa3\xc7\x68\xad\x47\xb2\x83\xb5\x14\x9e\x84\x57\x59\xca\xa1\xb5\x8c\xb5\x12\xdb\x0a\xf6\x2d\x31\x48\x28\x1e\x3c\x2a\xf9\x5e\x51\x85\x32\x0d\xa0\x0a\x2a\xd4\x83\x41\xc6\x09\x4c\x6c\xc2\xe3\x30\xa7\x1f\xd1\xd1\x94\xed\x99\x25\x1a\xfd\xeb\x1b\x16\x94\x95\x46\x70\x0e\x75\xb3\x98\x78\xe2\x92\xe9\x9c\x28\xeb\xb9\x64\x4f\x0a\xdd\x58\x19\x00\x0f\x49\x75\x48\x11\x08\x1c\x7a\x6f\x75\x90\x65\x92\xa6\x0a\x38\x03\x4d\x0f\xe6\x15\x02\x21\xe7\xba\x8e\x49\xfb\x3a\xe7\xbf\x62\x37\x2f\x72\xe8\x15\x55\x88\x74\xec\x76\xb1\x20\x30\x40\xa4\x03\xe8\x82\x47\x9a\xb8\x12\x0c\x0c\x41\x69\xaa\x37\xc0\xdb\x83\x5d\x99\xba\xba\x2b\xc7\xbb\xc6\x72\x0d\xd8\x01\xf5\x5d\x2d\xc0\x91\x0f\x20\xe0\x31\x45\xad\xfa\x05\x21\x51\xf9\xb9\x7d\x33\xad\x6c\x15\x78\x99\xaf\x3a\xf4\x2c\x12\x99\x8a\xe9\x81\x1b\x6c\xb8\x19\x0d\xd2\xea\x50\xff\x74\x0a\x81\x61\x15\xc9\xa0\x4a\x00\x1c\xab\x19\x56\x1a\xc5\xe1\x80\x81\x4d\x50\x0d\xfb\xde\x8e\x4e\xbf\x64\x28\x97\x09\xdc\x99\xd4\x0c\x80\x1e\x75\xcd\x42\xdb\x38\xf8\x51\x35\xec\x94\x4e\xab\x76\x50\x3f\x28\x09\xe8\xb5\xcf\x46\xff\xec\x53\x63\xc6\x6e\x16\x4f\x57\xc2\x2c\x9e\xa7\x84\x59\x7c\xbe\x12\x66\xf1\x1c\x25\xcc\xe2\x39\x4a\x98\xc5\xe7\x28\x61\x16\x9f\xa7\x84\x59\x7c\x29\x25\xcc\xe2\xaf\xad\x84\xdc\x1b\x4e\x78\xc1\x31\x5d\x09\xd3\xd3\x3c\x25\x1c\xe0\xce\x50\xc2\xf4\x34\x47\x09\xd3\xd3\x1c\x25\xec\xa1\xe6\x29\xe1\x00\x3d\x53\x09\xd3\xd3\xa5\x94\x70\xec\x87\xaf\xa5\x84\xfc\x6b\x5f\xb1\xdb\xa6\xd3\xb5\xb0\x4d\xe7\x69\xe1\x00\x77\x86\x16\xb6\xe9\x1c\x2d\x6c\xd3\x39\x5a\xd8\x43\xcd\xd3\xc2\x01\x7a\xa6\x16\xb6\xe9\xa5\xb4\x70\xec\x87\x6b\x6a\x61\x59\x25\x7d\x6c\x71\x19\xbb\xe4\xaf\xe9\xaa\xd7\x81\xcd\xd2\x3e\x16\xf4\x0c\x05\xec\xd0\xcc\xd0\xc1\x0e\x70\x86\x1a\x32\x80\xf3\x34\x91\x45\x30\x53\x19\x3b\x14\x17\xd2\x47\xae\x67\xae\xa2\x92\x4b\x94\xed\x51\xec\x56\xa8\x2e\x8b\xbc\x1e\x8e\x6d\x99\xae\x32\xc9\xb7\x50\x87\xb7\x9d\xf9\x63\xe1\xca\x3b\x59\x22\x5d\xe3\x0b\xe6\xb0\x1b\x2e\xb1\x2f\x95\x90\xf3\xef\x0b\xa8\x6a\x42\x0e\x9d\x80\x9f\x48\x01\xf8\xa5\xd8\xff\x0d\x1d\x1a\xf0\xd3\x53\x12\xa3\x62\xde\xf1\x7f\xe0\xf5\x31\x75\x0e\x0c\x29\xdb\x8f\xdc\xe6\xc0\xdf\xbf\xdc\x0a\x37\x8e\xd9\xb3\x70\xeb\x60\xb9\x0b\xb7\xfe\x7a\xf5\x56\x8d\xc3\xdf\xe8\x71\x84\x9b\x65\x10\x6a\xe0\xd7\xfb\x97\x95\x06\x7c\xab\x83\xf5\xf7\x2f\xbe\x06\x96\x7b\x98\x9d\x1c\x89\x1d\xcc\x81\x22\xdb\xb3\xa8\xff\xc6\x2a\x0c\xee\xee\x25\x73\xd3\x53\xf4\x26\x0a\x50\x2d\xbe\x01\x6e\x85\x9e\x50\x55\x23\x6d\x43\x86\x4a\xe6\x06\xc1\x55\xa5\x86\x99\xc9\x0a\xf5\xac\x1a\x6a\x24\xfe\x5c\x45\xa5\x40\x72\x7c\xd8\x19\xa4\xa1\xfa\xcc\x20\xcd\x0b\x25\x5a\xfa\x49\x8d\x18\xaa\x20\xf0\xab\x10\xd5\xc8\x98\x56\x46\xa6\x6a\x0c\xb1\xe3\x10\x10\x95\x9f\xe1\x86\x70\xab\xbe\x32\x28\xc9\xf9\x2b\x4f\x4c\xf0\x45\xec\x14\x49\xaa\x01\xb2\x8c\x81\x14\xe1\xd4\x11\xa9\xaf\x44\xea\x6b\x90\xfa\x4a\xa4\x5d\x52\x0f\x89\x57\x26\x01\x08\x88\x76\xc8\x05\x62\x42\xec\x2b\x11\xfb\x5a\xc4\x20\xc7\xc2\xd1\xfb\xee\x69\x7b\x51\x20\xe4\xbc\x7e\xf7\x45\x20\x00\x3f\x39\x0e\x54\x85\xa9\xa1\x3c\x06\x69\xe1\x72\x2b\x4a\x52\x45\x98\x4e\x77\xfa\x19\x24\x45\x3f\x99\xa8\x41\xd5\x60\x5a\xf4\x81\x7f\x90\x18\xad\x6b\xa4\xc6\xa5\x0a\xb0\x21\x1a\x91\x0d\x05\x90\x66\x9c\xd4\x4d\x95\xec\x1f\x1b\x64\x49\x96\xe2\x52\x9e\x7d\x23\x17\xf2\x40\x45\x61\xdf\x90\x13\x89\x29\xb2\x28\x98\xc8\xc8\x1a\x42\x89\x00\x2a\x22\x93\x40\xe6\x76\x80\xaa\xc1\x1d\x9a\xd7\x92\x51\xeb\x05\x4b\x84\x3f\x62\x29\x92\x81\x8f\x58\x0a\x84\xcc\xe7\x30\xfb\x7e\xa9\x50\x73\x78\x50\xf5\x4c\xf7\x51\x47\x08\xac\xc3\xd2\xd1\x99\x0a\xb2\x60\xd7\xd8\x0b\x0e\x83\x9d\x1e\xa8\x6d\x05\x43\x4c\xa9\x0d\x56\xe6\x82\x27\x04\x6a\x04\x43\x4b\xa7\x15\x16\xf6\x82\x27\x06\x5b\x0b\x86\x9a\xc2\x64\x08\xe4\x8c\x06\x83\xa7\x0a\x9a\x0b\x86\xa8\xda\x66\x80\x74\x4d\x16\x63\xd4\x18\x48\x37\x39\x9d\xd1\xe8\xe7\x48\xd4\xa4\xa1\x35\x4a\x8f\xe4\x0d\x18\x81\x52\x97\x58\xb6\x1b\x0a\xd0\x52\x64\x84\xbe\x53\x2e\x46\x18\x0a\xd0\x00\x60\x49\x68\x46\x40\x47\xc3\x46\xfd\x09\x25\x59\xf7\x59\x3a\x4a\xe5\x67\xa8\x68\x35\x9f\xd0\x00\xd5\x9e\x25\xa3\xd3\xfb\x8e\x92\x49\xe9\x09\x1d\x85\x2d\x64\x29\xe9\x0d\x62\x47\xcb\x6c\x0f\x69\x1f\x41\x2a\xc7\xf7\x92\x46\xe7\x3a\x5a\x6a\x85\x33\xed\x93\x76\x3d\x9c\xb1\xe1\x1e\x4b\x0f\xcf\xc2\xc7\xeb\x03\x2f\x3d\x11\xd6\xd1\x9b\xe2\xea\xd9\x39\x7b\x22\x35\xc9\xe3\x9b\xec\xf3\x4d\xf0\xfa\xe0\xa6\xda\xd0\xd7\x3b\x7f\xd3\xdc\x3f\x91\x8b\xd1\x59\xb3\xf2\x02\x0d\x7e\xa0\x88\x9d\x75\x06\x2d\xdd\x41\xa3\x43\x08\xb5\x40\x29\x45\xb3\x5f\x68\xe9\x19\x8a\x54\x47\xf7\xd0\xc6\x41\xd4\xbb\x88\x22\x6e\xd6\x4f\xb4\xf3\x14\x75\xbe\x22\x88\xdd\xd7\x60\xf7\xb5\xd8\x7d\x3d\x76\xde\x73\xb4\xf3\x1d\xf5\xde\xa3\x82\x82\xaf\xa1\xe0\x1b\x28\x28\xda\x20\x39\x92\x19\x3b\x3f\xda\x79\x93\x13\xfc\x49\x0d\xd9\x61\xb2\xb4\x71\x2b\xad\x1d\x4b\x0d\x41\x76\xe6\xb4\xf4\x2f\x2d\x3d\x4c\x0d\x51\x6e\xe1\x68\xeb\x68\x4e\x73\x35\x35\xd4\xd9\x05\xe4\x04\x8f\x73\x92\xcf\xd9\x93\xe7\xbc\x1b\x95\x56\xe9\x96\x5c\x96\xce\xa7\x82\x1e\xa4\x4e\xea\x85\x97\x95\x17\xaa\xa0\xa4\xd0\x23\xed\xf2\xcb\xc2\x1d\x55\x50\xe3\xd7\x61\xf6\x5e\xa9\x95\x5f\xaa\xec\x3b\x66\x35\x66\xed\x9e\xda\x38\xa8\x3c\x41\xa3\x11\x32\xf9\xa9\xd6\x9e\xaa\x92\x2e\xa4\x36\x7a\x87\xd5\xd2\x65\x55\x52\x54\xa8\x8f\xd1\x73\xb5\xf2\x5d\x95\x54\x55\x76\xc8\xec\xc2\x4e\x71\x62\x95\xe4\x15\x86\xc8\xca\x97\x9d\xe0\xcd\x6a\xd4\x0b\xd6\x68\xb3\x53\x6b\xe7\xd6\xf2\x84\x3b\x97\x26\x63\x7c\xdb\x09\xde\xad\xc9\xbf\x85\x49\xc1\xe3\xc7\xe8\xe6\xda\x39\xba\x30\x49\x68\xe8\x18\xfc\x5d\x1b\x8f\x17\x26\xa6\x18\x35\x66\xc7\xd7\xec\xfa\xc2\x04\x95\x76\xd7\xc6\x03\xb6\xf1\x81\x55\xfd\x08\x2b\xaa\x85\x2b\x6c\xe1\x0c\xdb\x1f\xda\x24\x44\xb3\xf8\x0a\x1e\x71\x16\x5f\xd3\x23\xee\x9a\xf4\x95\x3c\xe2\xa1\xa9\x5f\xd5\x23\xce\xe2\x4b\x7a\xc4\xe4\xac\xef\x85\x3d\x62\xda\x82\x2b\x7b\xc4\x59\x7c\x39\x8f\x38\x8b\x2f\xe9\x11\xf7\xd8\x2f\xe3\x11\x67\xf1\xa5\x3d\xe2\x91\xc2\x15\x3c\x62\x4c\xec\x2b\x78\xc4\x59\x7c\x65\x8f\x18\x1b\xa3\xab\x7b\xc4\x59\xfc\x35\x3d\xe2\x2c\xfe\x6a\x1e\xb1\x52\xab\x2e\xe4\x11\x2b\xd4\xe9\x02\x1e\xb1\x5a\x8f\x2e\xe1\x11\x63\x05\xba\xb6\x47\x4c\xfa\xee\xba\x1e\xb1\x52\x5d\x2e\xec\x11\x2b\xd4\xe6\x82\x1e\xb1\x5a\x7d\x2e\xe9\x11\x6b\xec\xd0\x35\x3c\x62\xb5\x21\xba\x8e\x47\xac\xd1\xe8\x0b\x7a\xc4\xb8\xd5\x57\xf2\x88\x95\xe3\xe7\x72\x1e\xb1\x62\xe8\x5c\xc6\x23\x56\x8f\x9a\x0b\x79\xc4\x3a\xbb\x7b\x41\x8f\x58\xa3\xa8\x57\xf0\x88\xb9\x1b\x64\xdd\xe8\x38\x5d\xc1\x23\x4e\x4f\xd7\xf4\x88\xbb\x26\x7d\x25\x8f\x78\x68\xea\x57\xf5\x88\xd3\xd3\x25\x3d\x62\x72\xf1\xf0\xc2\x1e\x31\x6d\xc1\x95\x3d\xe2\xf4\x74\x39\x8f\x38\x3d\x5d\xd2\x23\xee\xb1\x5f\xc6\x23\x4e\x4f\x97\xf6\x88\x47\x0a\x57\xf0\x88\x31\xb1\xaf\xe0\x11\xa7\xa7\x2b\x7b\xc4\xd8\x18\x5d\xdd\x23\x4e\x4f\x5f\xd3\x23\x4e\x4f\x5f\xcd\x23\x56\x6a\xd5\x85\x3c\x62\x85\x3a\x5d\xc0\x23\x56\xeb\xd1\x25\x3c\x62\xac\x40\xd7\xf6\x88\x49\xdf\x5d\xd7\x23\x56\xaa\xcb\x85\x3d\x62\x85\xda\x5c\xd0\x23\x56\xab\xcf\x25\x3d\x62\x8d\x1d\xba\x86\x47\xac\x36\x44\xd7\xf1\x88\x35\x1a\x7d\x41\x8f\x18\xb7\xfa\x4a\x1e\xb1\x72\xfc\x5c\xce\x23\x56\x0c\x9d\xcb\x78\xc4\xea\x51\x73\x21\x8f\x58\x67\x77\x2f\xe8\x11\x6b\x14\xf5\x0a\x1e\x31\xff\x9c\x05\xa1\xda\xa6\x57\x70\x89\xdb\xf4\x9a\x2e\x71\xd7\xa4\xaf\xe4\x12\x0f\x4d\xfd\xaa\x2e\x71\x9b\x5e\xd2\x25\x26\xaf\xa0\x5c\xd8\x25\xa6\x2d\xb8\xb2\x4b\xdc\xa6\x97\x73\x89\xdb\xf4\x92\x2e\x71\x8f\xfd\x32\x2e\x71\x9b\x5e\xda\x25\x1e\x29\x5c\xc1\x25\xc6\xc4\xbe\x82\x4b\xdc\xa6\x57\x76\x89\xb1\x31\xba\xba\x4b\xdc\xa6\x5f\xd3\x25\x6e\xd3\xaf\xe6\x12\x2b\xb5\xea\x42\x2e\xb1\x42\x9d\x2e\xe0\x12\xab\xf5\xe8\x12\x2e\x31\x56\xa0\x6b\xbb\xc4\xa4\xef\xae\xeb\x12\x2b\xd5\xe5\xc2\x2e\xb1\x42\x6d\x2e\xe8\x12\xab\xd5\xe7\x92\x2e\xb1\xc6\x0e\x5d\xc3\x25\x56\x1b\xa2\xeb\xb8\xc4\x1a\x8d\xbe\xa0\x4b\x8c\x5b\x7d\x25\x97\x58\x39\x7e\x2e\xe7\x12\x2b\x86\xce\x65\x5c\x62\xf5\xa8\xb9\x90\x4b\xac\xb3\xbb\x17\x74\x89\x35\x8a\xfa\xda\x2e\xf1\xf2\x98\x16\x51\xc3\xbc\x99\x4e\xfe\xbe\x23\x2f\x6b\xc1\x0f\xc2\xe0\xea\xcc\xcb\xf2\xb4\x7e\x57\xa2\x04\x18\xdf\xe9\xa3\xf5\x15\x4f\x7e\x9b\xef\x35\x63\x6c\x35\x9b\x3d\x5f\xc3\xf2\xb8\x9c\xa6\x50\x5c\xf6\x72\x35\xe7\x12\x1c\xfb\xcc\xa0\xb2\x01\x53\xce\xa2\x63\xbc\x59\x3c\xa7\x15\x59\x3c\xaf\x15\xc2\x93\xc5\xf3\x5a\x21\x9c\x1f\x20\x9a\x73\x9a\xd3\x8a\xf4\x34\xaf\x15\xc2\x9b\xb7\xf3\x5a\x21\xc6\x7c\x30\xe2\x36\x9d\xd3\x8c\x36\x9d\xd7\x0c\xe1\xd1\x54\x8b\x66\x2c\x1f\x6b\x92\x92\x24\x45\x87\xc6\x8d\x86\x57\xae\x68\x56\x3e\xe6\xe3\x9d\x13\xc9\xaf\x30\xba\x59\xf1\x8b\xb1\x92\xfe\x3b\xc0\xc5\xf8\xd0\x05\xc8\x06\x30\x63\x01\x7c\x80\xb5\x6a\x73\x25\x43\x05\x99\xdd\x51\xe0\x20\xbb\x90\xf0\x65\x76\xe1\x5a\xb5\xb9\x92\xa1\x42\xc7\x6e\xff\xea\x23\x23\xda\xf1\x21\x48\x55\x1b\x07\xa0\xee\xa5\x48\x11\x8c\x96\x02\x80\xfd\x63\x8b\x78\xa6\x6f\x92\x83\xf8\x02\x23\x2d\xd5\x01\xf6\x8f\x5c\xaa\x1e\xbf\xd4\x02\xf7\x2f\x3c\xaa\x5e\x7e\xd4\x02\x1f\x93\xb6\xcf\xc5\x32\x42\x76\x85\xfa\x96\x26\x87\xcf\x2f\x22\x5c\xaf\x0f\xf4\xab\xd0\x73\xac\x44\xe4\xef\x74\x92\xc3\x94\xc7\x1c\x2f\x02\x4b\xe2\x1b\x96\x5c\xca\x73\x38\xc9\xb9\xb7\xf2\x04\xe4\x6c\x4a\x15\x08\xff\xe4\x3c\xea\x0c\x89\xdf\xd4\x8f\x25\x6e\x52\xed\xbc\x7f\xaf\x12\xcb\x8d\x53\x54\xce\x7b\x51\x18\x37\x43\x1e\x51\xf2\xe7\x28\x02\xb5\x7c\x3f\x8a\x9f\xb9\x62\x46\x4c\x1c\xb3\x81\x27\xe4\x8f\xad\xdc\x22\x4f\x5f\xb4\xcf\x86\xf6\xe6\x5e\xc8\x83\xee\xf3\xf9\xac\xf9\xe4\xee\x77\x8e\xdb\x7f\x07\xde\x60\x75\x9c\x2e\x7f\x79\x85\x0e\xcd\x7b\x6f\xe1\xd0\xff\x75\xe9\x72\x49\x2e\x22\x97\x38\x25\x7d\x34\x57\xf1\xee\x28\x65\xde\x25\x69\xda\xa2\x7d\x8a\xee\xba\xdc\xdf\x0b\x07\xf8\xc4\xe4\x72\x13\x07\x27\xdb\xca\x21\xfd\x7b\xdf\xcc\xa1\x60\x6c\xc7\x53\x52\x27\xfb\x14\x31\x0d\x19\x93\xc6\xf3\xcc\x57\x59\x94\x8e\xec\x3e\x44\x31\x93\x84\x96\x64\xa9\x27\x45\x77\x8e\xe7\x90\x54\xbb\x15\xca\x86\x14\x39\xd5\x69\x1f\x31\xb2\x59\x7a\xdb\xf0\x06\x1a\x33\x1d\x0a\x18\x25\x41\xe4\x43\xd8\x7c\x1d\x32\x26\x07\x0f\x8b\x8f\x20\x5a\x81\xd8\xb4\xbc\x31\x53\x06\x8b\x50\x65\xbd\x9f\xdd\x20\xe4\xd2\xf4\x06\xe1\x5b\xb8\x5e\xe8\x71\xf5\x14\x59\x7e\x9e\xdd\x2d\x8f\x6f\xab\xc2\xe7\x7b\x3c\x42\xdf\x53\x61\x1c\x27\x16\x46\x6d\xa0\xaa\x0f\x43\x63\x86\x6c\xcb\x30\xf5\x87\xa1\x35\x7d\x45\x45\x73\x1e\x86\xe6\xf4\x15\xb7\x2a\x8c\x43\x7b\xd8\x37\x7c\xe1\xaa\x63\x83\x58\xbd\x87\xea\x66\x8c\x9c\xb2\xa8\x75\x0d\xb2\xca\x1e\xf8\xea\x26\x56\xf0\xfa\xf2\x89\x25\xc1\xac\x37\x3d\xef\xe9\x59\x09\xf3\xc0\xc3\x30\x74\x9e\xc0\xa7\xc6\x9e\xc0\xfe\x86\x09\x3c\xc1\xb2\x84\x11\x0f\x59\xf9\x7a\x4b\x08\xbe\x08\x9a\x35\xae\xb7\xc0\x3f\x5f\xf8\xea\x9a\x8c\x81\x59\x45\x41\x5a\x01\x44\x97\x2f\x30\xdb\x2b\xe8\x68\x93\x05\x66\xa9\x82\x94\x26\x57\x60\xd6\xef\xaf\x0c\xed\x56\x27\xfb\xca\x1a\xd7\xa7\x5c\xf9\x40\xeb\x35\x80\x15\x05\x6c\x05\xc0\x5e\x06\x1a\xd0\xbd\x82\xe6\x20\x09\x0d\x6c\xaa\x20\x4b\xe5\xa1\x81\x74\x03\x51\x2a\x1a\xa1\x04\x94\xc1\x00\x12\x8a\x46\x26\x01\x65\x2e\x80\x65\xa2\x11\x09\x4c\x71\x14\x89\x46\x22\x30\xd1\x5e\x22\x6a\x81\xac\x78\x81\xf8\x6a\x71\xac\x28\x73\x2b\x59\x1c\xbe\x5a\x18\x2b\xca\xd7\x0a\x12\x86\xaf\x16\x05\x4c\x6d\xc8\x3a\xaa\x16\x04\x4c\x90\x66\x1a\x55\x8a\x61\x2d\x88\x41\xa7\x17\x6b\xca\xda\x1a\x10\x84\x4e\x2f\xd6\x94\xb3\x35\x28\x0a\x9d\x5e\xc0\x14\x07\x61\xe8\xf4\x02\x26\x4a\xc5\xa1\xd1\x8b\x90\x17\xc8\x4a\x2d\x8e\x90\x32\x17\xca\xe2\x58\xa9\x85\x11\x52\xbe\x42\x48\x18\x2b\xb5\x28\x60\x6a\xbd\x28\x56\x6a\x41\xc0\x04\x3b\x41\xa8\xc0\x86\x04\xb2\xe3\xb2\x1a\xac\x46\xa7\x8f\xf2\x45\xa8\xaf\x99\x3f\x4a\x3a\x7f\x94\xad\x08\xa3\x9b\x40\xca\xbd\x8a\x92\x76\x06\x29\x53\x15\x31\xcd\x14\x52\xf6\xd6\x75\x6c\xbc\xda\xb2\x96\x74\x0e\x29\x5f\x04\x28\xe3\x24\x52\xd2\x49\xa4\x6c\x45\x48\xf3\x2c\x52\xee\x55\x54\x2d\xa6\x91\x32\x55\x11\x36\xce\x23\x65\x6f\x66\x19\xd1\x68\x24\x13\x50\x1e\x03\x50\x32\x1a\xc1\x04\x94\xbf\x40\x21\x18\x8d\x5c\x14\x34\xcd\x73\x49\x99\xaa\xc8\x9a\x26\x93\xb2\xb7\xb9\x83\x54\x7c\xb5\x4c\x56\x94\xbf\x15\x94\xd2\x41\x2d\x91\x15\x65\x6d\x05\x4a\xc4\x57\xcb\x43\x41\xcf\x34\xa1\x94\xa9\x8a\xa4\x7e\x46\x29\x7b\x83\x3b\xca\x42\xa7\x21\x6b\xca\xdd\x1a\x92\x86\x4e\x43\xd6\x94\xb9\x35\x2c\x0f\x9d\x86\x28\x68\x9a\x67\x95\x32\x55\x91\x35\x4d\x2b\x65\x6f\x7d\x07\xa9\xac\xd4\x32\x09\x29\x7f\x21\x20\x93\x95\x5a\x22\x21\x65\x2d\x04\x25\xb2\x52\xcb\x43\x41\xcf\x34\xb5\x94\xa9\x8a\xa4\x7e\x6e\xc9\xdc\x5c\x58\xa2\xbb\xfa\x35\x7a\xde\x2f\x98\x73\x60\x95\xee\xea\x97\xe9\x79\xbf\x60\xce\xc1\x85\xba\xab\x5f\xa9\xab\x28\xf7\xa2\x71\xf5\x8b\x75\x15\xf1\x4e\x3e\x5a\x60\x37\x0f\x24\x19\xe9\x44\xd4\x2f\xa0\xf3\x00\x14\x91\x4e\x42\xfd\x02\x3a\x0f\x14\x12\xd2\x09\x48\x41\x97\x11\x90\x4e\x3e\x0a\xd2\x83\x7c\x34\xe2\x11\x96\xef\xae\x66\xfd\x9e\xf7\x4b\xea\x1c\x58\xc1\xbb\x9a\x25\x7c\xde\x2f\xa9\x73\x70\x11\xef\x6a\x56\xf1\x2a\x9a\x83\x60\x34\x0b\x79\x15\x59\x2a\x16\xf5\x5a\x3e\x5f\x8b\x42\xd1\xea\x4c\xbf\xb8\xce\xd7\x90\x58\xb4\x3a\xd3\x2f\xae\xf3\x35\x2c\x18\xad\xce\x28\xe8\x8e\xa2\xd1\xea\x8c\x82\x74\x2f\x1c\x9d\xce\x08\x4b\x7b\x57\xb3\xb6\xcf\xfb\xe5\x76\x0e\xac\xee\x5d\xcd\xf2\x3e\xef\x97\xdb\x39\xb8\xc0\x77\x35\x2b\x7c\x15\xcd\x41\x30\x9a\x45\xbe\x8a\x2c\x15\x8b\xda\x16\x8f\x21\xb7\x5e\x2c\xca\x90\x5b\xb7\x49\x48\x79\x14\xe1\x3a\xc9\x28\x61\xab\x11\xb6\x95\x61\x2b\x43\xb0\x6f\xaf\xa5\xdc\xcb\x47\x09\x9e\x6a\x89\x77\x22\x52\x00\x9b\x8e\x30\x64\x6e\x9d\x8d\x67\x86\x15\xb1\xb6\x7e\xbb\x38\x23\xc7\x0f\xb0\x43\x82\xff\x78\x01\x40\x41\xbf\x69\x00\xaf\x58\xf0\x16\x02\x87\x5d\xa8\x01\xc1\xde\x48\x5f\xe1\x4d\x0d\x18\x52\x23\x0b\xa0\x63\x35\xc0\x63\x08\x5f\x12\x17\x9c\xc1\x9f\x15\x9a\xcf\x32\xed\x83\x42\xd3\x22\xa9\x58\x24\x2d\x84\x44\xe7\x74\xf1\x02\xd4\xf2\xa2\xf5\xbf\x78\x31\x6a\xd9\xd1\xb8\x62\x9c\x30\x03\x59\x98\x26\x59\x06\x2c\xff\x01\x2c\x4b\x93\x28\x03\x96\xf7\x40\x25\x4a\x93\x24\xb5\x9c\xe8\x3c\x36\x5e\x90\x5a\x66\xd4\xce\x1b\x27\xc7\x95\x28\x47\xdf\x20\xc5\x15\xcb\xfb\x0a\x92\xa2\x6f\x90\xe1\x8a\x65\x7b\x05\xcb\xd0\x37\x48\x50\xcb\x85\xda\xc7\xe3\xe5\xa7\x65\x44\xe5\xee\x71\xd2\x5b\x4b\xd2\x33\x6a\xe1\x9a\xe5\x7c\x0d\xca\xcf\xa8\x85\x6b\x96\xf1\xb5\x42\x82\x46\x2d\xd4\x72\xa2\xf3\x0a\x79\x29\x6a\x99\x51\x3b\x88\x9c\x1c\x43\x51\x8e\x2b\x83\x14\x43\x96\xf7\x10\x92\xe2\xca\x20\xc3\x90\x65\x3b\x84\x65\xb8\x32\x48\x50\xcb\x85\xda\x8f\xe4\xe5\xa7\x65\x44\xe5\x52\xf6\x28\x4a\x6e\x2a\x52\x45\x2d\x87\xda\xec\x44\x5c\xbe\x40\xb0\xda\x99\xb8\x64\x67\xe2\xb2\x05\xe1\xf5\x53\x71\xb9\x37\x73\x60\x98\x8b\xcb\xd4\xcc\x84\x76\x32\x2e\xb9\x79\x47\x1f\xec\xe4\x25\xe7\xb3\x7c\xfb\xb0\xe4\xb4\x58\xd8\xe9\xb8\x6c\x41\x2c\x36\xf3\x71\xb9\x37\x73\x63\x35\x21\x97\xa9\x99\x21\x8b\x19\xb9\xe4\x26\x20\x6d\x8c\x94\x17\x68\xc0\x36\x21\x50\x08\xd4\x24\xcf\x80\x65\x3f\x50\xca\xd3\x24\x4e\x3d\x2f\x36\xb3\x72\x99\x9a\xd9\x31\x4f\xcb\x25\x37\x1b\x69\x42\xab\xbc\x28\x57\x2c\xfb\x2b\x50\x94\xbe\x41\x90\x2b\x96\xf3\x95\x42\x90\xbe\x41\x8c\x7a\x3e\xcc\x53\x73\x99\x9a\x59\x31\xcd\xcd\x25\x37\x15\x69\x23\xb2\xbc\x10\xd7\x2c\xf3\x6b\x58\x88\x46\x7d\x5c\xb3\xbc\xaf\x55\x62\x34\xea\xa3\x9e\x17\x9b\xf9\xb9\x4c\xcd\xec\x98\x27\xe8\x92\x9b\x97\x34\x81\x5c\x5e\x94\x21\xcb\x7e\x08\x8a\x72\x65\x10\x64\xc8\x72\x1e\x2a\x04\xb9\x32\x88\x51\xcf\x87\x79\x92\x2e\x53\x33\x2b\xa6\x59\x9a\xac\x71\x72\xc9\xff\x73\x2d\x1c\xc0\x9c\xf3\xba\x72\xd0\x05\x74\x2d\x7c\xc0\x9c\xf3\xba\x72\x85\x17\xe8\x5a\xb8\x81\x06\x8e\xf4\x31\x62\x7e\xe9\x63\x60\x4a\x17\x2f\xe6\x45\x1b\x00\xa2\x35\x4a\x96\xf3\xc2\xf2\x40\x21\x59\xa3\x60\x39\x2f\x2c\x0f\x94\x82\x35\xca\x55\xcf\x8f\x36\xb4\x2c\x88\x55\xcf\x92\x26\xcc\xcc\x4b\x55\xf2\x0d\x5d\x93\x73\x98\x73\x7e\x59\x0e\xba\x87\xae\xc9\x3f\xcc\x39\xbf\x2c\x57\x78\x88\xae\xc9\x45\x34\xf0\xa2\x89\x48\x0b\xd2\xd4\xb3\xa3\x8c\x4e\xf3\xb2\x5c\xcb\xb2\x34\x6b\x28\xe7\xa1\xe5\x6b\x58\x9a\x66\x0d\xe5\x3c\xb4\x7c\xad\x92\xa7\x59\x43\xf5\xfc\x68\x03\xd9\x82\x4c\xf5\x2c\x69\x82\xda\xbc\x54\x25\xbf\xd1\x35\x39\x8e\x39\xe7\xb3\xe5\xa0\xeb\xe8\x9a\x7c\xc7\x9c\xf3\xd9\x72\x85\xf7\xe8\x9a\xdc\x47\x03\x2f\x9a\xf8\xb7\x20\x4d\x3d\x3b\xca\x58\x38\x27\x4b\xf6\x7a\xa7\x3a\x24\xce\x0b\x93\x86\x97\x87\x26\xc8\x38\x54\xe1\x71\x5e\x9e\x0c\x9e\x56\x81\x47\x19\x2a\xe7\x45\x6a\xc1\x91\x3a\x6c\xce\x4b\xd5\x82\x29\x55\x08\xdd\xfe\x12\x5d\xe6\x66\xf1\x94\x38\x3a\xae\x3d\xb4\x4f\x06\x35\xc5\xd1\x19\xf0\x16\x02\x37\xc6\xd1\x4d\xf4\xcd\x71\x74\x13\x0b\x86\x38\x7a\x16\x4f\x8f\xa3\x63\x18\x96\xe9\x59\x71\x74\x06\x49\x0b\x21\xb1\x8c\xa3\x9b\x78\xb1\x8d\xa3\x9b\xd8\xb1\x8a\xa3\x67\xf1\xe4\x38\x3a\x06\x61\xf9\x9f\x13\x47\x67\x70\xb4\x10\x0e\xbb\x38\xba\x89\x13\xcb\x38\xba\x89\x19\x9b\x38\x7a\x16\x4f\x8c\xa3\x63\x00\x96\xf7\xe9\x71\x74\x06\x43\x0b\x61\xb0\x89\xa3\x9b\xb8\xb0\x8a\xa3\x9b\x18\x31\xc7\xd1\xb3\x78\x72\x1c\x1d\x83\xb0\x9c\xcf\x89\xa3\x33\x38\x5a\x08\x87\x5d\x1c\xdd\xc4\x89\x65\x1c\xdd\xc4\x8c\x4d\x1c\x3d\x8b\x27\xc6\xd1\x31\x00\xcb\xfb\xf4\x38\x3a\x83\xa1\x85\x30\xd8\xc4\xd1\x4d\x5c\x58\xc5\xd1\x4d\x8c\x98\xe3\xe8\xec\x54\x64\x11\x47\x1f\xa7\xb1\xf2\x05\x82\x35\xc5\xd1\x19\xf8\x16\x84\x37\xc6\xd1\x8d\x1c\x98\xe3\xe8\x46\x26\x0c\x71\x74\x76\xde\xb1\x8e\xa3\x8f\x33\x57\xf9\x02\x61\xb0\x8b\xa3\x33\x58\x5a\x10\x8b\x65\x1c\xdd\xc8\x8d\x6d\x1c\xdd\xc8\x90\x55\x1c\x9d\x9d\x80\x6c\xe3\xe8\xe3\x0c\x56\xbe\x40\x08\xac\xe2\xe8\x0c\x92\x16\x44\x62\x17\x47\x37\xf2\x62\x19\x47\x37\xb2\x63\x13\x47\x67\x67\x23\xbb\x38\xfa\x38\x99\x95\x2f\x10\xb8\x45\x1c\x9d\x41\xd1\x82\x28\x6c\xe2\xe8\x46\x3e\xac\xe2\xe8\x46\x56\xcc\x71\x74\x76\x2a\xb2\x8d\xa3\x8f\x73\x59\xf9\x02\x21\xb0\x8a\xa3\x33\x48\x5a\x10\x89\x5d\x1c\xdd\xc8\x8b\x65\x1c\xdd\xc8\x8e\x4d\x1c\x9d\x9d\x97\xec\xe2\xe8\xe3\xb4\x56\xbe\x40\xe0\x16\x71\x74\x06\x45\x0b\xa2\xb0\x89\xa3\x1b\xf9\xb0\x8a\xa3\x1b\x59\x31\xc7\xd1\xb3\x78\x4e\x1c\x9d\x40\xb1\x6b\x8c\x99\x71\x74\x16\x4f\x0b\xe2\xb1\x8d\xa3\x9b\x39\xb2\x8e\xa3\x9b\x99\xb2\x8b\xa3\x63\xc8\xc9\x71\x74\x02\xc4\xb5\x63\x56\x1c\x9d\x45\xd3\x82\x68\x2c\xe3\xe8\x66\x7e\x6c\xe3\xe8\x66\x96\xac\xe2\xe8\x18\x70\x62\x1c\x9d\x80\x70\x6d\x98\x11\x47\x67\x91\xb4\x20\x12\xab\x38\xba\x99\x17\xbb\x38\xba\x99\x1d\x8b\x38\x3a\x06\x9b\x1c\x47\x27\x40\x5c\x0b\x66\xc5\xd1\x59\x34\x2d\x88\xc6\x32\x8e\x6e\xe6\xc7\x36\x8e\x6e\x66\xc9\x2a\x8e\x8e\x01\x27\xc6\xd1\x09\x08\xd7\x86\x19\x71\x74\x16\x49\x0b\x22\xb1\x8a\xa3\x9b\x79\xb1\x8b\xa3\x9b\xd9\xb1\x88\xa3\x0b\xb9\xf4\xac\xe2\xe8\x14\x86\x6d\xc2\xac\x38\x3a\x8f\xa7\x55\xe0\xb1\x89\xa3\xdb\x71\x64\x15\x47\xb7\x63\x6a\x56\x1c\x9d\x7b\xc6\x2d\x73\xd3\xd3\x94\x38\x3a\xae\x3d\xb4\x4f\x06\x35\xc5\xd1\x19\xf0\x16\x02\x37\xc6\xd1\x4d\xf4\xcd\x71\x74\x13\x0b\x86\x38\x7a\x7a\x9a\x1e\x47\xc7\x30\x2c\xd3\xb3\xe2\xe8\x0c\x92\x16\x42\x62\x19\x47\x37\xf1\x62\x1b\x47\x37\xb1\x63\x15\x47\x4f\x4f\x93\xe3\xe8\x18\x84\xe5\x7f\x4e\x1c\x9d\xc1\xd1\x42\x38\xec\xe2\xe8\x26\x4e\x2c\xe3\xe8\x26\x66\x6c\xe2\xe8\xe9\x69\x62\x1c\x1d\x03\xb0\xbc\x4f\x8f\xa3\x33\x18\x5a\x08\x83\x4d\x1c\xdd\xc4\x85\x55\x1c\xdd\xc4\x88\x39\x8e\x9e\x9e\x26\xc7\xd1\x31\x08\xcb\xf9\x9c\x38\x3a\x83\xa3\x85\x70\xd8\xc5\xd1\x4d\x9c\x58\xc6\xd1\x4d\xcc\xd8\xc4\xd1\xd3\xd3\xc4\x38\x3a\x06\x60\x79\x9f\x1e\x47\x67\x30\xb4\x10\x06\x9b\x38\xba\x89\x0b\xab\x38\xba\x89\x11\x73\x1c\x9d\x9d\x8a\x2c\xe2\xe8\xe3\x34\x56\xbe\x40\xb0\xa6\x38\x3a\x03\xdf\x82\xf0\xc6\x38\xba\x91\x03\x73\x1c\xdd\xc8\x84\x21\x8e\xce\xce\x3b\xd6\x71\xf4\x71\xe6\x2a\x5f\x20\x0c\x76\x71\x74\x06\x4b\x0b\x62\xb1\x8c\xa3\x1b\xb9\xb1\x8d\xa3\x1b\x19\xb2\x8a\xa3\xb3\x13\x90\x6d\x1c\x7d\x9c\xc1\xca\x17\x08\x81\x55\x1c\x9d\x41\xd2\x82\x48\xec\xe2\xe8\x46\x5e\x2c\xe3\xe8\x46\x76\x6c\xe2\xe8\xec\x6c\x64\x17\x47\x1f\x27\xb3\xf2\x05\x02\xb7\x88\xa3\x33\x28\x5a\x10\x85\x4d\x1c\xdd\xc8\x87\x55\x1c\xdd\xc8\x8a\x39\x8e\xce\x4e\x45\xb6\x71\xf4\x71\x2e\x2b\x5f\x20\x04\x56\x71\x74\x06\x49\x0b\x22\xb1\x8b\xa3\x1b\x79\xb1\x8c\xa3\x1b\xd9\xb1\x89\xa3\xb3\xf3\x92\x5d\x1c\x7d\x9c\xd6\xca\x17\x08\xdc\x22\x8e\xce\xa0\x68\x41\x14\x36\x71\x74\x23\x1f\x56\x71\x74\x23\x2b\xe6\x38\x7a\x7a\x9a\x13\x47\x27\x50\xec\x1a\x63\x66\x1c\x9d\xc5\xd3\x82\x78\x6c\xe3\xe8\x66\x8e\xac\xe3\xe8\x66\xa6\xec\xe2\xe8\x18\x72\x72\x1c\x9d\x00\x71\xed\x98\x15\x47\x67\xd1\xb4\x20\x1a\xcb\x38\xba\x99\x1f\xdb\x38\xba\x99\x25\xab\x38\x3a\x06\x9c\x18\x47\x27\x20\x5c\x1b\x66\xc4\xd1\x59\x24\x2d\x88\xc4\x2a\x8e\x6e\xe6\xc5\x2e\x8e\x6e\x66\xc7\x22\x8e\x8e\xc1\x26\xc7\xd1\x09\x10\xd7\x82\x59\x71\x74\x16\x4d\x0b\xa2\xb1\x8c\xa3\x9b\xf9\xb1\x8d\xa3\x9b\x59\xb2\x8a\xa3\x63\xc0\x89\x71\x74\x02\xc2\xb5\x61\x46\x1c\x9d\x45\xd2\x82\x48\xac\xe2\xe8\x66\x5e\xec\xe2\xe8\x66\x76\x2c\xe2\xe8\x42\x06\x5e\xab\x38\x3a\x85\x61\x9b\x30\x2b\x8e\xce\xe3\x69\x15\x78\x6c\xe2\xe8\x76\x1c\x59\xc5\xd1\xed\x98\x9a\x15\x47\xe7\x13\x89\x64\x6e\x9b\x4e\x09\xa4\xb7\x29\x13\xc8\x96\x41\x4d\x81\x74\x06\xbc\x85\xc0\x8d\x81\x74\x13\x7d\x73\x20\xdd\xc4\x82\x21\x90\xde\xa6\xd3\x03\xe9\x6d\xca\x04\xaf\x65\x04\x76\x81\x74\x06\x49\x0b\x21\xb1\x0c\xa4\x9b\x78\xb1\x0d\xa4\x9b\xd8\xb1\x0a\xa4\xb7\xe9\xe4\x40\x7a\x9b\x32\xe1\x6b\x19\xde\x2a\x90\xce\xe0\x68\x21\x1c\x76\x81\x74\x13\x27\x96\x81\x74\x13\x33\x36\x81\xf4\x36\x9d\x18\x48\x6f\x53\x26\x84\x2d\x43\x5b\x04\xd2\x19\x0c\x2d\x84\xc1\x26\x90\x6e\xe2\xc2\x2a\x90\x6e\x62\xc4\x1c\x48\x6f\xd3\xc9\x81\xf4\x36\x65\xc2\xd7\x32\xbc\x55\x20\x9d\xc1\xd1\x42\x38\xec\x02\xe9\x26\x4e\x2c\x03\xe9\x26\x66\x6c\x02\xe9\x6d\x3a\x31\x90\xde\xa6\x4c\x08\x5b\x86\xb6\x08\xa4\x33\x18\x5a\x08\x83\x4d\x20\xdd\xc4\x85\x55\x20\xdd\xc4\x88\x39\x90\xce\x4e\x45\x16\x81\xf4\x71\x1a\x2b\x5f\x20\x58\x53\x20\x9d\x81\x6f\x41\x78\x63\x20\xdd\xc8\x81\x39\x90\x6e\x64\xc2\x10\x48\x67\xe7\x1d\xeb\x40\xfa\x38\x73\x95\x2f\x10\x06\xbb\x40\x3a\x83\xa5\x05\xb1\x58\x06\xd2\x8d\xdc\xd8\x06\xd2\x8d\x0c\x59\x05\xd2\xd9\x09\xc8\x36\x90\x3e\xce\x60\xe5\x0b\x84\xc0\x2a\x90\xce\x20\x69\x41\x24\x76\x81\x74\x23\x2f\x96\x81\x74\x23\x3b\x36\x81\x74\x76\x36\xb2\x0b\xa4\x8f\x93\x59\xf9\x02\x81\x5b\x04\xd2\x19\x14\x2d\x88\xc2\x26\x90\x6e\xe4\xc3\x2a\x90\x6e\x64\xc5\x1c\x48\x67\xa7\x22\xdb\x40\xfa\x38\x97\x95\x2f\x10\x02\xab\x40\x3a\x83\xa4\x05\x91\xd8\x05\xd2\x8d\xbc\x58\x06\xd2\x8d\xec\xd8\x04\xd2\xd9\x79\xc9\x2e\x90\x3e\x4e\x6b\xe5\x0b\x04\x6e\x11\x48\x67\x50\xb4\x20\x0a\x9b\x40\xba\x91\x0f\xab\x40\xba\x91\x15\x73\x20\xbd\x4d\xe7\x04\xd2\xdb\x94\x0d\x5b\x03\x38\x2c\x03\xe9\x2c\x9e\x16\xc4\x63\x1b\x48\x37\x73\x64\x1d\x48\x37\x33\x65\x17\x48\xc7\x90\x93\x03\xe9\x6d\xca\x06\xae\x01\x14\x76\x81\x74\x16\x4d\x0b\xa2\xb1\x0c\xa4\x9b\xf9\xb1\x0d\xa4\x9b\x59\xb2\x0a\xa4\x63\xc0\x89\x81\xf4\x36\x65\x83\xd7\x00\x02\x9b\x40\x3a\x8b\xa4\x05\x91\x58\x05\xd2\xcd\xbc\xd8\x05\xd2\xcd\xec\x58\x04\xd2\x31\xd8\xe4\x40\x7a\x9b\xb2\x81\x6b\x00\x85\x5d\x20\x9d\x45\xd3\x82\x68\x2c\x03\xe9\x66\x7e\x6c\x03\xe9\x66\x96\xac\x02\xe9\x18\x70\x62\x20\xbd\x4d\xd9\xe0\x35\x80\xc0\x26\x90\xce\x22\x69\x41\x24\x56\x81\x74\x33\x2f\x76\x81\x74\x33\x3b\x16\x81\x74\x21\x6f\xbf\x55\x20\xbd\x4d\xf9\xb0\x35\x88\xc3\x22\x90\xce\xe3\x69\x15\x78\x6c\x02\xe9\x76\x1c\x59\x05\xd2\xed\x98\x32\x07\xd2\x97\x34\x25\x3d\x8a\xdd\x34\xc9\x3f\xdf\xdd\x45\xc7\x21\xa5\xbf\x22\x93\xab\x2a\x79\xae\x4d\x9e\x5b\x9a\xc4\x37\xc9\x1b\x54\xb9\xe8\x09\xe5\x4d\xcd\xe4\x3d\x3d\x14\x79\x83\xf2\xe6\xce\xb9\x7f\x73\xff\xa6\xc3\x19\x1d\x3e\x9f\xaa\xe2\x31\x8f\xdd\x43\x91\x16\xd5\x9d\x98\x35\xf4\x66\x78\x26\xbe\x41\x6d\xe3\x66\x45\x5e\x90\xbc\xa9\x34\xbf\x7d\x91\x37\xee\x31\xca\x92\xf4\xe5\xce\xf9\xe9\xdf\xfe\x58\xe4\x85\xfb\x67\x74\x7a\x4c\xa3\x6a\xe1\xfc\x11\xe5\x69\xb1\x70\xfe\x58\xe4\xd1\xa1\x58\x38\xbf\x2f\xf2\xba\x48\xa3\x7a\xe1\xdc\xbf\xf9\x31\xd9\xa3\x2a\xc2\x6d\xc7\x9f\x8b\xfb\x37\xb8\xf0\xf7\xc5\x63\x95\xa0\xca\xf9\x13\x7a\xc6\x05\x23\x29\xe0\xcd\x7a\xc2\xcc\xdf\x1e\xeb\x26\x39\xd2\xb4\xb8\xa4\x24\x4a\x93\x53\x7e\xe7\xf4\x1f\x54\x80\xcf\x55\x44\x33\xf7\x02\x99\x60\x95\x50\x5d\x96\x5b\x10\x8e\x7c\x50\xc1\x35\xd5\x63\x7e\x88\xfa\xdc\xcf\x60\xa2\x5d\x52\x6f\xfc\x82\xd2\x34\x29\xeb\xa4\xd6\x64\xda\x65\xf0\x8f\xa9\xdc\x59\x19\xc8\xd9\xdc\x19\x10\x26\x8f\x3b\x0b\x03\xa4\x72\x67\x80\x0e\x28\x1f\x54\x97\x85\xa2\xe5\xd3\x93\x03\x10\x24\x75\xc6\xe5\xa2\xd7\x37\xa1\x1f\xa0\x3d\x24\x97\x8f\xde\xd0\x12\x11\x96\x6d\x8e\xb9\x41\xf6\x4f\x35\x75\xe3\x24\x9e\xdb\xaa\x2c\x9e\xdf\xaa\x2c\x7e\xcd\x56\x71\x17\x67\x3a\x4d\x3b\xcd\x6d\x55\x7a\x9a\xdf\xaa\xf4\xf4\x9a\xad\xe2\xb7\x31\x09\xaa\x36\x9d\xdb\xac\x36\x9d\xdf\xac\x36\x9d\xdd\x2c\x2a\x97\xe2\x19\x55\x87\xa8\x46\xcc\x90\x6c\xaa\x28\xaf\x8f\x45\x95\xdd\x39\xe3\x67\xd5\x80\x7e\x2c\x4b\x1d\x82\xf1\xb3\xd2\x22\x44\x65\xd2\x44\x69\xf2\x8b\x02\x03\xf3\x1d\xca\x23\x8f\x27\x8f\x67\x92\xa8\xd7\x4d\x47\x29\x32\xc5\x77\xce\xca\xf3\xac\x40\x7b\x29\x72\xc0\xfd\x17\x03\x02\x6a\xf6\x65\xf8\xb5\x99\xf8\xbe\x48\x63\x00\x72\x6b\x07\x09\x72\x4d\x3f\xa8\xc0\x89\x40\x0f\x0c\x5c\xdd\xbc\xa4\xe8\xce\xa1\xe5\xca\x29\x0f\xcf\x22\x1d\x14\x9d\xe8\xbf\x39\x1e\x8f\xca\xea\x65\x95\x64\x51\xf5\xc2\x03\x78\xde\x76\x0f\xc2\x44\x1c\xd0\xdd\x03\x9e\xc9\x16\x8e\x50\xca\xa4\x76\x1f\x11\x86\x9b\xfd\x4a\xc9\x44\x8d\x0e\x45\x1e\x4b\x6c\x6c\x0e\xdb\x70\x1b\xab\xd9\x18\xc0\x04\x46\xc6\x72\x80\x95\xf5\xed\xfa\x18\xae\xd5\xac\x3c\x1e\x0e\xa8\x16\x60\x82\x5d\xb4\x5d\x87\x1a\x46\x3a\x20\x91\x0d\x5a\x0a\x30\xe1\xdf\x6e\x6e\x03\x75\x1f\x26\xf9\xb1\x10\x00\xb6\x51\xb0\xdf\xa9\x39\xc0\x10\x02\x79\x52\x04\xf5\xc5\x71\xb3\xd9\xaa\x05\xf0\x1c\x55\x79\x92\x9f\x44\x0d\x3a\xf8\xde\x56\x4d\x9e\x02\x09\x1c\xf4\xa5\x00\x13\xfb\x68\xb7\x87\x87\x0e\x81\x8c\xa3\xfc\xd4\x8f\x99\x1e\x24\x3e\xac\x42\x5d\x27\x74\x30\x02\x0b\xb4\x10\xe0\x20\xda\xfa\x71\x10\x29\x39\x60\xec\xd4\x20\x84\xdd\xf1\xf6\x18\xa9\x19\x20\x20\x02\xfd\xae\x0c\x20\x7f\xd8\xc7\xab\x38\xd2\x08\xa0\xfa\xcc\x03\xac\xd6\xab\x68\xed\xe9\x9a\x5f\x7d\x96\x1a\x5f\x7d\x06\xb5\x2f\xf0\xd7\xfe\x46\x49\x7b\x5f\xc4\xc2\x40\x0c\xfc\x20\x0c\x6e\x95\x00\xd9\x63\x83\x62\xcb\xa1\x4b\x49\xa4\xd1\xe1\xf3\x90\x62\x1f\x76\x48\x96\xe1\x8d\xde\xc8\x81\xf0\x41\x18\x2e\x9c\xf1\x1f\x2d\x96\x87\x24\x66\xdc\x9b\x3b\xc7\xfb\xe0\x39\xd1\x47\x06\x23\x99\xe1\xca\xa8\x42\x74\x5a\xee\x86\xf5\x43\x14\xe3\xb5\x7b\x5e\xe4\x48\xe1\x5a\x89\x70\xfb\xa2\x8a\x51\xd5\x39\x71\x6c\x27\xa3\x43\xd1\x39\x47\x2e\x46\xc6\x4c\xad\xe3\x97\x8e\x8e\x5a\x90\x15\x8a\xa8\xa2\x3c\x17\x55\xdc\xfd\x7d\xe7\x90\x1f\x2e\x2e\x11\x57\x16\xa4\x16\x76\x2d\xd4\x95\x58\xf7\x01\xd5\x88\x1f\x05\x49\xfe\x80\xaa\x04\xf4\x1d\x9e\x92\x3a\xd9\xa7\xb4\x19\xe4\x8f\x24\x4d\x9a\x97\x3b\xa7\xff\x00\xc0\x24\xb9\x12\xaa\xf3\x9a\xd4\xde\x46\x59\x25\x39\xe5\xed\x3b\xe2\xbd\x7f\x77\x77\xb7\x47\xc7\xa2\x42\xfd\x5f\x8c\x07\x0e\xf4\x9d\x28\x19\xdc\x4d\xad\xb6\x06\x59\xd3\x45\x77\x79\xd1\xbc\x5f\xee\x9b\xfc\x86\x43\xcd\x76\xd9\x63\x1e\xa3\x2a\x4d\xa8\x7e\x74\x60\xfb\x7d\xf5\x97\x26\x69\x52\xf4\xb3\xc0\x18\xe3\xab\x3b\xef\xef\xdf\x38\x51\xd3\x54\xef\x49\xcd\x1b\xe7\xfe\xcd\x0d\xf5\xdf\x09\x92\xb2\x42\x3d\x14\xe7\x2c\x96\x15\x72\x65\xcf\x74\x04\x22\x02\xd9\xa7\xc5\xe1\xf3\x7f\x3c\x16\xcd\x80\xa3\x57\x4b\xbf\x6c\x9d\xba\x48\x93\xd8\xf9\x26\x8a\xf7\xe1\x3e\xfe\xd8\x6f\x7a\x9c\x50\xa7\x51\x6e\x92\xd7\x49\x8c\xee\x9c\xe8\xa9\x48\xe2\x11\x77\x53\x11\xd4\x49\x76\x1a\x37\x4a\x4c\x30\x25\x01\x79\xe8\x22\xd7\x0f\x43\x90\xb5\xa8\xca\x87\x28\xaf\xef\x9c\x15\xa5\xfe\x9c\xc4\xc5\xf3\xf0\xf7\x17\x10\x88\xa1\x46\x64\x2a\x11\xfb\x0d\xae\xd1\xd7\xae\x93\x5f\x30\x3b\x0c\xc2\xd1\xd4\x39\x8e\xe8\x10\xc1\x2b\x7a\xdc\x5b\x51\x92\x8f\xdd\x67\x07\x96\x47\x4f\xfb\x68\x80\x89\x93\xba\x4c\xa3\x17\xc6\x86\x74\xb5\xf6\x51\x7c\xd2\xf5\x8e\xe7\x79\xac\x73\x11\x0d\xe3\xa6\xaf\x8d\x0d\x50\x1a\x95\x35\xba\x73\xfa\xdf\x14\x8e\x09\x81\x6d\xe2\x05\xfb\xd7\xc3\x80\x4c\xb2\x68\xf2\x1a\x92\xc3\xe4\x76\xe4\x51\xec\x34\x0f\x0b\xb0\x38\xd6\x34\x2b\x46\x28\x40\x1b\x1d\xfa\x71\x3a\x14\x0d\x11\x5c\x95\xe7\xa2\x2b\x8a\xe5\xa2\x07\x14\xc5\x60\x5d\xa2\x17\xdf\xd3\x9f\x92\x84\xbb\xe5\x08\x61\x5a\x12\xe9\x92\x20\xed\xf1\x6b\x78\x36\x20\xfc\x72\x9f\x7f\xf8\xee\x1b\xa7\x2e\x1e\xab\x03\xfa\x63\x54\x96\x49\x7e\xfa\xf7\x3f\xff\xf8\x69\x5f\x14\x4d\xdd\x54\x51\xb9\x3c\xd4\xf5\x32\x8b\x4a\xe7\xbb\x0f\x6f\x16\x6f\x3e\x7c\x70\x88\x7b\x90\x26\x79\xe3\xc6\x49\x4d\x78\x29\xab\xa2\x44\x55\xf3\xd2\x4d\xb7\x69\x52\x37\x0b\xa7\x3e\xd4\xf5\x87\x18\xeb\x46\xe5\x3e\x45\x55\xd2\x35\x1a\x1d\xa3\xc7\xb4\xc1\xc6\xf5\xc3\x07\xe7\xa7\xdf\xff\xf4\x93\xf3\xe7\x7f\xfb\xc9\xc9\x92\x36\x21\x45\xa4\xf8\xb7\x8f\x4d\x91\x45\x78\xa6\xaf\x50\x5d\x16\x79\x9d\x3c\x21\x32\x71\x92\x71\x55\x0f\xf5\x7e\x4c\x0e\x28\xaf\x51\xdc\x59\x41\xe7\x8f\x7f\xf8\x9f\xce\xfb\x87\xa6\x29\xeb\xbb\x0f\x1f\x4e\x49\xf3\xf0\xb8\x5f\x1e\x8a\xec\x43\xf3\xbc\xaf\x3f\x54\xc7\xfa\xc3\x3e\x2d\xf6\x1f\x9e\x76\xcb\xf6\xc3\x8f\x7f\xf8\xfd\xbf\xfe\xe9\xa7\x7f\xbd\xa1\x7c\xfc\xbe\xc8\x8f\xc9\xe9\xb1\x33\xaa\xb4\xec\x77\xd8\x4b\x1d\x88\xde\xe7\xdf\x56\xc7\xda\xdd\x47\x35\x72\x3b\x17\x89\x8c\x70\xbf\xdf\x46\xa4\xed\xfa\x48\xeb\x0d\x55\xdc\xc7\x3c\x69\xee\x1c\xa1\xce\x7d\xfe\x9b\xe4\xe8\x00\x35\x9d\x7f\xfa\x44\xea\x46\x79\xac\xfa\x5c\xb6\x5d\x57\xff\x06\x55\x55\x51\x39\xf7\x6f\xfe\xfa\xcd\xdf\x81\xaa\x5f\xfe\xea\x24\xb5\x93\x17\x8d\x13\x39\x4f\x11\x56\x7e\x82\xe0\x58\x54\x10\xe2\xa5\xf3\xef\x35\x72\xfe\x5a\xb6\x7f\x75\x8a\xca\xf9\x6b\x85\xb2\xbf\x2e\xc9\x74\xf0\xa5\x97\x06\xb6\x7c\x24\x08\xec\x44\x8d\xf3\xfc\x80\x2a\xe4\x0c\x28\x9c\xba\x89\xaa\xa6\x76\x62\x74\xa8\x50\x54\xe3\x35\x7d\x72\x74\xea\x43\x85\x50\xee\x10\x8b\x85\x79\xa9\xb3\x28\x4d\x51\xd5\x4b\x72\x40\xd8\xc7\x4f\x24\x21\x8e\x55\xa8\x14\xf9\x3a\x8c\x10\x85\x9a\x54\x4c\x83\x10\x81\xcf\xac\x8c\x81\xcf\xb8\x0f\x60\x29\x0b\x95\x4d\x62\x16\xaa\x8f\x72\x5e\x38\x7f\x45\x99\x4a\xda\x7f\x46\x44\xac\x83\xf6\x39\x58\xef\x62\xa7\xc8\x7b\xa1\x3e\x10\xc7\x9e\x34\x81\xc8\x97\x4a\xac\x79\x2e\xdc\x38\xc9\x50\x5e\x27\x45\x1e\xa5\x77\xce\x31\x4a\xb1\x5d\x66\x85\xf6\xe1\x83\xf3\x6f\xd1\xa1\x29\x2a\xa7\x38\xf6\x3d\xd6\xab\xf7\x91\x7c\xb8\x73\x7c\x4f\x16\x74\xf3\x52\x22\xb7\x38\xbe\x67\x2a\xde\x60\x51\xdd\xbf\xc9\x1f\xb3\x3d\xaa\xee\xdf\x38\x83\x6e\x75\xf8\xff\xe5\x93\xe3\xab\x74\x95\xd4\x90\x85\xc7\xc2\x2f\x9c\xa4\x71\xb2\xc7\xba\x71\xf6\xc8\x39\x55\x28\xc2\x2b\x99\xe6\x21\xca\x1d\x9f\x97\xd6\xff\x8d\x72\x54\x45\x0d\x72\x50\x4e\x8c\x51\x51\x39\xbd\x5d\x3a\xa4\x51\x5d\xa3\x7a\xe9\xfc\xbf\x45\x4d\xd7\x7b\x09\xaa\xa9\x5c\x16\xce\xfd\x9b\x0e\xa4\xe3\xfd\xfe\x0d\x05\xbb\x7f\x43\xe5\x41\xc0\x55\x52\xf4\x89\x96\x7c\xea\x58\xae\x50\xe6\x3e\x45\xe9\x23\x72\xca\x96\x02\x0f\x45\x77\x0e\x76\x81\x04\xe8\x9f\xa2\x63\x54\x25\x4e\x72\xac\xa2\x0c\x61\x3b\x47\xba\xf9\xf1\x74\xe7\xe8\x2c\x58\x52\xd7\x8f\xa8\xfe\xe0\xaf\x29\x8d\x9a\x60\x71\x3b\x2c\x6e\x87\xc5\xdd\x3f\x9e\xdc\x63\xd2\xaa\xf8\xfe\xbf\xa8\x6c\xb0\xdd\xdd\xbf\x38\x35\x6a\x1a\x3c\x62\xbf\xed\x44\xe1\x8e\x26\x77\xb4\x11\xb5\xd3\x14\x1d\xb6\xfb\x5c\x5b\x0f\x3b\x24\x8f\x32\xc9\xdf\x47\x87\x07\xe4\x00\x16\x94\x8c\x16\xd0\xb6\xd2\x21\x8f\xff\x7d\x0f\x7c\xbe\xe9\xf4\xf2\xf8\x98\x1f\xc8\x96\x4f\x9c\x3c\x25\x31\x7a\xff\x6d\xf7\x33\x8f\x17\x0e\xf9\xb5\xc6\x6a\xf4\x6d\x59\xa1\x43\x52\x93\xf5\xb2\xef\xd1\xb5\xf4\xb7\x35\x09\x8a\x26\xc7\x11\xc6\xf9\xc1\xf1\x3a\xab\x40\x41\x49\x01\x56\xea\xa1\xc6\xbf\x88\x35\xfe\x05\x3b\x90\xfe\xc2\x71\xfd\x1b\x32\x9f\x0e\x55\xc9\x06\xdc\x88\x9b\xf9\x5a\xe3\x11\x36\x7c\xac\x8b\xaa\xfb\x46\x8c\xd9\x40\xe8\xd3\x27\x67\x38\x80\xfa\x9b\x0a\x35\x8f\x55\xee\x30\x2b\xb2\xa1\x32\xe6\x81\xab\xdb\x8f\xb4\xdf\x47\x39\x1e\x58\x1d\x42\xdc\xcf\x1e\xbb\xbc\xff\xb6\x42\x59\x94\xe4\x64\x79\x34\x10\xfd\x48\xbf\xd4\x8f\xe9\xb0\x0d\xf8\xed\x68\x12\x3a\x2e\x9f\x1f\x92\x14\x39\xef\x47\x04\xa3\xd4\x06\x31\x3b\x3f\x7c\x72\xbc\xc1\x67\xf9\x16\x7b\x02\x09\xf1\x3b\x3c\xba\x1e\x81\xb0\x7c\x1a\x1a\x34\x40\x0a\x7c\x8e\x95\xdd\xa1\xee\xc7\xa1\xe6\x48\x65\xf8\xd5\xf9\x9e\xee\x5e\xd2\x56\x33\xad\xa3\xbf\x38\xdf\x61\x5b\xf7\xfd\x08\x42\xab\x0f\xcd\xa6\xbf\x38\xdf\x39\xcb\x1e\x95\x82\xa7\xef\x7a\x11\x39\x9c\xc2\x31\x52\x71\x07\x6e\x70\xf7\xbd\x67\xbe\x0c\x6a\x05\xca\xc3\xf9\xce\x09\x79\x99\xf0\x6d\x10\x5a\xf9\x85\xeb\xc6\xb1\xa1\x63\x53\x88\xee\xf3\xea\xca\x0d\x37\x58\x69\xa5\x2a\x83\xea\x7e\x8b\xcb\xdc\x0c\x7b\xfa\xef\x3b\x46\xee\xdf\x94\xed\xfd\x1b\xb2\xf4\x5e\xf4\x25\x15\xca\x48\x51\x85\xb2\xa1\x8c\x16\x31\x25\x6f\x49\xc1\x5b\xfc\xe7\x38\x2e\xde\xf3\x7c\xe2\x69\x87\xe3\x8a\x08\x2f\x8b\x4a\xf7\x21\xaa\xdd\xcf\xe8\xe5\xfd\xc0\xd1\x42\x68\xe2\xcd\xa8\x96\xb2\x84\x30\x86\x13\x6a\x34\xd0\xcc\x08\xa4\x83\x92\x42\x73\x93\x77\x56\x3c\xe1\x79\xa0\x63\xed\x58\x15\x19\x68\xfa\xf0\x1a\xe1\x10\xa5\x87\xc7\x94\x2c\x3b\x6b\x76\x3d\x23\x9b\x42\x3c\xca\x3b\xa9\x52\xfb\x05\x2d\x47\x7b\x2b\x28\x7f\x5b\x80\x2c\x7c\xe7\x60\xe5\xf7\xe9\x86\xfc\x6f\x10\x9e\x2e\x8c\x3c\x90\x7e\x9c\xc9\x84\xfa\x5b\xcf\xcb\x42\x98\x4f\x6f\x6e\x18\xd1\xb2\xf3\xc8\xb8\x20\x25\xac\x35\x85\x53\x56\xe4\x74\x82\x93\x3d\xa6\x4d\x52\xe2\xd9\x3f\x4a\xd3\x1a\x5e\x4c\xba\x07\x8c\x8a\x9b\x5f\x86\x0a\x37\x1f\xf9\x9e\x14\xbb\x71\xa4\xac\xeb\x42\x88\x1e\xdc\x89\xcc\x4a\x98\x93\xcf\x50\xbe\x90\x08\x6b\x3b\x4e\x4d\xb9\xeb\x3a\xc5\xda\x94\xad\x28\x76\xb1\x05\x8b\x70\xb9\x55\xb7\xfe\x21\x6f\x50\x95\x47\x69\xe7\x06\xe2\x35\x5e\xe3\x44\x71\x5c\x8b\xcb\x38\xdc\xc9\xcd\x03\x72\x6a\x94\x22\x62\xca\x92\xa3\x93\x23\x14\xa3\x78\x79\x9f\xff\xa6\x03\xfe\xff\x30\x19\x0a\xd7\xad\xdf\xe8\x12\xb4\x17\x4f\x57\x46\x5a\x39\x2c\xf7\x7a\x9b\x80\x7d\x4f\x72\xfa\xd6\x89\x72\x07\xb5\x4d\x15\x75\xa4\x9d\x24\xef\xd6\xc9\xb5\x53\x97\xe8\x90\x1c\x93\x43\xd2\xbc\x2c\x9c\xe7\x87\xe4\xf0\xd0\xeb\x5d\x4d\x78\xeb\x22\x86\xff\xf1\x88\xaa\x17\xcc\x6e\xf1\x84\xaa\x0a\xcf\xc0\xf8\x1b\xe3\x4d\x62\x6a\xff\x4c\x8d\xde\xb2\x67\x17\x5a\x52\x0d\xb5\xfe\x59\x5f\x6d\x98\x1e\x7e\x43\xa3\x7c\xd2\x94\xd0\x69\x49\xbf\x4e\x60\x6b\x7d\xb1\xe8\x0a\xba\xb6\x9e\xda\x13\x74\xb1\x68\xe8\x88\x61\x15\x4e\xb9\x5b\x6a\xd6\x98\x8c\x40\x74\xb5\x2e\x23\x8f\x47\xec\x86\x35\x85\x13\xa3\x06\x55\x59\x92\x23\xaa\x02\x6c\xaf\x63\x39\x10\x01\xed\x11\xa9\xcf\x0b\x84\xd4\x74\x49\xcd\xf7\xdf\x66\xff\x41\x47\x83\x20\x1a\xc1\x8f\x1b\x98\xec\x8f\x1e\x44\x6d\x1f\x08\xfc\xe6\xef\x03\x92\x2f\x37\x8b\xee\xd3\x03\xdd\xf5\xe5\xbe\x4d\x16\x88\x81\x96\x11\x1f\xe3\xcb\x4a\x21\x9c\x3e\xde\x43\x05\x53\x1d\xeb\xf7\xdf\x1e\xeb\x85\xf3\xed\x10\x97\xa3\xce\x0b\x25\x33\x9a\xfe\x63\x4d\x5d\x06\xbc\x46\xab\xe9\x92\x24\x39\xbe\x1f\xbc\xd3\x63\x7d\xd3\xe9\x54\xef\x95\x2e\xa8\x8d\x3f\xd6\x37\x0b\x8a\x94\xd8\xf7\x7e\xb4\x33\xc1\x40\xa7\x7e\x3c\x1e\x93\x76\x54\xe6\xc1\x00\x76\x1f\x3a\x77\x61\xa8\x8e\xfd\x47\x06\xba\x3b\x71\x76\xff\x86\x41\xff\x87\x23\xe1\x38\xa9\xf3\x77\xd8\xc7\xed\x58\x72\xde\xa7\xc9\x67\xd4\x47\xe8\x6e\x88\x39\x3e\xd6\xce\x43\x54\x3b\x51\x37\xd7\xbc\xc7\x2b\xf7\xb2\xc5\x5f\xf0\x62\xc9\x21\xf5\xfd\x65\x88\xb2\xae\x36\xf6\x9a\xbd\x05\x39\x92\x46\xf7\x26\xf0\x58\x24\x1d\xd3\xab\x11\xc6\xd0\x0b\x88\x52\x18\x96\x4e\x98\xc9\x6e\xb9\xc9\x15\x92\x69\x49\x2e\x1e\xe7\x8c\x63\xcd\xb9\x1a\xcc\x94\xff\xcd\xdf\xbf\x3d\xd6\x5f\xa8\x6f\xdf\xc9\xea\xcb\x47\x58\xaf\xc0\x69\xf5\x58\x03\x53\x69\xbf\x50\x1e\xd8\x11\x26\xcf\x6e\x9d\x5e\x8f\x33\x12\xd1\xa0\x63\xcd\x4e\x8e\xcc\xd2\x7f\x9c\x24\x39\x7c\xcc\x6a\x06\x44\x38\xfe\xae\x9d\xca\x28\xa1\xa1\x8d\x3f\xa1\xc6\xa1\x4e\xb0\x68\xf6\x3b\x21\x35\x51\x93\x1c\x3a\x85\x02\xe2\x7c\x9f\x3e\x75\x3d\xff\xcd\xdf\xb9\xc6\xf1\x74\xbf\xd0\x2a\x58\xf6\x65\xdb\xab\x1d\x21\xff\xff\xe4\xe9\x0b\xb6\xdb\xd2\x94\x94\x1c\xf9\x99\x08\xab\xd2\x3e\x39\x9d\xfa\xd0\x0a\xa9\x9f\xe4\x49\xf6\x98\x89\x7c\xd3\xbe\x70\xfe\xe5\x13\xb8\x96\x2c\xaa\x4e\xe9\xb4\x61\x84\x41\xce\xbc\xf2\x8c\x12\x81\x94\x48\xe8\xc2\x01\x07\xb1\x0a\x9d\xc6\x20\x98\xf1\x2e\x0e\x77\xac\x99\xde\x75\xb3\x04\x7b\x65\x40\x03\xbe\x67\xfb\xda\x75\xd4\x8b\x68\x1a\xfc\x1a\xe4\x2d\x70\x12\x27\xc7\x23\xaa\x50\x7e\x40\xce\x1e\x35\xcf\x08\xe5\x44\x6c\x78\x64\x69\xa4\xdb\x31\x87\x61\xef\x1c\xca\x40\xc7\x2c\x4f\x66\x88\x4a\x0f\x3e\x44\x16\x91\xf8\xcd\x80\x85\xd9\x25\x9a\xa0\x5c\x98\x92\x4e\xc1\xf0\x77\x4e\xc9\x08\x37\x24\x98\xf9\x94\x25\xf9\x5f\x89\x62\x09\xb3\x56\xd2\xaf\x1a\xe2\x81\xb9\x61\x1f\x60\x30\xdc\xd0\x7c\xb7\x70\x9e\x08\x3b\x4f\xcf\x4a\x21\x77\x06\xaf\x43\x46\x43\xcc\xbd\xb0\x3d\x28\xb2\x2b\x73\x30\x4c\x6a\x8c\x10\xb0\xf8\x89\x23\xef\x49\x4b\xee\x1b\xac\x99\x1c\xfb\x5f\x78\xde\xf0\x88\xc7\x5c\xf5\x46\x0c\xc5\x63\x3f\x8d\xae\x3b\xee\x8d\xf4\x31\x89\xef\x48\xbd\xf7\x78\x4a\xed\xfb\xeb\x8b\xf3\xbd\xc3\xd2\xe8\x0a\x6f\x1c\x69\x44\xb0\xea\xc0\xf9\x22\x92\x2a\xfc\x47\x1f\x80\xec\x05\x2d\x86\xba\x3f\x7d\x72\xca\x76\xe1\x48\xb1\xed\x2f\x5d\xa9\xd6\x1d\x61\xf4\x44\x11\x1b\x67\x7b\xef\x37\x49\x7e\x48\x1f\x63\xa4\x5c\xa0\xcf\xb1\x0b\x8c\xcd\x15\x29\xe8\xd6\x59\x50\x7d\x79\xa1\x0a\xb0\x34\xf6\xdf\xc7\xb1\x06\xc3\x42\x37\xe9\x53\xb4\x35\x14\xe1\x95\x96\x17\xdd\xff\x01\x83\x56\x17\xda\x5d\x38\xef\x3d\xac\xa7\x4f\xcf\x37\x0b\x27\x7f\x4c\xd3\x1b\x56\x20\xd0\x2a\xec\x7f\x3e\xb0\x66\xe3\x9f\x1d\x70\xcd\x4c\x56\x63\x35\x5e\xb4\x92\xe0\x70\x53\xe0\x6a\x87\x28\x95\xbc\x17\xba\x6e\x1b\x20\xf5\xab\xb7\x41\xd0\xc0\x3a\xef\x66\x3c\x6a\xd1\x2d\x05\x01\xbe\xce\xc6\xfe\x66\xf1\xe6\xc3\x77\xff\x74\x9f\x3b\xdf\x39\xbf\xeb\x37\x35\x9d\xa7\xf5\x72\xb3\x0c\x98\x0d\x43\xd4\x30\x3b\x9e\x45\xf6\xe1\x86\x00\xfc\xbe\x28\x5f\xba\x63\xb7\x81\xe7\xfb\x6e\xe0\x05\x01\x11\xe6\x88\xe8\xb7\x8f\xcd\x43\x51\xd5\xea\xda\xcf\x49\xd3\xa0\x6a\x81\x15\x63\x49\x6a\x4d\xd9\xb7\x1c\x78\xea\x76\x2f\xb3\x28\xc9\x99\xdd\x4b\xe7\xbb\x0f\xf7\xf9\x5d\x55\x14\xf4\x78\x8a\xeb\xee\xc9\x78\xa7\xe7\x2a\x3f\x76\x65\x49\x1e\x27\xa7\xe2\xce\xf9\x66\xb3\xf1\xbd\x63\x40\x4b\xcb\xc7\xaa\x4c\x71\xdd\xcd\x71\x1d\x1c\xfc\xbe\x34\xc9\x3f\xdf\x39\xdf\xa0\xdd\x0a\xed\x0e\xb4\xac\x42\xf1\x70\x2a\x8e\x16\x15\x55\x94\x9f\x30\xf0\x31\xde\x22\x7f\x4d\x4b\x5f\x50\x4a\x2e\x1b\xd0\x53\x7c\xb4\xf4\x54\x21\x94\x0f\x67\x1b\x69\x61\x83\xa2\x14\x97\x79\x87\xdb\xdb\xbe\xe2\xe1\x25\xca\x87\x13\x88\xb4\x8c\x9c\x3e\xe9\x4e\x05\x0c\xe8\xa2\x97\xe1\xdc\x17\x53\xd6\x1d\x42\xeb\x8f\xaf\xf5\xcd\xa1\x27\x45\x05\x89\x8c\xe7\x36\x05\x44\xfd\x49\x4a\x81\x5b\x72\xc2\x51\xe4\x8c\x9e\x39\x14\x5a\x4b\xcf\x01\x0a\xf2\x4a\xa9\x4b\xd6\x9d\xec\x1b\xaa\xca\x0c\x33\x36\xb4\xad\xfb\x88\x39\x57\x5c\x67\xf4\xce\x83\xfc\x29\x8b\xe9\xc5\x01\xf9\x53\x7a\xa2\xa7\x46\x00\x3a\x69\xbf\x05\x4b\xbf\x31\x57\x70\xdc\x3a\xca\x6b\xb7\x46\x55\x72\xbc\x73\xdc\xa8\x2c\x53\xe4\xd6\x2f\x75\x83\x17\x06\xbf\x4b\x93\xfc\xf3\x1f\xa3\xc3\x4f\xe4\xef\x7f\x2b\x3a\x8f\xe8\x27\x74\x2a\x90\xf3\xef\x7f\xc0\xee\xd0\x9f\x8b\x7d\xd1\x14\xb8\xf4\x7f\xa0\xf4\x09\x35\xc9\x21\x72\xfe\x84\x1e\x11\xfe\xf6\xdb\x2a\xc1\x33\xfd\xfd\x9b\x3f\x15\x4d\xe1\xfc\x14\xe5\x75\xe7\x40\x31\xf7\x78\xfa\xc2\x91\x07\x5c\xe1\xb7\x98\x09\xe7\xf7\x45\x5a\x54\xce\xbf\x66\xc5\xdf\x92\x0e\xae\xa7\x0b\x96\xfd\xf4\x92\xed\x8b\xb4\x2b\x24\xf4\x38\x70\xa0\xd9\xc3\x4d\xa1\xcb\xdd\x41\xea\x2d\xdf\x77\x8b\xfb\x9c\x3d\x50\xc6\x1f\x27\x23\x27\xc5\x92\x5f\x88\xa2\xd1\x63\x1c\xfb\xa2\xed\x61\x1f\x9a\x2c\x05\xae\x4d\x8d\x02\xeb\xee\x75\x25\x39\x1a\xa2\x02\xfe\xd2\xa7\x4a\xf9\x8c\xf6\x9f\x93\xc6\xed\x8e\xab\xe1\xd9\x25\x8a\xb1\x4b\x79\x87\xd7\x3f\x6f\xf9\x2a\x51\xe9\x3e\x24\xa7\x07\xa2\xc5\xa6\x5b\x5d\x51\xd5\x24\x87\x14\x2d\x9c\xa8\x4e\x62\xb4\x70\x8e\xc9\xe9\x10\x95\x58\x28\xe4\xf7\xc7\x0a\x97\x15\x05\x31\x89\x0f\x28\x8a\xc9\xcf\x53\x55\x3c\x96\x0b\x07\x9b\xb7\x85\x93\x47\x4f\x0b\xa7\x46\xdd\xce\x1e\x69\xdd\x70\x8c\x89\x1c\x2d\xeb\x29\x8d\x67\x66\x86\x07\xbb\x3e\x4a\xb2\xf8\x87\x56\x5a\xf6\x28\x4a\x85\xb2\x8f\xd0\x7d\x03\x48\x05\xc2\x8f\xf2\xa1\xdb\x8f\xd0\x75\x2f\xc5\xb1\x53\x6a\x8e\x49\x2f\xfc\xa5\x89\xf6\xe4\xae\xe0\xa7\xfb\x37\xae\x7f\xff\xe6\xe7\xee\x20\x30\x39\xbc\xd8\xfd\xea\xd2\x93\x97\x74\xc6\x2e\x1e\x1b\xcc\x8e\xf4\x96\x4e\xa7\xd1\x80\xde\xd3\x00\x13\x55\x7c\xc7\xe9\xdb\xd1\x35\x6d\xbc\xe3\x46\xc9\x0c\xa8\xfc\x85\xf3\x10\x2c\x9c\x87\xd5\xe2\xff\x67\xef\x5d\x98\x1c\xc7\x8d\x04\xe1\xbf\xc2\xed\x71\x5f\x75\x79\x44\xb5\x48\x3d\xab\xfa\xeb\x0e\xaf\x1d\xfb\x8a\x6f\x66\xf7\x8b\x9d\xdd\xf8\x2e\x62\x6a\x2e\x4c\x89\x90\x44\x37\x5f\x4b\x52\x55\xac\x71\xcc\xfd\xf6\x0b\x80\xaf\x04\x90\x78\x90\x52\xf7\x78\x7d\x3e\xdf\x4e\x97\x08\x64\x22\x91\x48\x24\x12\x09\x20\xd3\x39\xaf\x66\xce\x79\x3d\x73\xce\x1b\x28\x30\x2e\x78\x17\x89\x46\x4a\xeb\x50\xe5\x96\x50\x1e\x80\x01\xf7\x30\x67\xed\xaf\x30\xa8\x02\x37\x2b\xa2\x53\x94\x06\xb1\xdb\x94\x29\xee\xe2\xf2\x17\x3b\xd5\xc5\x4e\x98\x55\x15\x69\x96\xaf\xc3\xa5\x60\x87\xcb\x67\x12\xe7\xe0\x36\xb0\xcb\xbf\xf2\x14\x2f\x04\x97\x9f\xa3\xdc\x65\xab\x7e\x7b\x47\xb0\xa1\x3e\x0c\x8b\xfe\x75\x02\xde\x4b\xfe\xb1\x48\xf3\xe4\x45\x16\xb6\xe1\x26\x1a\xc3\x9b\xc5\xb3\xa7\xf4\x42\xff\x13\xc6\x13\x98\x9a\xc5\x4e\x8b\xc1\x61\x48\xb2\xf6\xdf\x0b\xfd\x8e\x12\xdb\xdf\x84\x0e\x2b\xfc\x55\x4d\x5f\x1e\xa2\xf0\x9d\x1c\x88\x41\xf0\x7a\x25\x24\x5c\x76\x1d\xe2\x56\x2e\x38\xca\xf7\xb3\xa7\xb4\xac\x8a\xac\x7b\xf0\x80\x3c\xd0\xe9\xaa\xb2\x9b\x52\xf0\x39\x0e\x9b\xe0\x3b\xa6\x94\x9b\x0a\x17\x86\xed\x92\x8b\x8f\x7e\x0b\x12\x07\x55\xf4\x4c\x44\xe5\xb0\x5d\xbf\x95\x47\xa6\x61\xf6\x33\xa1\xfa\x3a\x88\xbb\x59\xbf\x0f\x4a\xd2\xca\x5d\xd7\x56\x37\x23\xdb\xa7\xe3\x73\x7f\x3d\x74\xab\x27\xa2\x79\xe5\x3e\x07\x45\x01\xf6\xd4\xe7\x83\xf2\xe6\xb9\xd5\x0d\xf7\x06\x71\xf3\xfa\x00\x7b\xf8\xf3\xc1\x38\x99\x5a\x0c\x54\x3b\xfd\x78\x2e\xc8\xf1\xa7\xfb\xe6\x6f\xb6\xf3\xfb\xe9\x1e\xbb\x82\xae\xa5\xd9\x80\x0f\x21\xd5\x1a\x6b\x73\x9f\xfa\x90\x85\xf4\x9f\xcf\xfb\x90\x8e\x79\x90\xe4\x5f\xf1\x9d\xb4\xb4\xc8\x00\x95\x58\x90\x71\xf3\x17\x6a\xea\xfe\xf9\xb8\x9b\x94\xfd\x23\xe5\x4e\x93\x94\x87\x22\x8b\xe3\x7d\xd0\xcf\x87\xc6\x6a\xd0\x4f\xaf\xfe\x62\xb8\x28\xcf\x49\x14\x86\x31\x81\xea\xb0\x57\x58\x40\xc8\x9f\x4f\x9a\xa7\xd4\x4a\x94\x0c\x16\x5c\x8e\x56\x5e\x8d\xee\xea\xb6\x86\x50\x3b\x6d\xf9\x90\x64\xdb\x5e\xd1\xc8\xf1\xc1\x86\x32\xfe\xd9\x8b\x7a\xcd\x6e\x5b\x72\x9b\x8b\xf1\x0d\xa6\x9e\xe2\xb3\xfc\xe2\x5a\x12\xca\xf6\x7b\x67\x02\x26\x41\x75\x38\xbb\xfc\x3c\x8c\x83\x3d\x89\x05\x03\x2d\x4a\x99\x8e\xe9\xec\x34\xc3\xba\xba\xbf\x54\x55\xc7\x8e\x96\x79\x45\x10\x46\x97\x12\x2a\x58\x56\xc7\xde\xa8\xe8\x25\x22\xcd\x2f\xd5\xac\x83\xa7\x73\x87\x1d\x56\xd2\x45\x23\xaf\x1a\x7b\xf3\x29\xa5\x5d\x0d\x0a\x12\x18\xcd\x48\xc8\x1f\x30\x21\xe0\x67\xdd\xb2\xd7\x13\xc1\xa8\x12\x65\x4d\x30\x5c\x04\x8a\xf1\x87\xb0\x50\x7c\x7f\x2c\xb2\x98\x7c\x7c\x7a\xd3\x00\x3e\xbd\x69\x8d\x8a\xce\x1e\x68\x83\x37\xf4\xc2\x0e\xb0\x82\x47\x3a\xfd\x02\xce\xd3\xf0\x63\xf5\x9a\x73\xb8\xc1\x37\xf6\x68\x87\xff\x54\x5e\xf6\x49\x54\xf5\x24\x74\xe2\x13\xe4\x39\x09\x8a\x20\xa5\x1b\xaa\x06\x93\x30\xbc\x6c\x60\x5b\xb7\x60\x78\x8f\xb5\xab\xae\xd2\x91\xa1\xae\xd1\x53\x25\x54\xd1\xf2\xa9\xa5\xec\xd1\x4d\xb2\x9f\xdd\x46\xe6\xa2\x34\x25\x05\x4a\x9c\xae\x56\x4f\x9f\xae\xd2\x40\xa2\x54\x8b\x53\x17\x43\xe8\x0e\x95\x32\x63\x22\xd6\xb7\x1d\x84\x51\xd6\x0c\x11\xf7\xfd\x70\x26\x87\xcf\xfb\xac\xee\x47\x4a\xb9\xd1\x14\x5a\x6e\x34\x08\x37\x6d\x10\xbd\xde\xf8\x2b\x1f\x7b\xd5\x39\xa8\x72\x12\x87\xfd\x4b\x2f\xe0\xf6\x5c\x7c\x40\xfa\xc8\xcf\x47\xe9\x6d\x5b\x4c\x4e\x24\x0d\x15\x3b\x44\xc7\xe9\x5e\xe7\x77\xbb\x59\x70\x94\xdd\x7f\x43\x1b\x44\x6c\x3f\xee\xce\x7f\xff\x55\x31\xe3\xd1\x95\x1e\x09\x0b\x32\x2c\xa5\xd9\x69\x30\xb6\x4d\x06\x59\x37\x82\xdd\x01\x37\x15\x98\x76\x96\x31\x69\x71\xcb\x9c\x76\x41\x9c\xbf\x48\xf5\xec\x52\xf1\xd5\x1b\x02\xba\x0e\xb5\x83\xc9\x35\x5a\x92\xa0\x38\x9c\x7b\xa1\x69\xb5\xae\x9b\x1d\x8f\x25\xa9\x1e\x1d\xb7\x77\x30\x21\xf3\x9e\xd3\x58\x22\xbe\x81\xaa\xe6\x13\x30\x8a\xd4\x9a\x04\x62\x1c\x10\x1c\xa3\x98\xb8\x97\x3c\xce\x82\x90\xeb\x57\xf3\xf4\x12\x8e\x89\x59\x3b\x65\x97\xaa\xd7\xd7\xaa\x35\xae\xb5\x83\x93\xe1\x75\x7b\x5f\x33\x8e\xca\xca\x8d\xaa\x6e\xed\xc6\xf5\x4c\x45\x92\x3c\xee\x83\xb9\x88\x2f\xb6\x1a\x76\x35\xd6\xc8\x4f\x48\x15\x6c\x0f\x8d\x6e\x7c\x67\x4f\xe9\x9c\x96\xcc\x69\xd1\x9c\x96\xcd\x69\xe1\x9c\x96\xce\x85\x7d\xb1\xb4\x5a\x0b\xfb\x95\x35\xee\x56\xf0\x21\x05\xf3\xb3\x27\xed\x61\x7c\x6e\xf5\x6f\x08\xf1\xe5\x5a\xb0\x0e\xa3\x73\x29\xd5\xf1\x7a\x9b\xa8\xa9\xc6\x7a\xb2\x42\xaa\x71\xb5\x58\x57\xd7\x48\x2d\x9f\xab\xb6\x01\x1c\x91\x5d\x2c\xcd\x7b\xd2\x98\x04\xa1\x06\x91\x1c\x74\xa2\x87\x6c\x87\xcf\x95\xd9\xb3\xd1\xc0\xaa\x99\xdd\x23\x94\x39\xb9\x9e\xaf\xaf\x43\x29\x33\x7e\x75\x2d\x4a\x79\x90\x96\x13\x51\x76\xbe\x22\x31\x50\xbc\x76\x13\x02\x57\x91\x7e\x15\x6d\x40\xfb\x77\x82\xe2\xfb\x70\xef\x9e\xdb\x9a\xd3\x99\x84\xef\xd1\x17\xf3\xdd\x76\xad\xf6\xc3\x31\x14\x49\x50\x7c\xa6\x18\x92\xfe\xa5\x21\x0c\x17\xdd\x51\x89\xb8\xdc\x0e\xc7\x1d\x59\x0e\xf2\x47\x55\xcb\x25\x65\xeb\x7f\xc8\x6f\x28\x60\x1c\x2f\x56\x0d\x31\x12\x1a\xf8\x46\x93\x5d\x07\xcd\xf4\x9b\x85\x86\x94\x60\x1a\x5b\x2c\x0e\xca\xca\x3d\x9c\xa3\xb8\xb3\xc6\xb0\xc4\x07\xe0\x15\x77\x54\x45\x41\x1c\x95\x89\xc4\xfb\x87\x76\x49\x57\xc6\x9c\xe9\x91\xe0\x2e\x1b\x95\x7b\x0b\xd3\x10\x00\x85\xdb\xf8\xb2\x95\x56\x88\x42\x3a\xa4\x7d\x9c\x02\x6f\x77\x30\xd0\x79\x10\x86\x68\x6b\x4f\xfe\xc2\x5b\x3d\x3d\x2d\x16\x7f\xbf\x18\x9e\x43\xcd\xa3\xe4\xd4\x9c\x50\x77\x5d\x93\x6d\x1e\x6c\x7d\x67\x70\xd5\xf9\x92\xec\xd3\x20\x8a\x65\xb1\xec\x27\xa8\xd2\x17\xac\x79\x6f\xfb\x01\xdb\xde\x01\x9c\xd6\x44\x42\x47\x80\x5e\xd6\x9a\x9a\x6e\xef\x15\x50\xaf\x6b\xbc\x72\x11\x11\x70\x1b\x76\x44\xd8\xf0\x61\x3c\x64\x30\xdc\x43\xe7\xbf\xdb\xce\xd7\x3c\x10\x38\x64\x45\x83\x25\x0c\x8e\xb4\x4f\xce\x80\x52\xb2\x2d\x59\x9d\xcf\xfb\x50\x1e\xb5\x82\x24\xce\x62\xbe\x42\xe4\x59\x26\xa6\x1f\x45\x79\x80\xc1\xf9\x80\x3c\x8a\x60\x56\x50\x1a\x10\x3a\xa4\xb9\xd4\x8d\xb1\xca\x13\x9b\x4b\x63\x8c\x4e\x27\xb9\x0f\x3d\xa1\x3d\x1a\x74\x24\x4c\x96\x3a\x08\x6f\xc1\x1b\xea\xf3\xbc\x20\x6e\xe3\x9e\x1a\x9c\x3e\xf0\xca\xed\x72\xd5\x9d\xa2\xf6\x4e\xad\xd7\xce\xa1\xd5\x23\xe9\x1f\xf6\xcf\xe0\x8f\x66\xd6\xf2\x9f\xca\x84\xff\x9d\x08\xe5\xf1\x89\xff\x5d\xb7\x33\x57\xb1\xcb\xe9\xe3\x84\xaf\x73\x6e\x63\xd7\x05\xec\xee\x3e\xcb\xe1\x31\x65\xff\x37\x9c\x97\xa6\xa0\x7c\x43\x87\x1d\xae\x73\x43\xe4\xcb\x7e\xfe\xaf\x7b\x06\xda\xc6\xc6\x53\x21\xe7\x7e\x26\x21\xd2\xd6\xd6\xb7\x68\x8b\x8b\x58\x67\xd9\x16\xf7\x33\x3e\x21\x4d\x3f\x6c\x2c\x9a\xe6\xc3\xca\x4d\x6b\x9b\xfb\x59\xc7\x08\x29\x9e\x27\xb1\x7c\x5e\x64\x2f\xc2\x04\x3c\xc6\xa4\xa9\x43\xff\x68\x15\x55\x1b\x36\x52\x0e\xfa\x2b\xc8\x51\x17\x79\xb7\xf9\xdc\xb4\x90\x66\xee\xe9\x52\x55\xa4\x28\xd1\x45\x5f\x73\xde\x02\x41\x3f\xd1\xde\x31\x73\x8c\xfb\xd8\xf8\xde\x7f\xfb\xf1\xe9\xcd\x21\x8b\xdd\x7e\xb3\x2a\x66\x6f\xf8\x80\x5b\x3d\xdd\x24\x8d\x5d\x8f\x71\x2f\x76\xfd\xf6\xdf\x65\xfb\xef\xaa\xfd\x77\xdd\xfe\xbb\x69\xff\xdd\xb6\xff\xee\xda\x7f\x1f\xda\x7f\xbd\x45\xf7\x47\x87\xd1\x6b\x51\xce\xda\x96\x58\x5c\xd8\xa6\xa8\x4c\xfa\x76\xcb\xa4\x6f\xba\x4c\xfa\xd6\xcb\xa4\x27\xa0\x4c\x7a\x1a\xca\xa4\x27\xa3\x4c\x7a\x4a\xca\xa4\x27\xa6\x4c\x7a\x7a\x68\x13\x0b\xf0\x37\x68\xcf\x1b\x1a\xec\x68\x2b\x13\x48\x5e\x12\xf6\xe4\x25\x61\x4f\x5e\x12\xf6\xe4\x25\x61\x4f\x5e\x12\xf6\xe4\x25\x61\x4f\x5e\x12\xf6\xe4\x25\x61\x4f\x5e\x12\xf6\xe4\xd1\x26\x16\xe0\x6f\xd0\x9e\x37\x34\xd8\x91\x97\x84\x90\x3c\x96\xc2\xbb\xff\xd3\x1f\xfe\x5c\x0e\x7f\xae\x86\x3f\xd7\xc3\x9f\x9b\xe1\xcf\xed\xf0\xe7\x6e\xf8\xf3\x01\x34\xb1\x00\x7f\x83\xf6\xbc\xa1\xc1\x8e\xbc\x2e\x7b\x5e\xf3\xbd\x1e\x84\xaa\x1e\xe4\xaa\x1e\x44\xab\x1e\xa4\xab\x1e\x04\xac\x1e\x64\xac\x1e\xc4\xac\x1e\x24\xad\x1e\x84\xad\x06\xf2\x56\x03\x91\xab\x07\xa9\x73\xeb\x5e\xf0\xb8\x18\xc4\x8a\x73\xc4\xab\x56\x93\x7e\x36\xb5\xab\x30\x55\x1f\xfb\xa0\x8c\xfa\xbb\x4d\xec\xcb\xa9\xc8\x5e\xba\x50\xc3\xb2\x35\xd8\x2b\x25\x6a\x91\x94\xae\xe7\x7c\x72\x7e\x3b\xa0\x6b\xcf\x82\xd4\x5e\x3e\x01\xdc\xc7\xc0\xd7\x32\xf4\x1a\x03\x5e\x62\xc0\xcb\xe5\x7c\xc9\xfe\x9f\x84\x83\x2b\x11\x50\xad\x30\x54\xfe\x5a\xc2\xd1\x7c\x12\x80\xd7\x28\xb0\xdc\x09\x1f\xeb\xc4\x06\x65\xe0\x66\xbe\xa1\xff\x6f\x2b\xb3\x11\x96\x0c\xda\x71\x90\x9b\x01\x49\x6f\x2b\xb4\xa0\xc0\x76\xc0\x47\x85\x29\x43\x11\xcb\x4e\xc5\xce\x9d\xc4\x4d\xa6\x9e\xaf\xee\xca\x72\xe4\x30\xb0\x45\xe0\x2a\x29\x60\xcb\x87\x88\x61\xe5\xa9\xe8\xe6\x4a\x06\x0c\x9b\x91\x62\xcc\x16\x29\x09\x46\xc9\xee\x35\xce\xef\x9d\x88\x61\xa3\xe4\xf7\x06\xe7\xf7\x83\x88\x61\x2b\xf3\x7b\x2b\xf0\xdb\x5b\x48\x62\xa2\x64\xf8\x0e\x67\xb8\x27\x49\xda\x83\x92\xe3\x0f\x38\xc7\x3d\x7f\xb4\xe2\x69\x76\x4c\xc7\xa8\x28\xbb\x73\xbf\x66\x9b\xec\x7a\x42\x95\x38\x10\x6a\x78\x4b\xa1\xc6\x82\x2b\x5e\x08\xa5\x1e\x0f\x2c\x94\xfa\x5c\xa9\x2f\x94\x2e\xb9\x52\xb1\xdd\x15\x57\xba\x12\x4a\xd7\x5c\xe9\x5a\x28\xdd\x70\xa5\x1b\xa1\x74\xcb\x95\x6e\x85\xd2\x1d\x57\xba\x13\x4a\x1f\xb8\xd2\x07\x91\x1b\x3c\xb3\x3c\x89\x5b\x02\xbb\x44\x7e\x79\x3c\xc3\x3c\xc0\x31\x76\xd8\xd1\xb1\x9b\xb3\x52\xe5\x09\xd3\x56\xf6\x91\xca\x88\x32\x6a\x6b\x2f\x91\xda\x50\xff\xb4\xd5\x56\x48\x35\x44\xd7\xb4\xb5\xd7\x48\x6d\x44\xaf\xb4\xb5\x37\x48\x6d\xa8\x4a\xda\x6a\x5b\xac\x9a\x92\x0b\x3b\xa4\xf6\x46\xc9\x85\x07\xa4\xf6\x56\xe6\x42\x37\xd0\xfc\x40\x28\xd9\xe0\x61\xe3\x26\xcf\x76\xf3\x9e\x36\x06\x3b\x58\xd9\xac\x41\x0c\x1b\xdc\xd1\xd5\x84\x74\xeb\xd7\x66\x6a\x83\x0f\xcb\x33\xaa\x68\x6c\xf1\xf8\x38\x9e\x35\x86\x66\xad\xc4\xb2\xc4\xb1\x08\xab\x9d\x7a\xbd\xc3\x70\xae\x70\x9c\xdd\xaa\x8b\xac\xbb\x18\x96\xb5\x02\x0b\xd6\x3f\x5f\xd9\xbf\x8d\x82\xdb\xfc\x9a\xa6\xb6\x22\x86\x70\x8d\xfd\x56\x49\xc6\xd6\xdb\x41\xb2\x65\xa4\x1b\xcd\x6e\x53\x26\x23\xdc\xa9\xb9\xbf\x43\x98\xdf\xed\x26\x6f\xd7\xcf\xe5\xa4\xe1\xeb\xf6\xaf\x37\x90\xa7\x6e\xff\x2b\xa3\x12\xcc\x28\xb5\x21\x25\xa0\xda\x4c\x9a\x2b\xdd\x8e\x1b\x01\xd6\x0c\xd2\x5a\x33\x4a\x3b\x19\xd5\x46\x33\x4a\x1b\xcd\x28\x3d\xc8\xa8\xb6\xd8\x28\x6d\xb1\x51\xf2\x16\x88\xdc\x69\x86\x69\xa7\x19\x26\x0f\x91\xe1\x07\xcd\x38\x3d\x68\xc6\xc9\xf3\x27\x2a\xc7\xf6\xc6\x4c\x02\x8d\x31\xde\x1c\x93\x6a\x0e\x36\x19\x6f\x95\x49\x15\x17\x42\xad\x05\x56\xc9\x13\x51\x61\x95\x7c\xa1\x92\x8f\x55\x5a\x0a\x95\x50\x9a\x56\x42\xa5\x15\x56\x69\x2d\x54\x5a\x63\x95\x36\x42\xa5\x0d\x56\x69\x2b\x54\xda\x62\x95\x76\x42\xa5\x1d\x56\xe9\x41\xa8\xf4\x80\x32\x53\x64\xb9\x87\xf3\x5c\x62\x3a\xca\x75\x4f\x64\xbb\xc7\xf1\xbd\xb1\x1d\xe0\x38\x4b\xde\x49\xb9\x2e\x9e\x7b\x10\x9b\xf9\x03\x0c\x9e\x58\x0f\xd5\xc4\x03\x10\x9e\x3f\x8e\x57\xbd\x43\x6d\x3c\x33\x1a\xaa\x64\x07\x20\x3c\x01\x18\xaa\x4e\x07\xa0\x0d\x0a\xc4\xeb\xcf\xa1\xf6\x16\xaf\xad\xe7\xd7\x0e\x05\xda\xe8\xf9\xf5\x80\x02\x6d\x15\xfc\xf2\xf0\x31\xdf\xe9\x19\xe6\xe1\xa3\x2f\x2b\x36\xcb\x53\x8e\x18\x1c\x62\xdc\xce\xdc\x4c\xc2\xdb\x98\x9b\x49\x78\x0b\x73\x33\x09\x6f\x6f\x6e\x26\xe1\x2d\xcc\xcd\x24\xbc\x85\xb9\x99\x84\x37\x35\x37\x5b\xd7\xf7\x4d\xcd\x4d\x26\x10\xb7\x30\x37\x99\x44\xdc\xac\x9f\xd3\xcd\x4d\x36\xfe\xb7\x31\x37\x99\x10\xdc\xc6\xdc\x64\x92\x30\xd5\xdc\x4c\xc2\x9b\x99\x9b\x49\x78\x33\x73\x33\x09\xaf\x30\x37\xd9\x99\xcf\x8d\xcc\x4d\x76\x66\x74\x23\x73\x93\x9d\x39\x5d\x65\x6e\x26\xa1\xad\xb9\x99\x84\x96\xe6\x66\x12\x5a\x98\x9b\x70\x22\x2b\xcd\x4d\x38\x49\x95\xe6\x26\x9c\x7e\x4a\x73\x13\x4e\x33\xa5\xb9\x09\x27\x90\xd2\xdc\x84\x53\x43\x69\x6e\xc2\x29\xa0\x34\x37\xa1\x70\x2b\xcd\x4d\x28\xb6\x4a\x73\x93\x13\x4f\xb5\xb9\xc9\x49\x9e\xda\xdc\xe4\x84\x4a\x63\x6e\xc2\x71\x36\x99\x9b\x70\xb8\x6d\xcd\x4d\x38\xfa\xd6\xe6\x26\x94\x06\xb3\xb9\x09\xc5\xc2\xda\xdc\x84\x62\x62\x6d\x6e\x42\xb1\x31\x9b\x9b\x50\x7e\xac\xcd\x4d\x28\x4f\xd6\xe6\x26\x94\x2f\xb3\xb9\xc9\x09\x9a\xb5\xb9\xc9\xc9\xdd\x44\x73\x53\xb8\xe8\x12\x83\x8b\x2b\xb7\x33\x37\xe3\xd3\x6d\xcc\xcd\xf8\x74\x0b\x73\x33\x3e\xdd\xde\xdc\x8c\x4f\xb7\x30\x37\xe3\xd3\x2d\xcc\xcd\xf8\x74\x53\x73\xb3\xbd\xca\x70\x53\x73\x93\x09\xc4\x2d\xcc\x4d\x26\x11\x37\xeb\xe7\x74\x73\x93\x8d\xff\x6d\xcc\x4d\x26\x04\xb7\x31\x37\x99\x24\x4c\x35\x37\xe3\xd3\xcd\xcc\xcd\xf8\x74\x33\x73\x33\x3e\x5d\x61\x6e\xb2\x3b\x3c\x37\x32\x37\xd9\x1d\xa0\x1b\x99\x9b\xec\x0e\xd1\x55\xe6\x66\x7c\xb2\x35\x37\xe3\x93\xa5\xb9\x19\x9f\x2c\xcc\x4d\x38\x91\x95\xe6\x26\x9c\xa4\x4a\x73\x13\x4e\x3f\xa5\xb9\x09\xa7\x99\xd2\xdc\x84\x13\x48\x69\x6e\xc2\xa9\xa1\x34\x37\xe1\x14\x50\x9a\x9b\x50\xb8\x95\xe6\x26\x14\x5b\xa5\xb9\xc9\x89\xa7\xda\xdc\xe4\x24\x4f\x6d\x6e\x72\x42\xa5\x31\x37\xe1\x38\x9b\xcc\x4d\x38\xdc\xb6\xe6\x26\x1c\x7d\x6b\x73\x13\x4a\x83\xd9\xdc\x84\x62\x61\x6d\x6e\x42\x31\xb1\x36\x37\xa1\xd8\x98\xcd\x4d\x28\x3f\xd6\xe6\x26\x94\x27\x6b\x73\x13\xca\x97\xd9\xdc\xe4\x04\xcd\xda\xdc\xe4\xe4\x6e\xa2\xb9\x29\x5e\x6e\x8e\xc1\xed\xe4\xdb\xd9\x9b\x75\x7c\x1b\x7b\xb3\x8e\x6f\x61\x6f\xd6\xf1\xed\xed\xcd\x3a\xbe\x85\xbd\x59\xc7\xb7\xb0\x37\xeb\xf8\xa6\xf6\x26\x77\x37\xf5\x46\xf6\x66\x1d\xdf\xc8\xde\xac\xe3\x9b\xd9\x9b\x75\x7c\x85\xbd\x59\xc7\x37\xb3\x37\xeb\xf8\x66\xf6\x66\x1d\x5f\x61\x6f\xd6\xf1\xcd\xec\xcd\x3a\xbe\x99\xbd\x59\xc7\x57\xd8\x9b\x75\x7c\x3b\x7b\xb3\x8e\x6f\x67\x6f\xd6\xf1\xb5\xf6\x66\x1d\xdb\xda\x9b\x75\x6c\x69\x6f\xd6\xb1\x85\xbd\x09\x27\xb2\xd2\xde\x84\x93\x54\x69\x6f\xc2\xe9\xa7\xb4\x37\xe1\x34\x53\xda\x9b\x70\x02\x29\xed\x4d\x38\x35\x94\xf6\x26\x9c\x02\x4a\x7b\x13\x0a\xb7\xd2\xde\x84\x62\xab\xb4\x37\x39\xf1\x54\xdb\x9b\x9c\xe4\xa9\xed\x4d\x4e\xa8\x34\xf6\x26\x1c\x67\x93\xbd\x09\x87\xdb\xd6\xde\x84\xa3\x6f\x6d\x6f\x42\x69\x30\xdb\x9b\x50\x2c\xac\xed\x4d\x28\x26\xd6\xf6\x26\x14\x1b\xb3\xbd\x09\xe5\xc7\xda\xde\x84\xf2\x64\x6d\x6f\x42\xf9\x32\xdb\x9b\x9c\xa0\x59\xdb\x9b\x9c\xdc\xd9\xd8\x9b\x30\x61\xb1\x1c\x05\x06\x7f\xec\x8d\xbf\x21\xed\x13\x16\xcf\x86\xbf\xe5\x87\xb6\x43\x78\x2e\x31\x78\x4b\x95\xe5\x9a\x38\x03\xc3\xfb\x68\xbe\xb1\x26\x59\xb0\x22\x1c\x4c\x17\xca\x4b\x0a\xef\xe8\x9b\xf0\xca\xb9\x86\x21\x59\x06\x70\xb7\x4c\x20\x1b\xd8\x4f\x99\x13\x4b\xf8\x48\x5e\xc8\xcc\xfc\x67\xd3\x23\x71\x14\x0a\xb6\x29\x25\x79\x9e\x80\xad\x4f\xc4\xac\x28\xe2\x30\xb7\xbc\xed\xcd\x2f\xf0\xa4\x09\x42\xc7\xa4\x2c\x11\xa4\xcd\xe7\x10\xff\xac\x20\xa4\x29\x54\x8d\x14\x97\xd8\xbf\x19\x86\xaa\x88\x72\x4a\x3d\xab\x5a\x15\x8f\x69\x75\x76\xb3\xa3\x5b\xbd\xe6\xe4\x5d\x16\x76\x41\x15\xe4\x57\xdd\x62\x8c\x8b\xc5\xfa\x5e\x40\xdd\x44\x2e\xec\x11\x23\x31\x17\xe1\xc3\x70\x73\x03\x5b\xa9\x85\x36\x3a\xf7\x4c\xfc\xe0\x7c\xe2\x38\x03\xbe\x86\xaa\xee\x7c\xb3\xdf\x85\xc1\x10\x94\x56\x80\xc4\xb0\xc1\x81\x19\xea\x89\xa3\xd2\x97\x28\x27\x4f\x47\xc0\x36\xd8\xcb\x04\x34\x4c\xe3\x71\x41\x4e\x22\x1d\x79\x38\x1e\xc2\x31\x78\x3e\x71\x3d\xd1\x57\x3c\x8f\x6b\xb5\x0f\x93\x3e\x93\x3f\x09\x63\xc4\x7d\x57\x8f\x52\xb8\x09\x77\xe1\x5e\xd5\x8c\x02\x23\xec\x1f\xac\x2b\x8e\x15\x28\x33\x8e\xd6\x7e\xb9\xdf\xee\xf7\x3a\x2e\x0f\x31\xe2\xf5\xe3\x75\xd8\x1d\xf6\x87\xe3\x18\x4c\x9a\x11\x43\xaa\x9e\xc7\xb5\xdc\x46\xb0\x9f\x89\x1f\xc4\xf1\x1a\xbe\xaa\x47\xeb\xb0\x24\x9b\xc3\x1e\x6f\x00\xc5\xc6\x8d\x54\x5f\x4f\x1a\xa7\xae\xc4\x38\x4a\xbb\x63\xe8\x3d\x10\x2d\x6f\xdb\x80\xfd\xfa\x31\xda\x7b\xe1\xd1\x30\xda\x1c\x1e\xdd\x08\x89\x15\xcf\xe3\x5a\x8d\xd2\x63\x36\xe3\x7e\x09\x23\xd3\x7d\xd2\xa8\x3a\x42\xd6\x04\xc3\x2b\xe3\x81\xdd\x68\x6b\x88\xa3\xd1\x7c\x36\x0f\xc5\xe6\x70\x0c\x03\x1d\x0b\x59\x92\x04\xfd\x38\x04\xfb\x30\x24\x6b\x4b\x24\x9a\x41\xe0\x6b\x9d\xc7\xb5\xd7\x26\x6e\x98\x89\x1f\x84\x71\x00\x5f\xd5\x43\x71\x3c\x12\xb2\x0f\xf0\x06\x50\x6c\xb0\x4b\x43\x3d\x71\x4c\xfa\x12\xe3\xb0\x1c\x8f\xe1\x71\xab\x9d\x21\x5d\x9e\x0a\xfd\xc8\x1c\x8f\x64\x17\x78\xf6\x78\x34\x83\x23\x55\x3c\x8f\x6b\xb5\xc9\xa0\x31\x13\x7e\x0b\xa3\x33\x7c\xd4\x0c\xce\xfa\x20\xab\xaf\x16\x10\xc1\x05\x3b\xd4\xd7\x12\x47\xa6\x2b\x30\x0e\x0c\x09\x1f\x36\x7a\xd5\xd5\x66\x0a\x31\x8c\x8b\xb7\x5f\xec\xb7\xd6\x68\x34\xc3\x22\xd6\x3b\x8f\x6b\x93\xe5\x7e\x98\xf1\x3f\x85\x31\xe9\xbf\x69\x86\x24\x3c\x86\x47\x82\xa1\x46\x30\xc1\xae\x74\x75\xc4\xf1\x68\xbf\x9b\xe7\xc9\xfe\x78\x38\x1e\x74\x7c\x6c\x52\xb4\xe8\x47\x83\x1c\xc8\xe1\xb8\xb1\xc5\xa2\x19\x0c\xa1\xda\x79\x5c\x8b\x61\x1b\x42\x6e\xf8\x25\xcd\x8e\xe6\x93\x66\x69\xdf\x1c\x76\x87\x00\xc1\x2b\xe3\xe1\xe7\x05\xab\x21\xcf\x0a\xfa\xd9\x38\x08\x0f\xeb\x87\x87\x87\x83\x5e\x98\x8b\xcf\xa6\xb5\xfc\x61\xbf\xdf\x13\x4b\x24\xda\xf9\x00\x6b\x9d\xc7\xb5\x17\x1c\xaa\xe8\x99\xcc\x84\xdf\xc2\x28\x0c\x1f\x43\xeb\x5d\xd8\x56\xb1\x0d\xe3\x50\xea\x39\x74\x15\x4e\x0d\xc3\xc4\x7a\xe7\xe9\x04\x38\x73\x26\x43\x9d\x38\xf1\xbb\x4a\x4d\x24\x32\x90\x2a\x49\x10\xad\xd5\x7a\x15\xae\xd7\x78\x2b\x9d\xee\xe0\x9b\x59\x3d\xac\x17\xeb\xad\xaa\x25\xf2\x40\x0e\xe4\x88\xb5\x84\x3a\x18\xc2\x3e\x98\xe3\x98\x5e\x5c\x31\xf7\xd0\xf9\x85\x31\x81\x81\x69\x5d\x31\x0b\x35\xc0\x75\xde\x05\x7f\xbd\x9e\x39\xc3\x7f\x30\x1f\x03\x68\xcb\xec\x6e\x50\xb3\x54\xd1\x1c\x90\x3b\x24\x9f\xf1\x7a\xbb\x9e\x3f\x80\x37\x36\x95\x98\xb8\x74\x78\xdf\x8d\x04\xa2\x93\x3d\x8b\x20\xe8\x5b\xcd\x1d\x49\xf6\xf1\x96\xfb\x44\x07\x2c\x20\x1c\x73\x99\x55\xd9\xe5\x70\x06\x2e\x4f\x8c\x88\x4f\x0e\x3a\x7e\x62\x2c\xd3\x5f\xd4\x5d\xdd\x6e\xb6\xfa\xae\x0e\x6f\x8b\x7e\xc5\xae\x26\xe1\x0d\xba\xfa\xf0\xe0\xe9\xbb\x3a\xdc\x6b\xfd\x15\xbb\x1a\x9f\x6e\xd0\x55\xcf\x7b\x78\xd0\xf7\x75\xb8\x53\xf1\x2b\xf6\xb5\x8e\xc7\xf6\x55\xc2\x61\x1d\xe3\x1d\xa5\xdf\x86\x7a\x45\xbb\x0a\xc2\x65\xd5\x79\xcc\x8a\xc4\x3d\x64\x69\x55\x64\xb1\x35\xb5\x5d\xd8\x48\x96\x0b\x96\x25\xf8\x76\xbe\xed\x8e\x13\x9c\x6f\x1d\xbf\x49\xb8\xcb\x3b\xd8\x9b\x42\x78\xe6\x70\x9b\x24\x60\xfa\xe5\x10\x53\xbd\x71\x94\x3f\x82\x5c\x25\xb5\x2a\x08\xec\x81\x84\xab\x30\x30\x05\x81\x65\x11\x7b\xdb\xf0\x63\x70\x59\x73\x16\x73\x6f\x5d\x3a\x24\x28\xe9\xb6\xdf\xcd\x2e\xd5\xac\xc9\x55\x70\x0e\xc2\xec\x45\x2e\x15\x15\x7e\x5e\x90\x23\x29\x4a\xb7\x20\xe1\xe5\x40\x42\x37\xc9\xba\x10\x67\xf4\x77\x37\x73\xe4\xe1\xe3\x29\xea\x13\x14\xfd\x82\x0d\xf8\xe3\xa3\x9b\x94\x2e\xa9\xf3\x20\x55\x5a\x7a\x7c\x1e\x23\x93\x08\x35\x39\x4e\xc6\x18\x2c\x7c\x14\xde\xc1\x6d\xb3\xd8\x87\x6d\x09\x97\x22\xc5\x01\x4c\x6c\x0e\xfd\x17\x5d\xc4\xd8\xce\x7c\xf3\xfc\x65\xbf\x94\xfa\x60\xe5\xe6\x7b\x9e\xc7\xc1\x81\x9c\x59\xfe\x2a\x9e\x5c\x90\xa1\x26\xcb\x83\x43\x54\xbd\x72\xf1\x75\x21\x92\x2e\x1f\xc7\x8c\x1f\x88\x1f\x0b\x12\x84\x59\x1a\xbf\xfe\xa4\xde\x1e\x0d\x66\x9a\xdc\x08\x97\xf0\x22\x0c\x2a\xf2\xf4\xe6\x27\xae\x01\x31\x29\x46\x15\x25\xc6\x3a\x14\x0f\xad\xe7\xc6\xd9\x21\x88\x4d\xb5\x93\x2c\xad\xce\x62\xa5\xa6\x37\xaa\x44\x06\x4d\x7a\x16\x9e\x41\x43\x46\x90\x22\xea\x12\x88\x29\xe4\xaa\x49\xe7\xc8\x8d\xeb\x20\x39\xca\x06\x9a\xec\x3a\x4c\x8c\x59\xa6\xe4\xf1\x92\x27\x0f\x2b\x4b\xc4\x30\x13\x3f\xb2\xc4\xb1\x96\x1a\x72\x88\xbb\xc5\x50\x80\x7c\x43\x5c\xee\x24\xa6\x3e\x7b\xd5\xf8\x2d\xd5\x3d\xf7\x68\x22\x25\x65\x45\x24\x67\x9c\x5d\x9a\x9f\x46\x8b\x62\x74\xf6\x76\x06\x46\xaa\x25\xa1\x62\x35\x45\xa6\x01\x5b\x8a\x3a\x7b\x16\xa3\xc8\xb7\x24\xc9\xd7\xd0\xc4\xe2\x9b\x1b\x89\xe2\xa4\x21\x8f\x83\x88\x65\x93\xb1\x5e\x33\x91\xb5\xd0\x6a\x08\x3d\x0d\x61\x96\x27\x9a\x2a\x15\xde\xac\x73\x78\x69\x6f\xab\xe5\xb5\x42\xd5\x0f\x3c\xe0\x3f\xb3\xd0\xbe\x36\x15\x45\x41\xb3\x8a\x6f\x2b\x34\xc5\x67\x7e\x11\xec\x11\x8d\x39\xe2\xb7\xd6\x08\x66\x8c\x98\xc4\xc1\x10\x4d\x1c\xef\x24\x4a\xa2\xa7\x26\x90\xd1\xa7\x8f\xe8\x6f\x4b\x1c\xbc\xdb\x80\xe8\xd0\x1f\x29\xde\x9f\x66\x0e\x56\x94\x5c\xe2\x2a\xca\xfb\x6c\x9f\x58\x70\xfb\x2e\xa5\x12\xb2\x52\xe0\xb1\xf0\x69\x35\x96\xc6\x4c\x97\xc4\x00\xd4\xd5\xce\x32\x2e\x89\x9f\x90\xeb\x80\x41\x5f\x17\x12\x1a\x8f\x08\x0d\x23\xc4\xf6\x8d\x0c\x31\x9d\xc1\x27\xbb\x88\xce\x78\x20\x5a\xa9\x15\x96\xfa\x4a\x1b\xf1\x16\x61\x90\x10\xdc\x16\x63\x11\xc3\xeb\x82\x04\x6f\x03\xf6\x60\x5f\x66\xf1\xa5\x22\x08\xaf\x97\x68\x7a\x51\xd7\xd4\xc2\x8f\x9d\xcd\xf4\x93\xf3\xbf\x1d\x58\xca\x54\xfd\x0c\x81\xe8\xad\x2c\x0c\x40\x61\xba\x49\x6d\x83\xca\xaa\x3c\xab\x7c\xc3\x43\x7e\x11\x31\x61\x43\x2f\x3f\xec\x62\x13\xcb\x08\x52\x3e\x3a\x07\xd2\xa6\x46\xc2\x13\x92\x88\xc9\x41\xb6\x6a\x26\xb1\x96\x8d\x23\x53\x56\x41\x15\x1d\x3e\x68\x13\x59\xf6\xad\x2d\x3d\xdf\x90\x0d\x76\xfe\x1c\xc4\x51\xe8\x1e\x09\x09\xe9\xfa\x81\xa7\x74\x52\x5e\x4a\x13\xa6\x9f\x31\x79\x48\x9f\xa3\x1e\xb6\x5d\x65\x19\x55\x36\x5a\x11\x6c\xee\xa1\x75\xad\x43\x06\xff\xec\xb2\x5c\xce\xdd\xcd\x55\x99\x74\x7d\x16\x35\x79\x41\x80\x5d\x9b\x7b\x93\x96\x09\x4b\xff\xdf\x8a\xee\x59\x36\xdb\x99\xb3\x79\xa0\x5b\x96\x87\x7b\xfd\x96\x13\xd5\x3b\xf4\x1f\x8e\x8d\x46\x45\x24\x02\x34\x7c\x97\x55\xcf\x4b\xc0\x4c\xeb\x88\xee\x1f\x42\xe7\x91\xfd\x49\x67\x22\x2f\x30\x33\x63\x4d\x40\x57\xd4\xd6\xc3\xd1\xc8\xa5\x1c\x85\x78\x4a\x75\xa1\x71\x7e\x93\xc0\xbe\x0b\x46\xc9\xd0\x0c\xe6\x90\xee\x05\x54\xd2\xd5\x98\xcb\xe3\x9e\xcf\x65\xc6\x0d\x74\x94\x04\x27\xf2\xe8\x5c\x8a\xf8\x1d\xdb\x83\x05\x8f\xec\xcb\xfb\xf2\xf9\xf4\x6d\x9d\xc4\xb3\xb7\xcb\x43\xf9\x7c\x72\xea\x24\x4e\xcb\x8f\x77\xe7\xaa\xca\x1f\xdf\xbf\x7f\x79\x79\x99\xbf\x2c\xe7\x59\x71\x7a\xef\x2f\x16\x0b\x5a\xf9\xae\x99\x7b\x1f\xef\x76\x77\xed\xba\xca\xfe\x7c\x8e\xc8\xcb\xef\xb3\xfa\xe3\x1d\xbb\x96\xef\xec\xee\xde\x2e\xc9\xdb\xe5\x21\x0f\xaa\xb3\x73\x8c\xe2\xf8\xe3\xdd\x5b\x7f\xd9\xf4\xe6\xce\x09\x3f\xde\x7d\xef\xcf\x97\xce\x66\xbe\x5d\x7e\x37\xdf\x38\xab\xf9\x7a\x79\x70\xe7\x2b\xd7\x9b\x2f\x56\xf3\xd5\xc6\xf5\xe6\x2b\xc7\x9b\x7b\xee\x7c\x17\x7b\x73\xcf\xa1\x3f\x97\xf3\x95\xbb\x9c\xef\x0e\xf3\x8d\x3b\xdf\x2c\x1d\x8f\xfe\xeb\x6f\xe9\x42\x32\xdf\xc6\xee\xca\x59\xcd\x37\x14\xc5\x72\xbe\x76\xe7\x3b\x86\xca\x9b\x7b\x3f\xdf\xbd\x6f\xe8\xa0\x94\xbf\x5d\x92\xa7\x37\xf7\x22\x5f\x0a\x92\x93\xa0\xa2\xf3\xb3\xfd\x53\xac\x00\x96\x38\x76\x0c\x32\xec\x81\x5a\xd6\x7b\xbb\x96\xf9\x40\xf5\x02\xf8\x66\x92\xb6\x50\x3d\xd0\xb2\x83\xc1\xbf\xdb\x8b\x53\xb3\xf3\x54\x09\x15\x74\x83\xa8\x45\x4b\xef\xc9\x10\xd4\x02\xf4\x64\xf0\xd4\x61\xfb\xe2\x56\xe4\x91\x22\x41\xf0\x05\xf1\xa6\xab\xba\x46\x9a\xc5\x41\x69\xd2\xd4\x0d\x23\x80\x91\x87\x1a\x88\x1d\x81\x68\xa1\x9e\x44\x74\x06\xaa\x09\xad\xb2\x5c\x23\x3b\x06\xd9\x52\xc9\xc3\xe1\x52\x56\x59\xe2\x36\xec\xed\xf5\x0b\xf7\xf5\x2a\x05\xd3\x4b\xa6\xdf\xad\xdd\x1a\x1d\x73\x4b\xed\xb2\x1a\xb4\xcb\x5a\xd0\x2e\x2b\x67\x8d\x6a\x97\xe6\x54\xb0\xd5\x2e\xce\xe2\xbb\x85\xe3\x9f\x57\x3f\x27\x0b\x67\xfd\xdd\xc2\x59\x9e\x57\x88\x32\x68\xd9\xde\x79\x8c\x1b\xf1\x79\xbf\xcb\x6b\xc7\x5b\xe4\xf5\xa0\x13\x66\x6c\xed\xfc\x9b\xf2\x6c\x39\xd4\x4f\x3a\xc6\xb6\xf7\x23\x75\x1b\xa7\x6a\x6d\xa5\xba\x57\x73\xb8\x6c\x7f\x55\x3d\x27\xef\x0c\x7a\x3b\x41\xda\x47\xc8\x95\x39\xbb\x42\xbf\x8d\x10\xcc\x53\x6b\x2a\x4c\x26\x91\x11\xb4\xb3\x91\x0c\xd4\xcb\xed\x58\x54\x9f\x60\x44\xb5\x63\xde\xb9\x32\x04\x92\x85\xd2\x8e\xef\x18\x10\x47\x0e\x06\x37\x86\xff\xe3\xa9\xea\x72\x11\x4e\xa5\x8e\xcf\x65\xa8\x92\xf3\x91\xc4\x3e\xb2\xe1\x22\x57\x13\x6d\x8b\x07\x25\x7e\xb9\x3a\x10\xb5\x83\xbc\x2f\x1d\xdb\xb5\x46\x2b\x5c\xdb\x31\x2b\x2c\x20\x09\xf8\x0d\x34\x8c\xa9\x4f\x4d\xea\xcf\x96\xe3\xf7\xb7\xe9\xe1\x38\x9c\xd3\x65\x90\xa5\x97\xc6\x67\x0b\x2b\x12\x26\xf0\x50\x1d\x9b\x1f\x03\xc4\xed\x08\x92\x06\xdc\x92\x2c\x0d\xdc\x17\x5b\x99\xa2\xf4\xab\x3a\x4c\xc2\xc3\x72\x0d\xf8\xd9\xb5\xfe\x7f\xad\xcb\xc4\xf7\x17\x33\x67\xbd\xbc\xda\x65\x22\x30\xd2\xc6\x69\x82\xf2\xde\xe8\x36\x69\xa1\xa8\x90\x8a\xa2\x33\xb3\xaa\xcd\xbb\x4f\x0c\xe8\xf0\x1a\xd7\xba\x51\x5a\x3c\xc8\x9e\xb7\x6b\x0c\x9b\x6d\xbd\xe8\xfe\xe5\xb9\x52\x3c\x7f\xd8\x0e\xd0\xbf\x1b\x9b\x9f\x8a\xff\x9d\x53\x56\x45\xf6\x99\xb0\x1d\x40\xd3\x03\x61\xbb\xe0\xf9\x8e\xe7\xb7\x1b\x86\x43\x54\x1c\x62\xe2\x1c\xea\x8f\x77\x9b\x3b\xe7\xf0\xca\xfe\x29\x3e\xde\xad\xe6\xeb\xce\x96\x67\x7b\x8a\x06\xa7\x4b\x05\xff\x4f\x59\x94\x7e\xbc\x63\xfd\x6a\xb6\x16\xeb\xf9\xce\x59\xce\x37\xe7\xf9\xea\xbb\x8d\xb3\x99\xaf\xfb\x5d\x80\x8c\x7c\x37\xf7\x19\xfa\xf9\xe6\x6e\xd8\xa6\x74\x44\x76\x74\xb3\x5e\xfc\x35\x7b\x61\x5a\x99\x53\xfa\x61\xb8\x72\x93\x64\xea\xd7\x01\x41\xdb\x8c\xf3\xc4\xf4\xb3\x46\xe1\x8b\xe1\xe6\xce\xaf\xe5\x8d\xe9\x89\x54\xfa\x63\x74\x64\xfe\xe5\x79\x64\x06\x55\x25\xed\x5b\xaf\xd0\x55\x7f\xf3\xca\x7c\x19\xaf\xcc\xff\x7d\x7a\xf8\x57\x71\xe8\x88\x1a\x53\x35\x35\xbe\xaa\xca\x94\x7d\x22\xc0\x72\xb1\x74\xeb\x68\x20\x78\xc7\x82\x60\x46\x8f\xa0\xc4\x6c\xb4\x59\x81\xeb\x1d\x3c\x86\xf6\x2c\x41\x6e\xe5\xe8\x01\xa8\x47\xba\x7a\x0c\x90\x63\xc6\x64\x0a\x65\x16\xdb\x6f\x4b\x0c\xfa\x39\x30\x9a\xe0\x1b\xb8\x7c\x46\x62\xc2\x5f\x78\xae\x36\x8b\x4d\xa8\x7c\x40\xd4\x95\x8e\xef\xde\xb5\x6e\x9f\x51\x78\x6c\x1c\x3f\xf6\x5a\xc8\xdc\xaf\x9b\xb9\x7e\xae\xc0\x3a\x5d\x1e\x81\xaf\x45\x96\x7d\xb3\x9f\x45\x07\x73\x4b\xa2\x26\xb8\x80\xcc\x90\x5f\x6c\x25\x63\x0a\x19\xbd\x2a\xc4\xdf\x31\x3b\xc6\x14\x75\x91\xbd\x0c\xf7\xcc\xf0\xbb\x43\x32\x5a\xe9\xe6\x17\x72\xd1\xd8\x94\xf2\x13\xe2\x03\x0c\xc1\xc8\x55\x5f\x6a\x72\x9c\x3f\x5d\xca\x2a\x3a\xbe\x32\xc9\x24\x69\x25\x94\xa2\xd7\x58\x7f\x91\xda\x97\xae\xff\xe1\x54\xa0\x31\x33\x55\xbc\xd4\x11\x3d\x8a\x2c\xe1\x1d\x85\x78\xf1\x0b\x79\x81\x04\xa8\x13\xe3\x5d\x25\x51\x18\xc6\xc4\xa6\x3d\xf1\x32\xb1\xae\x65\x04\x15\x9b\x09\x0d\x4b\x67\x72\x29\x67\xe4\x75\xf8\x45\xea\x95\x04\x0e\x72\x77\x5b\x69\x91\xd9\x87\x5d\x9a\xd3\x92\x05\xaf\xc5\x29\x2f\x44\xb6\x42\x53\x9e\x8b\x28\xfd\x3c\x04\xe5\x95\x6f\xcc\xc9\x77\xe6\x06\xdf\xac\x26\xca\x1f\xc6\x6a\x41\x8a\xa6\xb1\xc8\x88\xde\xe5\x66\xb2\x4a\xcc\x1b\x85\xb2\xaf\x52\xfc\x2a\xe3\x20\x57\xe8\xbb\x2b\xe4\x72\x39\x7b\xa5\xd1\x4a\x38\x20\x57\x23\xfc\x97\x92\x14\xdd\x0e\x64\x70\x2d\xdb\x5f\x52\x1f\x1e\x64\x89\x35\xc6\xbf\x2e\xb3\xbc\xcc\x8d\xbe\xed\x52\x3f\xea\x12\xba\x82\x3f\xfc\xfa\xda\x0f\xc3\xfa\x31\x37\xbd\x07\xdb\x57\xa9\x21\x44\x1a\x1b\xf3\x90\x1c\xb2\x22\xe0\x90\x0c\xf0\xdd\x8e\x72\x5f\xd1\xd5\xab\xdf\x3c\xde\xea\xe1\x16\x45\x0b\x9e\x5a\xd1\x16\xfb\x3b\xc1\x7f\xe6\x9e\x50\x2d\xe6\x9b\x35\x47\x19\x33\xaf\xba\xca\xf7\xec\x67\x8f\xaa\x65\xd5\xe1\x52\x94\xb4\xcb\x79\x16\xc1\x65\x38\xe0\x9b\x7d\x4a\x8f\x11\x89\xc3\x92\x80\xfb\xc8\xc1\xc0\xe5\x16\xd8\x25\xcf\x24\xad\x4a\x99\x45\x7d\x3c\x36\xdb\xb7\xf6\x8b\xc5\x76\x8f\xbf\x8c\xeb\x4b\x24\xe4\xe3\xde\x9e\x7f\xb3\x58\x6c\x1e\xc2\x07\xbc\x89\x8d\x7f\x38\xa0\x4d\x80\xa1\xee\xbe\xcd\x91\x37\x7f\xd7\x35\x6b\x92\x95\xe5\x6e\xe6\x78\xab\x41\x58\x78\x59\xe9\xe9\xe2\x65\xa6\xef\x02\x2f\x3b\x5f\x6a\x2c\xb4\x92\xf7\xd8\xc6\xe1\x70\xec\x41\xe6\x43\xe8\x8e\xf2\xdc\x1c\x62\x71\x7d\x2d\xb2\x3c\xcc\x5e\xe8\xa2\x76\x3a\xc5\x64\xcc\x68\x0c\x3c\x17\xfa\xb6\x3e\xec\xa7\xf7\x0d\x93\x14\xab\x1e\xb6\x80\x76\xfd\xe4\x7d\x55\x57\xc8\xcc\x10\x83\xcf\x96\x73\xe0\x9d\xa8\xc0\x39\xe1\x19\x02\x87\x7e\xe4\x1c\x5d\x07\x1b\x7f\xb3\xc3\x1a\x59\xaf\xd6\xfb\x8d\xaf\x68\x04\xf2\xbe\xff\x3a\x72\x9e\x5a\x34\x6d\xe2\xb9\xb7\xa4\x5a\xbd\xe1\xbc\x96\xe9\xe2\x54\x1d\x7a\x32\x7a\xb2\x4e\x1c\x96\x11\xd3\xd5\x12\x48\x31\x61\x41\x9f\x27\x4e\x59\x8e\xfd\x7c\x1c\x15\xb2\x5e\xaf\xf7\x57\xf4\x10\x17\x9c\x2b\xa6\xad\xb2\xb7\xf6\x13\xd7\x28\x44\x6d\x54\x46\x5b\xf6\x71\xd7\x3f\x74\xb7\x56\x00\xf2\x91\xb3\xd6\xf7\x76\xbb\x25\x3a\x75\x3c\xb2\x25\xcb\x15\xda\x04\xc7\xfa\xe6\xdb\xc8\x19\x6b\xd1\xac\x89\xd9\x5b\x7f\xe6\x78\xbb\xc5\xcc\x79\xd8\xaa\x59\x2d\xcd\xd6\xb6\x07\xa3\xe7\xea\xa4\xa1\x18\x33\x53\x6d\x40\x54\xf3\xb4\xeb\xeb\xc4\x59\xca\xb1\x9c\x1f\x8c\xc3\x76\xb5\x5c\x4c\xee\x1b\x26\x28\xd7\xcc\x50\xbc\x9f\xf6\xf3\x53\x2f\x32\x2c\x4a\xa7\x35\xcf\xb6\x81\xbf\xc7\x05\xb8\x2b\xe1\x31\x8f\x9c\x97\xde\x72\xb7\x7a\xd8\xa0\xf8\xbd\x6d\xb0\xdb\xcb\xf8\x21\xaf\xe9\x87\x91\x33\xd2\xa2\x41\x13\x7b\xd7\x54\xf1\x6d\x37\x33\xc7\x7b\x58\x2b\xf8\x2b\xce\x47\x46\xf9\xe8\xc9\x38\x9e\xf9\x23\x66\xa2\xb9\xbe\x62\x1a\x36\xfd\x9b\x3a\x07\x21\x93\xf9\x2e\x2d\xb6\x8b\xed\x71\x5a\x97\x24\xa1\xb8\x62\xf6\x61\xdd\xb3\x9f\x7a\x06\xd9\xe8\xa2\xb1\xda\xc7\x3e\xff\xe6\x78\x3c\x78\x8b\xed\x07\x34\x60\x6b\x5b\x22\xe1\x1f\x1d\x61\xfd\x1b\xb2\x08\x76\x0b\x34\x1c\x5e\xb8\x7c\x20\x8b\x05\xda\x0a\xe4\x7a\xfb\x0d\x9b\x8d\x57\xb7\x6c\x3e\x10\xa0\x0a\x6f\xcb\xfc\x15\x6a\xa6\x8b\x73\xb2\xeb\x05\x3e\x2d\xbf\xc0\xa0\x8c\x98\x9c\x56\x20\x8a\xf9\xd9\x77\x57\x37\x45\xf5\xdd\xe3\x38\xcf\x75\xef\xb0\x79\x58\x2b\xa4\x61\xf4\x44\x1d\xd3\x49\x7c\xae\x2a\xba\x6a\x3f\x5d\x0d\x92\xd3\x86\xe8\xb5\x55\x6e\xdc\x09\x96\xee\xf0\x6d\xc0\x3d\x72\xb9\x3c\xec\xfc\xe5\x72\x89\xb5\xb0\x0f\x7d\x4f\x30\x61\xda\x16\x20\xcb\x9b\x4f\x23\x97\x4c\x8b\x46\xcd\x7c\x5e\xcf\x9c\xdd\x52\x61\x91\xb4\x54\x09\xf3\xb3\x25\x7f\xf4\xaa\x39\x65\x14\x46\x4c\x4d\x1b\x08\xc5\xcc\xec\xfa\x39\x71\xed\xe4\xb8\xcd\x8f\x83\xef\x1d\xfd\x70\x6a\xc7\x10\x09\xb9\x62\x4e\xe2\x9d\x1c\x33\x25\x75\xa2\xd2\x04\x60\x1d\xa3\xa9\x77\xc7\x87\x63\x80\x6a\xea\xae\x44\xc0\x3e\x61\xf1\xf4\xc9\x86\xa0\x6d\x84\x01\x59\x90\x35\xd2\x06\x64\x39\xfb\x32\x61\xe1\x34\xb7\x6a\xe4\xb5\xb7\x99\x39\xbe\xb7\xa5\xff\x79\x50\x71\x5b\x9c\x97\x4d\x07\x26\xad\x9a\xe3\xc7\x62\xc4\xc4\xb4\x00\x50\xcc\xcb\xb6\x9b\x57\xac\x97\x90\xe1\x82\x0d\x13\x3e\x84\xc7\x89\x1d\x93\xa5\xe4\x8a\x79\x89\x76\x72\xc4\xb4\x34\x88\xca\xb4\xb0\xc5\xc8\xf3\x37\x2e\xa0\x71\x87\x79\xac\xb7\x67\xe9\x6f\x7d\x7c\x97\x11\xfa\x9e\xbf\x92\xf1\xf3\x2a\xb0\xf8\x3c\xd6\xcf\x63\x6e\xd0\xc4\xe0\x9d\x3f\x73\x76\xbb\x99\xf3\xb0\x54\x70\x57\x5e\x1f\x8b\xcf\xe3\x57\xc7\xf1\xac\x1f\xb5\x36\x9a\xea\x2b\x57\x46\xda\xbf\xa9\x7b\x4a\xc8\x62\x61\x9b\xec\x05\x5e\x38\xad\x4b\x92\x48\x5c\xb5\x26\xca\xdd\xb3\x9f\x7a\x5a\xc9\x68\x4f\x74\xf1\xd3\xcc\x51\xc7\x64\x02\xa6\xd1\x47\x97\x57\x34\x05\x59\x2d\x94\xcd\xad\xd9\x24\x1c\x57\xeb\xf9\x24\x4e\x26\x91\x22\x7c\x5e\xc1\x4e\x1a\xae\x4b\xa8\x3b\x3b\x62\x3e\x8d\x02\x55\x4c\x2d\xa9\xe3\x93\x8f\x25\xaf\x18\xe0\xd1\x13\x6e\x4a\xcf\xf1\xb9\x67\xe8\xff\xe3\x8d\xe5\x4b\x71\x6a\x39\xea\x0c\x4c\xc2\x35\x72\x2e\x5e\xd9\x18\x36\x0e\xe8\x91\xa5\xe1\x94\x68\xb1\x9b\x39\x1e\xb5\x18\x3c\xdf\x8a\x63\xaa\x39\x69\x3a\x7a\x84\xdd\x1d\x3d\x2b\x27\x9d\x37\x8e\x04\x36\xcc\xcc\xeb\xcf\x1f\xaf\x1c\xf0\xc9\xb3\xf3\x16\xe7\x91\x46\x2e\x3c\xde\x5e\xe2\xb0\xf3\xc9\x51\x27\x5f\x02\xa6\xb1\xe6\xe9\x35\x4d\xa1\xe3\x20\x1f\x4e\x8e\x7a\x47\xaf\xe7\x93\x72\x5e\x6a\x0f\x19\x61\x27\xc7\xcf\xca\xf1\x27\x8b\xa3\x40\x4d\x33\xf2\xca\x93\xc6\xab\x06\x78\xfa\x6c\xbc\xfa\xe4\xd1\xd0\xff\xc7\x1b\xcb\x97\x7c\x12\x39\xea\xc4\x0b\xa2\x19\x7b\xec\x38\xb9\x1d\x8c\xf1\xe2\x31\xa4\x61\x27\xbd\xa4\xbc\x61\x47\xb4\x2b\x03\x73\x54\x33\x4f\x73\x9c\x08\x7b\x36\x7a\xda\x8d\x3d\x43\xb4\x87\x33\x4c\xb8\xeb\xce\x14\x27\x0f\xe6\xe4\xa9\x76\xe5\x19\xa3\xae\xdb\x8f\xb7\x16\x24\xf4\xcc\x71\xd4\x01\x96\x80\x69\xbc\x83\xf4\xaa\xd6\x30\xfe\x23\xa7\x8d\x06\x5e\x51\xa3\xdd\xa3\x3b\xe8\xad\x99\x55\xaa\x69\xa7\x3f\x31\x84\x9d\x1c\x3d\xf3\x26\x9c\x11\x8e\x02\x35\xcc\xbf\x1b\x9c\x19\x5e\x35\xc6\x93\x27\xe2\xf5\x67\x88\x06\x16\x3c\xde\x58\xc4\xb0\x23\xc5\x51\x27\x56\x3c\xa2\x91\xeb\xde\x35\x2d\x61\xec\x97\xcf\x13\x47\x3d\xdd\xd3\xf2\x48\x35\x0b\xb5\xe7\x82\xb0\x83\xa3\x27\xe1\xf8\xc3\xc0\x31\x90\x86\x29\x78\xe5\xe1\xe0\x35\x23\x3b\x79\xf6\x5d\x7d\x58\xa8\xef\xfc\xe3\x8d\xe5\x0a\x39\x3c\x1c\x75\x24\xc5\xe1\x99\xb0\x0a\x4e\x6f\x0b\x63\xbe\x74\x6c\x68\x60\xd1\x6a\x37\x73\xfc\xd5\xc3\xcc\xf1\xd7\x0b\x13\x93\x54\x73\x4f\x77\xf6\x07\xbb\x37\x7a\xea\x8d\x3e\xed\x1b\x01\x68\x98\x78\x57\x9f\xfe\x5d\x31\xae\x93\x67\xde\xb5\xa7\x81\xda\xce\x3f\xde\x5c\xa8\xe4\xd3\xc1\x51\xe7\x50\x10\xcd\xc8\x15\x6f\x7a\x3b\xb8\xc2\xe3\x8f\x06\x0d\x97\x01\xfd\x99\xb3\xde\xcd\x9c\xcd\xca\xc0\x1a\xf5\x52\xa7\x3c\xe2\x83\xfd\x9a\xb0\xd0\x8d\x3b\xd7\xb3\x87\x33\x2e\x72\x57\x9c\xf3\x4d\x1f\xca\x2b\x16\xb8\xab\xce\xfd\x74\xdd\x7e\xbc\x8d\x18\xc5\x51\xda\xce\x2c\xed\x83\x61\x70\x7a\x63\x7c\x3c\xca\x70\x62\xd3\x6c\xb1\x58\x6f\xf6\x4b\x1c\xc9\x25\x0d\x49\x41\x3b\x2b\x63\xe2\x6f\x31\xa4\xdc\x04\x1a\x83\x47\xba\x87\x92\x0e\x13\x47\x79\x22\x60\x7c\x06\x1a\x9f\x5a\x7c\xec\xbd\x7e\x9b\x4e\x75\x78\x45\xfa\xc5\xf3\x3f\x35\x57\xfe\x13\x8e\x88\x26\x53\x2f\x46\xc4\x97\xcc\x92\x45\xdb\x67\xef\xcf\x47\xe5\xd4\x1b\xa0\xbe\x75\x44\x14\x7c\x6c\x55\x18\xfa\x93\x4b\x6d\x58\x5e\xf6\x49\x54\x3d\xbd\xf9\x69\x80\x17\xb3\x1f\x16\xa4\x24\xfa\x1a\xfb\x4b\x55\x65\x29\x57\x45\x19\x9f\x63\x7e\x0c\xc2\x56\xef\xc0\xa7\xd8\xed\xa3\xe5\xf6\xc1\x37\xe5\x60\x50\x4c\x4c\x02\xda\xe3\x37\x26\xff\x0c\x42\xd2\xa8\x14\xaa\x38\xee\xc5\xd7\xd3\x30\x01\x5f\x1c\xe4\xa5\x5c\x57\x0c\x12\xcb\x55\xef\xfd\x3e\x8a\x68\x0c\x9d\x80\x2c\xb8\x94\xb7\x8f\xce\x39\x0a\x43\x92\x4a\x2f\xee\x9b\xea\x54\x80\xdb\x07\xf1\xd3\xb8\x23\x12\x67\xe2\xd1\x50\x7f\xce\x06\x93\x1b\xd7\xc5\x07\x24\xb1\x19\x8f\xb1\x01\xba\x1d\xd5\x90\x0a\x13\xed\x54\xeb\xb3\x30\x20\xec\x2f\x16\xcb\xa2\xfb\x41\x17\x83\xee\xef\x98\x1c\x2b\xcd\x48\x0d\xb8\xa4\x85\xf3\xe5\x1c\x55\xc4\x2d\xf3\xa0\xc9\xfe\xd9\xc6\x60\x41\x01\x1e\x1f\x83\x63\xd5\x29\x75\x75\xe4\x09\x3e\xb6\xc6\xdc\x5f\x77\xb1\x8f\xc5\x98\x12\xb0\xac\x0f\x99\xf1\xf4\xe6\xe9\x0d\x54\x36\x5d\x72\x32\x92\x34\x41\x23\x38\x45\xd4\xa7\xc3\xea\x4a\x55\xb9\x0f\xf9\x38\x1a\xed\xc7\x8e\x42\x15\x34\xce\x04\x92\xe4\xd5\x2b\xc7\x0a\x45\x02\xae\x1e\x30\x21\xe9\xe5\xda\x88\xce\xde\xa2\x5d\x91\xe5\xa0\xce\xc7\x38\x0b\xaa\x47\x06\xd6\xf0\x7f\x88\x1a\xe4\x2d\x3a\x7d\x2e\x2e\x44\x30\xad\x18\xfd\xe8\xb5\x2b\x83\x26\x5d\xa5\x21\x78\x48\xdf\x7e\x1c\x95\x95\x5b\x56\xaf\x31\xd1\x86\x07\xb9\x26\x93\x73\x77\xa1\xa2\xfd\xff\x73\x6f\x6d\x15\x2f\x9a\x1b\x11\x77\x98\x33\x85\x30\xf9\xb5\x23\xd9\x48\x1d\x07\xb8\x00\x50\x30\x35\xa2\x29\x8e\x13\x8f\xb7\x4c\x00\x49\x32\x51\xbc\x60\xfc\x82\x23\x00\xb4\x09\xd4\x09\xf4\x21\xe9\xdc\x07\x22\xb7\x9b\x9d\x8a\xc8\x24\xbc\x92\xc8\x24\xbc\x11\x91\x0f\x0f\xbe\x8a\xc8\xf8\x74\x25\x91\xf1\xe9\x46\x44\x7a\xfe\x62\xa1\xa2\xb2\x8e\xaf\xa4\xb2\x8e\xa7\x50\xd9\x2e\x29\x0e\xa6\x9f\x98\x22\xea\x21\xfa\x0c\x9e\x68\xac\x7b\x34\xd7\xed\xdc\x93\x67\x1c\xd7\xd6\xaf\xbe\x92\x5c\xb9\x7e\xe0\x0b\x91\xfd\x4a\x82\x31\x63\xd4\x8a\xd2\x8c\xb8\x72\xf0\x9a\xfe\xe1\x0a\xcd\x3c\x8e\x5d\x3f\x90\x51\x14\xdb\xfd\x0b\x32\x09\x54\x83\xc6\xcd\x07\xf5\x40\xaa\xc0\xa5\x41\xb5\xe1\xc7\x55\x63\x89\xf0\x54\x62\x10\x87\x80\xe9\x0f\x3b\x59\x10\xcc\x8b\x5e\x34\xcc\xb9\x46\x11\x61\x10\xda\xfd\xfa\xb2\x30\x89\x14\x6e\x87\xa3\x81\x85\xa1\x39\x8d\xfd\x00\xe1\xe5\xbe\xaa\x50\xe3\x8a\xc8\x2c\xde\xa6\xde\x8f\x12\x60\x0b\x06\xea\x05\xb8\x17\xdb\x1f\x6b\x37\x8f\x83\x03\x49\x48\x5a\xfd\xaf\x8f\x4f\x6f\xaa\x2c\x7f\x7a\xf3\xd3\xcc\xd1\xd7\x62\xcc\xb0\xa8\xd7\xb0\xc5\xa2\x22\xed\x50\x9f\xd4\x59\xd4\xa2\x1d\x73\xb9\xec\xd7\x3d\xba\x30\x7a\x8e\xc2\x8e\x67\xfc\xc6\x78\x30\xb3\x81\xed\x8d\xee\x96\xa1\x30\x0c\xe6\xee\x37\xe4\x81\x1c\xc8\x51\x6e\x33\xaa\x48\x32\x25\x5f\x7d\x63\xec\x7b\x83\x1b\xe8\x10\x93\xa0\x78\xa4\x3d\x3c\x4f\x8e\x1e\x18\xa5\x67\x52\x44\x8d\xb0\xe2\xbb\xca\x31\x51\x02\x17\x78\x6f\x1b\xbf\x22\x1c\x46\xf6\x15\x79\x6e\xe3\x6d\xbc\x9d\xb7\xd7\xba\x2c\xf1\x77\x71\x1a\x5e\xcf\x7b\xb7\x36\xdf\x7c\xf3\x19\xf7\x44\x8f\x6a\x5c\xb8\x0b\xcf\x37\x0e\x1c\x98\x7c\xf3\xb8\x17\x33\x08\xf7\xeb\xbd\xd6\x8b\x69\xeb\xfb\xe7\xa6\x4c\xe3\xa1\xd6\xc5\x22\xef\xab\x9f\x49\x10\x4a\x5a\x58\xca\x64\x3e\x38\x47\xa5\xc4\x43\xfc\xb6\x5d\xe5\xab\x44\xdc\xb6\x56\x5e\x0d\xca\x3b\x7d\x32\x7a\xed\x94\x11\x67\xc3\xe0\xcf\xec\x42\xb7\x02\x97\x6c\xa7\x06\xed\xb2\xbd\x8b\x89\xc9\x95\xd1\x38\x85\x36\x5b\xb7\xaf\xa2\x69\xce\x27\x8c\x53\xd0\x84\xe9\xf5\x1c\x8f\x57\x72\x62\x03\xed\x2c\xd4\x35\x03\x0f\x00\x06\x2f\x86\x1a\x23\xf4\xf2\x73\x05\xdc\x49\x12\x2c\x01\x67\x45\x6a\x2a\xfa\x73\x15\x75\x15\x0b\x34\x73\x38\xc1\x15\xbd\xa9\xb2\x2c\xde\x07\x85\x36\x6e\x34\x95\xc3\xc7\x21\xce\xb1\x14\x2f\xb6\x89\x6d\x5b\x05\x45\x85\xa2\x86\x91\x81\x39\x27\xa6\x7e\xb0\xd8\x01\xd4\x31\x2a\xca\xca\x3d\x9c\xa3\x38\xbc\x9f\x21\xb5\x9a\x1f\x72\x5d\xc4\x06\x70\x3d\x90\x16\x0b\x6f\x2d\x0e\x7a\x04\xed\x81\x17\x6f\x23\x18\x49\x00\x08\x38\xb9\x1d\x16\xc8\xc6\x12\x1a\x7c\x3d\xb2\x19\x84\xd4\xf8\x22\x1c\x52\xd0\x47\x99\xa5\x25\x4f\xaa\x80\x3a\x1c\xdd\x32\x8f\xa3\x0a\x4d\xd3\xb3\x98\xaf\x37\xc3\xd9\x91\x10\x70\x19\x94\x69\xf0\xb6\x96\xde\x4c\xbd\x3d\x45\xeb\xe1\x3b\x17\xae\xea\x34\xe3\xb1\x43\x01\x4d\x48\xc1\xd2\x16\x4e\xbe\x9c\x6f\x15\x48\x14\x47\x62\xaa\xea\x0a\x0e\x2f\xb7\x4a\x06\xf7\x45\xf0\x34\xd0\x8e\x9c\xe1\x98\x70\x24\x39\x6a\x6a\x64\x62\xb0\x95\x87\x69\x98\x30\x2a\xc8\xa1\x0f\x82\x7c\x49\x52\x39\x82\x3d\xa7\x89\x74\x91\xad\x95\xcd\x59\x2c\x45\x88\x26\x93\xce\x06\x71\x9d\xad\x9f\xb0\x78\x3b\x06\xdd\xc6\x6c\x6e\x5c\xb5\xe1\xcd\x8f\xd3\x71\x3a\x9a\x0c\xca\x4e\xa9\xcd\x2c\x15\xca\x17\x67\xe3\x68\x05\x88\xab\x6f\x91\xda\xf6\x98\x0a\x13\x24\xae\x88\xd3\xd2\xdc\x98\x42\xfb\x51\x8b\xdd\xe1\x4f\x8b\x83\x30\xca\xe8\x6e\xd1\x16\x80\xc5\xaf\xdf\x67\xb5\x1e\x86\xa7\x73\x6c\x8b\x1a\x68\xd0\xbc\xf6\x9c\xa9\x39\x5e\xa1\x73\x1f\x1c\x9e\xdc\x9b\xef\x39\x48\x66\x87\xc9\x7e\xd5\x5a\x3d\x9c\x9e\x29\xab\x82\x54\x87\xb3\xf2\x7a\x00\x6c\xfa\x13\x9f\x65\x61\xa6\x2f\x1e\x92\x30\x20\x15\xb9\x24\x0a\xea\xf2\x63\xd4\x1d\x93\xda\xda\xcb\x43\x2f\xde\x8a\x87\x71\x8b\x0f\x5a\xc9\xd4\x74\x85\x2e\x12\x23\x7a\x4e\xab\x9b\x3a\xa8\xa8\x4f\x3b\x6c\xcd\xd7\x91\x64\xf1\x80\x63\x08\x44\x21\x15\xa4\xf2\xe9\x31\xcc\x14\x4a\xf5\x2d\x45\x43\x02\xd0\xd3\xc3\x24\xc9\x9a\x9a\xae\xf6\x18\x31\xfd\x16\x91\x5a\xb5\xd9\xae\xe1\xf6\xb0\x67\xd2\xf5\xdc\x54\x8b\x11\x81\xe4\x05\x32\x65\xf5\xe9\x77\x57\x4b\x15\xad\x56\x0d\xf0\xb8\x56\x56\xfd\x46\x57\x43\x2d\x0f\x14\x16\xc5\x0d\x36\x01\x26\x7d\x24\xab\x5a\x5d\x02\x22\x35\x36\xd9\x00\x41\x12\x35\x5d\x8d\x81\xdb\x12\xdc\x64\x0b\x67\xa2\x87\x1b\x14\x43\x06\xa9\x1b\x8d\x53\x63\x04\x9e\x87\xc4\x58\x51\x96\xde\xe3\x42\x06\xb8\x35\xb3\x44\x82\x08\xde\x74\x2c\x13\x47\xfe\x56\x68\xbf\xa8\x38\x08\xf4\xc9\x03\x50\x9d\xdd\x81\xbc\x77\x74\x07\xb6\x14\xf9\x87\xe0\x10\xf8\x7f\x15\x92\x86\x4f\x18\x0a\xf3\x18\xdc\x08\xeb\x17\x1d\x02\x37\x2f\x48\x4e\xd2\x50\x20\xdd\x0d\x72\xfa\x15\x57\x60\x4a\x24\xbd\xf5\x8f\x60\x32\xfa\x33\xfb\x15\xc0\x37\x36\x81\x2e\x68\xb0\x21\x74\x65\x59\x1a\xf1\xb6\xf7\x5a\x67\x86\x2a\xb0\x0c\x31\x5a\x87\xfa\x62\xc5\xab\x81\x0d\xec\xb5\xaa\x61\x22\xa0\xab\x3e\x85\x78\x1d\xac\xb8\xe1\xd3\x5b\x3a\x3d\x1f\x10\xb7\x92\x12\x06\x0a\xad\x5d\x2b\xc8\x91\x82\x61\x95\x36\xa5\xbe\x32\x1d\x87\xf0\xd7\xca\xc5\x73\x3b\xf4\x2e\x77\x9f\x61\xe2\x61\xbd\x58\x6f\x75\xa9\xc0\xec\xcf\xf2\x86\xb3\x33\xec\xd2\xde\x37\x07\x12\xae\xc2\xc0\xe6\xa2\x9e\xc4\x4d\xe5\x66\x59\x5f\x53\xda\x18\x8b\xb7\x1d\xe4\xe6\x1a\xcf\x9c\xb4\x64\x77\x69\xd4\x45\x25\xdf\xd6\x47\x92\xf2\x75\x0c\xe7\x72\xa9\xd3\x81\x72\xbe\x75\xfc\xbc\xbe\xb7\x6c\xdd\xa2\x3d\xbc\x0a\x26\xf7\x9f\xcc\xb3\x4d\x06\x6e\x27\xc0\x24\x58\xd0\x30\xa2\x44\x74\x6d\x7d\xcd\x27\x14\x90\x82\xc6\x51\x6c\x3f\xfe\x4d\x7d\xdb\xf1\x6f\xfb\xa0\x91\x00\xb9\x7d\x8b\x16\xf1\x2a\x13\x25\x40\x06\xb6\x97\x00\x6d\xc3\x88\x04\xe8\xda\xfa\xda\xef\x57\x46\xce\x32\xe5\xc0\x0b\x3e\x7b\x4f\xf0\xcc\x0b\x3b\x17\x6b\x5e\x4d\x1f\x51\xa5\xd9\x2e\xf3\x5d\xe5\x8f\xbe\x31\x46\x03\xc1\x88\x8d\x8b\x21\x46\x4d\x5d\x94\xde\x2b\x11\x1a\xc8\x55\xa0\x1b\x50\x8d\x3f\x36\x18\x8b\x5d\xa4\x50\xe6\xfa\x17\xdb\x7a\x2b\x27\xef\xcc\xb6\xee\x48\xf6\xb6\x82\xaf\x3c\x87\xb8\x06\x7c\x22\x29\x00\x8d\xf6\x68\x65\x3c\x2a\x7c\x60\xbf\x88\xcb\x09\xcb\x76\x6b\xda\x56\x79\x1f\x14\x37\x67\x92\x28\x85\xea\x17\x3f\xb4\x84\x05\x45\x94\x56\x8d\x1d\xe9\x06\xe1\x9f\x2e\x65\xf5\xe8\x90\x3a\x38\x54\x0a\xf2\xf0\x2c\xdd\xe2\xbd\x19\xde\xc4\xf7\xa0\x1a\xc6\x92\xb9\x6b\x0f\x4f\xd0\x67\x39\xae\xc7\xf9\xfc\xbb\xde\x0c\x3d\x1f\xec\x12\xec\x51\x1e\x96\xa3\xbe\x4d\x1d\x6f\x97\x39\x5e\x7a\x4b\xa3\x08\xad\x6a\x73\xd9\x0c\xa5\xe6\x66\x99\xfb\x35\xd9\x60\xd5\x0d\xdf\x20\x99\xfe\x6e\xb1\x0f\x4d\x9d\x14\x5e\x68\xb7\x97\x7d\xa6\x0d\x00\x92\x77\x61\x19\x6e\xf1\xe1\xe9\x4b\xd4\xb4\xfd\xd8\x91\xf5\x93\x8a\x9e\x99\x83\x77\xaa\xbf\x14\xf8\xbf\x75\x99\xa6\x15\x81\x3e\xa7\x91\xd2\xb1\x66\x2a\x49\xc2\x40\x1a\xef\x66\xaa\xbb\xa5\xd0\x5b\xe8\x3e\x5a\xbc\x5c\x57\x65\xb9\xb6\x05\x9e\x4a\xdd\x93\x3e\x98\x79\xba\xf3\x19\x0c\x2a\x4f\x73\x65\x57\xd2\x23\xbd\x9a\x54\x5d\xe4\x44\xee\x95\x6b\x5e\xdc\xc9\x7b\xf3\xfe\xb2\xa8\xae\xdf\xc0\x65\xf8\x75\xbb\xad\xeb\xdd\xa3\xb3\x5e\xbc\x75\xde\xb3\xff\xd2\xff\x4b\x33\x97\x2e\xa5\x81\xbc\x72\xb4\xce\x80\x11\x4a\x44\xe5\x9f\x30\x61\xb4\xd4\xe4\xd0\x05\x3b\x8c\x56\x94\x04\x27\xf2\xe8\x5c\x8a\xf8\xdd\xd3\x9b\x30\xa8\x82\x47\xf6\xe5\x7d\xf9\x7c\xfa\xb6\x4e\xe2\xd9\xdb\xe5\xa1\x7c\x3e\x39\x75\x12\xa7\xe5\xc7\xbb\x73\x55\xe5\x8f\xef\xdf\xbf\xbc\xbc\xcc\x5f\x96\xf3\xac\x38\xbd\xf7\x17\x8b\x05\xad\x7c\xd7\xf0\xf5\xe3\xdd\xee\xae\xe5\x28\xfb\xf3\x39\x22\x2f\xbf\xcf\xea\x8f\x77\x54\x43\xef\x9c\xdd\xdd\xdb\x25\x79\xbb\x3c\xe4\x41\x75\x76\x8e\x51\x1c\x7f\xbc\x7b\xeb\x2f\x8f\xc7\xe3\x9d\x13\x7e\xbc\xfb\x7e\x33\x5f\x6f\x56\xf3\xed\x3a\x76\x97\xf3\xf5\x83\xb3\x9c\x6f\x3c\x9f\x8e\xe6\x72\x47\xff\xbb\xfe\x6e\xe1\xac\xe6\xfe\x26\xf6\xe7\x0f\xdb\x95\xe3\xcf\x1f\x1e\xbe\xdb\x39\xfe\xdc\x7b\x58\xfe\x7c\xf7\xbe\x41\x4c\x49\x79\xbb\x24\x4f\x6f\xee\x47\xb2\x8f\x2e\xb1\x15\x29\x92\x28\x0d\x2a\x32\x49\xf7\x4f\x5a\xfe\x6e\x42\xd4\x57\x1a\xd9\xd5\x30\xb2\x2b\x61\x64\x57\xce\x0a\x8e\x6c\x59\x15\xd9\x67\xc2\x8f\xed\xc2\xf1\xcf\xab\xab\x87\xa9\x53\xea\xe3\x0c\x17\x79\x3c\x0c\x41\xd2\x47\x12\x33\x45\x78\x26\x92\xc4\xdc\x91\x13\x94\xca\x1a\x5c\x73\xd1\xa2\xfa\xcb\xd2\x26\x9e\x3f\x08\x1d\xfd\xbb\x97\x3a\x77\xe5\xb8\x2b\xa0\x51\x0e\x51\x71\x88\x89\x53\x7c\xbc\x5b\xde\xf1\x9a\xc5\x28\x72\x3a\x3e\x7c\x5d\x79\x2b\x5f\xa2\xea\x70\xe6\x1d\x3b\xcd\x9a\xe6\xe3\x6b\x42\x0b\x60\x41\x52\xbb\x34\xfa\x60\xb5\xec\x16\x42\x78\xcd\x53\x58\xf1\x83\x38\xc6\x7d\x59\xe3\x89\x01\x02\xc3\xd6\x6d\xe6\xa9\xec\x7c\x6c\xbd\x8b\xb2\x23\x94\x95\x76\xd4\xc2\xe2\x96\xe8\xc6\xcf\x49\xcb\x5c\x67\xd5\x95\xf1\x4e\x50\xa1\x10\xd1\xc9\xe0\xcd\x8a\xaa\x83\x7c\xc4\x0c\xf6\xf7\x31\x2b\x92\x36\xea\x0a\x09\x4a\xe2\x46\x2c\x74\xd2\x4c\x6a\x00\xad\x03\x96\x0c\xbc\xbc\xdb\xd5\xc8\xa5\x13\x03\x81\x8c\x1c\x1b\x63\x78\x13\x2d\xbe\xab\x94\x87\xf4\x96\xa9\xe3\x76\xcb\xf8\x38\xa8\xc8\xff\x7c\xd7\x9e\x54\xdd\x7f\x18\x43\xd1\x57\x9e\xc6\xc0\x3f\xab\x7e\xd2\x29\xbe\x98\x53\xb8\xf0\xb7\xe2\x0c\x90\x0f\xef\xda\x19\x8c\x9f\xe6\xdd\xfc\xe0\x4e\xf9\x3c\x88\xb7\x93\xe9\x30\x7e\x19\xe3\x63\x2d\x19\x1f\x6b\xd4\xac\x6c\x02\xad\x35\xd6\x87\xef\x2c\xbe\x63\x16\xc8\xcf\xc9\xc2\xa1\x86\xe4\xf2\xbc\x42\x8c\xc6\xe6\x15\x66\xcf\xf5\xe6\x5c\xf2\xfd\x2e\xaf\x1d\x6f\x91\xd7\x9c\xb5\x3f\xf9\xd0\xd1\x71\x82\x3c\x27\x41\x11\xa4\x07\x22\x06\x42\x92\xef\xbc\xe9\xdd\x0c\x8e\xd3\x46\x6d\x1b\x7c\x6f\xd7\xb9\x45\x60\xd3\x8f\x8f\x6e\xc2\x1c\xd9\x17\xc1\xfd\x00\x84\x41\x39\x7d\x11\xac\x3f\x26\x97\xb8\x8a\xf2\x98\xfc\x34\x13\x8e\x32\x7e\xa4\xf2\xf9\x13\xf3\x8c\xb0\x3f\x3f\x3e\xbd\xf1\x9e\xde\xfc\x74\xcf\x9f\x6d\xf5\x97\x5e\x35\xef\x14\x64\x5b\x44\xc3\xe0\x09\x19\x5a\x14\x4e\x81\x16\x21\x63\x18\xa9\xf3\x40\xba\x77\xa2\xa1\xc2\x4d\xb2\x9f\x5d\xc6\xf0\x42\x8c\x7c\x2e\x3e\x57\x65\x67\xe6\xfc\xf0\x0e\x83\x81\xe0\x76\xcb\x64\xc4\xf1\xe0\xc0\x58\x69\x63\x3d\x04\xc9\xe9\x5e\x7c\x6b\x5e\x02\xe9\x4f\xcb\x30\x32\xe3\x93\xf5\x29\xb6\x44\xa4\x86\x46\x95\x23\x58\x7b\xa6\xcb\xd1\x67\xbc\x92\x7d\x7b\xf5\xae\xbc\xb2\x2d\x5d\x3e\xb5\xbf\x8b\x74\x2d\x35\xda\x98\x6b\x6a\x57\xf3\x88\x8b\xb8\x6a\x05\x77\xad\x46\x1b\x88\x40\x5d\x8a\xfc\xd5\x37\x99\x70\xc4\x8b\x28\xd1\x6e\xab\x25\x00\xda\x38\x48\x4f\xef\x48\x7a\x8f\xa2\xe5\x0c\x24\xe0\x8d\xfa\x7d\x91\xbd\x94\x04\x84\xa4\x90\x45\x02\x43\xf7\x23\x5d\x7f\xdd\x3d\x03\xfe\x09\xc7\x1d\x54\x55\xf1\x0e\x54\xc3\xb9\x88\xba\x3c\x11\x8f\xdc\x07\x45\xb4\xaa\x05\x76\x9c\x33\xdd\xec\x81\x7a\x1f\x95\xcc\xab\xcc\x9c\x71\x1e\x4d\xfb\xdb\x46\xfa\xd1\x1e\xc9\x57\xde\xb7\xcc\xdd\x13\x44\x7d\x9f\x3a\x66\xdb\xb0\xd9\x96\x79\xb8\xd0\xda\xdd\xe2\x6a\xb5\x34\x0c\xf0\x20\xb2\x14\xdc\xcd\xf0\xfb\x20\x17\xc2\x9e\x3e\x3d\x11\xec\xad\x1f\x3c\x2e\x5b\xc9\xf1\xea\x2c\xe3\x46\x98\x2c\x38\xd6\x3c\x34\xe0\x38\x33\x4d\x55\xf5\xf1\xd1\x7d\x21\xfb\xcf\x51\xe5\x96\x71\xc4\x0e\x58\xcf\x97\x64\xaf\x3a\xef\xa2\xd2\x47\x45\x72\x36\x49\x2d\xf2\xcd\x52\x13\x84\x7d\xf9\x8a\x4d\x96\x5f\xbe\x2d\x60\x5b\xd1\x1d\x34\x7f\x03\x59\x39\x16\x9a\x51\x30\x9e\x1d\x70\xcf\x3b\xa1\x95\x64\x93\xa4\x52\x0c\x18\xd6\x8a\xbb\x87\xb9\x22\xbe\x82\xb7\x41\x2d\xe6\x93\x5c\x10\x46\xe6\x5a\xba\x1e\x34\x78\xb8\xd0\x28\xba\xc3\x51\x0b\x84\xc5\x25\x4d\xe9\xca\xef\x56\x45\x80\x47\xe7\x05\x81\x77\xa4\x40\x1d\xa2\xc2\x38\x5c\x8a\x92\x7e\x6f\x1d\x6c\xca\xc4\x18\x84\xf8\x64\x83\x9c\xde\xaa\xe2\x33\xf1\x22\xa2\x9c\x02\xd2\xdc\x36\x0a\xf2\xdf\xe4\x55\xcb\xbf\x91\xb2\x2a\xe0\xb8\x4e\x4e\x01\xb2\xff\xee\xa2\x59\x4e\x56\xae\x78\xf4\x38\x5f\xa8\xda\xc7\x7d\xfb\x9b\x58\xeb\x79\x3f\x56\x9e\xcb\x9b\x08\x72\xf9\x35\x25\x58\x21\xa7\xfa\xd2\xee\x35\x35\x7a\xe0\x01\xfa\x71\x8c\xe2\xd8\x8d\xb3\x17\x8d\x5b\x5b\x9e\x40\x96\x53\x84\xe1\xbe\xe4\xb9\x10\xe5\xa4\xbb\x67\xb6\xce\xeb\x0f\x37\x6c\xb2\x77\x95\xeb\x8c\x51\xcd\x59\xca\x18\x94\xd8\x1a\xdb\x0d\x66\x48\x8e\xc1\x25\xae\x8c\x18\x71\xd3\x75\x32\x81\xa8\x72\x1d\x4d\x53\x39\x89\x18\xfc\x7a\x13\xb6\x67\x9c\xe1\x87\x0d\x5f\x59\x33\x4d\x57\x42\xaa\x9e\x3a\xb8\x5f\xc6\x41\xaf\xbe\x9b\x74\x56\x1a\x3c\x8f\x89\x8f\x25\xf8\x31\xd5\x57\xb8\x90\x90\xe3\x7d\x83\x20\xc5\x89\x4d\x0c\x3a\x38\x0b\x3b\xe8\x3e\xe8\x60\xff\x41\x97\x82\x04\x25\x60\x72\xa6\x11\xb5\xa8\x53\xd4\x55\xb0\x2f\x91\x58\x31\x9c\x23\xa4\x57\x39\x02\x98\xc0\x1c\x81\xb1\xed\xeb\xb6\x31\x21\x1b\x87\x36\x15\xaa\x5b\xbe\x9d\x0c\xb7\x63\xca\xbb\xe9\x82\xbb\x46\xee\x00\x37\x3e\x42\x11\x18\xa9\xa8\xcc\xe2\x76\x8c\x9a\x3f\x09\x76\x29\xb3\xf1\x7e\x0c\xff\x1a\xd9\x37\xbf\x3a\xad\xbc\x7e\xe5\x53\xb6\x3b\x04\xae\xe3\x0b\x59\xb0\x48\x16\xa5\x51\x18\xe2\x29\x3e\x35\x61\xe5\x1a\xfe\x85\x87\x4a\x43\xfb\x48\x2c\x62\x24\xbe\xd2\x0d\xc2\x04\xd1\x26\xf3\x28\x8e\x25\x39\x86\x27\x9e\x43\x9c\x4b\x9d\x19\x89\x09\x98\x80\x5a\xe0\x75\x5b\xda\xe5\x6a\xc2\xb9\x7c\xb4\xbe\x7a\x46\xe1\xa9\x49\x01\x71\xcd\xe0\xf7\x7e\x58\x87\x20\x5e\x42\xd4\x19\xf4\xed\xe6\x80\xbd\x89\xdf\x15\x91\x10\x6b\x62\x28\x44\xda\x71\xf7\x41\x19\xf5\x03\xc3\xbe\x9c\x8a\xec\xa5\xf3\x15\x6b\xda\xad\x82\x7d\x17\x2f\x8c\xb6\x4a\x7f\xe6\x81\x74\x65\x9f\xd3\x96\x02\x08\x34\x65\x15\xb1\x46\xd3\xe0\xb9\x0f\xba\x78\xbb\xa8\x44\xe0\xf5\xab\x14\xf9\x8c\x3d\x84\x75\xf7\xa4\x7a\x21\xad\x53\xdb\xb4\x86\xb0\xd0\x8d\x14\x3e\x88\xd2\x26\x84\x9e\xf4\xd1\x3d\xc6\x97\x28\x6c\x34\x98\x50\xc2\x72\x3b\xc9\x9f\x13\xbc\x36\x4b\x47\x25\x7f\xae\xe3\x31\xeb\xee\x64\x5e\xc0\x2e\xbb\xfb\x42\x3e\x74\x95\xce\xe4\x84\xa3\xc3\xa5\xa7\x3b\xe1\x84\xa5\xe8\xd3\x0e\xbb\x47\xa1\xe6\x40\xc5\x72\x3f\xe0\x12\x33\x7c\x1c\x63\x06\x50\x28\x93\xfd\x83\x07\xe6\xbb\x89\x19\xd4\x35\x2f\x28\x2b\xf1\xe0\x5e\xd1\xa0\x8c\x46\x9b\xdd\xa6\xac\x82\x2a\x3a\xc0\xec\x34\x18\x39\xc8\x3b\x79\x93\x7c\x98\x8f\x96\xb9\x16\xba\xac\x57\xb2\x3a\xeb\xf7\xb4\x92\x46\xd3\xc5\xd1\xe9\x08\x67\x0f\xf5\x0a\xe5\xeb\x54\xfc\xaa\x8f\xf2\x8d\xf2\xad\xcd\x2c\xcd\xba\x06\xa8\x17\x25\xba\xfb\x3c\x56\xa6\x5b\x38\x37\x3a\x64\xa9\xed\x05\xab\xf9\x5a\x7a\x28\xa5\x0a\x9e\x0f\xee\x32\xd9\xbc\x02\xa0\xe3\xda\xfc\x47\x7e\x07\x30\x88\xaf\x5b\x1e\x8a\x2c\x8e\x3b\xfb\xa4\xee\xc7\x62\xbb\x7e\x3e\x73\xa7\x97\xee\xab\x22\xa5\x4f\x50\x0f\x29\x7d\xd6\xf3\x07\x90\x30\xa7\x6d\xa6\xb9\x74\xd2\x3d\x13\x06\xda\xdf\x54\x45\x58\x0b\x54\xb5\xc0\xba\xa0\xaa\x92\x98\xb1\x80\xf5\x42\x55\xa5\x5b\x3b\x14\xca\x02\xd7\x4f\xbf\x58\xa6\x40\x92\x9a\x6e\x9b\x62\xd3\xb2\x39\x3e\x2e\xb2\x17\x18\x76\xc2\x14\x36\xb9\xcb\x95\x23\x61\x96\x94\xb0\xac\x74\x8b\xec\xc5\x16\x03\xa6\x00\x95\x87\xc5\x36\xf8\x78\xbd\x8c\xc5\xfa\xed\xb4\x87\xe6\x82\xcf\x2f\x7f\xe5\x12\x08\xac\x15\x20\x12\x66\xf6\x72\x13\x1e\xde\x4d\x78\x8e\xca\x68\x1f\x5b\x8d\x12\xbf\x98\x08\x6b\xb8\xf3\x77\x51\x92\x67\x45\x15\xb4\xaa\x98\x5f\x6d\x60\x12\x26\x5d\x13\xdc\xc2\x82\xe5\x7a\xfb\x45\xad\x86\xb6\x9b\xad\x46\x0d\x25\xa1\x51\x08\x84\x2a\x0a\x21\x10\x6b\x21\x42\x20\x56\x49\xcc\x58\x10\x21\x10\xab\xdc\x5a\x0d\x71\x49\xce\xa4\xa6\xbf\x90\x1a\x4a\xc2\x6b\xd5\x90\x80\xe1\x6a\x35\x24\xe2\xfb\x62\x6a\xe8\xaf\x49\x02\xed\xd5\x10\xcf\xde\xc9\x6a\x08\xa0\xf9\x52\x6a\x08\x34\x71\x8d\x1a\x7a\x78\xf0\x34\x6a\xa8\x8d\xab\xa2\x13\x02\xa1\x8a\x42\x08\xc4\x5a\x88\x10\x88\x55\x12\x33\x16\x44\x08\xc4\x2a\xb7\x56\x43\x5c\x1a\x43\xa9\xe9\x2f\xa4\x86\xe2\xd3\xb5\x6a\x48\xc0\x70\xb5\x1a\x12\xf1\x7d\x31\x35\xf4\xd7\x24\x81\xf6\x6a\x88\x67\xef\x64\x35\x04\xd0\x7c\x29\x35\x04\x9a\xb8\x46\x0d\x79\xde\xc3\x83\x46\x0f\xd5\xb1\x51\x0a\x84\x2a\x0a\x29\x10\x6b\x21\x52\x20\x56\x49\xcc\x58\x10\x29\x10\xab\xdc\x5a\x0f\xf1\x99\x4a\xa5\xb6\xbf\x90\x22\xaa\xe3\x6b\x15\x91\x80\xe1\x6a\x45\x24\xe2\xfb\x62\x8a\xe8\xaf\x49\x04\xed\x15\x11\xcf\xde\xc9\x8a\x08\xa0\xf9\x52\x8a\x08\x34\x61\xad\x88\x78\x14\xc0\xeb\x88\x4e\x19\x9b\xf4\x4f\x3c\xc2\x4f\xe8\x39\x02\x56\x8a\xcb\x8a\x49\x50\x4c\x52\x62\x12\x11\x5c\x3e\xa6\xf8\x98\x5b\x7c\x92\x72\xc0\x55\x83\x09\xd4\x3a\x17\xbb\x11\x91\xde\x7b\x3e\x37\x3d\xc1\xfa\xeb\x19\x54\x6c\xca\x1b\xb8\xc7\xcd\x76\x6c\xae\xeb\xe0\xf9\x69\xae\x9d\xe4\xc8\x14\xd7\x61\xe6\x66\x37\x7e\x2e\xd9\xd6\x8c\x9b\xac\x57\xf2\xf9\x96\xf0\x16\xb9\x4b\x4b\xff\x70\x6f\x81\x41\xf4\xc3\x63\x55\xe4\xf4\x96\x63\x9b\x42\x84\x57\x81\x69\x3d\x06\x93\x9e\x78\xbe\xaa\xb9\x13\xdb\x31\x4d\xe3\xd7\x2e\x44\x94\x4b\x1b\x94\xe2\x39\xfe\x4c\x5b\xbb\x3d\x95\xb6\xae\xdf\x13\x4c\x9b\xb1\xac\x8a\x24\x14\x1d\x3b\xe2\x9c\x58\xeb\xc6\x5a\xbc\xe9\x21\x56\xf2\xec\x1a\x02\x07\x40\x5f\x32\xfc\xc8\x72\x31\x3c\x3b\xa7\x7f\x73\xef\xce\x97\xf4\xff\x63\x61\x6f\x68\x9f\xde\xfa\x3b\xd8\xf5\xb7\xfe\xc3\x5d\x5b\x4e\x79\x4e\x0e\x41\xfe\xf1\x8e\x11\xdd\x7f\x4e\xa2\x8a\x14\x71\x94\x44\xd5\xc7\x3b\x6f\xd1\x7f\x6e\x29\xf1\x9b\x77\xec\x2b\x67\x7b\xf6\xfd\xef\x57\x8e\xb7\x6e\xfe\xf5\x97\x67\xdf\xd7\xc4\x38\xc1\x99\xd8\x9f\x85\x4e\x9c\x96\x0c\x41\x70\x9d\xc4\x30\x14\xfa\x29\xdd\xd6\x99\xa2\x90\xc2\xa0\xf8\xac\x51\x9e\xe2\x85\x22\x1c\x44\xa4\x0e\xa9\x81\xe4\x02\x36\xa1\x36\x68\x47\xf6\xa8\x69\xf8\x0f\x36\x18\x6a\x74\x5a\x8a\xad\x34\xa4\xd4\xfc\x76\x4c\xfb\x1a\x3d\x29\x21\xf6\x6d\x10\x6b\xb4\xa5\x5c\x59\xab\x2c\x35\x44\x0b\xba\x52\x53\x53\x9d\x7b\x59\xdd\x0f\xa5\x6e\xc4\x47\x1a\xd5\x90\x52\x55\xef\xde\xa6\xcd\xff\x0e\x6a\x52\xe6\xc2\xaf\xad\x2c\x79\x4e\xa2\xba\x72\xec\x24\x45\x14\xa6\x59\x6e\x50\x0d\x89\x55\x31\x28\xa1\x43\x50\x84\x53\x2e\xad\xe1\x17\x84\xa4\x24\x73\x2f\x59\x11\xb6\xc6\xf9\xbe\x20\xc1\x67\x97\x7e\x30\xde\xf7\x04\x45\x2c\x51\x60\x7f\xa5\xb8\x56\xdc\x3f\x91\x2c\x05\x9f\x9f\x2e\xca\x07\xd7\xb4\xf7\x9f\x9c\x73\xa1\xca\xef\xaa\xcc\x1b\xdb\x42\xce\xd9\x4d\x27\x90\x90\x10\xe6\xcd\x47\x9e\x29\x77\xb7\x84\x86\x22\x15\x3a\x2e\xfe\xb2\x18\x59\x99\xe3\xb1\xea\x06\x2b\x17\x45\xcb\xa5\xdc\xba\xd7\xdf\x69\xc5\x01\x94\x04\x82\xc0\xdf\x48\x92\x50\x8c\x44\x34\x9e\xb7\x81\x4c\x2c\x54\xb4\x0d\xa1\xf4\xdf\x2e\xef\xfb\xb7\x90\xee\x19\x3e\x7a\xdf\xb6\x20\xc7\x2c\x43\xd2\x11\x89\x43\xef\xee\xb3\xf0\x55\x79\x07\x96\x8b\x39\xdd\xde\x33\xee\x6f\x67\x79\x88\x0c\xba\x55\x54\x09\xa9\xf2\x86\xfb\x64\x5b\xb9\x7a\x79\xd9\xcb\x10\xdd\xc3\xe2\xa5\x36\x5d\x0b\x6c\x94\xd4\x95\x34\x8a\x7a\x90\xc1\x8e\xb0\xb9\x98\xd5\x83\xf4\xdc\x95\x6e\xf9\x77\xf1\xb7\x11\x9e\xc0\xa4\xfd\xe0\x6e\x5b\x17\xd7\xca\xd7\x27\xa5\x51\x07\xe8\xea\x94\xc4\x62\x79\xff\x41\xfb\x60\x41\xa1\x55\x24\x12\x95\x53\x55\x23\xaf\xe8\xb7\x85\xc8\x6e\x28\x8c\x5a\x16\x8c\xee\x2d\x13\x96\x31\x5d\x6d\x48\x51\x4d\x7a\x10\x7e\xc1\xb6\xb7\x18\x27\xc1\x33\x12\x21\x29\xd2\x62\xbe\x51\x0e\xb8\x8b\x64\x28\x6a\x63\x1a\x72\x60\xc2\x40\x2f\x50\x0a\x9a\x1b\xf5\xb6\x24\xc8\xcd\x00\x8c\x51\x72\x72\xe9\x54\x89\x83\xd7\x1b\x44\xf0\x80\xc7\x27\x88\x32\xb1\x11\x3a\x89\xbc\x19\x24\xb5\xca\x72\xee\x77\xd3\x3c\x70\xb2\x95\xe7\x82\x4e\xff\x6e\x69\x47\x92\xe4\xaa\xf0\xea\x53\x03\xdc\x7c\xa1\x92\x48\x80\x5d\xf9\xca\x6b\x11\xd5\x8e\x9f\x1d\x60\x67\x09\xc2\xdb\xbe\xd1\xb4\xba\xa3\x38\xe0\xc3\x8e\x18\x3e\xa0\x27\x63\xe0\x5c\x4c\xcc\x33\xd6\xbd\x0e\x95\xd2\x89\x75\x05\xbf\x08\xad\x82\x5e\x0c\xeb\xde\xc2\x69\x2f\x30\x2b\x5f\x9f\x2a\x34\xb4\xb8\x06\x80\x56\x01\xfb\x86\xcc\x9a\x37\xe3\x20\x30\xd7\xc6\xb1\xf0\x17\x11\xc7\x27\x5b\x96\xf0\x3d\x57\xe2\xf9\x96\xc7\x27\xd9\x9e\xf4\x23\x17\x09\x47\x8f\x4f\x91\x7c\xc5\x98\x7e\xc5\x26\xe1\xbb\x7d\x9b\xa2\x86\x19\x05\x06\x8d\x00\x23\xdd\x53\x68\x6a\xba\x38\x96\x2c\xb8\x30\x5f\xcf\x2d\x39\x8b\x8a\xe9\x5d\x9a\x31\x93\xca\xa8\x26\x47\x8c\x10\x02\xa7\x1c\xa2\x5b\x11\x65\x33\x44\x08\xa8\x6e\x8c\x70\xd2\x80\xda\x69\x36\xb5\xa5\x46\xed\x08\x86\xb9\x95\xe6\xe9\xb0\xb6\x34\x35\x3f\xdd\x43\x76\x49\xab\x2e\x32\x57\xff\xf5\x44\x37\xcd\x70\x7d\x77\x9c\xac\xc8\xcf\x41\x5a\x76\x2f\x35\xd8\x1a\x9c\xbd\xf4\xbf\x7f\x91\x1b\xe2\xd4\x89\xfa\x39\x84\x1c\x61\xa1\xe7\x46\x70\x38\x64\x45\x18\x75\xae\xa2\xfe\x39\x42\x90\x1e\xce\xd4\xce\xe4\x0c\xfe\xa1\x32\xa7\x19\x91\x08\x6c\x8a\xfa\x60\xbe\x65\x47\xb7\x7a\xcd\xc9\x3d\xfa\xaa\xd8\x2e\x4d\x94\x65\xbe\x21\x05\x15\x8d\x48\xa1\x64\x4c\x7f\x2d\x2a\x73\xe8\x13\x32\x8d\x44\xab\xfa\x83\xfa\x5d\x74\x83\x76\x5f\x90\x20\x3c\x14\x7d\x5c\x81\x51\xcf\xda\xc1\x96\x42\x61\x61\x7b\xc3\x7b\x21\xe9\x61\x97\x65\xe4\x36\x95\x0b\x66\xa0\xbc\x79\xef\xf9\xad\x23\x7d\xfa\xb3\xf1\x1c\xdb\x8c\x84\x8f\xde\xdc\xbe\x05\xa3\xb8\x3e\xe8\x8f\xcf\x91\x47\xd4\xe0\xf5\xcf\x7b\x10\x70\xd1\x82\x06\xb6\x71\xe6\x29\x91\x36\xd0\x97\x34\x24\x05\x9d\x9e\xb7\x46\xcc\x4d\x54\x01\x01\xea\xbb\x16\x32\xf1\xe4\xc1\x29\x4a\x9b\xac\x75\x0a\x11\xc3\x2e\x7a\xe1\x02\xa3\x17\x89\x3c\x38\x11\x78\xb7\xc1\xe0\x98\x54\xc7\x50\x50\xef\x0b\x3b\xaf\x8c\x10\xb4\xd0\xe7\xa3\x16\xea\xd3\x76\x68\x42\x3e\x0a\x4f\xf5\xfb\x0e\x41\xd7\x89\x10\x85\x75\x68\x73\xbd\xd9\x2f\x3f\xe8\x86\xd0\x72\xc6\x49\x91\x5e\x44\x62\x54\x69\xa4\x6f\x17\x39\x9a\xb5\xc5\x24\x14\xba\x48\xc4\x01\x46\xcc\xdc\x11\x71\x1a\x50\xdd\x8e\x49\x14\xa3\x03\xf8\x2f\x44\x32\x2c\xe2\x3e\x18\x96\x1c\x55\xab\xdd\xf4\x12\x5b\x14\xb8\x3e\xe6\xbd\xbe\x3a\xc5\x8c\xd8\x76\x7f\xea\x26\xb6\x3e\x25\xf4\x47\xef\xe2\x1c\x1b\xae\x01\x51\x23\xec\x86\xad\x38\xd7\x65\x27\xd7\x7a\x7c\x9a\x5d\x75\x4b\x46\x59\x54\x0b\xde\xd2\x4a\xee\x96\x82\x00\xe0\x14\x4c\x93\xc2\xa5\x9d\x10\xaa\x48\x28\x13\x1d\xbb\xaf\x49\x68\xab\x6e\xea\x0a\x7e\xfb\x76\xf3\xdc\xd4\xd9\x6b\x66\xbd\xe5\xa4\xe7\x2c\x91\x20\x3c\x11\xcb\xb7\xe4\x0d\xdb\x19\xd7\x57\x32\xd3\xb7\xeb\xb7\x72\xa4\xe2\x2d\x1a\xa9\x78\x4a\xd2\x74\xf1\x79\xf3\x3e\x28\x49\x6b\x76\x68\x13\x14\xc0\xb8\x4a\xea\xe0\x50\x7f\x91\x01\xa6\xc0\xd8\x18\xe2\x43\x05\x4d\xdd\xee\x7c\xb5\xfb\x69\xfd\x22\xbd\xa9\x4e\x92\xbc\x7a\xd5\xdd\xe6\xdb\x57\x29\x47\x95\xc2\xd2\x81\x01\x6b\x00\x7e\xe6\xaa\x56\x5c\xff\xdc\x28\x6e\x7f\x6e\x70\x5f\xb1\xb7\x90\x64\xd8\xcd\x8b\x28\x09\x8a\xd7\x89\xa1\x64\x02\x1e\x8b\xc0\xc9\xfe\xb3\xf2\x74\x5a\xd1\xc4\xc6\x3f\x1c\x54\x4d\x30\x5c\x52\x13\x73\x55\xa4\xe5\x91\x66\x0d\xb0\x6a\x1a\xfc\x25\x39\x64\x69\x38\x86\x43\xbc\x41\x1d\x88\x78\x44\x1e\x0d\x05\xe3\xb8\xb4\x5e\xad\xf7\x1b\x5f\xdd\x8c\xc0\xa7\xbe\x60\x32\xa7\xbc\xc5\x6e\xe6\x78\xde\x96\x32\x4c\xc1\xab\xcb\xe1\x40\x4a\xfb\x2e\xf8\xbb\x60\xbb\x5a\x4b\x5d\x68\xb0\x48\x7c\x6a\x3f\x8f\xe3\x92\x47\xb6\x64\xb9\x52\x35\x21\xf2\xa8\xf9\x3c\x99\x43\x2b\x2a\x4c\x9b\xed\xcc\xd9\x3c\xa0\xfc\x89\xd2\x63\x66\x4f\xf9\x36\xf0\xf7\x3b\x91\x72\x8a\x42\xe4\x0c\xfb\x36\x92\x2d\xde\x36\xd8\xed\x51\xe4\x02\x4f\xe8\xb7\xc9\x0c\xa1\x13\xcb\xdb\xf8\x33\xc7\xdb\xad\x50\x8e\xbc\x04\x45\x2a\xa6\x3c\xf9\xc6\xf7\xfc\xb5\xff\xa0\xb6\x3f\x0f\xde\x62\x2b\x92\xde\x22\x12\x59\xd3\x7d\x46\xb8\xa3\x6f\x25\x5c\x3e\x90\xc5\x42\xd5\x8a\xc0\xa3\xf6\xf3\x74\x36\x51\xdd\xe3\x3d\x2c\x67\xce\x16\xe5\x52\x18\xa4\x27\xe1\xf6\x98\x6e\x70\xc3\xc3\x72\x2d\x4f\xab\x06\x89\xc8\xa0\xf6\xeb\x38\xe9\xd9\x87\xbe\xb7\x5c\x28\x1a\x10\x78\xd3\x7c\x9d\xce\x1a\x7f\x31\x73\xd6\x4b\xe5\x94\x6a\x6e\x8b\x8e\x11\x9f\xdd\xf1\xe1\x18\x88\xb4\x33\x34\x22\x6f\x9a\x8f\xe3\x45\x27\x20\x0b\xb2\xc6\x5b\x10\x98\xc3\x3e\x4e\xe7\xcd\x6a\x37\x73\xfc\xd5\x03\x5d\xbc\x16\x0a\xc1\x29\xec\x83\xc4\x35\xc9\xb2\xe4\x51\x2d\x3e\xcb\x42\x53\x7c\x1e\xab\x70\x42\xdf\xf3\x57\x28\x72\x49\x60\x8a\xcf\x93\x59\xb2\xf6\x67\xce\x7a\x37\x73\x36\xa2\xba\xf9\xd3\x25\xd9\x67\x55\xd1\x79\xb5\x7a\xd3\xdc\xd7\xf9\x43\x75\x31\xa3\x75\xae\xcf\xe5\x88\x03\x03\x81\x30\x40\xda\x8a\x92\xe6\x83\x27\x7d\x42\x4f\x9a\xd7\x39\xa3\x9e\x3c\xa1\x2e\xe7\xd6\x63\x1d\x93\x42\x9f\x4f\x68\xcc\xe5\x1c\x8f\xdf\x53\x5d\x11\x44\x8a\xd1\xc5\xbc\xe6\xe2\x3a\x21\x5e\xae\x6b\x6a\x0e\x5b\x3e\x64\x47\x05\x2b\x86\x51\x99\x44\x25\x7b\x0a\x84\xf2\x70\x25\x53\x01\x41\xe6\x87\x38\x2b\xc9\xa4\x0b\x1f\x82\x4b\x50\xcb\x57\x6d\x5f\x51\xdb\x7d\xb1\x58\x2d\x76\x6b\x95\xd8\x1e\x0e\x64\xad\x48\x0e\xbf\x0b\x03\xe0\x59\xe2\x5b\x38\x4b\x57\xe5\x7a\xb8\x87\xe3\x21\x54\xc2\x49\x83\x32\x50\xe9\x6f\xd7\xbe\x00\xa5\xb0\xb5\x97\xbb\x65\xb8\xf2\x94\x13\xd1\x27\x4b\xb2\x46\x5d\x52\x9b\x70\x17\xee\x95\x6d\x68\xfa\x74\xd8\x1d\xf6\x87\xa3\x12\x52\xd9\x2b\x7f\xe1\x2f\xfd\x8d\x08\x87\x59\xc5\xde\x7a\xbd\x65\xfa\x10\x5f\x42\x56\x24\xe4\x73\x09\xf5\x94\x2d\xc9\xe6\xb0\x57\xb4\xa0\xe9\xd1\xde\x0b\x8f\x7b\x15\x9c\x7a\x94\xf6\x3e\xf1\x96\x02\x94\x6c\xc5\x2e\x0e\xeb\xd5\x66\xa1\xec\x8c\x47\x0e\x47\x0f\x15\x39\x42\xd6\x64\x8f\xa1\xd7\xf4\x24\xd8\x87\xe1\xb0\xbc\x42\x20\x75\x37\x36\xfe\x61\x29\x76\x03\x35\x3d\x77\xeb\xcd\x6a\xb1\xd2\xb8\x3e\x97\x87\x10\xeb\xc9\xf1\x48\xc8\x3e\x50\xb4\xa0\xe9\xcc\xf1\x48\x76\x81\xa7\x80\x53\xf6\x67\xbd\x5c\x1e\x17\x62\x7f\x30\x23\x71\xeb\x7b\x07\xb5\x94\x1d\x77\xe1\x16\x97\xb2\xe3\xfa\x20\x4b\x59\xdb\x80\xae\x37\xde\x7e\xb1\xdf\xe2\x60\xca\xce\xac\x1e\x3c\xdf\xdb\x4a\x5a\x5c\x32\xeb\x76\xde\xce\xdb\xf9\xca\xbe\x10\xfa\x3f\xb4\x2f\xe1\x31\x3c\x12\x14\xbf\xa6\x2b\xe4\x40\x0e\xc7\x0d\x0a\xa5\xec\xc9\x66\x47\xff\x27\x75\x5f\x34\xc1\xbc\xbd\x47\x7c\xa5\x3a\x63\x4a\xeb\x01\x9d\xfa\x9b\xc3\xee\x10\x60\xe8\x75\xf3\xfe\x61\xbf\xdf\x13\x0c\x48\x3d\x5b\x56\x8b\xf5\xa2\x9f\x60\xbf\xfb\x4c\x5e\x8f\x45\x90\x90\xd2\xc9\x8b\xec\x54\x90\xb2\x74\xf7\x41\xe1\x96\x55\x11\xe5\xa4\xd5\x6a\xc7\x22\xeb\x23\xe9\x81\x3e\x0d\xeb\xa2\xd7\xa5\xe8\x6a\xaf\x2f\x54\x99\xb6\xfa\x42\xbc\xac\xd1\x35\xad\x3a\x93\x94\x12\x85\xa0\xd9\xe0\x38\x77\xea\x42\x76\x7f\x6f\xd7\x13\x0d\x3e\xe1\x40\x08\xf0\x69\x42\xf8\x55\xe9\x99\x3e\x70\xf3\xa2\xdd\x92\xb2\x26\x8f\x73\x11\xeb\xcf\x9f\xa0\x03\x95\xd9\xaf\xce\x62\xbe\x69\xbc\xb4\xd3\xdc\xb3\x32\x77\x4c\x51\xfc\x11\xb9\x0b\x55\x2f\x9a\xe8\x10\x07\x85\x7b\xa2\x63\x43\xd2\xea\xdd\x6a\x1d\x92\xd3\x4c\xf5\x82\x6a\x7d\xef\xf8\xeb\xb7\x33\x68\x93\xca\x1f\xd6\x8b\xb7\x3a\x04\x86\xe2\xad\x88\x4e\xfc\x20\xe5\x26\x1f\x32\x35\xf3\x91\x9d\x39\x36\x04\x69\x94\x04\x55\xc7\x87\xe6\x57\x33\xd3\xca\x96\x07\x4e\x94\x1e\xa3\x34\xaa\x08\x3a\x6f\xaf\x1f\x3b\x81\x04\x8e\x08\x79\x0c\x9b\x66\x14\x93\x81\x0b\x81\x8b\x04\xa5\x60\xc0\xf2\x5b\x8c\xbe\x5c\x7c\x9d\xf3\x65\xa2\x1d\x1b\x66\xfd\x40\x04\xeb\x89\x1b\x1c\x86\x4b\x14\xe2\xb5\x2b\x24\x30\x3e\x9c\xb4\xa2\xb5\x8f\xa3\xee\x9f\x85\x29\x8a\xb1\x73\x7f\x4f\xdb\xbc\xed\x25\x04\xde\x87\xa2\x6a\x1f\xbb\x6c\xa2\xf7\x9c\x08\x39\x53\x05\xbc\x57\x5c\x13\xb1\x79\x49\xa1\xb9\xe8\xa1\x7d\x36\x21\x50\xa9\x7d\xd0\xc5\x9d\x6a\x22\xef\xc6\xe4\xe3\x49\x83\x28\x18\x5e\x67\xa9\x70\x69\x4f\x5b\x0d\x4d\xf6\x37\x0d\x64\xc9\x7b\x9c\x9e\x74\xc4\x90\x45\x5c\xa4\x01\xca\x96\xe2\x86\xcd\x2d\xae\x57\x88\x12\xf8\xad\x83\x0b\x25\xfe\x66\xcf\x16\x07\xd7\x1b\x53\xf6\x8a\x4e\x95\x80\x63\x42\x80\xee\x9c\x15\xd1\xcf\x59\x5a\x05\xb1\x39\x7c\x0d\x0e\xf6\xc9\xb1\x96\x68\xfd\x95\x1c\xab\x7b\x92\xd6\x34\x28\xe4\x7c\xcc\x2d\x1e\xc5\xb5\x50\x5b\x12\x94\xa3\x34\x1e\xd5\x08\x39\x12\x24\x80\xf5\x41\x27\x62\x63\xdb\xc5\x7a\x25\x5c\x9e\x43\x9a\xf6\xec\x9f\x62\xa0\xb4\x89\x81\xb7\x95\xb1\xd7\x94\xd0\x36\x62\x6a\x2d\xa8\x96\x2f\x0e\xc6\x10\x23\xca\xab\xa5\xc4\x5a\x5f\xf8\x1f\x41\x0b\x37\xc4\x58\x0a\xc5\xd1\x18\x95\xf2\xab\x93\x60\xa5\x0c\xdf\x86\x00\xbc\x97\x82\x28\x6b\x84\xd9\x3e\x76\x33\x4e\xa7\x10\xc3\x79\xa4\x44\x27\xe1\x5f\x90\x44\xe3\xc4\xfc\x3a\x12\x8d\xd2\x72\x95\x44\xa3\x18\xbf\xa6\x44\xdb\x12\xf0\x45\x25\x9a\x0b\x03\x8c\xd3\x29\x84\x03\x1e\x29\xd1\x4d\x14\xd9\xbf\x10\x89\xc6\x89\xf9\x75\x24\x1a\xa5\xe5\x2a\x89\x46\x31\x7e\x4d\x89\xb6\x25\xe0\x8b\x4a\x34\x1f\x50\x16\x27\x54\x88\x20\x3a\x52\xa4\xeb\xf8\x2f\x48\xa4\xeb\xf8\x2f\x47\xa4\xeb\xf8\xd6\x22\x5d\xc7\xbf\xb2\x48\xd7\xf1\xd7\x16\x69\x88\xf9\x18\x5f\xca\xb3\xf2\x8d\x98\xa2\xfa\x27\xfd\xa6\xa2\xeb\xba\xb3\x50\x6d\x1e\x55\x68\xec\x43\xc0\xe0\xfe\xa0\x09\xc7\xd4\xc2\x61\xb4\x02\xe3\x58\xc7\x98\x01\x0c\xb9\xd1\xa2\xa7\x52\x38\xfa\x1e\xd7\x9c\x26\x90\x98\xc2\x69\x31\x90\x22\x3a\x2d\xda\x12\x9c\x8c\x49\xa7\xea\xc2\xd9\xb9\x12\xe7\xd8\x21\x30\x02\x22\x83\xa0\xa7\x54\x38\xab\x1f\xdb\xe0\xd8\x61\x80\xc4\xf0\xc3\xd0\x97\x28\x08\x19\x7f\x0d\x40\x38\xec\x57\x60\x1c\x3d\x04\x7a\x30\x64\x00\xf4\x54\x0a\x57\x0b\xc6\x35\x37\x96\xfd\x90\x14\x9e\xfd\x7d\x09\x4e\xc6\xd8\x5b\x0b\xc2\xdd\x04\x0c\xdd\x58\xc6\xeb\x60\x30\xdd\xa3\xa5\x4f\xb8\x06\x31\xa2\xad\xd1\x8a\x07\xd0\x21\x28\x9e\xae\x04\xa7\x61\xd2\x0d\x0b\xee\x1e\x85\x02\xe3\x58\xc6\x1b\xc0\x10\xde\x1b\xa9\x84\xb7\x36\xc6\x35\x37\x96\xfd\x90\x14\x9e\xfd\x7d\x09\x4e\xc6\x84\x0b\x21\xfc\xb5\x0f\x1c\xe1\x58\xe6\xeb\xa1\x10\xde\x1b\x68\xe4\xef\x98\x8c\x6a\x6d\x2c\xeb\x21\x25\x3c\xeb\xfb\x12\x9c\x8a\xf1\xd7\x57\xf8\x4b\x2a\x28\xbe\xb1\x8c\xd7\x02\x61\x32\xaf\xa5\x50\xb8\x10\x33\xa6\xb1\xd1\x12\x0f\x08\x11\x24\xbe\x2b\x51\x0d\xfe\xb8\xbb\x36\xc2\x8d\x1a\x0c\xdd\x78\x69\x57\xc3\x60\x2b\xab\x96\x3e\xe1\xf2\xce\x88\xb6\x46\x2f\xab\x80\x0e\x61\x59\xed\x4a\xda\xa8\x29\xc3\xad\xd7\x36\xba\x02\xdb\x55\xca\x2f\x77\xf9\x07\xa6\x16\x0f\x1b\x07\x6b\x76\x31\x9c\x48\x0f\x37\xbd\xbd\xbc\x76\x16\x43\x1f\xb2\x3c\x38\x44\xd5\xeb\xa3\x03\x5e\xa6\x32\xda\xe0\xdb\x7b\x14\xa5\x3a\x8c\x21\x03\x67\x31\x41\xba\x73\xcc\x7b\xf6\x73\x3e\xfc\xec\x86\xdd\xa6\x2e\xbc\xc3\xde\x53\xbb\xed\xc9\xdd\x5f\xaa\x2a\xe3\x18\x3a\x1c\x58\x8f\xcc\xd0\x0b\x2e\xed\x33\x74\x42\x08\x66\xc5\xa1\x6b\x9b\x02\x3d\x0b\xca\x4a\xce\x57\xbc\x5c\x2f\xda\xfd\x29\x48\x72\x34\x7c\x54\xbd\x1a\x56\x04\x28\x94\x6e\xc6\xec\xd6\xf7\x78\x0c\xd8\x21\xcf\xb2\x75\x10\xd8\x7b\xec\x5d\x00\x9f\x1b\x59\x05\xd4\x8f\x8b\xd5\x0d\x0f\xc6\x2a\x45\xb0\x2d\x43\x38\x4f\x06\xca\x82\x4c\xf7\x06\x51\xdf\xb6\x87\xd4\x52\xe4\xa0\xd7\x40\x9d\xa3\x50\x9f\xea\x9e\xd6\xe2\xa2\xcf\x18\xee\xe1\x80\x9b\x63\xda\x94\xd3\xc8\x29\xff\x17\x92\x02\x8b\xd8\x9d\x8b\xf5\xfd\xd7\x0b\x96\xdb\xb0\x74\xb8\x96\x24\x5e\x38\x19\xee\x2f\x65\x61\x10\xbb\x59\x4e\x52\x43\xa0\x24\x50\xb1\xf9\x5b\x88\xc6\x54\x73\xf7\xfe\x54\x39\xa3\x21\xe8\x70\x5d\xe6\x18\xd5\x24\x14\xdf\x25\xc0\x4b\x4f\xc3\x25\xa1\xc5\x7a\xf1\x01\x93\x24\xf9\x22\x53\xaf\xc2\xbb\x0f\xe8\x05\x45\xee\x09\x0f\xec\x69\x18\x05\x71\x76\xd2\x5e\xec\x69\x5b\x1c\x82\xee\xb2\x89\xc6\xe7\xbe\xd1\xe9\x37\xd6\xd0\xfc\x18\x84\xc4\x41\x1a\x85\x17\x0f\xd9\xdf\xc7\xac\xa0\xe2\xbd\x6c\xdf\xa1\x37\x8f\xd0\x9d\xa1\xac\xad\x16\x07\x15\xa1\x72\xe7\x52\x8d\x78\x3f\xed\x32\x9d\x9e\x32\xd3\xa5\xc8\x06\x9a\xe9\x0a\x55\xbf\x1a\x7a\x11\x6e\x34\xf5\x9b\xa4\xf9\x06\xe8\xf2\x10\xc4\xe4\x9d\x37\x5f\xf8\xf7\xe8\xd8\xb5\x39\x76\x82\xfe\x15\x8d\xac\x55\x60\xbe\x73\x36\x9d\x58\xba\x74\x97\x5d\x6e\x34\x23\x6d\x0b\xda\xcb\xb0\x72\x06\xf5\x0e\xe3\xf3\x19\xa0\x34\x4e\x31\x65\x3b\x8d\x82\x9c\x99\x2b\xc2\xb0\x73\x52\xd8\x54\xab\xa6\x06\xc5\xa1\x9f\xc8\x1d\x86\x46\x21\x77\x8b\xba\xbd\xf6\x86\x61\xaa\x2d\xf9\xdf\x35\xc5\xc7\x9a\x42\x96\x23\xc3\x28\x74\xc5\x94\x84\x76\x04\xd1\xcc\xfa\x1a\x12\xf4\xd2\x36\xf1\x1a\xb5\xa0\xb6\xa6\x34\x6f\x92\x4b\x79\xda\xd9\xa2\xe6\x99\xde\x93\x8f\x20\xe4\x1a\xbf\x45\x60\x7f\x51\xbd\x8b\x9a\xd5\x2a\x2e\xd0\xf5\x26\x9d\x7f\xaf\x7d\x57\xa9\x59\x50\x68\xe3\x61\xd1\x45\x22\x9e\xb6\xf8\xad\xc4\xc0\xc7\xcf\x2f\xa2\xd0\x3c\x9f\xd5\x5e\x7a\x15\x49\x8d\xa6\xff\xb3\x64\x76\xa2\x75\x07\x1b\x70\xa8\x0b\x76\x3a\x50\x57\x8d\xbf\x54\x8d\xcc\x0d\xf6\x2a\xc0\xdd\x93\xea\x85\x90\x54\x88\x3d\xcd\xbd\x90\x55\x5a\x62\x43\x00\x28\xa3\xf5\xb5\x1c\x69\x7c\x2d\x11\xdb\x8b\xe3\x00\xba\x89\xf2\x90\x97\xbd\x8f\x8e\xcb\x3e\xc3\xff\x22\x0a\x57\x13\xa6\x5f\x1f\x1b\x49\x54\xec\x8a\x39\x89\xe4\x12\xe0\xc8\x16\xf0\xc1\xa5\xc6\x2e\xe2\xa3\x6a\x29\xc0\x33\x40\x92\x34\xfc\xa0\xb0\x5f\x55\x81\xe4\x91\xd1\xd6\x45\xda\x5e\x8e\x0e\xb4\xad\x1e\xf3\x96\x1b\x9f\x9c\xdf\xc2\x11\x92\x77\x6b\xad\x91\xc3\xd4\xea\x3e\x28\xdc\x84\x04\xe5\xa5\xb0\x78\xb1\xeb\x3e\x3c\x3c\x3c\xb4\xfb\xdc\xee\x46\x63\xb7\xef\xed\x06\xbd\xff\x30\xd8\x19\x4d\x4b\xb6\xd7\x22\x31\x83\x0f\xec\xb4\xd7\x8b\x85\x10\x55\x9b\x0a\x5a\xb3\x97\x15\xb2\x88\x6a\xd7\x47\xb5\xf5\xb5\x64\xf6\xf3\xbd\x05\x22\x6c\xb1\xd1\xd8\x60\x06\xc4\xbc\x15\xa3\xb6\x4e\x2c\xd1\xf0\x8b\xa5\xc2\x20\x81\xb8\xd4\x46\x09\x6c\x65\xb8\x9f\x0a\xdd\x1f\xfd\xa0\xd8\x5e\xac\x6a\x90\xc5\xa7\x19\xf8\x35\xdc\x41\x01\xa8\x77\x36\xa8\xf9\x1b\x2e\x1a\x6c\x9e\xb7\x12\xd1\xcd\xab\x2c\x8b\xab\x28\xd7\x8a\x3f\x58\x04\xb7\x0b\xd5\xb3\x8a\x7e\xbe\x0d\x8e\xa0\x63\x90\x44\xf1\xeb\xa3\xe3\x06\x79\x1e\x13\xb7\x7c\x2d\x2b\x92\xcc\x9c\xdf\xc7\x51\xfa\xf9\xfb\xe0\xf0\x03\xfb\xfd\x8f\x59\x5a\xcd\x9c\xa7\x37\x3f\x90\x53\x46\x9c\xff\xfc\x97\xa7\x37\x33\xe7\xdf\xb3\x7d\x56\x65\xf4\xeb\x3f\x93\xf8\x99\x54\xd1\x21\x70\xfe\x95\x5c\x08\x2d\xfb\xfb\x22\x0a\x62\x5a\xf4\xaf\x59\x95\x39\x3f\x04\x69\x49\xbf\x3e\xbd\xf9\x2e\xda\x93\xc6\x7f\xd7\x7f\x2c\x83\xb4\x74\x4b\x52\x44\x47\x5a\xe1\xef\x29\x11\xce\x1f\x58\xc0\xb1\x7f\x48\xb2\x3f\x45\x0d\x5c\xd7\x2e\xfa\xed\x87\xd7\x64\x9f\xc5\xcd\x47\xd6\x1e\x07\x0e\x5c\x5e\x5d\x88\xd3\x22\x09\x62\xd9\xbd\xb9\x5a\x28\x17\x08\xfe\x85\x4f\x1f\x92\x16\x7e\x1c\xd6\x67\xf5\x6b\x1c\xce\x2b\xca\x7f\x95\xf7\x7c\xd4\xc4\xa9\xa8\xfd\x46\x97\x77\xa6\xd9\x01\xe1\x2c\x67\x13\xcb\xd6\xc4\x7f\xe6\x5f\x09\xf2\xd5\x31\x3c\x4d\xd0\xbb\x06\x4f\xaf\x9a\x54\xfe\x41\x75\xa2\x28\xc4\x26\x6a\x45\x16\x37\x86\x1e\xc4\x6a\xce\x3c\x28\x8a\xae\xa2\x42\xc0\x11\x71\xee\x6e\xaf\xcc\x77\x1d\x8d\xfd\x03\xd1\xf9\x8a\x77\xe1\xc1\x66\x78\xbd\xa3\x68\x4e\xdc\xe6\x88\xce\x75\x45\x28\x8c\x56\xc8\xd8\x4a\x3b\x04\x74\x29\xdd\x96\x02\x16\xbd\xdd\x81\x1f\x28\xdb\x7f\xac\xdd\x3c\x0e\x0e\x24\x21\x69\xf5\xbf\x3e\x3e\xbd\xa9\xb2\xfc\xe9\xcd\x4f\x92\x63\x6a\xd5\x3d\xc4\xc5\xb0\xb6\x7d\xb3\x46\x0e\x39\x2e\xa7\x5b\x41\x71\x77\x7c\x1b\xd9\x86\x10\xf4\x78\xb0\xe1\x85\xcb\x4d\x6d\xff\x86\x6e\xa2\x8f\xa2\xa1\x91\x0e\xa8\x60\xa6\x8b\x99\x30\x56\x0d\xe1\xad\x28\x30\x22\x66\x6b\xee\xf6\x0d\x40\xfe\xc2\xcd\x0a\xd7\x5b\x41\x66\x77\x16\x24\xd8\x0f\x82\x40\x0a\x3f\x0c\x42\x16\x1b\xcd\x40\x20\xe3\xd1\xd8\x89\x86\x11\x69\x53\x02\x18\xc9\x6c\xea\x8d\x93\xf7\x36\x59\x8c\xed\xa0\x0c\x4d\xc0\x51\x11\x1e\x00\xa9\xd0\xdb\x33\x5c\x6c\x86\xe7\x38\xfa\x20\x75\xb8\xd8\x07\xb9\x8d\xd8\xd9\x06\x66\x53\x09\x33\x13\x48\x6b\x8d\x13\x7e\x0a\x61\xcd\xe6\x0e\x3d\x64\x32\x27\x67\x53\x64\x1f\x50\x60\x3f\x12\x3c\x25\xfc\x38\x20\x11\x95\x04\xc1\x57\x0f\x06\xdb\xed\x60\x43\xd1\x11\x13\xa5\x29\x29\x06\x87\x52\x8b\xd8\xef\x2d\x44\x5d\x34\x5f\xcb\x50\x00\x4a\xc7\x85\x39\xb6\x41\x96\x0f\xe7\xab\xe6\xb8\x47\x0a\x17\xcb\x46\x63\x5d\x0e\x3d\xa6\xfb\xa5\xbf\x19\x99\x7f\x33\x32\x6f\x67\x64\xfe\xaa\x6e\x4b\x7e\x02\x5d\x65\xad\x7a\xb2\xee\x5b\x8b\x9e\xae\x85\xbe\x65\xa0\x08\xc5\x82\xe0\x58\x19\x66\x38\x42\xd9\x8d\x6d\xdd\x96\xa6\xc1\xd6\xed\x3e\x98\x6c\x5d\xe9\x20\x7e\x2d\x2c\x0a\x00\xb3\xf3\x89\x5b\x97\x2c\x9a\xf8\x84\xda\xbc\xcc\xd9\xe0\xb6\xd9\x28\x04\xa7\x95\xa2\x45\x7e\x1d\x1a\xd1\xf2\x08\x83\x60\x0e\x56\x07\xa5\x31\x2c\x09\xf1\xda\x82\x76\x26\x21\x13\x48\x07\x92\x05\x3c\xc8\x93\x69\xe7\x42\x04\x00\x5a\x80\x21\xaf\x23\x8f\x37\xe4\xf9\xf4\x14\x4a\xb1\x69\xec\x68\x7b\xc1\xe9\x1b\xf9\x84\x98\xf3\xb8\xe0\x00\x23\x67\x2d\x4e\x74\xc9\xa1\xdd\xba\x4a\x17\x66\x5a\xed\x45\x4e\xa2\xd9\xde\xfa\xe1\x86\x0d\x19\x3d\xce\xec\xb7\x94\x3d\xb1\x1b\x96\xd2\x87\xf4\x02\xc8\x5f\x9b\x8d\xd0\x46\xfa\x4c\xdd\x50\x89\x21\xdc\xbd\xe8\x08\x15\x76\x2f\xdc\x4b\x29\xa5\x1c\xb6\xfb\x0b\x7b\x41\x1c\x5a\xf9\x24\x6f\x61\x2c\x35\x98\xd0\xa8\xbd\x44\xc9\x8d\xdb\xee\xe8\xd1\xc1\x50\x6f\x6e\x2c\x45\x4a\xea\x88\xa5\x4c\x61\xfd\x00\x42\xd5\x9d\x92\xdc\xa0\x23\x7a\xa1\xea\x17\xed\x2e\x37\xf1\x84\x91\x50\xa0\x18\x67\xda\xaf\xdb\x93\x62\x0b\x5b\x45\xcc\xa5\x0b\x36\x2d\x0a\xd3\x01\x39\x65\x3c\x6e\xe9\xff\x30\xc6\x0c\xdb\x57\x5d\xf7\xb9\xed\xab\x90\x08\x5e\x39\xd7\xd8\xfe\xd1\x7e\xa6\x75\x6d\x7c\xc2\x76\xb1\x5f\x58\xe5\x73\xa4\xda\x4b\x85\x48\xf2\x08\x47\xcf\xba\xdb\xef\x2a\xc4\x1a\xee\x77\x2d\x67\xa7\xd0\x09\xcb\xb9\x29\xf7\x01\xcc\xcc\x82\x4f\xd3\x7e\x4d\x27\xb8\x99\xc9\xcf\x21\xc9\xfd\xa4\xca\x4f\xc6\xdb\x6d\xf0\xe2\xb4\x2e\x40\x55\x27\xfb\xba\x09\x42\xf6\xf4\x7f\x5f\xeb\x18\x5e\x50\x21\xc6\x54\x28\x83\x16\x43\x2e\x4d\x2a\xaf\x96\xf6\x51\xc3\xfa\xcc\x9d\xd9\xa5\x24\xb1\xe6\x8c\x9d\xaf\x38\xe7\xee\xb1\x74\xaa\xfa\x72\x38\x77\x37\xf3\x9d\x3c\x48\xdd\x57\x09\x0e\xba\x62\xf4\xd7\x13\x75\xf7\x1f\x31\x9c\x9c\x6c\x62\xbb\xa9\x98\x04\xc5\x23\x35\x92\xcf\x9a\x0b\x53\x03\x4e\xeb\xf0\x68\xfd\xa6\x5d\xcc\x8d\x28\x76\x44\xcc\x22\xdd\x7d\xa7\x72\x79\x0c\x0e\xc4\x7d\x8e\xca\x68\x1f\xc5\xec\x38\x06\xdc\xf5\x54\xdd\xa8\xdc\xdc\x20\xb3\x0f\xd2\x5f\xd3\x35\x49\x0e\xa4\x7d\x15\x31\x13\xbf\xbb\x29\xa9\x2b\xf9\x6b\x5e\x90\x67\xc5\x08\x21\xc8\x19\x92\xe6\x0d\x00\xff\x9d\xb2\xf8\x7e\xf6\xd4\xbd\xc9\x10\x4a\x8b\xe1\xa9\x10\x76\xc9\xf4\x7f\xb2\xf3\xf0\x7b\x45\x93\x94\x42\xac\x49\x86\x54\xdd\x26\xd3\xaf\x9a\x26\x5d\x45\x9b\xcd\x5d\x55\x64\x14\x84\x7b\xf4\xc3\x90\xb8\x79\x91\xe5\xa4\xa0\x45\x6d\x9d\x0f\xba\xeb\xa9\xba\x96\xb0\xc1\x43\xaa\xb1\x61\x40\xfa\x6b\x84\xa3\xbc\x54\x8f\x8d\x10\x41\x11\xb9\x86\x2f\x20\x57\x32\x7e\x66\x59\x17\x6b\x7c\xf1\x41\xcb\xed\x9e\xc9\xce\xa2\x64\x53\xee\xca\x69\x66\xee\x89\x65\x6d\xd0\x17\xeb\x09\x4b\x55\x5e\x91\xc5\x6c\x5c\x66\x58\x01\x1d\x68\x5b\x63\x95\x5f\x6f\x85\xc1\xb4\xbf\x4a\xab\xbb\x53\xda\x29\xd0\x36\x9f\x9b\xf0\x98\x67\xb4\x63\x5e\xca\xa3\x2a\x8f\x7e\xe7\xf2\xc5\xc6\xbf\x4f\xa5\x76\xa5\x08\x08\xa3\x80\x15\x0d\xe3\x30\x69\x6c\x87\x37\x55\x68\x69\x93\x1d\x44\x35\xfe\x2d\xb0\xb2\x58\x93\xa4\x44\xed\xfe\x16\x32\x8e\xa0\x97\x0e\x50\x62\x45\xf7\x88\xa2\xea\xc0\x30\x60\x58\x6b\xd0\xba\xd1\x21\x4b\x95\x7d\x64\xa5\xa6\x54\x84\xfd\x21\x92\x70\x8f\xad\xff\x00\x05\x6f\xbd\x78\xeb\xbc\x67\x96\x40\xf3\x9f\x34\x73\x0b\x92\x93\xa0\xb2\x20\x53\x15\x97\xf9\x52\xc4\xef\x9e\xde\x84\x41\x15\x3c\xb2\x2f\xef\xcb\xe7\xd3\xb7\x75\x12\xcf\xde\x2e\x0f\xe5\xf3\xc9\xa9\x93\x38\x2d\x3f\xde\x9d\xab\x2a\x7f\x7c\xff\xfe\xe5\xe5\x65\xfe\xb2\x9c\x67\xc5\xe9\xbd\xbf\x58\x2c\x68\xe5\x3b\xe7\x18\xc5\xf1\xc7\xbb\xb7\xfe\xf2\x78\x3c\xde\x35\x3d\xfa\x78\xb7\xbb\x6b\xfb\xc2\xfe\x7c\x8e\xc8\xcb\xef\xb3\xfa\xe3\xdd\xc2\x59\x38\x3b\x67\x77\xf7\x76\x49\xde\x2e\x0f\x79\x50\x9d\x9d\xf0\xe3\xdd\xf7\xeb\xb9\xbf\x76\x16\xb1\xbb\x72\x9a\xff\x79\xf3\xb5\xeb\xcd\xd7\xdf\xad\xe8\xf7\x55\xec\xcf\xd7\xae\x3f\x5f\x7f\xd7\x54\xfb\xf9\xee\x7d\x03\x4e\x9b\x7f\xbb\x24\x4f\x6f\xee\xf5\x63\xfa\xdf\x80\x01\xfe\x7c\xcb\x18\xe0\xcd\xd7\xb4\xf3\xdf\x2d\xe9\xef\x55\x4c\x7b\xed\xd0\x9e\xb3\xf2\x5d\xbc\x72\xd9\xff\xac\x38\x10\xa5\x61\x74\x08\xaa\xac\x28\xb5\xca\x58\xd8\x43\x72\xd7\x69\xd1\x43\xc2\xb5\x42\x37\xeb\x74\xb0\x26\x96\x73\xb7\x01\x5c\xbf\x95\x9d\x11\xdd\x47\x24\x8b\xb5\xba\xb3\x71\xd4\x39\xb2\x6b\xba\x77\x63\xba\xbe\xa5\xa9\x3f\x33\x6a\x2e\xfa\x2e\xe0\x45\xdf\xfe\x2e\xa1\x30\x13\x97\xfd\x73\x4b\x48\xae\xf0\xb5\x21\xb7\xfb\xc8\x34\x18\x65\x17\xe5\x82\x3b\x5c\x5a\xed\xb2\xf8\xb6\xbb\x9e\x1b\x9d\x7c\xb5\x57\x80\x17\xa6\x44\x3e\xfd\x9e\x54\x5d\x93\x7f\xbc\xab\x5a\xc1\x36\x37\x59\xc0\x90\x11\xb3\xdf\x33\x0c\xb0\xdc\x83\x6a\x9d\xf5\x77\x08\xf2\x21\xee\xb7\x7e\x2e\x74\x62\xd7\xa7\x9b\xea\x64\x82\x97\x4a\x70\x6e\xce\x09\x39\x1b\x0f\x5f\xb8\x15\xe0\x4a\xc8\xac\x2c\x0f\x31\xd5\x43\x99\xb3\x6d\xaa\xdb\x8c\x69\xb7\x63\xe6\xd8\xd7\x98\xef\x45\x56\x05\x15\x79\xb7\xdc\x2c\x42\x72\xba\xe7\xf9\x88\x21\x31\x2f\x51\xa2\xfb\xab\xff\x20\xa6\xb2\x75\x59\x20\x6e\x21\xcf\x54\x9b\x6a\xb7\x91\xbb\xc3\xa5\xa0\x32\xc7\x38\xa0\xf4\xde\x1b\xf2\x51\x75\x0e\x4e\x10\xdd\x7e\xbe\x5d\xcb\x41\xf6\xf9\xce\x7e\xc0\x79\xd0\xdf\x2b\x56\x9d\xe3\x8a\xef\x2c\x7a\x07\x95\x0f\x32\x8a\xc9\xc3\x74\xea\xbd\x8c\x8b\xb7\xc8\x20\x35\x8f\xf8\x16\xe0\x32\xf5\x7a\xa8\xc7\x09\xb3\x00\x28\xcf\x0d\xb9\xc5\x2f\x36\xa2\x92\xc6\x52\x0e\xa7\x30\x54\xc2\xfe\xc8\x76\xe4\x4e\x30\x38\x36\xfc\x68\x3b\x6a\x13\xd4\x14\x2f\x1e\x33\xee\xdb\xc0\x62\xd0\x07\x37\xbc\x74\xf6\xaa\x37\x5f\x97\xfc\xe0\x34\xdb\x96\x2e\xc5\x73\x03\xab\x4a\x00\xed\xfc\x5d\x94\xe4\x59\x51\x05\x29\xcc\x2a\x46\xe1\xab\xee\xf9\x94\x08\x4a\x0b\x94\x50\x49\x14\x86\xb1\xa2\xcd\xb6\x4c\x09\xdb\x9e\x69\xe0\xf4\x36\x65\x6a\x6a\xa9\x3a\xd3\x21\x80\x15\xf4\x58\xd4\x1d\xef\x4a\x11\xf8\xfd\x89\x8f\x6f\xa7\x0c\x37\x8f\x00\x07\x00\x1a\xe4\x58\x3c\x09\xb9\x8e\xfb\x58\x11\x52\x6d\xac\x04\x6c\x79\x94\xb9\x95\x15\x1d\x11\x22\xc5\x29\x73\x1b\xab\xba\x82\xe5\x38\x3e\x49\x29\x89\x21\xd1\x22\x04\x5e\xa6\xef\x52\x93\x08\x59\xd5\x25\x18\x75\x4d\x99\x82\x58\xd9\x21\x29\x15\xf1\x49\xc8\x1d\xcc\x11\xcc\xd5\xc6\x4a\xf4\x1d\x69\x72\x15\x2b\x3a\x32\xc4\x2f\x53\xe6\x0a\x56\xf5\x42\xc8\x19\x7c\x82\x79\x7e\x21\x95\xa0\x9e\xf4\xd9\x40\x39\x4b\x27\xac\xa0\x9c\x0b\x03\xa6\x4c\xe8\xab\x22\x5e\x4e\xec\x7b\x12\xd2\xf0\x42\x5a\xf9\xda\x58\x89\xbe\x23\x4d\xda\x5f\x45\x47\x60\x40\x2d\x65\xda\x5d\x55\x3f\xa4\xf4\xbb\x27\x3e\x61\x2e\xa4\x95\xab\x8b\x14\xe8\xfb\xd0\x64\xe7\x55\xf4\x01\x44\xa6\x52\x26\x76\x51\x75\x41\x4c\x92\x7b\xe2\x92\xda\x42\x3a\x61\x4d\xf9\xbb\x61\x08\x58\xfa\x5c\xe5\x10\x74\x11\x9e\x94\x09\x6c\xd5\x03\xc0\x25\xb2\x3d\xc1\xe4\xb3\x3c\x8f\xfb\x7a\xd2\x67\xc3\x2c\x60\x39\x6e\x55\xb3\xe0\x4c\x6d\x0d\xf5\x1c\x38\x2a\xe0\x60\xea\xa8\x3f\x1b\xc3\x02\xa1\x48\x80\xf9\x2d\x5f\x62\x6c\x5f\x72\xaa\x01\x87\x65\x51\xfb\x14\x54\x83\x00\x78\x7f\xe1\x97\x71\x48\xe0\x12\x6f\x7a\x84\xac\x41\x33\x1c\x7d\x80\x0f\xe3\x50\x2c\x78\x56\x2e\xf4\xac\xe3\xab\xb7\xb7\x7a\x4c\xcc\x12\x80\x3a\xdf\x89\x91\x3d\x02\x5c\xef\x66\x31\x30\x44\x00\x6b\xbd\x27\x1a\x20\xde\xe2\xc1\x52\xe8\x68\x80\x45\x2b\x83\x07\x57\x5a\x18\x3d\x38\xb7\xa2\xf3\xc0\xca\xd5\xbc\x03\x06\xab\xa8\x10\xe6\x4c\xb5\x82\x76\x90\xfc\x2a\x26\x66\xff\x54\xac\x60\x1d\x30\xb7\x72\x08\x49\x6a\x55\xab\x46\x3f\x40\xd2\xec\x31\x6a\xeb\xa1\xd9\x5e\x5b\x0a\xa1\x6a\x55\x9a\xb2\xef\x2d\xd0\x56\x62\x5f\xd1\xb1\x65\x0a\x89\x84\xfd\x56\x49\x7e\x46\x50\x90\x44\x03\xa8\x82\x5a\xeb\xc1\x30\xe5\x84\x06\x5c\xe7\x71\x98\xc3\xa2\xeb\xda\x94\xf5\x99\x25\x1a\xfd\x5b\x79\x8b\x96\x95\x4a\x70\x4a\xeb\x66\x36\xf1\x8d\x4b\xaa\x73\x24\xaf\xa7\x36\x7b\x52\xc8\xc6\xd2\x00\x78\x88\x8a\x43\x4c\x50\xe0\xf5\xe2\xad\x0e\x32\x8f\xe2\x58\x01\x67\x68\x73\x81\xd3\x8a\x81\xb0\x2b\x1e\xc7\xa8\xbe\xcd\x55\x90\xd0\x4d\xb3\x14\x0b\x00\x87\x35\x1d\xba\x8d\xaf\x06\x75\xe0\xe8\x00\x1a\xe7\x8e\xc6\xef\x83\x03\x63\x50\x9a\xea\x15\x12\x4d\xaa\xf9\xa6\xae\xee\xca\xfe\xa8\xe1\xbb\x06\xec\x40\xba\xa1\x16\xe0\x58\x01\x0a\x78\x8c\x49\x8d\x04\xe3\xd0\xf2\x0d\x81\x81\x25\x32\xa8\x29\x7e\x04\xd5\xb4\x60\xc8\xb5\x83\xde\x85\x36\x60\x30\x70\xe4\x0d\x63\x8f\xc0\xc1\xa1\xb4\x12\x01\x0e\x07\x0e\x6c\x82\xaa\x60\x38\x0b\x9d\x40\xc8\x50\x2e\x70\xa1\x99\xe4\x02\x81\x1e\x84\xc3\x42\x3c\x38\xf8\x61\xbc\xb5\x52\x82\x71\x18\x05\x55\x0a\x8b\x7d\xda\xaa\xd0\x4d\xc2\xf1\x12\x93\x84\xd3\x24\x26\x09\xaf\x97\x98\x24\x9c\x22\x31\x49\x38\x45\x62\x92\xf0\x1a\x89\x49\xc2\xeb\x24\x26\x09\xc7\x4b\x4c\x12\x7e\x01\x89\xe1\xa2\x97\xd0\xb5\x77\xbc\xc4\xc4\xa7\x69\x12\xd3\xc3\x5d\x21\x31\xf1\x69\x8a\xc4\xc4\xa7\x29\x12\xd3\x41\x4d\x93\x98\x1e\x7a\xa2\xc4\xc4\xa7\xf1\x12\x33\x70\xf8\x86\x12\xc3\x07\xa5\x09\xdd\x3a\x1e\x2f\x32\x75\x3c\x4d\x64\x7a\xb8\x2b\x44\xa6\x8e\xa7\x88\x4c\x1d\x4f\x11\x99\x0e\x6a\x9a\xc8\xf4\xd0\x13\x45\xa6\x8e\xc7\x8b\xcc\xc0\xe1\x2b\x45\x26\x2f\xa2\xce\x81\x35\x0f\x5d\xf6\x6b\xbc\x9c\x34\x60\x93\x44\x05\x82\x5e\x21\x2d\x0d\x9a\x09\x02\xd3\x00\x4e\x90\x19\x00\x38\x4d\x6c\x20\x82\x89\x92\xd3\xa0\x18\x2d\x3c\x1c\xcf\xa7\xca\xcf\x9c\x24\x7b\xba\xe7\x26\x65\x9e\xa5\x65\x7f\x05\xc3\x3e\x0d\xb8\x14\xd3\x92\xbf\x98\xa9\xbc\xb0\x2f\xb6\x6b\x8c\x85\x8a\x6f\xcc\x24\xf2\xa5\x2f\xec\x9e\xe9\x0c\xab\x1a\xb1\x63\x7e\xb4\x88\x7d\x40\x4b\xb2\xfd\x9f\xc8\xa1\x42\x8b\x9e\xa3\x90\x64\xd3\xae\xcc\x22\xe1\x67\xd4\x41\xa0\xa5\xb8\xf4\x72\x9f\x7d\x6f\xff\xfa\x20\x3c\x39\x83\xf7\x5a\x56\xfe\x7c\xb7\xde\x7a\xab\xe5\x5b\x35\x0e\x6f\xa3\xc7\xb1\xde\xcc\xfd\xb5\x06\x7e\xb5\x7f\x5d\x6a\xc0\xb7\x3a\x58\x6f\xff\xea\x69\x60\xb9\xc0\xb2\x2c\xc8\x62\x3f\x77\x91\xcc\x83\xd8\xd6\x91\x55\x6b\x42\xb3\xea\x42\xdd\x2a\x41\x8b\xec\xc5\x2d\xc8\x33\x29\x4a\xa2\x6c\xb7\xaf\xa0\x6f\x5f\x8f\x47\xa8\xa3\x42\xf5\x52\x04\x39\x40\x30\x04\xac\x54\x42\xa4\x19\x0a\xd3\x7e\xd6\xb5\x83\x10\x3c\xb4\x67\xa4\xf4\xd8\x7b\x7f\xf8\x38\x9d\x4a\x00\x76\x47\x64\x01\x1a\xa3\x1f\x14\x5e\x9f\x01\xc0\x93\x00\x3c\x25\x40\x13\x5b\x9a\x6b\xa3\x0f\x37\x6d\x02\xf2\x10\x20\xb4\x25\xe1\x62\x65\x13\x2e\xb6\x01\xc6\xe3\x86\x36\x15\x2c\x30\x91\x34\xd4\xe1\xa1\xc5\x16\x58\x9a\xcb\x6a\x0a\x44\x6d\xa1\x05\x9a\x36\xc8\xad\x02\x0f\x17\x08\xd7\x06\x5d\xc0\x5c\x7f\x5a\x6c\x6d\x15\xe5\xe5\x13\xf6\xce\x00\xb2\x5b\x11\xba\xd7\x84\xa1\x67\xb3\x0c\x4f\xcc\xed\x43\xf6\x22\xef\x1f\x4c\xe0\xfc\xad\x23\x0e\x81\xf9\xca\x51\xc7\x81\x82\x54\x87\x33\x82\xa1\x2b\x51\x22\x40\x64\x96\x2b\xb0\x63\xa3\x24\xaf\x18\x0e\x2d\x2b\x31\x59\x15\x90\x98\xd8\x89\xca\xa9\x80\xc3\x28\xa5\x3c\x2a\x28\xa3\x28\x26\x93\x84\x0e\xec\x95\x46\x68\xc0\x64\x1a\xa3\x92\xc4\x47\xf6\x70\x17\x82\xd3\x8f\x8f\x4a\xf5\x0a\x00\xa5\x91\x6d\x20\x6d\x86\x95\xc1\x0b\x63\x0a\xa0\xb5\x03\xca\x60\xe5\xd1\x6c\xc0\x4d\x43\xc9\x80\xb1\x89\xd1\x80\x9b\xe7\x45\xdb\x73\x89\xe9\x0d\xbc\x9a\xe3\x26\xef\x71\xc3\xb5\x04\x6e\x28\x8c\x66\x49\x67\xd7\x77\xb0\xd0\x36\xb1\xb3\x4e\x44\x0c\x92\x89\x32\xc2\x48\xc1\xa9\x31\xa1\xd3\xd9\x2a\x22\xc6\xc1\xf8\x30\x98\x2c\x22\x20\xb4\x5b\x8c\x96\x0b\xd6\x2a\xda\x0b\x93\x01\x23\x22\x1a\xac\x18\xbd\x1d\x23\xc2\x41\x63\x46\x67\xce\xa0\x70\x1e\x02\xe7\xe9\xe1\x78\xd3\x46\x6f\xdc\x28\x60\x3d\x14\x56\xd1\xae\x64\xe5\x24\x50\xb5\x8c\x30\x75\x34\x08\x7b\x5d\x63\x6d\xf1\x68\x90\x41\xe5\x63\x69\xf8\x68\xb0\x71\xab\xca\x38\xfb\x47\x83\x15\x2e\x30\xa3\xcc\xa0\x0e\x27\x67\x06\x08\x23\x62\x65\x0d\x29\x10\x81\x91\xb0\x30\x8a\x14\x48\xf8\x11\x30\xda\x46\x0a\x2c\xfc\x3a\x60\x65\x22\x29\xb9\x03\x16\x04\x1b\x4b\x89\xc7\xa3\x92\x7c\x4b\x83\x49\x89\x4c\xe2\xb5\xa5\xcc\x4b\x88\x30\x7e\x5b\xc9\xbb\x84\x49\x90\x76\x7b\x2b\x4a\x89\x91\x97\x74\x6b\x63\x4a\x33\x02\xc8\x58\xea\x6d\x2a\x1e\x57\x63\x22\x24\xc0\xb0\x32\x99\x56\x38\x3c\x22\x0a\x7a\x0b\x0b\x47\x23\x09\x81\xce\xd0\xc2\x51\x60\xc3\xaf\xb6\xb7\x70\x1c\xf8\x64\xd3\x99\x5d\x2a\xae\x20\xc3\xa3\xb1\xbe\xec\x8f\x63\x19\x47\x92\x70\xba\x09\x96\x84\xd7\x9a\x60\x4d\xeb\xb7\x31\xc1\x7a\x6a\x6e\x66\x82\x25\xe1\x44\x13\x8c\x1d\x73\x4f\x35\xc1\xda\x56\xaf\x37\xc1\x92\x70\x9a\x09\x96\x84\xd3\x4c\xb0\x0e\x6e\xac\x09\x96\x84\xd3\x4d\xb0\x01\xf6\x2a\x13\x8c\xa2\xb9\xa9\x09\x96\x84\x37\x34\xc1\xa8\x64\xdf\xce\x04\x4b\xc2\x2f\x61\x82\x25\xe1\x6d\x4d\x30\x71\x44\x26\x9b\x60\xfc\x48\x4c\x34\xc1\xa4\x11\x98\x64\x82\x51\xce\xdf\xc6\x04\x63\xdc\xb9\x89\x09\x86\xf3\x79\xa2\x09\x86\xf1\x7a\x92\x09\xa6\xe0\xf7\x04\x13\x4c\x96\xf6\x6b\x4d\x30\x49\xd2\xaf\x34\xc1\x54\x63\x39\xda\x04\xa3\x84\x5d\x63\x82\xe1\xa2\x30\xda\x04\xc3\x84\x60\xa4\x09\xa6\x18\xfe\x51\x26\x98\x72\xb2\x8d\x34\xc1\x54\xc3\x33\xd5\x04\xe3\xee\x37\x31\x8e\xc4\xa7\xe9\x26\x58\x7c\xba\xd6\x04\x6b\x5a\xbf\x8d\x09\xd6\x53\x73\x33\x13\x2c\x3e\x4d\x34\xc1\xd8\xbd\xb1\xa9\x26\x58\xdb\xea\xf5\x26\x58\x7c\x9a\x66\x82\xc5\xa7\x69\x26\x58\x07\x37\xd6\x04\x8b\x4f\xd3\x4d\xb0\x01\xf6\x2a\x13\x8c\xa2\xb9\xa9\x09\x16\x9f\x6e\x68\x82\xc5\xa7\x5b\x9a\x60\xf1\xe9\x4b\x98\x60\xf1\xe9\xb6\x26\x98\x38\x22\x93\x4d\x30\x7e\x24\x26\x9a\x60\xd2\x08\x4c\x32\xc1\x28\xe7\x6f\x63\x82\x31\xee\xdc\xc4\x04\xc3\xf9\x3c\xd1\x04\xc3\x78\x3d\xc9\x04\x53\xf0\x7b\x82\x09\x26\x4b\xfb\xb5\x26\x98\x24\xe9\x57\x9a\x60\xaa\xb1\x1c\x6d\x82\x51\xc2\xae\x31\xc1\x70\x51\x18\x6d\x82\x61\x42\x30\xd2\x04\x53\x0c\xff\x28\x13\x4c\x39\xd9\x46\x9a\x60\xaa\xe1\x99\x6a\x82\xf1\x17\x86\x19\x4b\xea\x78\xba\x0d\x56\xc7\xd7\xda\x60\x4d\xeb\xb7\xb1\xc1\x7a\x6a\x6e\x66\x83\xd5\xf1\x44\x1b\x8c\x5d\xc4\x9e\x6a\x83\xb5\xad\x5e\x6f\x83\xd5\xf1\x34\x1b\xac\x8e\xa7\xd9\x60\x1d\xdc\x58\x1b\xac\x8e\xa7\xdb\x60\x03\xec\x55\x36\x18\x45\x73\x53\x1b\xac\x8e\x6f\x68\x83\x51\xc9\xbe\x9d\x0d\x56\xc7\x5f\xc2\x06\xab\xe3\xdb\xda\x60\xe2\x88\x4c\xb6\xc1\xf8\x91\x98\x68\x83\x49\x23\x30\xc9\x06\xa3\x9c\xbf\x8d\x0d\xc6\xb8\x73\x13\x1b\x0c\xe7\xf3\x44\x1b\x0c\xe3\xf5\x24\x1b\x4c\xc1\xef\x09\x36\x98\x2c\xed\xd7\xda\x60\x92\xa4\x5f\x69\x83\xa9\xc6\x72\xb4\x0d\x46\x09\xbb\xc6\x06\xc3\x45\x61\xb4\x0d\x86\x09\xc1\x48\x1b\x4c\x31\xfc\xa3\x6c\x30\xe5\x64\x1b\x69\x83\xa9\x86\xc7\xca\x06\x9b\xb3\x50\xff\xe0\xf9\x3e\x08\xfd\x8f\x5f\x1e\xa6\xd5\x41\x90\x83\xb6\x7e\xf3\x45\x09\x30\xbc\xe6\x69\xeb\x2b\x5e\x9f\x9b\xef\xa6\x51\x6c\x25\x8c\x52\xaf\x21\x79\x58\x88\x5b\x28\x2e\xd4\xb8\x9a\x72\x09\x0e\x3e\x46\x52\x76\x60\xcc\xf1\x2e\xc5\x9b\x84\x53\x7a\x91\x84\xd3\x7a\x21\xbc\xef\x9d\xd6\x0b\xc1\x43\xca\x24\xe7\x34\xa5\x17\xf1\x69\x5a\x2f\x84\x37\xa7\xd3\x7a\x21\x6e\x32\x28\xe2\x3a\x9e\xd2\x0d\xba\x3b\x98\xd2\x0d\xe1\x1d\xa4\x45\x37\xe6\x97\x92\x45\xc7\x89\xc9\xa1\x72\x83\xce\x66\x06\x1f\x1f\x9d\x00\x8f\x49\xc0\x01\xf6\xda\x97\x87\x54\xdc\xb0\x85\xa0\x03\xbd\x1c\xa8\x2a\x8a\x44\xf7\x72\x0a\x34\x39\x3c\xa6\x52\xb5\xd7\x03\x35\xaf\xad\x44\xb0\xf6\x2b\x02\xd8\x3d\x58\xa2\x0b\x40\x15\x1d\xc4\x57\x4c\xed\x57\x1d\x60\xf7\x50\x4c\xf5\x80\x4c\x0b\xdc\xbd\x92\x52\xbd\x9e\xd2\x02\x1f\xa3\xba\x8b\x70\x33\x40\x36\x1f\xf5\x3d\x8d\x0e\x9f\x5f\xe5\x9e\xb2\xaf\x98\x1e\xa6\x18\x87\x88\x38\x42\x53\xe2\xfb\x2e\x2e\x20\xb7\x22\x4f\xef\x72\x21\x20\x87\x01\x68\x30\xfc\xa3\xa3\x7c\x83\x26\x7e\x57\x5e\x72\xda\xa5\xd2\x79\x27\xf6\xb6\x0f\x97\xca\x7e\x0d\x5d\x94\xf9\xd2\xc5\xb0\x1d\xfa\xc9\xb5\xe6\x2f\x84\x70\xb6\x85\x9b\xa5\xf1\xab\xf6\x4d\x5c\xa7\x52\x84\x80\xdd\x9e\x94\x8e\x99\x4b\xd2\xe5\x76\xe5\xc8\x03\x43\xc7\x69\x02\x6d\x17\xe4\x50\x81\x74\x58\xf7\x58\x6e\x5c\xba\xcf\x56\x3c\xaa\x6b\x89\x77\x59\x54\xba\x60\x1f\x93\xc7\x36\x45\x8a\x83\x14\x81\xd0\x75\xe2\xac\x81\xbd\xec\xe3\x94\x77\xdd\xec\x3f\x0c\xfd\x60\x99\x7f\x62\x02\x3a\x32\x44\x37\x47\x13\xfb\xb6\xe4\xb2\x84\xc2\x20\x42\x54\xdd\xe7\x18\x5e\x38\x2c\xf2\x6f\x93\xff\xa9\xf9\x57\x4c\x15\xb6\xd8\xae\xef\x31\xa1\x6f\x50\xe0\x28\x19\x22\x0f\xc3\xe6\xe9\x90\x81\x90\x43\x10\x1f\x43\xb4\x44\xb1\x69\x69\x03\x7a\x15\x22\x54\xa9\xd5\x17\xd7\x5f\x73\xe1\x86\xfd\xf5\x5b\xbc\xde\x7a\xc1\xd5\x53\x04\x35\x7a\x71\xb7\x3c\xbe\xad\x0a\x9f\xb7\xe0\x11\xb2\xe4\x0f\x68\xcd\x41\xe3\x03\xb1\xc1\xaa\x9e\xfb\xce\xf4\xc1\x9f\xf1\xd6\xcf\x7d\x6f\xba\x8a\x8a\xee\x9c\xfb\xee\x74\x15\xb7\x2a\x8c\x7d\x7f\xe0\x03\x55\xbc\xea\xd0\x21\x28\xf7\x58\xdd\x04\xf0\x09\x24\x2b\x57\xa1\x4e\xce\x7c\x75\x13\x29\xd4\x86\x79\x86\x4d\x00\x9b\x66\xb1\x78\x7e\x51\xc2\x9c\x79\x18\xd0\xce\x33\xfa\x26\xe7\x19\x1d\x6f\xbc\x81\x67\x9c\x97\x38\xe2\x3e\x08\xe1\x90\x88\x1a\xab\x55\xb9\x8b\x19\xfd\xf7\x95\xaf\xae\x09\x90\x98\x14\x2d\x48\x2d\x80\xe8\xc2\x23\x26\x7b\x45\x3b\xda\xd8\x88\x49\xac\x68\x4a\x13\x1a\x31\xe9\xbc\x7f\x43\x9a\x46\x65\x6c\xb3\xa4\x72\xbd\x96\x2a\x0f\x4b\xfa\xaa\x06\x2c\x5a\xc0\x5a\x00\xec\x73\x58\xaa\x41\xf7\x8a\x36\x87\x54\xd9\x6a\xd8\x58\xd1\x6c\x97\x2d\x59\x0d\xe9\xfa\x22\x57\x34\x4c\xf1\x5b\x02\x7d\x55\x26\x5c\x05\x4f\xfc\x96\x38\x5f\x9d\xd7\x53\xc1\x12\xbc\x45\x3e\x7b\xb8\x82\x23\x78\xa3\x30\x7f\x34\xce\x90\x25\xcf\x10\x4f\xcd\x8e\x65\x4b\xdc\x52\x66\x87\xa7\x66\xc6\xb2\xa5\x6b\x89\x31\xc3\x53\xb3\x02\x6f\xad\x0f\xb2\xaa\x66\x04\xde\x60\x1b\x58\x55\xc9\x86\x95\xc0\x06\x9d\x5c\xac\x5a\xd2\x56\x08\x23\x74\x72\xb1\x6a\x29\x5b\xa1\xac\xd0\xc9\x05\xde\x62\xcf\x0c\x9d\x5c\xe0\x8d\xb6\xec\xd0\xc8\xc5\x9a\x67\xc8\x52\xcd\x8e\x75\x4b\xdc\x5a\x66\xc7\x52\xcd\x8c\x75\x4b\xd7\x1a\x63\xc6\x52\xcd\x0a\xbc\xb5\x8e\x15\x4b\x35\x23\xf0\x06\xdb\x1c\x36\x0a\xb0\x3e\x5e\xee\x60\x56\xa3\xd5\xda\xe5\x23\x7f\x15\xea\x6b\xd6\x8f\xbc\x5d\x3f\xf2\x5a\x84\xd1\x2d\x20\xf9\x5e\xd5\x92\x76\x05\xc9\x63\x55\x63\x9a\x25\x24\xef\xb4\x2b\x48\x8a\xaa\xd4\xac\x79\xbb\x86\xe4\xaf\x02\x94\x71\x11\xc9\xdb\x45\x24\xaf\x45\x48\xf3\x2a\x92\xef\x55\xad\x5a\x2c\x23\x79\xac\x6a\xd8\xb8\x8e\xe4\x9d\x9a\x15\xf3\xc5\xe2\x9c\xf1\x5b\x1a\x7d\x94\x33\x1a\xc6\xf8\x2d\x7d\xbe\x82\x31\x1a\xbe\x28\xda\x34\xaf\x25\x79\xac\x6a\xd6\xb4\x98\xe4\x9d\xce\xed\xb9\xe2\xa9\x79\xb2\x6c\xe9\x5b\x62\xf1\x4a\xd4\x1c\x59\xb6\xa4\x2d\x51\x8e\x78\x6a\x7e\x28\xda\x33\x2d\x28\x79\xac\x6a\x52\xbf\xa2\xe4\x9d\xc2\x1d\x78\xa1\x93\x90\x55\x4b\xdd\x0a\xe3\x86\x4e\x42\x56\x2d\x71\x2b\x9c\x1f\x3a\x09\x51\xb4\x69\x5e\x55\xf2\x58\xd5\xac\x69\x59\xc9\x3b\xed\xdb\x73\x65\xa9\xe6\xc9\xba\xa5\x6f\x8d\xf0\x64\xa9\xe6\xc8\xba\x25\x6d\x8d\x72\x64\xa9\xe6\x87\xa2\x3d\xd3\xd2\x92\xc7\xaa\x26\xf5\x6b\x4b\xe2\xa6\x82\x89\xee\xea\x6d\xf4\xb4\x33\x98\x53\xc4\x4a\x77\xf5\x66\x7a\xda\x19\xcc\x29\x6a\xa8\xbb\x7a\x4b\x5d\xd5\x72\xc7\x1a\x57\x6f\xac\xab\x1a\xef\x73\xef\x6b\xec\xf5\xd4\x97\x78\xa4\x63\x51\x67\x40\xa7\x3e\xca\x22\x1d\x87\x3a\x03\x3a\xf5\x15\x1c\xd2\x31\x48\xd1\x2e\x60\x90\x8e\x3f\x8a\xa6\x7b\xfe\x68\xd8\x23\x98\xef\xae\xc6\x7e\x4f\x3b\x93\x3a\x45\x2c\x78\x57\x63\xc2\xa7\x9d\x49\x9d\xa2\x46\xbc\xab\xb1\xe2\x55\x6d\xf6\x8c\xd1\x18\xf2\xaa\x66\x5b\xb6\xa8\x6d\xf9\x74\x25\x32\x45\x2b\x33\x9d\x71\x9d\xae\x30\xb6\x68\x65\xa6\x33\xae\xd3\x15\xce\x18\xad\xcc\x28\xda\x1d\x58\xa3\x95\x19\x45\xd3\x1d\x73\x74\x32\x23\x98\xf6\xae\xc6\xb6\x4f\x3b\x73\x3b\x45\xac\x7b\x57\x63\xde\xa7\x9d\xb9\x9d\xa2\x06\xbe\xab\xb1\xf0\x55\x6d\xf6\x8c\xd1\x18\xf9\xaa\x66\x5b\xb6\xa8\x75\xf1\xe0\x72\xeb\xd8\xa2\x74\xb9\x35\xa7\x5a\x2d\x8d\x22\x5c\xc3\x19\x25\x6c\x31\xc0\xd6\x32\x6c\x61\x70\xf6\xed\xb5\x2d\x77\xfc\x51\x82\xc7\xda\xc6\x1b\x16\x29\x80\x4d\xc7\xe4\x89\x5b\x26\xc3\x5d\x35\x85\xaf\xad\x3b\x92\x4c\xd8\x11\xf7\xa2\xc9\x2f\x97\xbc\x22\xa0\xe8\xbe\xa9\x07\x2f\x20\x78\x8d\x81\xe3\x5b\xa8\x1e\xc1\xde\xd8\xbe\x62\x37\xd5\x63\x88\x8d\x24\xa0\x1b\xab\x1e\x9e\x42\x78\x12\xbb\xf0\x84\x05\x90\x69\x1e\x24\xda\x43\x99\xa6\x45\x52\x40\x24\x35\x86\x44\xb7\xe9\xe2\x19\xa8\xa5\x45\xbb\xff\xe2\xd9\xa8\x25\x47\xb3\x15\xe3\x98\xe9\xcb\xcc\x34\xf1\xd2\x87\xf4\xfb\x38\x2f\x4d\xac\xf4\x21\xed\xbe\x8a\x95\x26\x4e\x6a\x29\xd1\xed\xd8\x78\x46\x6a\x89\x51\x6f\xde\x38\x3e\x2e\x45\x3e\x7a\x06\x2e\x2e\x21\xed\x4b\x8c\x8b\x9e\x81\x87\x4b\x48\xf6\x12\xe7\xa1\x67\xe0\xa0\x96\x0a\xf5\x1e\x8f\xe7\x9f\x96\x10\xd5\x76\x8f\xe3\xde\x4a\xe2\x9e\x51\x0a\x57\x90\xf2\x15\xca\x3f\xa3\x14\xae\x20\xe1\x2b\x05\x07\x8d\x52\xa8\xa5\x44\xb7\x2b\xe4\xb9\xa8\x25\x46\xbd\x41\xe4\xf8\xb8\x16\xf9\xb8\x34\x70\x71\x0d\x69\x5f\x63\x5c\x5c\x1a\x78\xb8\x86\x64\xaf\x71\x1e\x2e\x0d\x1c\xd4\x52\xa1\xde\x47\xf2\xfc\xd3\x12\xa2\xda\x52\x76\x28\x72\x6e\x29\x52\x79\x2d\xfb\xda\x70\x21\xce\x5f\x31\x58\xed\x4a\x9c\xc3\x95\x38\xaf\x51\x78\xfd\x52\x9c\xef\xcd\x14\x18\xd6\xe2\x3c\x36\x13\xa1\x5d\x8c\x73\x6e\xdd\xd1\x3b\x3b\x79\xce\x79\x90\x6e\x0f\xe7\x9c\x16\x0b\x5c\x8e\xf3\x1a\xc5\x62\xb3\x1e\xe7\x7b\x33\x35\x56\x0b\x72\x1e\x9b\x09\xb2\x58\x91\x73\x6e\x01\xd2\xfa\x48\x79\x86\xfa\xb0\x0b\xbe\x82\xa1\x26\x7e\xfa\x90\x7c\x5f\xc9\x4f\x13\x3b\xf5\xb4\xd8\xac\xca\x79\x6c\x26\xc7\xbc\x2c\xe7\xdc\x6a\xa4\x71\xad\xf2\xac\x5c\x42\xf2\x97\x28\x2b\x3d\x03\x23\x97\x90\xf2\xa5\x82\x91\x9e\x81\x8d\x7a\x3a\xcc\x4b\x73\x1e\x9b\x49\x31\xad\xcd\x39\xb7\x14\x69\x3d\xb2\x3c\x13\x57\x90\xf8\x15\xce\x44\xa3\x3c\xae\x20\xed\x2b\x15\x1b\x8d\xf2\xa8\xa7\xc5\x66\x7d\xce\x63\x33\x39\xe6\x05\x3a\xe7\xd6\x25\x8d\x23\x97\x67\xe5\x1a\x92\xbf\x46\x59\xb9\x34\x30\x72\x0d\x29\x5f\x2b\x18\xb9\x34\xb0\x51\x4f\x87\x79\x91\xce\x63\x33\x29\xa6\x55\x9a\xd9\x38\xa9\xb4\xff\x73\x2d\x36\x80\x29\xb7\xeb\x4a\xd1\x2d\xa0\x6b\xb1\x07\x4c\xb9\x5d\x57\xaa\xd8\x05\xba\x16\xdb\x40\x03\x45\x7a\x1f\x31\x6f\xfa\x18\x88\xd2\xf9\x8b\x79\xd6\xfa\x08\x6b\x8d\x9c\xe5\x76\x61\xa9\xaf\xe0\xac\x91\xb1\xdc\x2e\x2c\xf5\x95\x8c\x35\xf2\x55\x4f\x8f\xd6\xb5\x2c\xb0\x55\x4f\x92\xc6\xcd\xcc\x73\x55\xda\x1b\xba\xa6\xcd\x61\xca\xed\xcb\x52\x74\x7b\xe8\x9a\xf6\x87\x29\xb7\x2f\x4b\x15\x3b\x44\xd7\xb4\x45\x34\xd0\xa2\xf1\x48\x0b\xdc\xd4\x93\xa3\xf4\x4e\xf3\xbc\x5c\xc9\xbc\x34\x4b\x28\xb7\x43\x4b\x57\x38\x37\xcd\x12\xca\xed\xd0\xd2\x95\x8a\x9f\x66\x09\xd5\xd3\xa3\x75\x64\x0b\x3c\xd5\x93\xa4\x71\x6a\xf3\x5c\x95\xf6\x8d\xae\x69\xe3\x98\x72\x7b\xb6\x14\xdd\x3a\xba\xa6\xbd\x63\xca\xed\xd9\x52\xc5\xee\xd1\x35\x6d\x1f\x0d\xb4\x68\xfc\xdf\x02\x37\xf5\xe4\x28\x7d\xe1\x1c\x2f\xe1\xbb\x39\xb5\x4b\x9c\x67\x66\xeb\x5e\xee\xbb\x20\xe3\x50\xb9\xc7\x79\x7e\x02\x3c\xb5\x02\x8f\xd2\x55\xce\xb3\xd4\x82\x22\xb5\xdb\x9c\xe7\xaa\x05\x51\x2a\x17\xba\xfd\x43\xad\xc4\x4d\xc2\x31\x7e\x74\x5a\xbb\xef\x9f\x0c\x6a\xf2\xa3\x03\xf0\x1a\x03\x37\xfa\xd1\x4d\xed\x9b\xfd\xe8\x26\x12\x0c\x7e\xf4\x24\x1c\xef\x47\xa7\x30\x90\xe8\x49\x7e\x74\x80\xa4\xc6\x90\x58\xfa\xd1\x4d\xb4\xd8\xfa\xd1\x4d\xe4\x58\xf9\xd1\x93\x70\xb4\x1f\x9d\x82\x40\xfa\xa7\xf8\xd1\x01\x8e\x1a\xc3\x61\xe7\x47\x37\x51\x62\xe9\x47\x37\x11\x63\xe3\x47\x4f\xc2\x91\x7e\x74\x0a\x00\x69\x1f\xef\x47\x07\x18\x6a\x0c\x83\x8d\x1f\xdd\x44\x85\x95\x1f\xdd\x44\x88\xd9\x8f\x9e\x84\xa3\xfd\xe8\x14\x04\x52\x3e\xc5\x8f\x0e\x70\xd4\x18\x0e\x3b\x3f\xba\x89\x12\x4b\x3f\xba\x89\x18\x1b\x3f\x7a\x12\x8e\xf4\xa3\x53\x00\x48\xfb\x78\x3f\x3a\xc0\x50\x63\x18\x6c\xfc\xe8\x26\x2a\xac\xfc\xe8\x26\x42\xcc\x7e\x74\xb8\x14\x59\xf8\xd1\x87\x65\x2c\x7f\xc5\x60\x4d\x7e\x74\x00\x5f\xa3\xf0\x46\x3f\xba\x91\x02\xb3\x1f\xdd\x48\x84\xc1\x8f\x0e\xd7\x1d\x6b\x3f\xfa\xb0\x72\xe5\xaf\x18\x06\x3b\x3f\x3a\xc0\x52\xa3\x58\x2c\xfd\xe8\x46\x6a\x6c\xfd\xe8\x46\x82\xac\xfc\xe8\x70\x01\xb2\xf5\xa3\x0f\x2b\x58\xfe\x8a\x21\xb0\xf2\xa3\x03\x24\x35\x8a\xc4\xce\x8f\x6e\xa4\xc5\xd2\x8f\x6e\x24\xc7\xc6\x8f\x0e\x57\x23\x3b\x3f\xfa\xb0\x98\xe5\xaf\x18\xb8\x85\x1f\x1d\xa0\xa8\x51\x14\x36\x7e\x74\x23\x1d\x56\x7e\x74\x23\x29\x66\x3f\x3a\x5c\x8a\x6c\xfd\xe8\xc3\x5a\x96\xbf\x62\x08\xac\xfc\xe8\x00\x49\x8d\x22\xb1\xf3\xa3\x1b\x69\xb1\xf4\xa3\x1b\xc9\xb1\xf1\xa3\xc3\x75\xc9\xce\x8f\x3e\x2c\x6b\xf9\x2b\x06\x6e\xe1\x47\x07\x28\x6a\x14\x85\x8d\x1f\xdd\x48\x87\x95\x1f\xdd\x48\x8a\xd9\x8f\x9e\x84\x53\xfc\xe8\x0c\x0a\xda\x18\x13\xfd\xe8\x10\x4f\x8d\xe2\xb1\xf5\xa3\x9b\x29\xb2\xf6\xa3\x9b\x89\xb2\xf3\xa3\x53\xc8\xd1\x7e\x74\x06\xc4\xf5\x63\x92\x1f\x1d\xa2\xa9\x51\x34\x96\x7e\x74\x33\x3d\xb6\x7e\x74\x33\x49\x56\x7e\x74\x0a\x38\xd2\x8f\xce\x40\xb8\x3e\x4c\xf0\xa3\x43\x24\x35\x8a\xc4\xca\x8f\x6e\xa6\xc5\xce\x8f\x6e\x26\xc7\xc2\x8f\x4e\xc1\x46\xfb\xd1\x19\x10\xd7\x83\x49\x7e\x74\x88\xa6\x46\xd1\x58\xfa\xd1\xcd\xf4\xd8\xfa\xd1\xcd\x24\x59\xf9\xd1\x29\xe0\x48\x3f\x3a\x03\xe1\xfa\x30\xc1\x8f\x0e\x91\xd4\x28\x12\x2b\x3f\xba\x99\x16\x3b\x3f\xba\x99\x1c\x0b\x3f\xba\x90\x86\xc1\xca\x8f\xde\xc2\xc0\x2e\x4c\xf2\xa3\xf3\x78\x6a\x05\x1e\x1b\x3f\xba\x1d\x45\x56\x7e\x74\x3b\xa2\x26\xf9\xd1\xb9\x50\x61\x89\x1b\x9f\xc6\xf8\xd1\x69\xed\xbe\x7f\x32\xa8\xc9\x8f\x0e\xc0\x6b\x0c\xdc\xe8\x47\x37\xb5\x6f\xf6\xa3\x9b\x48\x30\xf8\xd1\xe3\xd3\x78\x3f\x3a\x85\x81\x44\x4f\xf2\xa3\x03\x24\x35\x86\xc4\xd2\x8f\x6e\xa2\xc5\xd6\x8f\x6e\x22\xc7\xca\x8f\x1e\x9f\x46\xfb\xd1\x29\x08\xa4\x7f\x8a\x1f\x1d\xe0\xa8\x31\x1c\x76\x7e\x74\x13\x25\x96\x7e\x74\x13\x31\x36\x7e\xf4\xf8\x34\xd2\x8f\x4e\x01\x20\xed\xe3\xfd\xe8\x00\x43\x8d\x61\xb0\xf1\xa3\x9b\xa8\xb0\xf2\xa3\x9b\x08\x31\xfb\xd1\xe3\xd3\x68\x3f\x3a\x05\x81\x94\x4f\xf1\xa3\x03\x1c\x35\x86\xc3\xce\x8f\x6e\xa2\xc4\xd2\x8f\x6e\x22\xc6\xc6\x8f\x1e\x9f\x46\xfa\xd1\x29\x00\xa4\x7d\xbc\x1f\x1d\x60\xa8\x31\x0c\x36\x7e\x74\x13\x15\x56\x7e\x74\x13\x21\x66\x3f\x3a\x5c\x8a\x2c\xfc\xe8\xc3\x32\x96\xbf\x62\xb0\x26\x3f\x3a\x80\xaf\x51\x78\xa3\x1f\xdd\x48\x81\xd9\x8f\x6e\x24\xc2\xe0\x47\x87\xeb\x8e\xb5\x1f\x7d\x58\xb9\xf2\x57\x0c\x83\x9d\x1f\x1d\x60\xa9\x51\x2c\x96\x7e\x74\x23\x35\xb6\x7e\x74\x23\x41\x56\x7e\x74\xb8\x00\xd9\xfa\xd1\x87\x15\x2c\x7f\xc5\x10\x58\xf9\xd1\x01\x92\x1a\x45\x62\xe7\x47\x37\xd2\x62\xe9\x47\x37\x92\x63\xe3\x47\x87\xab\x91\x9d\x1f\x7d\x58\xcc\xf2\x57\x0c\xdc\xc2\x8f\x0e\x50\xd4\x28\x0a\x1b\x3f\xba\x91\x0e\x2b\x3f\xba\x91\x14\xb3\x1f\x1d\x2e\x45\xb6\x7e\xf4\x61\x2d\xcb\x5f\x31\x04\x56\x7e\x74\x80\xa4\x46\x91\xd8\xf9\xd1\x8d\xb4\x58\xfa\xd1\x8d\xe4\xd8\xf8\xd1\xe1\xba\x64\xe7\x47\x1f\x96\xb5\xfc\x15\x03\xb7\xf0\xa3\x03\x14\x35\x8a\xc2\xc6\x8f\x6e\xa4\xc3\xca\x8f\x6e\x24\xc5\xec\x47\x8f\x4f\x53\xfc\xe8\x0c\x0a\xda\x18\x13\xfd\xe8\x10\x4f\x8d\xe2\xb1\xf5\xa3\x9b\x29\xb2\xf6\xa3\x9b\x89\xb2\xf3\xa3\x53\xc8\xd1\x7e\x74\x06\xc4\xf5\x63\x92\x1f\x1d\xa2\xa9\x51\x34\x96\x7e\x74\x33\x3d\xb6\x7e\x74\x33\x49\x56\x7e\x74\x0a\x38\xd2\x8f\xce\x40\xb8\x3e\x4c\xf0\xa3\x43\x24\x35\x8a\xc4\xca\x8f\x6e\xa6\xc5\xce\x8f\x6e\x26\xc7\xc2\x8f\x4e\xc1\x46\xfb\xd1\x19\x10\xd7\x83\x49\x7e\x74\x88\xa6\x46\xd1\x58\xfa\xd1\xcd\xf4\xd8\xfa\xd1\xcd\x24\x59\xf9\xd1\x29\xe0\x48\x3f\x3a\x03\xe1\xfa\x30\xc1\x8f\x0e\x91\xd4\x28\x12\x2b\x3f\xba\x99\x16\x3b\x3f\xba\x99\x1c\x0b\x3f\xba\x90\x4b\xcf\xca\x8f\xde\xc2\xc0\x2e\x4c\xf2\xa3\xf3\x78\x6a\x05\x1e\x1b\x3f\xba\x1d\x45\x56\x7e\x74\x3b\xa2\x26\xf9\xd1\xf9\x64\x15\x89\x5b\xc7\x63\x1c\xe9\x75\x0c\x1c\xd9\x32\xa8\xc9\x91\x0e\xc0\x6b\x0c\xdc\xe8\x48\x37\xb5\x6f\x76\xa4\x9b\x48\x30\x38\xd2\xeb\x78\xbc\x23\xbd\x8e\x81\xf3\x5a\x46\x60\xe7\x48\x07\x48\x6a\x0c\x89\xa5\x23\xdd\x44\x8b\xad\x23\xdd\x44\x8e\x95\x23\xbd\x8e\x47\x3b\xd2\xeb\x18\xb8\xaf\x65\x78\x2b\x47\x3a\xc0\x51\x63\x38\xec\x1c\xe9\x26\x4a\x2c\x1d\xe9\x26\x62\x6c\x1c\xe9\x75\x3c\xd2\x91\x5e\xc7\xc0\x85\x2d\x43\x5b\x38\xd2\x01\x86\x1a\xc3\x60\xe3\x48\x37\x51\x61\xe5\x48\x37\x11\x62\x76\xa4\xd7\xf1\x68\x47\x7a\x1d\x03\xf7\xb5\x0c\x6f\xe5\x48\x07\x38\x6a\x0c\x87\x9d\x23\xdd\x44\x89\xa5\x23\xdd\x44\x8c\x8d\x23\xbd\x8e\x47\x3a\xd2\xeb\x18\xb8\xb0\x65\x68\x0b\x47\x3a\xc0\x50\x63\x18\x6c\x1c\xe9\x26\x2a\xac\x1c\xe9\x26\x42\xcc\x8e\x74\xb8\x14\x59\x38\xd2\x87\x65\x2c\x7f\xc5\x60\x4d\x8e\x74\x00\x5f\xa3\xf0\x46\x47\xba\x91\x02\xb3\x23\xdd\x48\x84\xc1\x91\x0e\xd7\x1d\x6b\x47\xfa\xb0\x72\xe5\xaf\x18\x06\x3b\x47\x3a\xc0\x52\xa3\x58\x2c\x1d\xe9\x46\x6a\x6c\x1d\xe9\x46\x82\xac\x1c\xe9\x70\x01\xb2\x75\xa4\x0f\x2b\x58\xfe\x8a\x21\xb0\x72\xa4\x03\x24\x35\x8a\xc4\xce\x91\x6e\xa4\xc5\xd2\x91\x6e\x24\xc7\xc6\x91\x0e\x57\x23\x3b\x47\xfa\xb0\x98\xe5\xaf\x18\xb8\x85\x23\x1d\xa0\xa8\x51\x14\x36\x8e\x74\x23\x1d\x56\x8e\x74\x23\x29\x66\x47\x3a\x5c\x8a\x6c\x1d\xe9\xc3\x5a\x96\xbf\x62\x08\xac\x1c\xe9\x00\x49\x8d\x22\xb1\x73\xa4\x1b\x69\xb1\x74\xa4\x1b\xc9\xb1\x71\xa4\xc3\x75\xc9\xce\x91\x3e\x2c\x6b\xf9\x2b\x06\x6e\xe1\x48\x07\x28\x6a\x14\x85\x8d\x23\xdd\x48\x87\x95\x23\xdd\x48\x8a\xd9\x91\x5e\xc7\x53\x1c\xe9\x75\x0c\xdd\xd6\x08\x0e\x4b\x47\x3a\xc4\x53\xa3\x78\x6c\x1d\xe9\x66\x8a\xac\x1d\xe9\x66\xa2\xec\x1c\xe9\x14\x72\xb4\x23\xbd\x8e\xa1\xe3\x1a\x41\x61\xe7\x48\x87\x68\x6a\x14\x8d\xa5\x23\xdd\x4c\x8f\xad\x23\xdd\x4c\x92\x95\x23\x9d\x02\x8e\x74\xa4\xd7\x31\x74\x5e\x23\x08\x6c\x1c\xe9\x10\x49\x8d\x22\xb1\x72\xa4\x9b\x69\xb1\x73\xa4\x9b\xc9\xb1\x70\xa4\x53\xb0\xd1\x8e\xf4\x3a\x86\x8e\x6b\x04\x85\x9d\x23\x1d\xa2\xa9\x51\x34\x96\x8e\x74\x33\x3d\xb6\x8e\x74\x33\x49\x56\x8e\x74\x0a\x38\xd2\x91\x5e\xc7\xd0\x79\x8d\x20\xb0\x71\xa4\x43\x24\x35\x8a\xc4\xca\x91\x6e\xa6\xc5\xce\x91\x6e\x26\xc7\xc2\x91\x2e\x24\x44\xb7\x72\xa4\xd7\x31\xef\xb6\x46\x71\x58\x38\xd2\x79\x3c\xb5\x02\x8f\x8d\x23\xdd\x8e\x22\x2b\x47\xba\x1d\x51\x66\x47\xfa\xbc\x4d\x7b\x4e\x42\x37\x8e\xd2\xcf\x8f\x8f\xc1\xb1\x4f\xd6\xae\xc8\xe4\xaa\xca\x7e\x6b\x93\xa8\xb6\xc9\xf5\x9a\x45\x69\x45\x0a\x97\x3c\x93\xb4\x2a\x41\xde\xd3\x3e\x4f\xfe\xd3\x9b\xa7\x37\x0d\xce\xe0\xf0\xf9\xc4\xf2\xef\xbb\x87\x2c\xce\x8a\x47\x31\x6b\xe8\x7d\x1f\x26\xbe\x22\x75\xe5\x26\x59\x9a\xb1\xbc\xa9\x6d\x0e\xf5\x2c\xad\xdc\x63\x90\x44\xf1\xeb\xa3\xf3\xc3\x3f\x7e\x9f\xa5\x99\xfb\xef\xe4\x74\x89\x83\x62\xe6\x7c\x4f\xd2\x38\x9b\x39\xdf\x67\x69\x70\xc8\x66\xce\x1f\xb2\xb4\xcc\xe2\xa0\x9c\x39\x4f\x6f\xbe\x8b\xf6\xa4\x08\x68\xdf\x69\x71\xf6\xf4\x86\x7e\xfc\x43\x76\x29\x22\x52\x38\xff\x4a\x5e\xe8\x87\xa1\x29\x24\x66\x3d\x23\xe6\x4f\x97\xb2\x8a\x8e\x6d\x5a\x5c\xf6\x85\xe5\x9b\x7f\x74\xba\x02\x15\xe0\x4b\x11\xb4\xa9\x79\x91\x4c\xb0\x4a\xa8\x26\xcb\x2d\x0a\xc7\x0a\x54\x70\x55\x71\x49\x0f\x41\x97\x94\x19\x4d\xb4\xcb\xea\x0d\x25\x24\x8e\xa3\xbc\x8c\x4a\x4d\xa6\x5d\x80\x7f\x48\x17\x0e\x79\xa0\xca\x9b\xcf\xea\x80\x5c\xe1\x10\x46\x99\x3b\x9f\x55\x3a\x90\xb4\x17\x5d\x08\xd5\x7e\x1f\x9f\x1c\x80\x21\x11\x52\xe8\xeb\xbb\xd0\x4d\xd0\x0e\x92\xcb\x79\x6e\xe8\x89\x08\x0b\xbb\x63\xee\x90\x7d\xa8\xa6\x66\x9e\x84\x53\x7b\x25\xa6\xd5\x1f\xd3\xab\x24\xbc\x65\xaf\xb8\x87\x33\x8d\xa4\x9d\xa6\xf6\x4a\x4c\xb3\x3f\xa6\x57\xf1\xe9\x96\xbd\xe2\x8f\x31\x19\x2a\x21\xe5\xfe\x88\x6e\x89\x69\xf7\xc7\x74\xab\x8e\x27\x77\xab\xe5\x4b\xf6\x42\x8a\x43\x50\x12\x30\x25\xab\x22\x48\xcb\x63\x56\x24\x8f\xce\x50\xac\x9a\xd0\x97\x3c\xd7\x21\x18\x8a\x95\x1a\x21\xc8\xa3\x2a\x88\xa3\x9f\x15\x18\x40\x39\x96\x08\x9e\x2e\x1e\x2f\x2c\x51\xaf\x1b\x0f\x5c\x04\x9f\x1f\x9d\xe5\x62\x61\x05\xda\x71\x91\x03\xee\x4a\x0c\x08\x5a\xb5\x2f\xc3\xaf\xcc\x8d\xef\xb3\x38\x44\x20\xb7\x76\x90\x28\xd5\x6d\x81\x0a\x9c\x31\xf4\x00\xe0\xca\xea\x35\x26\x8f\x4e\xfb\x5d\xb9\xe4\xd1\x55\xa4\x81\x6a\x17\xfa\x6f\x8e\xc7\xa3\xb2\x7a\x5e\x44\x49\x50\xbc\xf2\x00\x8b\xc5\x76\x8f\xc2\x04\x1c\xd0\xe3\x99\xae\x64\x33\x47\xf8\x0a\x52\xbb\x0f\x08\xd7\x9b\xfd\x52\x49\x44\x49\x0e\x59\x1a\x4a\x64\x6c\x0e\xdb\xf5\x36\x54\x93\xd1\x83\x09\x84\x0c\xdf\x11\x52\x56\x0f\xab\xe3\x7a\xa5\x26\xe5\x72\x38\x90\x52\x80\xf1\x77\xc1\x76\xb5\xd6\x10\xd2\x00\x89\x64\xb4\x5f\x11\x22\xbc\x87\xcd\x83\xaf\x1e\xc3\x28\x3d\x66\x02\xc0\x36\xf0\xf7\x3b\x35\x05\x14\x42\x68\x9e\x7d\xc2\xc6\xe2\xb8\xd9\x6c\xd5\x0c\x78\x09\x8a\x34\x4a\x4f\xa2\x04\x1d\xbc\xc5\x56\xdd\x7c\x0b\x24\x50\xd0\x7d\x45\x88\xd8\x07\xbb\x3d\x3e\x75\x18\x64\x18\xa4\xa7\x6e\xce\x74\x20\xe1\x61\xb9\xd6\x0d\x42\x03\x23\x90\xd0\x7e\x44\x28\x08\xb6\x5e\xe8\x07\x4a\x0a\x80\x9e\xea\x99\xb0\x3b\x3e\x1c\x03\x35\x01\x0c\x44\x68\xbf\xf9\x86\x34\x7f\xd8\x87\xcb\x30\xd0\x30\xa0\xf8\xcc\x03\x2c\x57\xcb\x60\xb5\xd0\x75\xbf\xf8\x2c\x75\xbe\xf8\x8c\x4a\x9f\xef\xad\xbc\x8d\xb2\xed\x7d\x16\x0a\x13\xd1\xf7\xfc\xb5\xff\xa0\x04\x48\x2e\x15\x09\x2d\xa7\x6e\xdb\x44\x1c\x1c\x3e\xf7\x29\xf6\xf1\x0d\xc9\x7c\x7d\xaf\x57\x72\x28\xbc\xbf\x5e\xcf\x9c\xe1\x3f\x5a\x2c\xe7\x28\x04\xdb\x9b\x47\x67\xf1\x7e\xe1\x04\x1f\x00\x46\xb6\xc2\xe5\x41\x41\xda\x65\xb9\x99\xd6\xe7\x20\xa4\xb6\x7b\x9a\xa5\x44\xb1\xb5\x12\xe1\xf6\x59\x11\x92\xa2\xd9\xc4\xc1\x41\x26\x87\xac\xd9\x1c\xb9\x14\x19\x58\x5a\x87\x92\xa6\x1d\x35\x23\x0b\x12\xb4\x82\xf2\x92\x15\x61\xf3\xfb\xd1\x61\xff\xb8\xf4\x8b\x68\x59\xb0\x5a\x74\x6b\xa1\xae\x04\xb7\x0f\xa4\x24\xfc\x2c\x88\xd2\x33\x29\x22\x74\xef\xf0\x1c\x95\xd1\x3e\x6e\xbb\xc1\x7e\x44\x71\x54\xbd\x3e\x3a\x5d\x01\x02\x13\xa5\x4a\xa8\x66\xd7\xa4\xde\x6d\xe4\x45\x94\xb6\xb4\xfd\x96\xed\xde\x7f\xfb\xf8\xb8\x27\xc7\xac\x20\xdd\x2f\xb0\x03\x47\xc6\x4e\xe4\x0c\x1d\xa6\x5a\x5b\x83\xd9\x74\xc1\x63\x9a\x55\xef\xe6\xfb\x2a\xbd\xe7\x50\xc3\x21\xbb\xa4\x21\x29\xe2\xa8\x95\x8f\x06\x6c\xbf\x2f\x7e\xac\xa2\x2a\x26\x3f\x09\x84\x81\xbd\xba\xf3\xee\xe9\x8d\x13\x54\x55\xf1\x8e\xd5\xbc\x77\x9e\xde\xdc\xb7\xfb\x77\x86\x24\x2f\x48\x07\xc5\x6d\x16\xf3\x82\xb8\xf2\xce\x74\x00\x62\x0c\xd9\xc7\xd9\xe1\xf3\x7f\x5d\xb2\xaa\xc7\xd1\x89\xa5\x97\xd7\x4e\x99\xc5\x51\xe8\x7c\x13\x84\xfb\xf5\x3e\xfc\xd0\x1d\x7a\x9c\x48\x23\x51\x6e\x94\x96\x51\x48\x1e\x9d\xe0\x39\x8b\xc2\x01\x77\x55\x30\xd4\x51\x72\x1a\x0e\x4a\x4c\x30\x39\x03\x39\x37\x9e\xeb\x73\xef\x64\xcd\x8a\xfc\x1c\xa4\xe5\xa3\xb3\x6c\x5b\x7f\x89\xc2\xec\xa5\xff\xfd\x0b\x0a\x04\x5a\x63\x3c\x95\x1a\xfb\x1d\xad\xd1\xd5\x2e\xa3\x9f\x29\x39\x00\xe1\xa0\xea\x1c\x47\xdc\x10\xe1\x16\x3d\x1d\xad\x20\x4a\x87\xe1\xb3\x03\x4b\x83\xe7\x7d\xd0\xc3\x84\x51\x99\xc7\xc1\x2b\xd0\x21\x4d\xad\x7d\x10\x9e\x74\xa3\xb3\x58\x2c\xe0\xe6\x22\xe8\xe7\x4d\x57\x9b\x2a\xa0\x38\xc8\x4b\xf2\xe8\x74\x7f\x29\x36\x26\x0c\xb6\x0a\x67\xf0\xd7\xb9\x47\x26\x69\x34\xd9\x86\xe4\x30\xb9\x4d\xf3\x24\x74\xaa\xf3\x0c\xfd\x1c\x6a\xba\x15\x12\xe2\x93\x8d\x0e\xfd\xb0\x1c\x8a\x8a\x08\xaf\xca\x53\xd1\x7c\x0a\xe5\x4f\x67\x12\x84\x68\x5d\x26\x17\xdf\xb6\xff\x4a\x1c\x6e\xcc\x11\x46\xb4\xc4\xd2\x39\x43\xda\xe1\xd7\xd0\x6c\x40\xc8\x34\xdd\xfb\xdf\x7e\xe3\x94\xd9\xa5\x38\x90\xef\x83\x3c\x8f\xd2\xd3\x7f\xfe\xfb\x77\x1f\xf7\x59\x56\x95\x55\x11\xe4\xf3\x43\x59\xce\x93\x20\x77\x7e\xfb\xfe\xcd\xec\xcd\xfb\xf7\xce\x3f\xd3\xd5\xdf\x49\xa2\x3a\x4a\x9d\x20\x0d\x9d\x3f\xfe\x86\xa4\xac\x53\xcc\x2c\x70\x99\xda\x74\xff\xeb\x42\x8a\xd7\x3f\x3a\x41\x41\x9c\x90\xe4\x05\x39\x04\x15\x09\xe7\x4f\xe9\xfb\xf7\xf4\xff\x9c\x7f\x2b\xa2\x53\x94\x06\x71\xfc\xea\x04\x61\x48\x42\x27\xbc\x14\xd4\x1c\xcc\x2e\x85\x13\xc4\xf9\x39\x28\x19\xea\x24\x88\x9a\x79\xd0\x57\xd8\x93\x2a\x28\x67\x4e\x75\x8e\xca\x96\x84\x97\xa0\x64\x28\x43\x52\x46\x27\x5a\xb3\xca\xa8\x32\x7a\x26\x69\xe5\xfc\xb1\x31\x55\xfe\xe8\x94\x55\x74\xf8\x1c\xa5\xd4\xe4\xce\x52\x27\xfa\xb7\x1f\xdc\x20\x75\xa2\xb2\xbc\x10\xe7\xe5\x4c\x0a\xe2\xb0\x7a\x0e\xdb\xfb\x34\xe8\x5e\xb2\x4b\x1c\x3a\x39\x29\xca\xa8\xac\x9c\x46\x95\x46\x69\x54\x45\x41\xec\x54\xd9\xe5\x70\x1e\x3a\xf3\x8f\x59\xc1\x64\xf9\x25\x28\x42\xe7\x90\x25\x79\x50\xb5\xcb\xcb\xcc\x79\x21\x77\xcf\xc4\xf9\x4c\xf2\x8a\xca\x41\x49\x1a\xa2\x9b\xde\x5d\xf2\x90\x72\x85\x16\x24\x4e\x95\x31\x5c\x41\xfc\x12\xbc\x96\x4e\x41\xaa\x4b\x91\xd2\x92\xa8\x70\x8a\xc6\x03\xea\xe4\x25\xb9\x84\x99\x7b\x88\x83\xb2\x24\xa5\x13\xa5\x65\x45\x25\x2b\x3b\x3a\x81\x53\x9e\xa3\x24\x21\xa1\xd3\x2c\x5a\x8c\xfb\x03\x81\xff\x42\x3b\xfa\xe8\x9c\xab\x2a\x2f\x1f\xdf\xbf\x3f\x45\xd5\xf9\xb2\x9f\x1f\xb2\xe4\x7d\xf5\xb2\x2f\xdf\xf7\x43\xfd\x9e\x71\xa4\x7c\xef\xaf\xbd\x87\x75\xb3\x06\x32\x16\x33\xe6\xbc\x6b\x17\xa2\xff\xd1\xf0\xd4\xf9\xb3\xf3\xbb\x76\x4d\xf9\x00\xfc\x23\x43\x7d\x97\x99\x84\x02\xd4\xac\xf9\x1b\x58\x8b\xce\x80\x86\xf7\xb4\x30\x4c\x79\x1c\x44\xa9\x8b\xe1\x9b\x5d\x81\x15\xe0\x73\x83\x43\x15\x3d\x13\x0d\x99\xed\xdf\x4d\x3d\x0d\xf6\x66\x72\x30\x09\x8a\xa3\xb4\x72\xc3\xa8\x64\x53\xb5\x24\x31\x39\x54\x59\xe1\xc6\x51\x59\xb9\x87\x2c\x49\x02\x37\x25\x2f\x74\xdd\x6e\x56\x13\x36\x05\x9b\x81\xfa\x67\x12\x84\x51\x7a\x2a\x9b\x0f\x4f\xe9\xd9\x9b\xd1\xd5\xc8\x39\x2f\x67\xce\x79\x35\x73\xce\xeb\x99\x73\xde\xcc\x9e\xd2\x39\x2d\x99\xd3\xa2\x39\x2d\x9b\xd3\xc2\x39\x2d\x9d\x9f\x37\x68\xb2\xd6\xdf\x9c\x5b\xd4\x2e\x57\xf0\x41\xf2\xba\x0f\x15\xc1\xe7\x0f\x92\x57\x41\xa8\xd6\x7c\x6e\x0e\x12\x68\xc7\xce\x52\x35\xf0\x19\xda\xbe\x43\x05\xf6\xa1\x33\xbe\x9a\xee\x79\x54\xc8\xa2\xf4\x10\x5f\x42\xd2\x3a\x27\xa2\x9f\xc9\xbb\xdf\x9c\x3d\xb7\xff\x75\xcf\xa4\xaf\xe1\x84\xaf\xaa\xef\x4b\xf5\x19\xd3\x96\xaa\xfa\x4b\xa9\x3e\xe3\xef\x4a\x55\x7f\x25\xd5\x67\x43\xb1\x56\xd5\x5f\x4b\xf5\x37\xed\xd0\xe1\xf5\x37\x62\xfd\xa7\x74\x1e\xd3\xb9\xcf\x86\x1a\x03\xa1\xa5\x10\x48\x1e\xc0\xa1\x46\x3f\x78\xcd\x6a\xf0\xde\xf9\x8f\xd7\x9c\x74\xd6\x83\xd3\xaa\x9b\xa7\x74\xde\x7e\xe9\x6e\xf4\x61\xcd\xb6\x55\x3c\x65\xab\x7d\x05\xa5\xc4\x74\xad\xf0\x02\xf3\x0b\x68\xdf\x37\xb6\xef\x9b\xda\xf7\xaf\x69\x7f\x69\x6c\x7f\x69\x6a\x7f\x79\x4d\xfb\x2b\x63\xfb\x2b\x53\xfb\xab\x09\xed\x43\x3d\x95\x15\xd1\xcf\xd4\x44\x8d\x9d\xe2\xd2\xae\x98\x6c\xda\x16\x72\x8e\xea\xdf\x9c\x8b\x4e\xe7\x34\x7a\x44\xd2\x4c\x42\x39\xdc\xc6\xf6\xe6\x4b\x8f\xaa\xfd\xcd\x6c\xe1\xd6\xb2\x03\x9f\x39\x25\xd2\x93\xfb\x0f\x09\xb5\x28\xa2\x9e\xcc\x32\x09\xe2\x98\x6a\x51\xf6\x87\x9a\x9b\xac\x58\x3f\x8b\x64\xc7\x6f\xd7\x7a\x12\x14\x9f\x59\x0e\xec\xde\xa8\xec\xaf\xba\xfd\x86\x7e\x73\xdb\x9f\x8a\xcd\x7d\x53\x67\x7f\x92\x3a\xf3\x5d\x54\x56\x7d\x4f\xe6\x6c\x51\xb9\xa4\x6c\xd9\x11\xd5\x01\x57\xf6\xee\x1e\x4c\xf0\x7f\x49\xe9\xe8\x3a\xd4\xc6\x28\x59\x35\x27\xaa\x48\x42\x4d\x8a\x2a\x73\x22\x56\xe8\xb2\x8d\x5c\xd7\x42\xf3\xcd\x06\x3f\xac\xef\x52\xac\x0d\x50\xbf\x17\x81\xd8\x3f\x50\x72\xe8\xe2\x4a\xf7\xba\x8f\x71\x40\xd7\xc7\x73\x14\x87\xf7\xf8\x59\xfd\x6f\x20\x6a\xc8\xbd\x5f\x44\x1e\x7d\x1f\x95\x87\x8e\x45\xef\xdf\x3b\xbf\xbf\x44\x71\xc8\x2c\xbf\x3f\xd2\x0d\xf2\x1f\x99\x47\x80\x99\x72\x51\x99\x28\x87\xff\x61\xf1\xf6\xfe\x83\xf6\x20\x03\x70\xf4\xf7\xfd\xb6\x97\x6a\x4a\x71\x13\x2c\x8a\x3c\xdb\x50\x17\x1f\x54\x72\x37\x80\xf3\xc2\xd7\x28\x7e\xae\x34\xeb\xb7\xf8\x3d\x87\x3b\xd6\x1a\x71\xa3\xe2\xdd\x89\x9f\x54\xaf\x9b\x5a\xcd\x88\xb5\x3e\x10\xc4\xbb\xf0\xf4\xe4\x2f\xbc\xd5\xd3\xd3\x62\xf1\xf7\x8b\xa7\x37\x1f\x9c\xf7\xef\x1d\x92\x38\x61\x50\x9e\x67\x4e\xba\x2f\x73\xd1\x62\x6a\xe5\x99\x71\xf1\x3f\x3b\x41\xfe\x4c\x48\xce\x49\x26\x23\xc7\x89\xc9\x33\x89\x67\xec\x3c\xde\x29\x48\x92\x3d\x93\xd2\x09\xc9\x31\xb8\xc4\x95\xb3\x2f\xb2\x97\x92\x14\xdd\x2c\x63\x16\x36\x13\x18\x86\xb2\xb7\xfd\x04\xa1\xe5\x66\xa6\x0b\x2f\x41\x0c\xb0\xfd\x06\xba\xa7\xf9\xdf\x49\x99\x67\x69\x49\x0d\xc2\x28\x09\x4e\xa4\x74\xde\x91\xb4\xbc\x14\xfd\xcf\x30\x4b\xef\x2a\xa7\x3c\x04\x31\x71\xf6\xe4\x35\x4b\xc3\xd6\x96\x6f\xdc\x75\xe5\x7d\x2f\xaa\xff\x41\x77\x32\x51\xe9\xe4\x97\x22\xcf\x4a\x72\xbc\xd0\x3d\x51\x96\x53\x39\x77\x9e\xa3\xc0\x09\x52\x87\xd4\x79\x1c\x1d\xa2\xaa\x59\x8a\x9d\x22\xa8\xce\xa4\x70\xaa\x73\x90\x3a\x7b\x42\xbb\x5a\x9d\x49\xcf\x86\x63\x46\x77\x50\xb1\xf3\xc7\xff\x27\x4a\x4e\x9f\xfe\x58\xb2\x5d\x80\xf3\xff\x13\xb6\x27\x8a\xb2\x4b\x19\xbf\x3a\x55\x11\x35\xdb\x0e\xe7\xe9\x4d\x4b\x30\xdd\xa8\x15\x43\xaf\xf6\xaf\x1d\xc2\xa7\x37\x4e\x90\xe7\x45\x16\x1c\xce\x4e\x94\x3a\xbf\xef\xf6\x0a\xce\xb3\x3f\x6b\x76\x2c\x69\xe8\x04\xfb\x20\x0d\x33\xba\xf9\x8a\x2a\xa1\xd6\xd2\xd9\x93\x43\x70\x29\x09\x2d\x62\x3e\x94\xd2\x89\xb3\xaa\xa4\xdb\x96\xea\x1c\x15\xa1\x9b\x07\x45\xf5\xea\xbc\x44\xe1\x89\x54\xa5\xf3\xae\x91\x59\xda\xad\x7f\xca\xb2\x53\x4c\x9c\xef\x83\xbc\xe1\x97\xf3\x72\x8e\x0e\x67\xe7\x85\x14\x84\x72\x97\xd4\x39\x39\x54\x5d\xff\xdb\x7e\xbc\x44\xd5\x39\x62\x1b\xa7\xa4\x24\x31\x95\x8f\x2a\x73\xf6\xc4\x89\xd2\xe7\x2c\xbe\xa4\x55\x50\x44\xf1\x2b\xed\x69\xf4\x73\xbb\x1f\x75\x7e\x20\xc4\x09\xe2\x32\xb3\xdf\x1f\x79\x3b\x6f\xbb\xa3\x4a\x24\x39\xb9\xc7\xf8\x12\x89\x8a\xb7\xff\x3e\x28\xdd\x46\xed\x52\x1a\x9d\xea\x7c\x49\xf6\x69\x10\xc5\x65\x8b\xa2\xff\x20\x2e\x13\x7d\x81\x69\xad\x18\x2a\xee\x4f\xdc\x1a\x0a\x4b\x90\x85\x53\x2a\xed\x26\x39\xe8\x4c\x5b\x52\x04\x61\x74\x29\xdf\xc9\x20\x4d\xc1\xbd\x08\xd4\xf9\x38\x79\x88\xee\xeb\x7d\xab\x48\xde\xbf\x77\xfe\x5f\x42\xf2\x66\x0b\x1c\x54\x4e\x92\x95\x95\xe3\x2d\x16\x6f\xa9\x3c\x10\x13\x53\xbb\xfd\x77\x74\xba\x14\x83\x11\x32\x3f\xb2\xdf\x0d\x33\xe9\xea\xcf\x66\x66\xc9\xa4\xe4\x10\xe4\x55\x94\xa5\x77\x25\x53\xea\x0e\x3b\x1d\x6f\x84\x66\x10\xa2\xb9\x6e\xbd\xfa\x05\xb4\xe0\xf6\x0e\x49\x5c\xbf\x3b\xbf\x75\xe6\x6b\xd9\xc2\xf2\x44\x34\x2d\x51\x6a\x3b\x84\xaf\xa7\xd2\xd8\x42\x2d\x60\x0a\x35\x4a\xab\x91\xbe\xef\x99\xff\x81\xf1\xcd\x95\xf4\x58\xff\xb9\x8a\xd2\xa0\xfb\xd4\x0a\x2f\x56\x97\x15\xb0\x01\x6c\xa7\xdf\xb1\xc8\x12\xa6\xf6\x1a\x5f\x4d\xa7\xf8\x9c\x46\xea\xd8\x94\x07\x5a\x70\x0e\xf6\xe4\x60\x78\xfb\x91\xfb\xff\x82\xa2\x72\xbc\x47\xe7\x07\x52\x39\x81\x93\x04\x75\x94\x5c\x12\xa7\x20\x71\xc0\xf6\xe2\x55\xc6\x70\x37\xc8\x9a\x61\xa8\xfb\x6b\x19\x8b\xc5\xdb\x0f\x10\x8d\xff\xe8\xfc\xdb\x33\x29\x8a\x28\x24\x0c\xaa\x19\x0d\x8a\x83\xdd\xcb\x73\x32\xaa\x54\x5f\xa2\x12\x68\x92\x38\xa6\x9a\xa3\xbf\x70\xd7\x62\x7b\x39\x93\xd4\x29\x49\xc5\x34\x4f\xd0\xf6\x8c\x2a\xc1\x16\x63\x50\x55\x45\xb4\xbf\x54\x84\xda\x1b\x8d\x50\x9d\x1c\x12\x93\x84\xa4\x15\x13\xad\x4e\x0e\xda\x6b\x74\xbf\x00\x0e\x43\xb6\xb7\xdc\xfd\xe1\x9c\x15\x74\xb1\x63\x45\x0d\xab\xa8\x8a\xef\x08\x00\xca\x80\xc1\x31\x4a\x98\x70\x88\xcc\x6d\x50\x50\x61\x8a\x89\xeb\xd5\x33\xa7\xf9\xcb\xa7\x7f\xb1\x4e\x34\x1f\x1b\xea\x5c\xaf\xbb\xd2\x22\x36\xf0\xe8\x5c\x8a\xb8\xc7\x02\xe6\xf1\xdf\x5f\xaa\x2c\x2f\xc8\x31\xaa\xe9\xe2\x14\x7c\x26\xa5\x73\xa0\xab\x4a\x76\x74\xda\x15\xd9\x7d\x21\xfb\xcf\x51\xe5\x26\x51\xea\x86\xe4\x39\x3a\x10\x37\x8f\x6a\x12\xbb\xec\x40\xa3\xa1\x3c\x53\x94\xce\xda\x56\xf6\x97\xca\x09\x33\x52\xd2\x05\xe0\x90\xa5\xcf\xa4\xa8\x9c\x30\xcf\xeb\x8f\x9f\xc2\x3c\x9a\xb7\x95\xfe\xe3\x4c\x0a\x72\x57\x3a\x69\xe6\x94\x97\x03\x9d\xda\x6c\xac\x4a\xe7\x92\xb6\x14\x86\x8e\x82\x88\x32\x4a\x0f\x74\xa9\x62\xd0\x69\x59\x05\x69\x18\x14\x61\x87\xf8\x0f\xd0\xb9\xe7\xb0\xa3\xef\x7e\xd5\x38\x04\x69\x74\x29\x09\x5b\x36\x0e\x65\xd9\xfa\x41\x0b\xc2\x6e\x62\x46\x19\x63\x53\x7b\xa6\x94\xa5\xf1\xab\x53\x1e\x0a\x42\x1a\x0f\x2a\xbb\x4f\x34\xd4\x7c\x74\xbc\x07\x3f\xcc\xa3\xfb\x19\x6d\xf3\x5f\xfe\xe1\xc1\xf5\xbc\xce\xa2\xb8\xe4\x79\xd6\x76\xb9\x3d\xd0\x30\xe1\xf2\x69\xdd\x7b\xe7\xcf\x14\xd7\x0f\x6d\x7f\xe8\xe2\x27\xf9\xe0\xa5\xe1\xf5\xeb\xfb\x0f\x52\xad\xe6\x74\xa3\x97\x18\x20\x30\xe0\x38\xa4\xd3\x61\xbd\xeb\xf7\xdd\xd3\x9b\x3f\x02\x21\xbc\xff\x63\x73\x45\xf3\x79\x35\x5f\xce\x17\xed\xdf\xeb\xa7\x37\xf7\x1f\xb4\xae\xb4\xbc\xc8\x72\x52\x54\xaf\xec\x43\x1c\x67\x2f\xec\x16\x6c\x59\x35\x13\x25\x4a\xa9\xb5\x50\x46\xe2\x9a\xd5\xce\xae\x7f\x26\x71\x4e\x0a\xe7\x78\x49\x0f\x4c\xdb\x56\x99\x53\x90\x3c\x0e\x0e\xc4\x49\xc9\xa9\xd1\x28\xcf\x41\x7c\x69\x8d\x08\x67\xf1\x94\xfe\xae\xaf\xfc\x1c\xc4\x51\xd8\xaf\x81\xed\x92\xd7\x4c\x90\xdf\x34\xbe\xda\x47\xe7\x5d\xbb\x06\x12\x6a\x2a\xfd\x86\xa1\xa2\xb6\x50\x5b\xbb\xf7\x1c\x46\x47\xa7\x7a\xcd\x89\x9b\x1d\xdf\x35\x95\xee\x9d\x8f\x1f\x9d\xf4\x92\xec\x87\xd3\x1e\x80\x35\xc8\x73\x92\x86\xef\xda\xdf\x33\xaa\xe3\x5a\xb8\x99\xb3\xb8\xef\x06\xe8\x17\xe7\x77\x24\x2e\x89\x05\x7c\xdb\x66\x07\x37\x8c\x59\xeb\x72\x6e\x2b\x7e\xe0\x3d\xa6\x82\x11\xd0\xfc\x4b\x77\x09\xf0\x3b\x55\x29\x41\x1c\x53\x61\xe1\x8d\x83\x47\xe7\x18\xc4\x25\xb9\xef\x56\xb8\xa3\xd3\x1d\x19\x30\x99\x22\xc2\xa9\x4d\x0f\x85\x72\x1d\x88\x19\xeb\x32\xc5\x86\x37\xeb\xfc\xdd\xc7\xa6\x61\x05\x7a\x05\x18\xe6\x31\x1e\xbc\x10\xb8\x10\x98\xfb\x44\x41\xe9\xf6\xc2\xa2\x73\x1c\x0c\xdb\xfb\xda\x71\x04\x1b\x30\x00\x3d\x89\x64\xdb\xe6\x7b\xa0\xc6\x06\xba\x92\xec\x0e\xc9\x34\xba\x47\x92\x20\xc2\x59\x8e\x12\x4e\x39\x00\xfe\x2a\x22\x72\x0b\x9a\x85\x76\xbf\x24\xdd\x9a\x69\xf5\xb5\x24\x55\x2f\x71\xd7\x50\x71\x4b\xd1\xbf\x66\x3c\xa6\xc8\x44\xbb\x45\x68\xdc\x7c\x87\x8c\xee\xbd\xe8\x7f\xd5\x7b\x12\x5a\xaa\xda\x89\xb0\xb2\x61\x2b\x89\x5e\x06\x1a\x0c\xc7\x1f\xaa\x82\x04\x49\xe3\x90\x3c\x93\x66\xd9\x6f\xac\xec\xe6\x6a\x87\x13\xa4\x87\x73\x56\xb0\x9d\x3c\xbb\x77\xe1\xec\x8b\xec\x33\x49\x87\xfb\x2f\xcd\x59\x71\x56\xb0\x0d\x63\xe0\x7c\x72\xfe\x87\xfe\x14\xbf\x73\xda\xfd\x67\xc9\x0e\x75\xf3\x4b\x45\x97\xe4\xe8\xc0\xce\xa3\xd9\x4d\x69\x12\x32\xe7\xcb\x67\xf2\xba\xcf\x82\x22\x7c\x4a\x3f\xef\x43\x71\x77\xfe\x79\x1f\x76\xfb\x72\xf7\x95\xff\x59\x2b\xdd\x6f\xb4\x96\x82\x6b\xb4\x68\x60\x1a\xb2\xcb\xa7\x15\xda\xfd\xbd\x6a\x77\xce\xfd\x74\xcb\x44\xb3\x2d\x67\xd8\xa4\x0d\x79\xdf\x4f\x18\x76\xe1\x43\x67\xba\x48\xfd\xa1\xdb\xac\x4e\x23\xf1\x8e\xf1\x94\x94\x15\x09\xdd\xbe\xbf\xe0\xbc\x01\x27\x28\xcd\x52\x72\x2f\x8e\x10\x73\xab\x32\x5f\x51\x23\x93\xfd\xd5\x24\x4b\x6f\xa7\x4e\x4a\xf3\x82\x70\x4e\x4d\xba\x87\x39\x1c\xb2\x4b\xda\x38\xd1\xca\x2c\x69\x66\x82\x93\x5d\xaa\xfc\x52\x95\x4e\x75\x0e\x2a\xa7\xb1\x18\xd9\xf7\x2a\x38\x95\xd4\xc2\xa3\x44\xd1\xbf\x1b\xe4\xe1\x70\x48\x2c\x13\xd4\x0a\x62\xc7\x32\xf4\xc2\x06\xbc\x61\xd7\x1f\x29\x70\x5c\xf9\x87\xb4\x39\x59\x3e\x14\x59\x1c\xb3\x3f\xf7\x02\x9f\xe6\xb4\x73\xa0\xfc\xcf\xdd\xf6\xb8\x3f\xe6\xe1\x2b\xb8\x43\xd9\x07\xf8\xaa\xc8\x7d\x7d\x6c\x9b\x81\x96\xf9\x1f\xfa\xdb\x49\x6c\x1b\x50\x0e\x9b\x55\x52\x35\x6e\x16\xbe\xc2\x8c\x4d\xd0\xac\xdb\x7e\x47\x0d\x83\x9b\x7d\x58\x73\x65\x89\xf1\x71\xb8\xbb\x10\x91\xd6\x37\x00\x74\xdd\xa9\x88\xc2\xfe\xee\x43\xe7\x21\x68\x8d\xfe\xa1\xbd\xc6\x45\xca\x0c\x78\xc6\x42\xf6\x76\x6d\x70\x0c\x94\xfc\xed\xaa\x6e\x57\xd9\x7b\x9c\x00\xa6\xa0\x62\x7e\xd4\x01\x8b\x00\x0b\x3d\x7f\x60\xac\x93\xe0\x33\x15\xab\xb6\xd2\xbb\x5e\xa2\xdb\x96\x80\x17\xa5\xaf\xd4\x4a\x16\xdd\x2c\x0f\x84\x5c\xd2\x2a\x8a\x9d\x00\xb4\x0f\x36\x17\xc3\xc7\x19\xd5\xb6\x1d\x45\x7d\x37\xd9\xbe\x03\xf9\xde\xef\x42\x40\x37\xbe\xf9\x33\x40\xf7\xcb\xb0\x83\xf8\x1d\xa9\x2b\x92\x86\x52\x8f\x87\x9d\x83\xd8\x73\xb6\xe1\x1d\x70\xb9\x97\xfc\x1d\x4f\x29\x1b\x42\xc0\xd0\xfb\xa1\xb5\xb7\x83\xf3\xd9\x35\xd3\xc6\xb9\x7a\xb0\x8e\x7e\xe8\x6a\xf6\x64\x36\xae\xc0\xa6\x4b\x8c\x89\x40\x3c\x1a\xbf\x72\x54\x3a\xec\xa4\x83\x14\x4e\x56\x38\xe4\xbf\x2e\xec\xa6\x4f\x23\xcf\x97\xa2\x20\x69\x25\x0c\x06\xdb\x67\x35\x5c\x02\xbd\x7a\x74\xaa\xe2\x42\x3e\x0c\xed\xb6\x63\x96\x06\x09\xe9\x5c\x2d\x6c\x7c\x44\x6e\xc0\xee\x51\xc1\x7f\x27\xe3\xbe\x87\x75\xe0\x28\x7e\xf3\x67\xc0\xf7\x28\x3d\x46\xf5\xbb\xae\x41\x89\xe9\xbf\xf0\x48\x86\x91\xb6\x19\x83\x0f\x10\x14\x30\xb7\x65\xf0\xbf\xa5\x07\xa2\xe0\x18\xe5\x6f\x41\x59\x41\xc2\x99\x53\x56\x59\xee\x34\xcd\x46\xe9\x09\x22\x69\x7a\x0e\xc0\x3e\x7e\x6c\x78\x77\x2f\x92\x8d\xb1\x9e\x6d\xf7\x44\x1a\xa5\x3f\x7f\xe1\x37\xbf\xc0\x03\x97\xbd\xf4\xba\xec\xdf\xb3\x97\xb2\x9b\xa3\xce\x6b\x76\x29\xa8\xb6\xbe\x24\xa9\x8d\x66\x9a\x17\xd9\x0b\xae\x19\x8a\xec\x05\xd1\x09\x49\xf6\xdc\xb0\xad\xf7\x44\x34\x1e\xe5\xc6\x9f\xda\x1d\xed\x50\xac\x33\x5a\xad\xf1\x2b\x9e\x87\x43\xf8\x76\xa9\x6e\xf1\x31\x20\xaa\xbb\xd8\x95\xb0\x28\xa8\x88\xc3\x8e\x55\x0b\x92\x76\x7d\x70\xde\x81\x5b\x72\xc5\x25\x0d\x5e\x82\xd7\xd6\xf2\x6a\x17\xa3\x20\x3d\x90\xfb\x79\x73\xab\x34\x73\x4f\x97\xaa\xa2\x8a\x0a\x8f\x4f\xf8\x01\x0b\x14\xd8\xcf\x80\x4f\x54\x4e\xe3\x59\xf7\xe3\x47\xc6\xa9\xdf\x7e\x7c\x7a\x73\xc8\x62\xf7\xe9\xcd\x4f\xc3\xb8\x8a\x21\x96\x3e\x88\x05\xf0\x7c\x4e\x18\x3f\xb6\x2c\xb1\xbe\xf5\x23\xf8\x87\x2c\x49\xb2\xb4\xbd\xd4\xd7\xac\xe9\xec\xbc\x9f\x9d\x0c\x06\xc5\x89\x38\x74\xe4\x3a\x96\x98\x47\x95\x1f\xc9\xa6\xbc\x81\x7d\x07\x1d\x57\xef\x9d\x7f\xa2\x68\xcb\xd7\xb2\x22\x49\x4f\xcc\x3f\x91\x94\x14\x74\x28\x4a\x92\x04\x69\x15\x1d\xb8\xc6\xfb\x23\x88\xfe\x86\x20\x74\xdf\x0a\x6b\xca\x6f\x9a\xd1\x78\x6c\xe7\x76\xf3\xab\xd1\x7b\xed\x24\x11\x9d\xe0\x02\x63\x5b\x04\xff\x87\xbd\x77\xe1\x6e\xe4\x38\xd2\x44\xff\x4a\x4e\xab\x2d\x11\x12\x0a\x04\x5b\xa2\x1e\xa4\xdc\x33\x92\x2c\xd9\x9a\xb1\x25\x5f\xb7\xbc\xda\x73\xdd\xde\x41\x02\x95\x00\xca\x2c\x54\xc2\x95\x05\x92\x10\x4f\xef\x6f\xbf\x27\x23\xf2\xfd\xa8\x2a\x90\x2d\xcb\xbe\xbb\x9e\x39\x76\x13\x95\xef\x8c\x8c\x8c\x8c\xc7\x17\xd6\x3e\xe1\xaf\x6f\xf4\x39\x0e\x99\x77\x7f\xb6\x41\xeb\x81\xd2\xc8\x10\xfc\xf0\x80\x8d\x38\xb7\xae\x19\x0a\xcf\xf2\x1f\xea\xd1\xa0\x42\x94\x23\x38\x84\xdc\x38\x15\x3e\x41\xf0\x59\x53\xc9\x37\x92\xb9\xfb\x17\xc0\x54\x1e\x31\xfd\xfe\xd0\x66\x06\xd7\x64\xe1\x88\x05\x55\x43\xa8\xeb\x65\x99\xd9\x24\xe7\xce\x3d\x7b\x6e\xff\x9d\xbe\xad\xc4\xd4\xbd\xd2\xc5\x55\xf6\xa6\x3c\xe5\xfa\x8f\x2f\xfd\x13\x6e\xea\xf4\x25\x3d\xee\xd2\x7d\xd3\xaf\x07\xfe\x61\xcb\xc8\x22\xbb\x58\x0b\x24\x7f\xa3\x1e\xbe\x9c\xbd\x88\xd4\xc3\xe1\x92\xd7\x45\xcb\x68\x79\x1c\x41\x66\x16\x21\x41\x1b\x91\x8c\x8d\x48\xf1\x42\x7d\x1e\x81\x87\x2e\xd9\x8a\xef\xc0\xc0\xcc\x39\x69\x68\x2b\xb9\x3a\x3c\x4c\x69\x67\x44\x05\x38\xc5\x5d\x25\x99\xe3\xf2\xa8\x1a\x53\x4e\xbc\xda\x46\xb3\x70\x8f\xe3\x62\x86\x26\xff\x3b\xde\xde\x08\x63\x1b\xbf\x63\x44\xfe\xcf\x42\x52\xfd\x42\xa9\xa1\x55\x63\x35\x95\x44\x8c\x0a\x6b\x6e\x2d\x58\x95\x30\xee\xc8\xd0\xfc\xec\xad\x9f\xfb\xd4\x4a\x9f\x3d\x97\xcf\x18\xa0\x3a\x58\x27\xbd\xd6\xea\x4f\xb5\xcc\x72\x16\x57\x64\x4e\xe6\x64\xcf\xda\x15\x6b\x3a\xba\x61\x67\x65\x75\x5b\x95\x2c\x6c\x40\x69\xb0\xe5\xdb\xab\x2c\x09\x95\x94\xa1\x48\x61\x21\x27\xac\xbc\x2a\x94\x7b\x89\xb6\xee\xc3\x29\xc0\x06\xc0\x18\x44\x1a\xde\xc9\x27\xd0\x9d\x7c\xaa\xa9\xe6\x42\xab\xa3\x2a\x3f\x23\x5f\xec\xf7\x75\x85\x7e\x01\xdf\x7e\x7d\x31\xff\x00\xae\x83\x6f\xaa\x96\xad\xf9\xfd\x8c\x7c\xb5\x6d\xe5\xbb\x4f\xfe\xf6\x8a\xae\x69\x5b\xa9\xe6\x4a\x0e\x9d\xd0\xfd\x9e\xd1\x16\x6d\x07\x7f\x3f\x54\x2d\xee\xc4\x2c\x30\x3e\x8e\x9b\x75\x92\x92\x25\x1b\x3d\x8b\x96\xd1\xb0\x5c\xd5\x81\xc3\x82\x7d\x8b\xa7\x7a\x62\xb0\x8e\x30\xda\xd6\x95\x47\x9f\x99\x1e\xf9\x7a\x2d\x58\x37\x6e\x63\x9f\x37\x87\xdd\x15\xc9\xcc\x29\x66\xc1\xd5\xfa\x4c\xd6\x90\x22\x1c\x46\xdb\x39\x0b\x23\x3f\x4c\x5c\x9f\xb4\x3f\xf1\x3b\x7b\x15\xeb\xf7\xe4\x9e\xad\xaa\xf5\x51\x52\x3f\x55\x76\x5e\x6d\x4a\x3d\x63\xb3\xcd\x6c\x0a\x32\xd1\x44\xee\xc7\x9a\xb7\x2b\x96\x92\x78\xc0\xa7\xed\xbb\xef\xa0\x3d\xb4\xb2\xc0\x2b\x19\x45\x39\xf2\x0a\x0d\x6a\x02\x2e\x99\x3d\x9e\x75\xd2\xb0\x3b\x30\xd9\x8b\xa9\xb1\x37\xc2\xee\x97\x9c\x50\xf2\x07\x2a\x78\x23\xf9\xbe\x36\x51\xc1\x12\xcf\xcc\xc2\xb6\xfc\x4e\xae\x9a\x38\x7b\x0e\xba\x04\xb5\x72\x2f\xc9\xfb\x9a\x8f\xda\x6d\x55\x0b\x29\x77\x0e\xd6\x51\x16\x37\xb2\x94\xd9\xd8\x6c\x29\x57\x73\xf7\xa5\x15\x98\x6f\x2b\x76\x07\x46\x42\xb9\x3f\x2a\x8e\x22\x78\x59\xab\xe5\xfd\xd2\x79\x7c\x60\xa4\xc6\x1a\x62\x2d\xa8\x00\x73\xfb\x5e\x1e\x9d\x33\x29\x7b\x5f\x91\x5d\xd5\xd8\x5b\x71\x32\x25\xa0\x67\x52\xe6\x7e\x10\xaa\x3a\x8e\x32\xd5\x95\x69\x9d\x10\x72\x76\x2f\xae\xe4\xbe\x8b\x9d\x82\xea\x98\x92\x5d\xa9\xf0\x2d\xa6\xa4\xde\xa8\x60\xa6\x29\xb9\xaf\x0d\x92\x82\xe3\x19\xc5\x60\x10\x7a\x54\xe8\xd6\x43\x16\xd1\xe5\xb8\x20\x9b\x9a\x2f\x69\x4d\x6e\x69\x5b\x81\xba\xa3\x12\x92\x9d\xc2\x44\xb0\x8a\x57\x9a\xb6\x9b\xc3\x0e\x1e\x27\xc6\xcb\x69\xa6\x88\xf0\x3b\xba\x63\x9a\x61\x34\xec\xbe\xf3\x84\x04\xde\x92\xe6\x50\xd7\x20\x49\xca\x02\x35\x15\x6e\x81\x99\x3b\xf3\x97\x2f\x9d\x2f\x85\x6c\xea\x4c\xec\x26\xfa\xeb\xae\xec\x2d\x37\x7d\xd4\xc2\x8d\x6f\xfd\xb9\xfb\x23\xdd\x31\x71\x25\x3b\x24\x62\x47\x76\x25\xa9\x37\xe4\xbe\xf6\x1b\xb3\x76\xd0\xb0\x35\xfd\xc8\xec\x97\x5e\x92\x3d\xee\xe8\xbe\xb8\x61\x47\x71\xe6\x09\x1b\x86\xd1\x5c\x11\xc0\x20\x3a\x8b\x6a\x4e\xd5\x73\xf0\xda\xb5\x5a\x02\xa7\x21\xff\xf6\x6b\xdc\x20\x49\xf2\xcf\x1b\xf2\x39\xa9\x59\xb3\xe9\xb6\x71\x1b\x93\x29\x69\x52\xbf\xcb\xb6\xc9\x07\xe4\x42\x7e\x3f\xd4\xb5\xcb\x9e\xfe\xa0\x0e\x80\xab\x36\x80\x7b\x97\x7c\xe7\xd2\x04\x8a\x05\xa2\x23\x67\xeb\xaa\x15\xdd\x64\x1c\x7d\xec\xaa\xe6\xe9\xdb\x0e\x15\x32\x9b\x25\x3b\x18\xb7\x57\x7a\x03\x76\x55\x83\x7b\xb4\x91\x97\x83\xbf\x99\xe9\xf5\xdf\x55\xb0\x03\xf3\x29\x54\x4e\xac\xa0\x12\xac\x07\x56\x10\xb8\x88\x5c\x40\x79\xbc\xa2\xf5\x53\x5c\x01\x5b\x52\x36\x76\x41\x56\xb4\x5e\x1d\x6a\x08\xa6\x52\x47\x5e\xf3\x2b\xf7\x2c\xf3\x86\x91\x9a\x09\x41\xe6\xb3\xf9\x0b\xb9\x54\x52\x4c\xe0\x20\x89\x11\x0a\xaa\x76\x1c\x40\xb5\xab\x3a\x08\xb1\x05\x85\xea\x62\x57\x35\xc5\x02\x23\xdd\x24\x57\x5e\x10\xe5\x43\x82\xac\x55\x73\x5b\xf5\x84\x5b\xb7\x14\x16\x5f\x8b\x65\xc2\xfa\x18\x6a\x47\x91\xbb\xbb\xbb\xd9\xdd\x87\x33\xde\x6e\xce\x7f\xf8\xd3\x39\xb0\x66\xc5\x99\x8b\x8f\xce\xdf\xd9\xfd\x1d\x3c\x60\x76\xf4\x5e\x9b\x28\xf4\x78\x3d\xc7\xcf\xf9\x6c\x7e\xb1\xbf\x0f\x87\x4f\x8d\xde\x05\xfe\x06\x07\xa1\xc3\x46\x72\x4e\x14\x66\xe2\xc1\x2c\x0f\x1b\x31\x43\xbf\x1c\x18\x91\xd8\xf2\xbb\xff\x5e\x1e\x36\xb3\xd5\xa6\xfa\xf7\xaa\xfc\xf5\xc5\x27\x9f\xbe\xf8\xf8\xa2\x87\x72\xe9\xfd\xd3\x29\xf7\x93\x8f\x3f\x99\x7d\xf6\x69\x9e\x78\xe9\xfd\x89\xc4\x2b\xb7\xfb\x6a\x0c\xb3\x4a\x70\x11\x76\xdf\x4d\xe3\xa3\x03\xbf\xfa\xcf\xa2\x82\xcc\xe6\x2f\x62\x32\xff\x13\x43\xb7\x7a\x4a\x96\x35\x6d\x6e\x88\xe8\x20\x70\xb1\x5a\x5b\xde\xe0\x5d\x2a\xc6\xef\xac\x55\x15\x81\x5e\xe5\x3d\x04\x04\x45\xc1\x75\x9a\xa0\x2e\x48\x1f\x82\x3f\x83\xa3\x30\x1c\x99\x1d\xbd\x91\xcd\x3b\xbe\xbb\x87\xae\xaa\xab\xce\xbb\xe8\xa3\x6d\x43\x15\xe1\xbd\x78\xe2\xc6\xbd\x7e\xf6\xfa\x19\x21\x67\xe9\x29\x4f\xfa\xba\x7e\x32\xcd\xbc\x7e\x56\x88\xdd\xeb\x67\x19\x92\xf1\x55\xa0\xe3\xde\xd6\x96\x08\x86\x19\xa7\xf2\xd9\xa9\xeb\x29\xac\x81\xfc\xef\xe2\x9d\x07\x28\xf8\xc6\x79\xa7\x4a\xae\x87\x1e\x5f\x6b\xf9\x66\xac\x99\x94\x18\x5c\xf6\x94\xe0\x85\x1c\xf5\x0a\xf1\x8d\x12\x72\xc2\x3f\x80\x8f\x9d\x2c\xa2\xa3\x11\xe5\xf3\xa4\x3e\x6a\xa5\xf5\xa6\xba\x65\xee\xa2\x00\xbb\xba\xab\x4a\xd6\x5a\x61\x35\xa9\x09\x38\xfd\x9e\x18\xb1\x60\xd7\xc6\x76\x2d\xef\x09\xad\x91\x88\xf1\xb4\xe4\x67\x47\xe5\xe0\x05\x5a\x6a\xdd\x82\xef\xec\x94\x8c\xf4\x0c\x56\x1e\xfc\x8a\x5d\xed\xce\x88\x85\xd7\x17\xd1\x5b\x59\x77\xd4\x1e\xf4\x2e\x7d\xc9\xef\x4e\xbe\xa4\xe9\xfd\xd5\x08\x4e\xe9\x2e\x3e\xbd\x8f\x16\xdf\xd1\xea\xec\xe8\xfd\xdb\x5c\x7c\xb0\x6b\x89\x3d\x6d\x04\xd9\x1d\xea\xae\xda\xd7\x2c\x5a\x79\x31\xb0\xaa\x4b\xd6\xdd\x31\xa5\xf2\xde\xa9\x90\x73\x39\x0b\xcf\x30\x97\x5b\x53\x55\xf9\xec\x39\xa0\x97\x4d\xc9\x73\x88\xdd\x79\x1a\x71\xeb\xa6\xa2\x05\x4e\x6f\x47\xa2\x47\x6d\x6c\x37\xc7\xc1\x13\x5c\xe5\xe4\xf4\x0f\x43\xe7\x04\x3d\x3e\x1f\xb5\x81\x9a\x1a\x7e\x1d\x74\xd5\xab\x24\x4c\xcd\xfd\x84\xee\xaa\x66\x7c\x77\x78\x1c\x52\xab\x37\xd0\x61\x48\x84\x2e\x01\xd9\x66\xde\x13\x86\x09\x2b\x8a\xb2\xef\x5b\x45\x92\xdf\x71\x53\xa4\x87\x19\xa3\x71\xbb\xe1\xa6\x89\x90\x7f\xf0\x86\x0d\x90\x38\xf8\xf0\x66\xb8\xc7\x14\x34\x0f\x56\xca\xa4\xcd\x11\x99\x38\x3c\x47\x87\xb9\x8a\x6c\xfb\xe7\x64\xe9\xa7\xf0\xa0\x7f\x4d\x9a\x4f\xdd\xfe\x3f\x27\xc9\x9f\xde\x9f\xa3\x07\xfa\xa6\xa5\x3b\x06\x4f\x02\x50\xfc\x6d\xd0\xea\x04\xee\xe7\x4a\x16\xfc\xb3\x60\x25\x52\xdc\xf2\xe8\x04\x6a\x75\x5c\x17\x56\x06\x5c\xde\xb6\x6c\xd5\x69\xc7\x64\xbe\x56\xf6\x2a\x65\x10\x03\x32\x55\xf1\x5f\x47\xf5\x10\x93\x8f\x25\x4f\x6b\xb8\x88\x8c\x58\x9e\xd1\x2c\xa3\x6b\x9c\x92\x1e\x45\xfe\x58\x22\xb6\xe6\x3f\xe5\x34\x5e\x29\x13\x60\xc2\xa7\xe3\x57\x4e\xef\xc6\xf9\x29\x6d\x29\x88\x55\xec\xc3\x4a\xf6\x41\xf3\x9a\xb2\x04\x47\xc6\x1d\xf0\x89\x49\x6a\x49\xf4\x28\x9f\x83\x9c\x7b\x95\x90\x7c\xb3\xd6\x9c\x6b\xeb\xb7\xb1\x36\xba\x5b\xf2\x92\xcc\x2d\x8d\x9d\x9f\x93\x2f\xea\xda\xaa\x63\x25\x6d\xa8\x28\x18\xb2\x96\x84\x8c\x7a\xf5\x25\x93\x65\x30\xa0\x27\x58\x51\x68\x5f\xae\xf6\xf3\x0a\x75\x84\x17\xa4\xdb\xb6\xfc\xb0\xd9\xda\x2e\x1d\x6b\xfe\x6c\xc5\xeb\x77\x1e\x70\x32\x6f\xa4\x1c\x5d\x05\x3e\x0a\xc6\x43\xc1\xd9\xa9\xeb\x5e\xc3\xbe\x71\x73\xb1\x0d\x4f\x13\xbf\x79\x20\xdc\xbd\xfd\x3c\xc6\xdf\x25\x7d\x84\xc1\xda\xc4\x6f\x21\x4e\x81\x8a\x6a\x45\x16\x72\x48\xc5\xc3\x72\xff\x66\x61\xce\xd7\x5a\xbb\xa0\x28\x8b\xde\xba\x66\xf7\x4b\x7e\x6f\x35\xe4\x89\x95\x73\xd7\x0c\xcc\xa7\xb2\x79\xe1\xda\xd1\xd5\xef\x9b\x96\xdf\x69\x70\xef\xc8\xb2\xe7\x50\xb6\xe7\xe1\x01\xf4\x02\xeb\xa2\x34\xdc\x31\xe1\xe4\x37\x3d\xaa\xe7\xfb\xb1\x68\x9d\x79\x2f\x11\x38\x4b\x6f\x75\xec\xd5\x64\x8c\xb7\x47\x72\xb9\x82\xbd\x8f\x7d\xb8\xb4\x35\x26\xbb\x1a\x27\x2e\x42\x7a\xee\x43\xb4\x9f\x18\xd7\xd9\xf3\x2a\xb4\xbb\x8c\x5d\x00\xd0\xdb\xdb\xfe\x40\x49\x49\x1e\x88\x0a\x17\x2d\x2e\xae\xfb\x4a\x83\xc2\xdb\x14\x36\xf3\xf9\x80\xf8\xd5\xbc\xf9\xcf\xfb\x4f\x7e\xd0\x83\x9a\xbf\xe9\xa2\xba\x4e\x4e\xa3\x6f\xf5\xcf\xcf\xc9\xc2\x7c\x2b\xc8\xc5\xc2\x18\x59\xd1\xd2\x85\x61\x73\x47\xdf\x40\x48\x1b\xc2\x9a\xae\x6a\x81\xb4\x48\x05\xe1\x65\x7b\x2e\x00\x33\x30\xb3\xb1\x76\x62\x67\x6e\x77\x81\x9b\x92\x1c\xa9\x14\xe0\xce\x70\x86\x52\x16\x00\xa5\x09\x48\x3d\x15\x58\xc6\x54\x6c\xd6\x17\xe0\xda\xcc\x76\x15\x8e\xf0\x20\x18\xe8\x2a\x67\x38\xea\x62\xee\xd3\x84\xfa\x79\x80\x72\x52\x34\xad\xed\x7d\x59\x12\xf2\x88\x68\xac\x03\x15\x48\x1f\x68\x54\x02\x9e\xe6\x08\x16\x14\xd6\x50\xc5\xe6\x3a\x68\x72\x21\xbf\xe9\x01\x49\x30\x71\xce\xe0\x99\xd3\xeb\x24\xad\x10\xe1\x36\x8e\x29\x54\xee\x5a\xc3\x04\x2c\xab\xb2\x20\xab\x00\x54\x54\xb1\x2d\xc2\x66\x50\x6e\x21\x1a\xb3\xad\x8b\x5d\xa2\xf5\x48\x58\xed\xc7\x66\x13\x72\x2b\x65\x8d\x15\xad\x35\xf2\x76\xc7\xf7\x51\x50\x8f\x1d\x66\x2a\x26\xdb\xfd\x62\xa7\xfa\x46\x0f\x09\xc1\xe4\xf4\x88\xc2\xee\x1c\x58\xa7\x20\x1e\xe0\x8a\x9c\xbd\x20\xef\xa7\x7a\x9e\x8c\xec\xba\x07\xae\x0e\x26\xf5\x84\xf6\x7d\xf8\x8e\xaf\x78\x53\xb2\x46\xca\xa9\x48\x2e\x77\xe7\x64\x4b\xeb\xb5\x75\x73\x73\x89\xa9\xd0\x10\x1e\x27\xed\x56\x21\x76\x51\xdf\xe4\x4b\xb4\x6a\xde\xb2\x56\x54\xdc\x31\x43\x7f\x51\x96\xf2\xb5\x85\x88\x13\x6a\xca\x02\x24\x49\xc7\x6c\x80\x43\x95\xe7\x5a\x3f\x38\xc1\x2c\x6a\x3c\x0f\xd0\xa3\x2b\x44\x2c\x7c\xf0\xa3\xf5\x4f\xa3\x8a\xe4\xac\x1f\xdb\x58\x40\x62\x1a\x74\x74\xab\xc4\x26\xdb\x41\x18\x67\xa2\xce\x71\x66\xf3\x53\x4f\x73\x6f\x11\x6a\x83\x83\x6d\xa6\x32\x75\x29\x7d\x3a\x40\x7b\x5a\xbe\x71\xde\xfd\xff\x2f\x5b\xb6\xb4\x10\x5d\x5b\xed\x0d\xb9\x9c\x9f\x93\xdf\x28\x3f\xca\x9f\xec\x67\xa6\xbd\x03\xcf\x68\xdd\xb1\xb6\xa1\xc0\x24\x36\x2d\x3d\xc2\x4e\x3a\x08\xbb\x0e\xaf\x11\x13\x97\xfa\xa0\x19\xb5\x38\x38\xbc\xae\xbd\x6a\xba\x6d\xc1\xd7\x45\x77\xdc\xb3\xb3\x77\x1e\x9e\x7b\x45\x0b\x18\xf6\x9b\x49\x1e\x06\x53\x95\xa7\xab\x15\x6b\x3a\x1d\xf2\xe1\x51\x2a\x62\x30\xb2\xf5\x9a\xad\x3a\x33\xbf\x3f\xd6\x74\xc5\x4a\x02\x78\x86\x3a\x8e\x99\x6c\x29\xc8\xef\x2b\xf0\x6a\x01\x14\x43\x88\x99\xe7\xf2\x11\x59\xd1\x1a\x17\x83\xd8\xb5\x32\x13\x53\x28\x7f\xee\xb4\xa2\x17\xac\x07\x0c\xe8\x04\x34\x3c\x77\x9a\x70\x08\xac\x77\xb6\x58\x78\xb9\xb9\xce\x39\xe7\xfe\x80\x91\x0e\x76\x1b\x2c\xbe\xd3\x3d\x5d\x75\x06\x68\x4f\xa8\x97\x89\xf2\xd0\x29\x3d\xc7\xa9\x85\xbf\x6d\x68\xd7\x53\x8e\xb0\xd0\x96\xe3\xfe\x8a\xae\x20\xa2\xd3\x7c\x48\xf9\x64\xe2\x33\x0d\x06\x3f\x75\xe3\x7c\xbb\x2d\xdb\xa9\xcb\x29\x74\x18\xed\x54\xb4\xd6\x5d\x01\x2e\x0a\x4d\x77\xa6\xeb\x3b\x95\x0a\x40\xb7\x31\x5f\xcc\x4d\x86\xbf\x4f\xc6\x94\xd5\x31\x88\xb2\xbc\x75\x31\xca\x8f\x02\x41\x0d\xa7\x96\xe0\xe4\x9f\xc5\x72\x83\xaf\x44\x3c\x34\xb4\xbd\x71\x70\x31\xd1\x80\x48\x77\x9a\xdf\xed\x68\x7b\x73\xd8\xa3\x9f\x4c\x05\xe1\xf8\xac\x44\x2a\x20\x62\x25\xc7\x7b\x45\x00\xa4\xd4\x6e\x9b\x02\xe6\x01\xf0\x05\x76\x6f\x3c\x2f\xa2\x68\x6f\xb0\xd9\x01\x0a\x19\x69\x78\x51\x1e\xf6\x75\xb5\xa2\x1d\x2b\xcc\x36\xfb\xd2\x84\x8b\x88\x6a\x78\x57\x8e\x30\x65\xa9\xb1\x74\x59\x1a\x1c\x2e\x8f\xf9\xa5\x0a\x85\x0c\xd5\x52\xb1\x33\xc2\xda\x4b\xf0\x91\x1d\x22\x94\x1d\x7b\x74\x64\xd9\xa1\x21\xf6\x8c\xce\x65\xca\x11\x24\x7c\x7a\xc9\x46\x2c\x57\x9e\xa5\xa7\xb1\x6e\x7b\x97\x52\xad\xe1\xbb\xc9\xfb\x33\x71\x15\xb8\x85\x3d\x16\xfd\x48\x26\x3d\x34\x63\x9f\x57\xfb\x1b\xff\x6e\xcc\x51\x63\x9e\xda\xc7\x55\x93\x7b\x91\x62\xae\x43\xa3\x0c\x78\x6c\x5f\x24\x84\xb5\x27\x23\xef\x4b\x39\xb2\xb7\x15\x43\x17\x09\x35\x41\x27\x7e\xe4\x7d\x5f\x95\xb1\xe2\x0d\xc0\xd3\x68\xb4\x26\x04\xac\xc0\x83\x5f\xfd\x04\xaa\x43\xc4\xe1\x85\x40\x0b\x25\xf5\x55\x75\x6d\x02\xd1\x5c\xe1\xc9\xb1\x75\x3f\x8c\x50\x9c\x65\xa3\x8e\x72\x6e\x02\xfd\x31\x4b\xd7\x43\xaa\x37\xe5\x2b\x90\xaa\x88\x55\xdf\x4d\x68\x6c\x86\x94\xc2\x99\x18\xa0\x44\x18\x24\xfe\x27\xa5\xcc\x71\xc2\xfa\xee\x1d\x1f\x52\xfc\x8f\x06\x67\x31\x45\x30\xec\x0f\xe4\x67\xc0\x3b\xbe\x76\x83\x7d\x1c\x8f\xe9\x92\x1f\xe0\x5e\x46\xd9\x99\x37\x6e\x5c\x0a\xb6\x41\xca\x03\xdc\xa5\xf8\x06\x27\x8b\x60\xd0\x0b\xdb\xec\x4b\x92\x39\xdf\x2e\x5f\xf3\x15\x5a\x43\x6f\x52\x14\x1b\x84\xa3\x88\x4e\x5c\xc6\xa2\xa3\x1d\xe8\xdc\xcd\xe9\x99\x6a\x6c\x8b\x2b\x74\xf0\xb0\x68\x52\x6f\x4b\xd6\x80\xd6\x06\xa4\x0d\x83\x17\xfe\xce\x03\x8e\xd1\x50\xcc\xbb\x26\x9e\xc6\x48\xe8\x2f\x7d\x19\x3d\x66\x04\xf6\xa7\x58\xa7\xb9\xd6\xf3\x0d\xcd\x30\xce\x13\xc0\xf0\x71\xfc\xd5\x11\xcf\x2d\x43\x0b\x44\xf4\x04\x97\xc7\x3f\x73\x1c\x48\xad\xcb\xef\x14\x1c\x37\xed\x14\x03\x59\xb8\x3c\x74\xa1\x4a\x7d\xc7\x3b\x76\xa5\x7c\xe1\xd1\x43\x97\xde\xd2\x0a\x23\x5e\x81\xeb\xb0\xba\x16\xf0\x72\xe3\x77\x06\x1a\x6e\x01\x23\x5f\xc8\x9f\x17\xdd\x9a\xf3\x6e\xe1\x2e\xb4\xc7\xa3\x9f\x2b\x7e\x69\xd6\x0d\x85\x19\x26\xcf\xa3\x43\x29\x97\xbf\xb2\x67\x3b\xb7\x5f\xfd\xec\x3d\xb1\x59\x61\xd7\xde\xf1\x7b\xe9\xee\x04\x12\x41\x70\x52\x46\x35\x38\xfa\x0c\xf5\xa0\x5a\x37\xbc\xf8\xfb\x81\xd6\xd5\xfa\x08\x69\xb8\x8f\x7b\xe6\x3c\xe4\x7f\x60\xf7\xdd\x81\x82\xa3\xd2\x0e\x9c\xf8\x5b\x5e\x3b\x38\x6d\xbc\xdd\x15\xea\xd7\x6c\x54\x77\xc8\xc8\x4c\x00\x33\xc4\xed\xbb\x31\xcb\xf6\xb9\x8f\x9f\x9c\xd8\x7c\xff\x87\xfb\x04\xea\x35\x96\x08\x21\xaf\x53\x21\xe5\x4e\xc9\x1c\x28\xac\x53\x24\x0b\xb3\x8b\x65\x72\xa8\xd8\xf8\xb5\x57\xdc\xc2\x22\xcb\x18\x13\xb0\xae\xf6\x57\x4e\x3e\xf2\x7b\x1f\x10\x50\x55\x4b\x68\x05\xbc\x2f\x41\x60\x3c\x9e\x34\x08\x5c\x91\x0f\xca\x86\xab\xb7\xa7\xe4\xf7\x9f\x23\x2d\xbc\x84\x18\x6e\x88\x9a\x57\x50\x9c\x62\xaa\x39\xbf\x71\xab\x64\x25\xd0\x12\x55\x08\x5a\xf2\x36\xd0\xd5\x17\x50\xff\xab\x57\xaf\x66\x7d\x00\x07\xde\x20\x35\xec\xd0\xdc\x1a\x97\x13\x40\x07\xba\x8a\x0b\x75\xe0\xbe\xcd\xe4\x1b\x1f\x6c\x7d\xba\xa8\xfd\xc5\x81\x37\x53\xd0\xa4\x0a\x45\xb0\x65\x30\xf5\x60\xf0\x10\x4f\x32\x53\x00\xa9\xc5\x4e\x14\xec\x7e\x2f\x79\x7e\xf6\xa1\x1f\x66\xf0\xc9\x08\xb2\xe7\xe7\xe4\xab\x83\xe8\xf8\x4e\x8a\x4a\xe0\xd0\x8e\xd0\xf4\x0b\xe4\x90\x72\x85\xd1\x67\x95\x91\x06\xc3\x47\x7f\x64\xcb\xff\xaa\x3a\xf5\x6e\x9b\x05\xa4\x6c\x4f\x9d\xc2\xd4\x7f\x5e\x6d\x1a\xde\x32\x93\x49\x0b\x22\x98\x9d\xb9\x83\x62\x61\x0b\x79\xe4\xd4\xe4\xf6\xf6\x97\x00\x6a\x43\x9f\x35\x5b\xc0\x93\x51\xcf\xcf\x2d\x0c\x9f\x0a\xba\x79\x4f\x90\x43\x73\x10\x92\x4f\xe8\x48\x57\xbe\xa7\xab\xaa\x3b\x5e\x13\xe1\xb8\xaa\xe6\x61\x39\xf7\x87\xba\x3e\xbf\xb8\xb8\x7c\xf1\xf1\x4c\x81\xa2\x61\x7d\x6d\xe3\xb2\xcb\xf8\x1b\x64\x5f\xf8\x08\x6d\xe5\xb3\x09\x2c\xe1\x30\x66\x15\x70\xa5\x6f\xa0\x1f\xfe\xf0\xfb\x4b\x22\xe8\x51\x45\xe7\x6b\xee\x85\xa8\x23\x84\x92\x75\xc5\xea\x52\xb0\x8e\xbc\x24\x35\xdb\xb0\xa6\xbc\x02\x63\x0a\x22\x18\x93\x3b\x80\x6b\x5b\x32\x1d\x3e\xa4\xfb\xad\xd0\x1f\xd9\x54\xae\x84\xf9\x36\x23\xbf\x39\xa8\xbd\xdc\x63\x8c\x0b\x66\xb4\x2d\xab\xf5\xba\x5a\x1d\x6a\x4c\x27\x61\xe2\x91\x64\xfb\x5b\xde\x80\xb3\x09\xed\x08\x2b\x37\x92\x30\x05\xbb\x26\x77\x1a\x44\x05\x51\x35\x6d\x0f\x84\x36\xc7\x3b\x7a\x54\x14\xaa\x7f\xc5\x04\x07\x7f\x91\xab\x21\x17\xe3\xaf\x3d\x7a\x29\xdc\x5b\x5d\xd1\x3e\x24\xa4\x24\xf3\xfd\x2b\xb2\xae\xee\xe1\xde\x3d\x34\xb2\x31\xb8\x27\x4c\xd7\x26\x57\xc4\xb8\x2d\xd5\x48\xab\x17\x1f\x5f\x5e\x66\x37\x15\xf6\x15\xc6\xf4\x17\x79\xf1\xfc\xfa\xf5\xb3\x92\x76\xec\xf5\xb3\xbf\x4e\x83\x9f\xbb\x6a\x97\xfa\x59\x96\x96\x9f\x8a\x9a\xaf\x68\x9d\x28\xb0\xe3\x4d\xb7\x35\x21\xca\xef\x26\x6e\x2c\xa2\x42\xc2\xa4\x04\xa7\x70\x82\x09\x40\x92\xde\x3b\x1f\x60\x51\x64\x67\x8a\xd0\xac\x43\xb6\x3b\x11\x64\x25\x89\x3e\x6c\x88\x38\x16\x21\xfc\xd0\x81\x5e\x04\xc3\x6f\xf0\xb7\x25\xbf\x97\xcd\x7e\xf3\x0d\x6e\x6e\xb1\xe3\x3f\xe1\xe9\x6e\x4d\x9a\xbd\x6c\xc2\xb1\x20\x6d\xd5\x1c\xfe\x2f\xba\x83\xf4\x6b\x16\x79\x0f\x32\x38\xd4\x7e\x3d\x18\x2a\x78\x75\xd8\xef\x5b\x26\x94\x13\x33\x4a\xb3\xfa\x50\x63\xca\xc8\x0e\x3d\xf1\xc9\x52\x56\x74\xb4\x42\xdb\x6a\xb3\x45\xd5\x08\x7a\x40\x75\xdc\x34\x0a\x0f\x46\x98\x25\x2b\x09\x47\xac\x54\x68\xe6\x4e\x87\xc2\x9f\x89\x4e\x3e\x16\x57\x35\x17\xac\x9c\x98\x1b\x89\xb4\x6c\xc5\xaa\x5b\x10\x21\x57\x07\x61\x69\x55\xb2\x6a\xf4\x23\xc2\xd3\xbc\x62\x2d\x84\xf9\xaf\x78\x53\x02\xe3\x17\x13\xf2\x75\xb9\x61\x53\x79\x7a\xaa\x8e\xd4\x9c\xdf\x08\xb2\xa4\xc8\x37\x56\xb4\x81\x80\x43\x46\x76\x54\x5e\x20\x76\xa4\x3b\xda\xad\x10\x49\xd6\xd9\x7c\x1d\x82\x80\x9c\x19\x71\x8e\x67\x76\xc5\x4e\x3a\x0e\x9f\x7d\xf8\xd9\xa7\xb3\x14\xbf\x75\x79\xec\x90\xb0\xe0\x7a\xc8\xd1\x1b\xc9\x8c\x6a\x43\x99\x4b\x06\xbe\x29\x6a\x22\x72\x91\xf5\x07\x70\x8c\x5d\xa9\x07\xfc\xce\x0b\x93\x9b\x05\xc2\x5c\x21\x5b\x9c\x86\x3f\xb6\xb4\xd9\xb0\x91\x72\x5e\x00\x79\x4f\x97\xcc\xca\x8d\x2a\x86\x1b\xc2\x66\xab\x6e\xeb\xbe\x37\xe5\xee\x28\xa8\x7a\xd9\xb5\x98\x22\x89\x1c\xf9\x81\x34\x4c\x41\x5e\xd7\xb2\x31\x72\xc6\x5b\xc5\xb6\xd1\xa3\x1c\xa6\xda\x71\x44\x04\xb6\x80\xc0\x9e\xe0\x2a\xa7\xb9\x82\x4b\xb3\xdd\x15\xd8\x8c\x87\x1e\x8e\xa9\xe9\xcb\xf2\x2c\x14\x40\xa7\x29\xb1\x6b\xe2\x45\xe0\x9a\x24\xf2\xa7\x55\x0f\x6c\xa6\xf3\x6b\xef\x82\x05\x51\xe1\x73\x18\xe9\xcb\xf3\xcf\x71\xba\x2f\x17\x06\xd9\xbb\xe9\x87\x28\x4a\x35\x95\x68\x62\x58\xac\x45\xf5\xa2\xbf\x72\x45\xbd\x19\xb9\x78\x45\xbd\x79\xe2\xfa\xf5\xb7\x30\x42\xc6\x2f\xea\xcd\x64\x8c\x08\x5f\xd4\x9b\xdc\x74\xb5\x91\x72\x78\xba\x10\xa0\xf7\xa4\xe9\xf6\xb6\x30\x66\xba\x1a\x37\x6c\x68\xba\x60\x43\x75\x75\x86\x28\x41\x58\x59\x89\x0a\xcc\xe0\x04\xc7\xcb\x9a\x53\xc1\xe9\x15\x91\x9a\xe4\x91\x23\x5a\xf4\xd0\x58\x6c\x1c\xbc\x15\x24\xe3\x55\xf1\xd6\x75\x75\xc3\x6c\x1a\x2c\xd9\xa2\x3d\xb4\x67\xf2\xb0\xf2\x43\x07\x8e\x88\x38\xdf\xa9\x7b\xb1\x28\x13\x09\x26\x87\xaa\x9a\xb2\x5a\xd1\x8e\xb7\x93\xe8\x05\x5a\x40\xbb\xd0\xe4\xd8\xb7\x68\xfe\xc5\x39\xcf\x9f\x4e\x64\xad\x5a\x10\x58\xa3\xfa\x02\x17\x63\xc5\x77\x0c\x13\x94\xe1\x57\x60\x43\xfa\xfa\xc4\xc6\xc4\x49\xcf\xd2\xd3\x9f\x9c\x66\x11\x7a\x1f\x9f\xb9\xcc\xa3\xf8\x92\x4c\x7f\x35\xee\xba\x89\x17\xa8\x06\x8b\xf1\x25\x2c\x49\xc8\x89\x5f\xeb\x4d\x60\xe0\x0f\xf1\x62\x52\x68\x31\x9e\x72\xfb\x1b\x87\xab\x13\x51\xfd\xe4\x1a\x89\x21\x57\x08\xbc\xed\xbc\x5e\x17\xb8\x19\x3b\x5e\x56\xeb\x4a\xe3\x8c\x21\x8a\x40\xc9\x56\x2d\xa3\x82\x11\xde\x92\xaa\x51\xff\xee\xb6\x08\xa6\xae\x41\xc1\x9b\xd2\x6e\x96\x94\x08\xc2\x8b\x45\x83\x0e\xb1\x3d\x83\x30\xc6\xaa\x21\x8b\xff\x86\x95\xfa\x6f\xb9\xf4\xfb\x99\x58\x09\xb1\xb0\x10\x88\xaf\x24\xbd\x28\x6f\x45\x14\x0e\x66\x31\x45\x6b\xa6\x93\xd4\x99\x68\x0f\x88\x2c\x11\xcb\xea\xa1\xe6\x44\x57\x7a\xeb\x5c\xe4\xa4\x17\xbf\x6a\xfa\x4d\x3c\x63\x4d\x1b\xe9\x19\xd7\x9b\x81\x19\xd7\x9b\x78\xc6\xf5\xe6\xe7\xb9\x26\x4e\x9b\x31\x36\xfd\xe6\x09\xc6\xd2\xec\xf3\xe2\xdd\xbf\xc8\xc1\xff\x55\x3d\x03\x75\x9c\x8e\x79\x06\x06\x70\xf5\xf6\x28\x49\x2e\x41\x5b\x46\x13\x4d\xa6\x20\xee\xf5\xb9\x03\x72\x16\x8e\x53\x86\x4d\xdb\xb8\x65\xf5\xde\xca\x5e\xbc\xdd\xd0\xa6\xfa\x09\x1f\xc1\xf2\x00\x09\xf9\x00\x6c\x36\xf2\xf8\x68\xb7\x27\x14\xf3\x66\xb2\x65\x3c\x6e\x56\x16\x54\x02\xe0\x01\x0f\x23\xd9\xb7\x4c\x03\x09\xb8\x8e\xec\xce\xa9\x81\x81\xa5\xf3\x39\xd8\xef\x51\xfa\x3c\x87\x08\x7b\xef\x0e\x2f\x25\x96\x29\x5e\xd8\x9f\xaf\x23\x0e\x25\xc7\xe9\x43\x61\xd0\x5a\x63\x96\x03\x7e\x81\x7c\x56\xf2\x83\xc2\xf8\x40\xbc\xa9\xf7\x04\x59\xcc\x5a\x7e\xb7\xc0\x30\x14\xb9\x0d\xac\x45\x6e\x53\xd3\x23\x3f\x74\xee\x8c\x0d\x4a\xd9\xe3\xe0\x97\xd4\xaa\x04\x1e\xfa\x59\x38\xa6\xfe\xe2\x08\x92\x61\x90\xc2\x7a\x70\xc2\x42\x7f\xfb\xa1\x61\x44\xfe\xf7\x43\x15\xbc\xbb\xe2\xab\x2d\x5b\xdd\x2c\xb9\x0e\xf7\x96\xc7\x91\x5b\xea\xfd\xb6\x29\xe5\x46\x98\x77\x05\x5c\x08\x3a\x76\x40\x15\x3e\x5f\x39\x4d\x08\xb2\xa5\xcd\x46\x52\xb1\xc3\xfc\x0d\x17\x93\x05\x7b\x91\x8a\x12\x84\x95\x9a\x1c\x34\x54\x20\x1f\xc1\x39\x06\xec\xd2\x7e\x0f\xbb\xa3\x4b\x48\x1d\xc0\x32\x44\xeb\xb6\x9c\xca\xea\xe6\x6d\x76\x72\x18\x5a\x9f\x2a\x18\xf9\x8b\xd6\x0e\xfd\x15\xd6\xd6\x68\xa4\x80\x76\xef\x78\x7b\xa3\xdc\xeb\xc6\x27\x2e\xfd\xf4\xc5\x47\x9f\x20\x1f\xb3\x4d\xff\x6f\xe2\x4e\x1a\xb6\x69\xea\x6b\xc0\x52\x45\x42\xb5\xa6\x4d\x41\xef\xd1\x48\xa6\x5e\xff\xbb\x4c\x8b\x74\xfa\x6d\xb6\x50\x6e\x9b\xaa\x5a\x72\xab\x6c\xfe\xb5\x30\x35\x8d\x39\xb3\xf0\x76\x85\x9c\x6b\xe2\x8a\xac\x00\xc7\xf8\x3a\x95\xdd\xca\x1b\xcb\x52\x4a\x2b\x4e\x57\xf1\x41\x7f\x1e\x8d\x43\xef\xfc\xbd\xab\x1e\x2f\x39\x89\x89\x4b\xcd\x14\xcf\x0e\x2d\x4b\xb4\x0f\x2c\xdc\x0e\x94\xf9\x2d\x4d\x97\x2e\x65\x8a\x8e\x76\xd5\xca\xc7\x1a\x04\xca\x0c\xf0\x07\xf3\xc3\xf6\xc8\xf6\x3e\x87\x5a\x98\x12\x16\x01\x3e\xdb\x8f\xa3\xd2\x31\x1c\x6b\xc6\x4a\x29\x21\x2b\x0b\x77\x2b\x50\xe7\x00\x2c\x17\xd4\xbc\x3a\xab\x04\x6d\x19\xb6\x83\x82\x22\xfc\x73\x46\x7e\xe4\xed\x0d\xa6\xe3\xd9\xb7\xd5\x0e\xd3\x53\x81\xed\xb2\xae\x18\xc8\x15\x25\x73\x7a\x07\x54\x6a\xb1\xe2\x7b\x56\x92\xc5\x95\x6a\x44\x81\x53\x5c\xe1\x1f\xd8\x96\x9f\x2a\x78\x29\x9f\x47\xb5\xe0\x44\x49\x1c\xf2\x92\xa8\x44\xe1\xd7\x97\xbf\xa8\xbf\x1d\xd7\x0d\x94\x37\x58\x0b\xf6\x58\x7f\x30\xae\x3b\x9c\xb6\xa0\x97\xb4\xa3\xe0\x0d\x07\xab\x6f\xcb\x16\xca\x96\xfb\x10\xdb\x22\xc2\x42\xc6\x1c\x6f\xd0\x47\x64\xa3\x53\x3c\x89\x93\xe8\xe7\x6a\xc5\x9b\x49\x22\xb9\x21\xdc\xff\x36\x23\x20\x28\xba\xe4\x4f\xfa\x4d\x89\x34\x71\x86\x99\x9d\x26\x64\x79\xd4\x69\x6a\x40\xd5\x81\xf4\x88\x65\xd4\x7a\xcc\x54\xcb\xd0\x1e\x36\xb5\x64\x9b\xaa\x91\x84\xb9\xba\x81\xa0\x3a\x29\x91\xb7\x54\x21\x22\x9d\xed\xf8\xb2\xaa\xd9\x84\x60\x9a\x19\x3c\x03\x80\xde\xb9\xd1\x49\x16\x81\x54\xa0\x3d\x1b\xe0\x09\x18\xa9\xe4\x73\x40\x41\x70\x1f\x06\xe0\x60\xe0\xe0\x54\xa9\x37\x22\x82\x59\xc2\xd5\x83\xce\xec\x8e\x30\x83\x42\x00\x06\xc0\x99\x7c\xae\x7c\xad\xd2\x65\x23\x0f\xfa\xdd\x0f\x7f\xf8\xbd\xff\x1a\x41\xb0\xe6\x43\x4b\x56\x60\x73\x0a\x3e\x2a\xdc\x2d\x3c\xa3\x28\xcb\x4d\x9c\x2b\x2c\xc9\xa8\x7c\xa9\x62\x5d\xf3\xbb\x2b\x88\xb3\x30\x92\x45\x8a\x73\xb9\x3e\x26\x62\xcb\x5b\x29\xc7\x28\xec\x2f\x05\xcf\xb7\x69\xf9\x9d\x42\xec\x12\x74\x67\x52\x3a\x51\x81\xa0\x1a\x66\xac\xb8\x1d\xcb\x43\xd7\xf1\x46\xb8\xb5\x10\x5d\x1b\x3c\x90\x4a\xf5\x5d\x35\x32\x31\x8c\xed\x4b\x1f\xa1\x4f\xce\x60\x8a\x69\x9d\x14\xfa\x1e\xbe\x1f\x01\x7a\xdb\xde\xf3\xf2\x49\xaf\x32\xe3\x83\xce\xd8\x58\x6d\x30\x73\x11\x5f\xad\x0e\x7b\x0c\x41\x59\x1f\x6a\x1d\xe3\x75\x66\x70\x88\xef\xb6\xb4\x93\x3d\xde\x51\x25\xe5\xdd\x0b\x0b\xe4\x36\xd1\xa8\xd5\x82\xcb\x32\x08\x7c\x06\x36\xa0\x2d\x6b\x59\xc8\x4d\x35\x1f\x0d\x75\x17\xd6\x26\xf6\x5f\xd5\xea\x46\x83\x6b\x55\x8a\xc2\x07\xc2\xdc\xc4\xce\xb8\x2f\x78\x97\x65\x6a\xcf\xc1\x46\x92\xb9\x99\xe4\x7f\xfe\x76\x10\x5d\xb5\x3e\x16\x26\x85\x64\xf0\x3d\xba\x4a\x03\xdf\x15\x73\xe2\xf1\x24\x1b\xaf\x7b\x48\xfa\x84\xce\x23\xaf\x9f\xa9\x79\x3d\x53\x4e\x1a\xa1\xbc\x9f\x1f\x79\x02\x83\xcf\x84\xd1\x25\x08\x79\x68\xb2\x23\x26\x83\xa1\x97\x6b\x5e\xdf\x80\x30\xf9\x7e\xc3\xbb\xf7\x11\x1c\xd2\x3d\xd9\xee\x44\x02\x83\x54\x3e\x79\x9d\xe7\x1a\x06\xf3\x71\x0f\x99\xe2\x22\x68\x54\x92\x2c\x0d\x92\x66\x2d\xf9\xad\x6b\xb6\x4a\x0c\x22\x0e\x42\xd9\x55\x65\x59\xb3\xc4\xdc\x80\x0b\xe3\x3d\x6e\x39\xca\x92\x6d\xe9\x2d\xf3\x75\x7c\xbc\x61\x22\x31\xc5\x50\x47\x37\x34\x59\x1b\x08\xaa\x84\x50\x39\x6c\x13\x07\x0a\xec\x4d\x3d\x91\x6d\x7b\x21\xc4\xa2\x3f\x03\x65\x88\xf3\x95\x72\x24\x29\xeb\x77\x78\x88\x5b\x86\x58\x74\x80\x3f\xac\x96\x75\xaa\x79\x82\xb6\x6f\x41\x32\x0b\xf4\x93\x58\xd7\x1c\xa3\x10\xf8\x5a\x35\x8a\x46\x27\xa7\x61\x8e\x4a\xc4\x99\xb7\x42\xee\x61\xff\x39\xce\x61\xbc\x2e\xbd\xb8\xcc\x3d\x22\x5d\x4f\x74\xb5\x3a\x59\x62\xdb\x56\xcd\x8d\xeb\xe8\x97\x92\xf7\xfa\x25\xbe\x84\xa8\x97\x14\xf6\xbc\x70\x61\x24\x89\xe8\x40\x3d\x7e\xdd\xde\x24\x5b\x2e\x02\xae\x99\x67\x0b\x43\x7e\x58\xf9\x94\x68\xda\xdb\xd1\x71\x6f\xb1\xff\x9e\xcd\x66\x4e\x3a\x19\x0d\x93\xe7\x38\xbe\x40\x64\xa2\xf1\x83\xb3\x1f\xae\xdc\x3f\x8a\x25\x55\x68\xeb\x6f\x2c\xb8\x43\xaa\xb1\x97\xe4\xc2\xc4\x8e\x84\xe9\xd1\x6c\x39\xd7\x57\x6e\xad\x8b\x68\xf0\x04\xde\xba\xbf\xf0\x86\x79\x11\xb7\x77\xb4\x6d\x08\x62\x0b\xdf\xb0\xe3\x1d\x6f\x4b\xf2\x9e\x2c\xf4\x9e\xac\xf7\x9e\x6c\xe0\x3d\xb2\x3b\x08\x30\xda\x6a\x64\x48\x4a\x04\x66\x8f\xd0\x78\x90\xb3\xd7\xcf\xfa\xdc\x12\x5d\x70\x70\x3b\x68\x2f\xb1\x5b\xe3\x4f\x7c\x4a\x2e\x26\x09\x7f\xca\xf4\x62\x26\x7d\x32\x55\x77\xfb\x96\xad\x59\x2b\x8a\x96\x95\x87\x15\x2b\x8b\x1d\x87\xe5\xc7\xab\x19\x51\x8b\x00\x84\xa4\xa7\xfb\xbe\xef\xde\x6a\x6a\xdc\x8d\x74\x9f\xf2\xc4\xca\xbf\x3d\xf7\x45\x77\x46\x2a\x55\x72\xbf\x3f\xa1\xa7\x80\x47\xcb\x0c\xc8\xfc\xb1\x93\x39\x55\x52\x28\x88\x68\x4e\x49\xa5\x51\x6f\xc1\xea\x83\xdc\xc5\x28\x0e\x05\xa0\xc6\x56\x3a\x10\x65\xea\xe4\x0e\x36\xef\x51\xe5\x94\xb6\x30\x3a\xdc\xd5\x41\x78\xbe\x6f\x0b\x83\x26\x6a\x85\xf0\x1f\x19\xba\x29\x1c\x09\x6b\x56\xfc\xd0\xd2\x0d\x38\xac\xa3\x28\xd9\xd9\x91\x7a\x09\x99\x55\xae\x3e\x0c\x90\x11\x1d\xa3\xa5\xa4\x40\xb4\x5f\x6d\x2b\x1c\xc9\x1d\xa3\x37\x44\x45\x0e\x81\xb2\x93\x50\x51\x34\x8c\x95\x52\x2e\xa5\xa2\x12\x0a\x34\x9a\x32\xd1\x6d\x19\xdc\x9e\x5b\xb0\xa6\x57\x02\x1e\xf0\xf2\xed\xa1\x46\xb8\xfc\x2f\x48\x5e\xa9\x7b\x47\x0f\x30\xec\x9e\xee\x41\x2d\x2c\xd9\x06\x98\xdd\x10\x46\x06\xcd\xf2\x7c\x6d\xbc\xf6\x66\xe4\x5b\x4c\x30\x4f\x0e\x42\x3b\xea\xc1\xf3\x7d\xb5\x62\x42\xe8\xe4\x97\x62\xcb\x0f\x75\x29\xcf\x53\x47\x6f\x34\xcc\x2e\x55\xf9\x73\x10\xb9\xae\x39\xaa\x61\xce\xdc\x48\xad\xdd\xbe\x96\x67\x10\x72\x4d\xaa\x59\xb8\xcb\x85\x7e\x21\xe8\x8a\x0c\x4a\x5f\x70\x4a\x01\xa0\x43\xf0\x1f\x91\x7b\x8e\x4e\x0a\xd0\x20\x10\x11\x15\x1d\xa1\x1b\x2a\x97\x17\xf0\xf2\x00\xfd\x84\x1e\x1d\xc3\x95\x05\xc8\x19\xe3\xfe\xe6\x66\x2b\x54\xee\x2e\x69\x2f\x37\x24\x9b\x51\xbe\x17\x8a\xc2\x36\xd7\xc9\xd0\x97\x1c\x15\xaa\xd2\xca\xe1\xc7\x4d\xc5\x64\x99\x03\xae\x90\x48\x78\x1a\xf7\x79\x41\x4e\xc3\x4e\x7d\xf7\xc8\x44\x4a\x49\x13\xa3\x7e\x90\x7c\x53\xe5\xa2\xc5\x37\xc8\x8a\x36\x64\x0f\x16\x4c\xfd\x64\x84\x83\x8a\x5b\x87\x57\x54\x7d\xb4\xd1\x49\xf7\xc6\xd5\x28\x33\x86\x13\x90\xe4\x13\xfb\x39\x09\x41\xe4\x3f\x72\x73\x8c\xca\x89\x7b\xfb\xed\xea\x0e\xe0\x94\xe1\xcc\x0e\x02\x9e\xec\x64\x51\xad\x65\x8b\x1d\x5b\x6d\x9b\xea\xef\xe8\xa1\xb7\x64\x64\xa5\x52\xc1\xd6\xca\x0b\xe5\x37\xb4\xed\xc0\x2a\x17\x41\x6c\x3a\x5a\x4b\x41\x85\xc0\xff\x32\x99\xc4\x3f\xf9\xf0\x1d\xf8\xf7\x8a\xef\xe4\x1d\x54\x5c\x5c\xbe\x78\xf1\xd9\x87\x9f\xbc\xb8\x44\x74\x47\x0e\xb0\xcc\x1d\x66\x0b\x77\x49\x38\xd4\x9a\x18\x53\x8f\x52\x9f\x38\xd7\xbb\xfa\x05\xb1\x07\xa0\xde\xeb\x67\x70\x9f\x3a\x3f\x2b\x55\xd0\xeb\x67\x86\xb1\xcf\xee\xa8\xd0\xbd\xb0\x92\xbc\xf3\x50\xad\xcf\xde\x95\x8b\xf8\x2e\xae\xe5\xeb\x67\x93\x37\x57\xc6\xcf\x5d\x09\xd5\xc9\x52\xb3\x4a\x24\x1d\xe2\x87\xd1\xe5\x9e\xdc\x9c\x8f\x79\xde\xaf\x6e\x32\xc1\x94\xa0\x51\x52\x51\x85\xa6\xa3\xc2\xe8\xf9\x54\x8f\x46\xc2\x76\x6e\xbc\x38\xea\x26\xd6\xa0\xeb\x76\x7c\xd3\x4f\x26\x5f\x58\x50\x25\x30\xef\xbb\x19\xf7\x02\x2f\x3d\x67\xe0\x1d\xe7\x75\x57\xed\x63\x85\xaa\xa7\xea\x27\x04\xc6\xe8\x0c\xdd\x17\x92\x7f\x2a\x00\x8f\xf9\x8a\x68\xa3\x4a\x6a\xfe\x29\x38\x7a\x95\x2c\x0c\x0c\x23\x18\x49\x0d\xfa\x51\x1f\x5d\xc3\x9a\x64\xfd\x09\xab\xb1\xbb\xbe\xfc\xfd\x05\xee\x13\xeb\x3e\xbb\x68\xd9\x6e\xf4\x1a\xeb\x16\xa3\xb5\xf6\xad\xba\xe9\x4a\xa1\x73\x85\xd9\x21\x8c\xda\x3d\x56\x7f\x57\x31\xbb\x93\xec\x7d\xd1\x6e\x96\xd4\x06\xf6\xa6\xbb\x51\xae\xb0\x93\x38\x9d\x9e\x67\x48\x4e\x57\x8e\xf2\xf6\x9f\xe8\x8b\x08\xde\xd6\x1f\x5e\x5c\x5e\x7e\xe2\xe8\x2c\xaa\x8d\xdc\x61\x24\x34\x44\xe3\xdf\x19\x6d\x9d\xfb\x1c\x6c\xf9\x9d\x32\xf3\x91\x97\x26\x88\xc9\xfd\x14\x9b\xfd\x9c\x74\x8e\x9a\x28\x47\xd8\xfc\x7c\xc9\xbd\x4f\xdf\x9c\xe1\x9c\x84\xfc\xef\xd4\xf1\x9f\x26\xbe\x05\x27\x2c\x13\x96\xe7\xc5\x02\xa7\x14\x37\x8f\x1c\x66\x24\x4c\xb8\xb1\x1b\xa1\xb0\xe0\xb4\x2a\xd9\x9c\x07\xc6\x13\x1a\x56\x3d\xdf\x89\xaa\x69\x58\x4b\xfe\xad\xda\xed\x79\xdb\xd1\xa6\x83\xb3\x1d\xfb\x21\x80\xf6\xb7\x64\xab\x9a\x22\xec\x5c\xd1\xf0\xc2\xd4\x49\x06\x3c\xa9\xb4\xe3\x4c\xac\xe8\x9e\x15\xe2\x76\x73\x86\x0c\x38\x1d\xd4\xda\x82\x83\x8c\x64\x3a\xea\x9f\xe9\x62\x8e\x82\x01\x74\xc2\x89\xb9\x14\x7f\x3f\x50\x50\x2a\x07\xef\xf9\x54\xb6\xf3\x44\x6d\x00\x24\xc9\x7d\x48\x21\x46\x05\x82\x64\xcf\xbe\xd9\xcf\xf7\x69\x9f\x6c\x14\x97\x90\xe4\x3d\x76\x31\x7b\x71\x39\x19\x88\xac\xeb\x73\x1d\xe9\x0d\xea\x22\x24\xeb\x41\xf2\x04\xd2\x7d\x1a\x6d\x1a\xae\x4f\xde\x27\x1f\xfd\x1c\xc4\x99\xa1\x23\xb7\xdf\x17\x21\x01\xbd\xf5\x75\xef\x71\xb4\xf9\xc5\x56\xde\x25\xf9\xa1\x23\xd8\xf1\x7d\xef\x01\x1c\x3c\xa2\x7d\x4b\x9b\x56\xe3\xfe\xb3\xb1\x52\x6f\x90\xf6\x4a\x96\xf5\x0a\xaf\xec\xcf\x40\xc4\x51\xf7\x5e\x94\x73\xf0\x69\x13\x33\xe2\x81\xd1\x6b\x67\x97\xf3\xfe\x72\xe0\xf8\x18\x73\xed\x7f\x32\x06\x99\xd5\x59\x3f\x9a\xa0\x7a\x5c\x4b\xd2\x02\x7c\xb0\x2a\x7d\x42\xc8\x90\x18\x92\xc5\x07\xe8\x39\x47\xfa\x29\xfd\xd6\x66\xdf\xaf\xf9\x8e\x57\xc0\x7e\x79\xf7\xea\x6a\xc9\xd6\xbc\x65\x29\x14\x80\x2c\x51\xbc\x49\x92\x16\x2c\xbf\x8f\x27\x90\x19\xdb\x98\x4e\x21\x50\x89\x35\x86\xac\x2e\x6c\x16\xec\x40\x05\xb3\x91\x62\x36\x22\x83\x9c\xa5\x6a\x4d\x06\x47\x1e\x1d\x8a\x13\xc7\xfd\xa4\x23\x12\xe4\x78\x7d\xf7\xaa\xe1\xdd\x99\x5e\xcc\xc9\x53\x96\xb0\x77\xdf\x12\xf7\xa7\xd6\x2c\x55\xf8\x64\xd4\xfd\xca\xbf\xdf\x3a\xad\x42\xa3\x11\xa1\xf6\x8e\x7f\xec\x96\xa5\x9b\x1e\x5c\x9c\xb7\xb3\x91\xfd\x4a\xf9\xdf\x2a\x52\x75\xb1\x32\x5c\xf2\x55\x0f\x57\xab\x57\xb2\x99\x52\x55\xc5\x38\x72\x54\x4f\x05\x1e\xcf\xb4\x35\x45\xcf\x2e\x3e\x9d\x97\x6c\x33\x25\x3b\x00\x2b\xe6\xe5\xb1\x58\x6e\xac\x0a\xe6\xe2\xf2\x57\x13\xfd\xd7\x84\xe0\x95\xa1\x9e\xf6\x81\x86\x28\xa1\x6f\x8d\x81\x05\x01\x50\xc2\x38\x06\xeb\x31\x4c\xd1\xd4\x2d\x5f\x94\x90\xd0\x4f\x9e\x4e\x0b\x41\xd8\x32\xf0\x57\xea\xee\xb8\x86\xb3\xea\xf8\x5e\x4c\x89\xe8\x68\x8b\xfe\xfc\x4c\xde\x9f\xcb\xa3\x32\x37\x1c\xc1\x5a\xae\xca\x02\xd0\x87\xbe\x18\xd7\x3a\xe1\xa8\x6d\x67\x16\x2f\xf0\x3d\x10\x64\xdb\x99\x69\x6c\x5a\x7a\x2c\x3e\x99\xcf\xa7\x72\x9d\x4b\xff\xe7\x4f\xe1\x67\x2c\xaf\x72\xea\x5d\x11\x48\x0f\x27\x8b\x9a\x5f\x20\x3b\xbf\x82\x18\x8c\x1e\x5c\xe1\x8e\xe8\x25\x30\x0d\xe3\x70\xfd\x5e\xdc\xc1\x78\x9d\x4d\xc2\x48\x11\xfd\x50\x73\x36\x4f\xef\xc5\xff\xd0\xce\xdb\xc1\x4e\x48\x39\xb1\xe3\xca\x17\xf2\x97\xdb\x89\xe3\x3f\xc1\x4e\xe0\x1a\xfc\xcc\x5b\x11\x4e\xbc\xac\x5a\xa6\x92\x57\x9d\xbe\x04\x25\xdb\x5c\x91\x8f\x2e\x4b\xb6\x19\x3d\xcf\xe7\xc0\x01\xdc\x9e\xdc\xe6\x47\x4e\x23\x3a\x47\x45\xb7\x6d\x99\xc6\xe1\x0b\xe7\xb1\x04\x5b\xdc\xf3\x5d\x65\xe7\xb0\x3f\xb4\xfb\xda\xa8\x7f\x0b\x01\x2a\xc3\x4b\xb3\x85\xba\x58\x2b\xef\xbb\x27\x1d\x25\xb7\x5f\xb7\xb7\x51\x93\x76\x25\xe7\xc4\xac\x8f\xff\x04\xb3\xfe\x47\xcd\x55\xfe\xaf\xa4\x50\x7c\x22\x26\x28\x94\x1f\xba\xf0\xc3\xa7\xf3\x79\x76\x1e\xd8\x9e\x9d\xc7\xaa\x6a\x57\xb0\x34\x4e\x07\x7e\xab\x8f\x1d\xb9\x02\x82\x52\x37\xa9\x56\xf5\x82\x5d\x73\x4a\x66\x17\x97\xf2\xce\xa3\xcd\xa6\x66\x27\x9f\x24\xa8\xa5\x77\x93\xbc\xb8\xfc\xd5\xd4\xc3\x2e\x8d\x7e\xb8\x54\xb9\x44\x65\x69\xf7\xdf\x9f\x84\x05\xc3\x1f\xdc\x44\xe7\x8f\x86\x05\xfa\x92\x0a\xe6\x61\x4a\xbe\x6e\x66\xcb\xae\x49\xbb\xb7\xdb\x97\x8b\x8f\xd8\xb3\xec\x9a\x08\xaf\xc7\x87\xe1\x31\x25\xee\xe2\x68\x47\x10\x39\xac\xa4\x00\xde\xfd\xca\x7b\xcd\x51\xe7\xc0\xcf\x25\x5b\x71\x7c\x6a\x63\x46\xdb\xba\x6a\x6e\x9c\x1f\xb5\x3f\xca\x54\xe5\x03\x93\xff\x46\x02\x81\x8d\x2d\x00\xc6\x5a\x8d\xc6\xf9\x05\x4a\xf4\x38\xce\x1d\x04\x6b\x95\xb0\xea\x98\x58\xc6\x87\x62\x42\x7f\x09\x98\x9f\xb0\xbc\xb5\x1d\x80\xff\xab\x32\x89\xc8\xca\x6e\xfc\xb9\xfb\xf7\xfd\xd4\x59\x5a\x95\x03\x58\xfe\xed\xd8\x3e\xa6\x5e\xf7\xd6\xd2\x90\x81\xdd\x91\x65\x63\xd0\x9d\x1c\x60\x56\x66\x0b\x13\xbb\x65\x96\xcd\x87\xae\x30\x41\xa5\x8e\x94\x1e\x59\xd8\x3d\x2b\x35\x4e\x37\x61\xa3\x4e\x20\xcb\x60\x10\x2f\x02\xeb\x0b\x4e\x10\x53\x15\x2d\xe4\xca\x10\x4e\x5a\x06\xc4\x8f\xc3\xf0\x61\x58\x6c\x4c\xca\x43\x80\x7a\x02\x83\x30\xd0\x2b\x1a\x21\x27\x32\x00\x19\x8b\xbf\xa5\x43\x33\x7b\x78\xbc\xe9\x26\x26\xf0\xa7\xe9\xde\x2e\xef\xa1\x15\x72\x7d\x25\xa9\x6b\xf7\x23\x5e\x35\xc0\xfc\xe0\x53\xb1\xe6\x6d\xa1\xbc\xa9\xa7\x44\x7d\xb3\x79\x10\x15\x3e\xdd\x95\xc2\x96\x55\x7f\xce\xd4\x3a\xf4\x3b\x29\xc8\x29\x6a\x10\x5a\xcf\x21\xa1\xe7\x6d\x95\x6d\x28\xdc\x30\x45\x94\xc9\xf6\xf3\x68\x98\xe7\xe7\xe4\x9b\x43\x77\x68\x59\xb1\x6f\x39\x5f\x2b\x40\x1b\xed\xf1\x5d\x57\xab\x1b\x81\x48\x50\xf4\xe5\xc2\xb1\x78\x51\xc9\xd0\xdc\xbd\xd5\x88\x3f\x76\x83\xa9\xe5\x79\x7a\x81\xc1\x11\x57\x18\xc2\xf5\x51\x30\xbe\x50\x08\xd5\xfa\xa8\x1a\xde\x79\x02\x22\xb1\xec\xb2\x78\xe7\x01\xcb\xbe\x89\x9e\xcc\x8a\x07\x18\x5c\x44\xe5\xbb\x84\xff\x3b\xf1\xde\x54\xa7\x76\xaa\x0e\xd8\x70\xe7\xba\xa0\x3f\x88\x49\x1a\x29\xfe\xf7\x55\x73\x13\x2e\x87\xf6\x33\xa6\xda\xa5\xbf\xe6\xfc\x46\x01\xb3\x5b\x4f\x63\x2a\x2f\xd1\x1b\xbc\x78\x24\xeb\x52\x76\x7d\xff\x06\x71\xfe\x2a\x30\x58\xc0\xbb\x44\xe0\x26\x08\x2e\x11\x97\xff\x84\x57\xc5\x48\xc6\x06\xb5\x62\x78\xd7\x4c\xf3\x58\xd0\xeb\x64\x0c\xc3\x7b\x54\x6b\x3e\xaf\x9a\x85\xbc\xca\x70\x66\xb5\xa4\x96\x5d\xb9\xf3\xc8\x10\xbb\xcb\x4c\xbf\xe3\x88\xd7\x82\x0e\x7e\x9a\x87\xa2\xbb\xca\x96\xb5\x2c\x24\x83\x2f\x71\xa3\x5f\x55\x3f\xf9\x12\x85\x89\x07\x1f\x71\xcb\x21\x4a\x88\x77\xd1\xd9\x9f\xdc\x18\xef\xf8\xba\xb3\x3f\x66\x83\xb6\x61\x34\x3a\x1e\x7f\xcc\x68\x30\x4f\xb7\x37\x1a\xf3\x93\x1b\x63\x9f\x18\x8d\xf9\x31\x1b\x34\x6f\x17\x0e\x42\x26\x70\x18\xde\xc2\x61\x2c\xc5\x38\x20\x0c\xb5\x69\xfa\x59\x5f\x1f\x21\x52\x9b\xc9\x3b\xd5\x49\xfb\xe8\xf4\x04\x1e\x01\x1f\x90\xb0\xa3\xc0\x5b\xc6\x7c\x2d\x54\xe0\xb7\x8a\x34\x75\x38\xf3\x2b\xf4\xf4\x5c\x01\x96\xa0\x8a\x68\x14\x01\x86\x97\x38\x2c\x77\x55\x97\x00\xf7\x6a\x99\x60\xa9\xdf\xd5\x6a\x58\xd4\xaf\x68\x98\x89\x58\x1a\x9b\x88\x1f\x49\x51\x71\x2f\x07\xa3\x9e\x8a\xaa\x3e\x92\xfd\x61\xb7\x87\x85\x09\x1d\x34\xa9\x20\x77\xac\xae\xe5\xff\x5e\xc1\x21\x9c\x12\x75\x78\x89\xbd\x4a\x21\xdd\x5a\x69\x41\xd5\x10\x0c\xcb\x49\x6c\xa6\x97\xd7\xbc\x3d\x42\x8e\x9e\x40\xb8\x9d\x8e\xc5\x39\xfd\x64\x86\x6a\x39\x55\x5a\x09\x9a\xa6\xa4\x6a\xec\x62\x0e\x85\xf4\x35\x3b\xd0\x66\x50\x3a\xd7\xe6\x0b\xd9\xf5\xc4\xc3\x25\x77\x3c\x6a\x6c\x83\x81\x90\xe9\xa9\x2f\xc3\x52\x79\x5c\xda\xac\x48\x11\x0b\x25\x03\xbc\xdc\x19\x64\xb8\xc6\x91\xf3\x8e\x37\xd8\x5c\xe9\x60\xd0\xee\x56\x8c\x64\xfc\xbf\xd4\xc8\x1e\xe3\xb4\xea\xaf\xf9\x54\x2b\xbe\xad\x74\xe7\xa8\xbd\x77\xd5\xfd\x59\x9a\x26\x1c\x4a\x47\xc5\xf2\xec\x72\xf2\x0f\xf5\x72\x7d\x7b\xc3\xbe\x4e\xda\x46\x7e\xae\xb7\xc7\xf0\x49\x1b\x87\x33\xdd\x87\x00\x6d\x63\xaa\xbe\x7a\xf5\x8a\x58\x53\x02\x02\x65\x1e\xdf\x6b\x19\x41\x92\x29\x63\x22\x8a\x0c\x0f\x29\x5d\x89\xe3\x9e\xf8\x66\xfc\x6b\xc8\x7d\xbe\x0c\x14\x9d\x39\x45\x67\x62\x0b\x5e\x6c\xef\xce\xca\x96\xef\x4b\x7e\x27\x2f\xb3\xcd\xa6\x66\xf9\x25\x8d\x18\x65\xcf\xca\x46\x65\xaf\x9f\xb2\x28\xce\xda\x43\xe6\x59\x55\xd1\x24\xb0\x05\x24\x47\x56\x9e\xbb\xe2\x97\x17\xd5\x14\xec\xab\xc7\xc4\x9d\x97\x60\xf0\x64\x4b\xb1\x01\x48\x87\x96\x7c\x9d\xc5\x01\x2a\xa7\xbc\x1d\x7f\x0e\x96\x91\x60\x1a\x6f\x8f\x6d\xfc\xcc\x8c\x23\xfd\xc6\xf5\x65\x85\xe8\x01\xa6\xdf\x78\xd8\x1b\x30\xf6\x84\x43\x6b\xfa\xce\x37\x95\x83\x1b\xde\x33\x26\xc6\x96\xbb\x1e\x37\x9c\xa1\xd7\x93\x33\xca\xd3\x0f\xd2\x00\x45\x8f\xb9\x5f\xc7\xee\x9f\x31\xd3\x5e\xfa\x5a\x9a\x91\x4c\xf9\x79\x7f\xd4\x49\xa8\xe6\xfb\xff\x23\xd7\xfb\x57\x67\x3f\x0e\x05\xfc\x93\xf1\x96\x90\x36\x7b\x94\x63\xea\xbd\x23\xf0\xe9\xed\x73\x12\x7c\xd7\xba\x7a\x64\x57\x87\xec\xea\x8f\x03\xdd\xb1\xa7\x37\xf6\x80\x33\xaf\x6c\x1b\x47\xa7\xb9\x2c\x44\x5b\x2f\x20\x62\xe8\xad\x0f\x9a\xa3\xe6\x00\x4f\x58\xf4\xb0\x83\x68\x9f\xbd\x42\x7a\xa1\x8d\xcd\xed\xa1\xe2\x07\x55\xcc\x5c\x12\x52\x35\x70\xc6\x4f\x61\xd6\xe3\xab\x71\xb6\xa6\x25\x0b\x33\x86\x25\xc3\x76\x0b\x59\x52\x3f\x3d\xf0\x80\xc2\xd9\x9b\x44\xda\x62\x1f\xc8\x66\xa6\xc1\x28\x74\x4c\x5b\x5c\x33\x0e\xe7\x08\x2b\x1b\x1c\xe9\x4c\xf4\xb6\x5e\x56\xec\x5a\xe7\x91\xb9\x22\xdb\xaa\x2c\x59\x73\x3d\x66\x7a\x7a\x98\x66\x8a\x33\x24\x4a\xff\xdd\xad\x55\xf4\x11\x32\xdd\xf8\x0e\x5c\x44\x54\x2f\x59\xcc\x96\x11\xcd\xc3\x10\x6a\x85\xb5\xe4\x6c\xf1\x79\x59\xdd\xbe\x5c\x4c\x5e\x37\xc0\xe0\x00\x42\x00\xfe\x85\x56\x5e\xf5\x87\xac\xa3\xff\x0d\x4e\x25\xf9\xc5\xc2\x75\x4d\x32\x4b\xcf\x68\xd4\x70\x85\x2c\xa1\xa8\xf3\xb7\x5e\x86\x76\xc8\x42\x20\x27\xbf\xa3\x4a\xf1\xe2\xad\x31\x7c\x3f\xf3\xa3\xdb\x9c\xd9\xed\x58\x73\x70\x07\x21\xff\xee\x05\x03\xf3\xe3\x83\xdc\xe8\x20\x13\x1b\xf4\xfc\x27\xf8\x47\xa1\x1b\xf5\x31\xcb\x8c\xd0\x09\x0c\x75\x79\xd4\xa7\x06\xa3\x53\x51\xc3\xc2\x1b\xf2\xfa\x19\xdf\xb3\xe6\xf5\x33\x0d\x9c\x8d\x03\x25\x08\x8c\x70\x05\x1d\x23\xe2\x58\xd5\x18\x4c\x51\x3b\x0b\xfd\x63\x80\xf4\x68\x0a\x38\xdc\x23\xfa\xed\xde\x41\x32\x73\xeb\x60\x26\x5a\xc9\x2f\x61\xf8\x3c\xc4\xf1\x3a\xd4\x39\xf6\x63\x9a\x08\xf8\x90\xbe\xb3\xcc\xf7\xb4\x29\x12\xe6\x0a\x59\x87\x1a\x71\x68\x99\xd0\x58\x3e\xf0\x19\x20\x00\xab\xb5\x8e\xaa\xda\x22\x54\x39\x86\xd4\x96\x1a\xfb\x66\xc7\x4b\xc0\x42\xe4\x1d\x6b\x27\xc8\x01\x45\x57\xc0\x13\xb0\xd7\xac\x68\x47\x76\x72\x86\x11\x5b\x33\x91\x64\x24\xfc\x68\xe7\x9d\xe3\x9b\x61\x8d\xa4\x35\xd1\xbd\x89\x9d\x0a\xae\xb6\xc6\xb5\x5a\x9c\x98\x2a\x6c\x6c\xca\xf7\x53\xf3\xf2\xe7\x53\x84\xf9\xc7\xd2\xc9\xc0\x6d\xf8\x8a\xfc\x4f\x1b\xf1\xbf\x30\x6a\xef\xcd\x50\x83\xad\x9b\x8d\xd0\xb4\x38\x0f\x9a\xf3\xc1\x50\xbc\xfb\x5f\xc3\xd5\xb4\x86\xb3\x40\x48\xfb\x46\xfb\x30\x91\xc3\x9e\x9c\xd1\x1b\x3a\x25\xc8\x3a\xa1\x7f\xc4\x5c\xff\xcf\x83\xe8\x00\x14\x4e\x71\x55\x27\x3f\xa9\xe8\x68\x53\xd2\xb6\xb4\xe3\x56\x10\xc9\x52\x52\x3b\xf2\xc3\x7b\x2d\x23\x02\x60\xf4\x75\x5d\xb4\x34\x25\xb8\x99\x62\x5c\xce\x14\x34\xcc\x46\x26\x4c\x33\x80\x93\x33\x20\xa0\x01\x3b\xf0\xa2\x2d\x33\x72\x6f\xc0\x8b\x0f\x7b\xdf\x8c\x65\xef\x90\xc1\xe1\xeb\x41\xc5\x5b\x8e\x3b\x34\x6e\x2e\x2a\x7a\xee\xe9\x33\x81\x61\x68\xd9\xf0\xdd\xab\x2b\xdc\xb9\x87\x1c\x20\xd0\x3c\x99\x70\xd2\xbf\x28\xc7\x4f\x3e\x8a\x51\x75\x56\x63\x04\x2e\xe0\xd3\x67\x2f\x7b\x75\x26\x1f\x3a\x3b\x8f\x9a\xfd\xf9\x39\xf9\x71\xcb\x1a\xf2\x47\x0e\x32\x46\x25\xb4\x9a\x6b\x4a\xc0\x30\x81\xe2\x25\xe4\x52\x37\x47\x40\x5f\xcc\x8f\x4f\x98\x9a\x58\xe3\x77\xff\x72\x5f\x18\x48\xd9\xff\xf5\xeb\xd7\xcf\x3a\xbe\x47\xab\x48\xe2\x1b\x3a\xc9\xe6\xbe\x2a\xcf\xcd\xdc\x67\xb9\x6c\x0e\x8e\x6b\x4c\xca\x06\xd5\x3e\x84\x1a\x06\x1d\xa7\x94\xc1\x5b\x41\xce\x60\x51\x40\x46\xa7\x0d\x59\x7c\xbe\x6d\x5f\x2e\x26\x3a\xb9\x5b\xe7\x48\x38\xee\x74\x4b\xac\x1d\xb0\xf3\x86\xde\xea\x2f\xce\xb5\xa1\x7e\x41\x87\xe4\xe8\x57\x0d\x7a\x3a\x35\x49\x92\xf4\x08\x7f\x5f\x35\x37\x88\xb4\x81\x9e\x11\x92\x55\x41\xfc\x7e\x62\x6c\x4a\xa8\x51\xb6\xa1\xc5\xe7\x58\xe9\xe5\xa2\x50\xd8\x25\x2b\x9d\x97\x9a\x42\xfc\x7f\xc3\x3b\x56\x2a\x7c\x3f\x95\xfe\x42\x57\x11\x0b\x77\x9e\x55\xc7\x76\xa3\xac\x76\x44\x35\x63\xbb\x16\x19\x81\x49\x36\x99\x94\x9a\xbc\x0f\x28\x03\xac\x6a\x46\x5b\x48\x42\xbf\xbd\x3e\xd9\x9a\x6e\x1a\x4e\x99\xd5\xd5\x51\x52\xc9\x29\x72\xc3\x7f\x8b\xfe\x5a\x4a\xf4\x26\x00\xcc\xa9\x00\xd2\xe4\x06\xa3\xab\x72\x4b\x9b\x92\xef\xea\x23\xde\xf0\xe0\x0d\xd2\xb8\x19\x51\x86\x7d\xb5\x32\x33\xb0\xf9\xbf\x92\x05\x74\x42\x2e\x9d\x7b\x53\x93\x93\x7e\x6d\x29\xb5\x79\xcb\xde\x83\x24\x6d\x26\x61\xfe\xa9\xe1\xdd\x2f\x3e\xf9\x64\xfe\xa1\xf1\xf3\x4f\x08\xcf\x2e\x3c\xd4\xbb\x5e\xe6\xab\x94\x45\x07\x04\xb7\x8e\xef\x63\xa1\x0e\x7d\x2c\x13\xa2\x9d\x23\xbb\xbc\x7b\x55\xd3\xe1\xe6\x55\x36\xfa\x13\x7b\x88\x63\xc4\xd1\x70\xa5\x90\x44\x42\xa5\x9b\x4f\xa3\x23\x7c\x34\x1c\xeb\x43\xda\x9c\x96\x6a\x71\xb9\x09\x54\x82\x9e\x5a\xce\xf7\xa4\x4a\x8f\x4c\x69\xa2\xde\xe6\xd0\xbc\xe4\xe0\xa7\xab\x2b\xfd\xc6\x4e\x73\x0c\x19\x97\x3a\xef\x97\xb0\x24\x05\x0f\x79\xc9\xd5\x51\x19\x9a\xe6\xc1\xe6\x32\xd3\xe7\x56\xa0\xc3\x3d\xd9\x32\x2a\x2f\x37\xb7\x2d\xfc\x29\xcb\xcc\x13\x9c\x1a\x6b\xe8\x43\x9a\xcf\x40\xb2\xf6\xb2\x27\x31\x0a\xa8\xb7\x2e\x58\x43\xaf\x22\xcd\xe4\x75\x88\x76\x56\xf5\x6f\xb7\x34\xc7\x50\xa9\xc2\xaa\x7d\x49\xea\x8a\xbc\x24\x34\xb1\x30\x98\x30\xc6\xbf\xd8\xfa\x01\xf6\x9f\x7a\x75\xf5\xde\x42\xa8\x20\x52\xda\x4d\x10\x02\x31\x2f\xb3\xf6\xd0\x36\x1c\xee\x8a\x3c\xc7\xcf\xce\xab\xd7\xb5\x68\x98\x80\xe0\xb0\x50\x2e\x6b\x8a\x8f\x09\x68\x32\xfc\xaf\xc7\x34\xe2\x1a\x77\xb0\xec\x61\x9f\x1a\xf2\xfc\xad\x8c\xb0\x7f\xe2\x8f\x1e\x32\x8c\x67\xdc\x42\xe7\x46\xe8\xbd\x6a\x07\x47\x9d\x6b\x25\x37\x83\xe4\xa8\x65\xe1\xb7\x32\xe8\xfe\x55\x1d\x3d\x8b\x68\x84\x67\xcf\x4d\xb8\xcf\x15\x91\xb4\x9c\x08\xec\x43\x0d\xe3\x43\xee\x95\xd7\x0f\x33\xeb\x3f\x39\x71\x7c\xca\x91\xeb\x3a\xf7\x52\x52\xc5\xfc\x9f\x4d\x69\x83\xb0\xf9\xfa\x99\x83\xd4\x88\x12\x8a\x9e\x8b\x14\x4c\x80\x81\xa4\xec\x35\xee\xc1\x8d\x0c\x2e\x51\x33\x87\x7d\x4f\x23\xf2\x20\x0d\x37\x11\x68\x57\xa2\x56\x14\x6d\x27\x6c\x2c\xce\x15\xe5\xb5\xe8\x2b\x80\xe2\x3d\x49\xe3\x32\x05\xf1\xa9\x89\xf0\xdc\xfe\xbd\x8c\xde\xd0\xe9\xed\x3c\x75\x43\x73\x5b\x1a\xad\x13\x9e\xa6\xec\x32\xbd\x7b\xc5\x76\xfb\xee\x18\x2d\x46\x0e\xed\xd5\xd7\xf9\x3b\xa1\xa1\xea\x91\xe7\x64\xa7\x49\xbf\x3a\xb7\xad\x79\x71\x5a\xad\x17\x20\x6c\xd2\x5b\xd0\xb0\xba\x2e\x78\xde\x2b\x53\x5f\x33\xce\x8f\x36\x62\x4a\x3d\x2d\x83\xcf\xf6\xc5\xd9\x0b\x54\xe8\x9b\x5f\x8c\x12\x5b\xd7\xee\x33\xcb\xb8\x0c\xea\x62\x7f\xaf\x75\xb5\x09\xdd\x6c\x04\xbf\xe7\x4e\xee\x71\xb8\x7b\x8f\x0e\x25\x42\x2f\x6f\x78\x55\x57\xb7\x81\x6f\xb7\xf6\x68\x05\xdf\x4d\x8d\xfa\x6c\xff\x30\x04\x39\x2e\xd9\x4a\x98\x68\x23\x13\xb6\x63\xb3\xbb\x81\x67\xbf\x55\xd2\x63\x46\x53\x9b\xff\x6b\x4b\x57\x37\x88\xac\x6d\xf2\xde\x98\x50\x80\x1e\x70\x64\xc4\x22\xbf\x20\x17\x5a\x41\x62\xe4\xde\x2f\x5b\x9d\xb8\x40\xb9\x8e\xc2\xf3\x85\x95\xa8\x84\x78\xfd\x0c\x65\xf7\xd7\xcf\x0c\x08\xbe\x32\x5f\xae\x5b\xde\x40\xf0\xb3\xac\x55\xd3\xa3\x97\x72\x15\xa9\x42\x04\x66\xe4\x7c\x1a\x7b\x63\x05\xba\xf0\xb1\x8f\x5d\x5f\x89\x11\x81\x21\xe9\x66\x1c\x4d\xd0\xf7\x7b\x8c\x51\xbd\x22\xbf\x05\x04\x77\xeb\x62\x8c\xa6\x68\x4c\x4a\x40\x3a\xbe\x61\xf2\x29\x8c\xce\xb1\x00\x4e\xb6\xa4\xad\xa2\x02\xf5\xd7\x29\xd9\x8f\x22\x9c\x67\x44\xaa\xee\x68\xdb\xa9\xad\x70\x41\xc6\x03\x93\x65\xa4\xd1\xb2\xb4\x68\x72\xfc\x9a\x47\x3d\x3f\x48\xfa\xd7\xcb\x0f\x68\x79\x7a\xdf\x68\xcb\x48\xa3\x52\x95\x82\x29\x03\x32\x1d\x58\x1a\x42\x9f\x0d\xe7\x39\x3e\x99\xda\x8f\xd8\x5f\x5c\x24\xf0\xbe\xd6\x29\x7c\xc2\x00\xb2\xc0\x47\xff\x4f\xa0\xa5\x84\x07\x12\x78\x1e\xb6\x0d\x30\x4e\x7f\x24\xf6\xe1\xae\xfd\x47\x7c\x05\x6b\x6e\x78\x4e\xbd\xe0\x74\x44\x66\x22\x50\x27\xa9\x57\xff\xdc\x7b\x9b\x3e\x65\x49\xfa\x3b\x95\x4b\x14\xf7\x69\xbc\xd2\xfd\x8c\x82\x7f\x62\xbb\xea\xde\xc7\xb8\x35\x3e\x13\x90\x08\x4a\x25\x5b\xa9\xb4\x06\x89\x37\x98\x7a\x85\x30\x2a\x2a\x48\xc6\xdb\x54\xfb\x43\x6d\x73\xae\x38\x8c\x4c\xec\xcc\x50\xc9\x7f\xa8\x7c\x80\x2a\xd6\xe0\x5a\x8e\xc9\x29\x5a\x6f\x32\x45\xeb\xcd\x35\xf1\xc3\x02\x5e\xed\xeb\xca\x0c\xd3\xdc\x70\x26\x40\x20\xd8\xc4\x42\x40\x71\x2f\xbf\x69\xeb\xc4\x60\xba\x68\x59\xb3\x4f\x2e\x53\x59\xab\xd2\xc5\x54\xb2\x79\xb8\xd5\xa7\x46\x3f\x7f\xd8\x27\x7e\x44\x49\x2b\x94\x87\xd2\xb9\x7d\x4c\x25\x10\xa6\x22\x71\xc8\x17\x75\xe6\xf1\xb1\x15\x3b\xf2\x01\x79\xf4\x22\xc8\xea\xe3\xd6\xc1\x2d\xf9\xc6\x0d\x69\x79\x4a\xef\xf5\x66\x6c\xef\x4e\x49\x9b\x0d\x49\x5e\xfa\x10\xf5\x06\x77\xb4\xa2\x10\x70\x18\x95\xe3\xd0\xb7\x90\xd6\x6e\x93\x57\xca\x90\x01\xf9\x59\xaa\x46\x72\x0c\xe5\x9c\x44\x31\x47\xf8\x95\xef\x5c\x6a\xc9\x15\xd5\x28\x69\x83\xcc\xe9\xb1\x83\x72\x28\xb2\xbd\x86\xeb\xfe\xe5\x98\x17\x26\xf8\x6b\x41\x44\xd5\xac\x20\xe5\xec\x96\x82\xea\x14\x18\xab\x39\xa9\xa0\x8c\x9f\xd9\x70\x10\x1b\x30\x36\x22\xf8\xd2\x3f\x5b\x06\xfd\xc2\xbb\xae\xbc\xe0\x9b\x94\x8c\x02\xb7\x8d\xf3\x64\x5b\xf1\xfa\xb0\x6b\xe2\xec\x39\xde\xad\xd4\x97\x9d\xc0\x32\xc1\x88\x1f\x0e\xe4\x8c\x79\x7b\x57\x0d\x48\x9c\xff\x2a\x37\x8d\xaf\x60\xfe\x47\x5d\x35\x8e\xd6\x7c\x3e\xc9\xa7\x27\xb4\xc9\x09\x75\x50\x90\x93\xa3\x90\x20\x9c\x7a\xc7\x89\x38\xec\xf7\xbc\xed\x5c\xdf\xb5\xf7\x04\xa2\xb5\x3a\x49\xc6\x0c\xcc\x18\xd9\xf3\x3b\xd6\xb2\x92\x2c\x8f\x26\xa3\xed\xa2\xc5\x54\x54\xe5\x82\xd0\xae\x6b\xab\xe5\xa1\x63\x53\x72\x27\xa5\xda\x5b\xf0\x8b\x7b\xfd\x6c\x5b\x95\x52\xd8\xc4\x84\x42\x90\x39\xe6\xb6\xa2\x64\xb1\xaa\xab\xfd\x62\x46\x7e\x64\x3a\x83\xbe\xc6\xc1\x5f\xf8\x6f\xd6\x05\x91\x67\xf3\xb6\xd2\x58\xf3\xe6\xad\xb2\x40\xae\x41\x55\x32\x33\xd9\x0d\x72\x91\x3d\xdf\x4b\x69\x74\xa6\xae\xdf\xdd\xbe\x3e\x92\xdb\x4a\xa0\x27\xdf\xb6\x32\x69\xbd\xdc\xd1\x28\x57\xb9\x05\xb9\x03\x20\xfb\x9a\x51\xf4\x83\xdf\x39\xfc\x4d\xe5\x99\x5e\xb1\x16\x20\x8c\x57\x54\xde\xd3\x26\x4b\x93\xb2\x0b\xe1\xf2\xa0\x6f\x26\xce\x11\xf3\xa9\xf9\xea\xec\xc5\xcc\x02\x8c\xdf\xd1\x23\xac\x18\x03\xaf\x1e\x42\xc9\x6f\xbe\xff\x83\x56\xc0\xca\x86\x61\xea\x88\xd2\x6f\xb0\x6b\x9c\x69\x82\x09\xca\x62\xea\x9f\x60\xd6\xb9\x78\xf1\xc9\x67\x1f\x61\xee\x99\xf3\xf3\xd1\x95\x3e\xba\xbc\xfc\xcc\xa2\x91\x57\x8d\x24\x97\xa4\x30\xe2\xf2\xe8\x1c\x6b\xf1\xa9\xfd\xd4\x3c\x89\x10\x0b\xac\x1f\x3e\x7e\x34\x9f\xa4\x7d\x6d\x7a\x0e\xbe\xe9\xdc\x39\x8e\xf1\xb9\x07\x07\x9b\x10\x74\x70\x92\xac\xf6\x6c\x3e\x25\xea\xff\xad\xfa\xa1\xc7\x4e\x31\x22\x63\xcb\xe3\x21\x32\xa2\xe7\xc5\xd0\xbb\x35\xfb\x9e\xd1\xb6\xc5\xdc\xc1\x8f\x6e\x15\xd1\xb5\xac\x5b\x6d\x33\xc1\x9f\x2f\x7d\x3c\xe3\x69\xe2\x37\x9b\xb9\x49\x7f\xf5\xc0\x22\x83\x1f\xd7\x95\xf5\xbd\x48\x4c\xd2\x0e\xdf\xe4\x03\x79\x4f\xe8\x87\x63\xe6\xad\xec\xde\x67\xc6\x53\xc6\x7a\x10\x22\xe5\xe9\x13\x01\x79\x9a\xb4\xaa\x04\x0e\xc6\xdf\x0f\x4c\x00\x5b\x3d\xff\xf0\xe3\x17\x1f\x7d\x72\xf1\xd1\xfc\xfc\x6e\x7b\x2c\x4a\x00\x20\x91\xab\x0b\x0b\xa5\x12\x17\x15\x7b\xb8\x54\xf0\xca\x85\x27\x7f\x86\xda\x35\x25\x7f\x90\x58\x40\xf8\x35\x5e\x24\xf7\x67\x77\x99\xa2\xe7\x5b\x9c\x66\x3d\x1d\x3c\x66\x75\x07\x8e\x9e\xc0\xcd\xf9\xa7\x95\x05\x1d\xdf\x13\xbe\x26\xe2\xd0\xc2\x55\x1c\x1a\x8d\x82\x0d\x77\x1e\xfd\xe1\x66\x27\x3f\xc1\x5c\x62\x54\x3f\xe5\xbd\xdf\x07\xa0\x67\x14\x06\x1f\x5e\xe7\x66\xe6\x80\x07\xaa\x64\x31\x98\xd7\xcc\xe4\xed\x3d\x65\x2c\x61\xb7\x1f\x05\x82\x40\xea\x28\x24\x41\x6a\xdf\x4d\xc9\x47\x43\x6f\xcd\x70\xfb\xbe\x0a\xa7\x26\xf0\x22\x06\x5e\xbd\xe2\xbb\x7d\xcd\xee\x25\x69\xdc\x1c\xf6\x53\xd2\x6d\x0f\x82\xe0\xfd\x2d\x97\xa6\xac\xd6\x6b\xd6\x32\x84\x8d\x3d\x3f\xf7\x3d\x2f\x6d\x40\xf5\x2c\x7f\x38\x53\x69\xc6\xd2\xc9\xb2\xbc\x29\xbb\x42\x57\xbc\xb1\xd3\x13\xca\x9a\x07\xdf\xa0\x62\xc0\xaa\xa3\xe2\x55\x4f\x11\xd7\x49\x1b\xa1\x3c\xea\xb7\x36\x65\x46\x65\x72\x48\xc4\x47\x23\x9c\xd7\xd4\x14\xf3\xcf\xc9\x60\x39\x39\xde\x13\x56\xf4\xf4\x8a\x91\x4a\x7d\x8c\xfa\x25\x08\xb4\x0c\x56\x25\xbb\x28\xdd\xb6\xb0\x83\x39\x6b\xc8\x07\xe4\xc3\xfc\xca\x8c\x2a\x8c\xb3\x4c\x15\x1d\xbf\x46\x23\x6b\x3f\x71\xa1\xac\x40\xff\xc7\x96\xed\x59\x53\x62\xc6\xa5\xbd\xfc\xa7\x4d\x3f\xb5\x85\x43\xde\xa9\x13\xcc\x04\xe1\x0d\x53\x29\x67\x6b\x7a\x64\xad\x64\xcf\x3a\x9f\x2b\xa8\x07\xa7\xa4\x64\x25\x78\x01\x96\x52\x5a\xd5\x0d\x23\x90\x00\x34\x6e\x53\xaa\x42\xf6\x38\x72\x00\xdd\xf0\xc5\x84\x2c\x19\xa9\x99\x10\x64\x55\x33\xd0\x28\xbf\x98\x10\x21\x05\xeb\x6a\x7d\x84\xe4\xb0\xc6\xab\x70\x6a\x5a\xfc\x70\x62\xde\x17\x72\x14\x97\xa1\x78\x31\x0b\xa5\x98\x42\x8d\x69\x1a\xfc\xac\x86\x96\x54\xce\x2a\x56\x85\x0e\xf1\x9e\x5e\x94\xd6\x77\xf4\x28\xfc\x8c\x95\x46\x6a\x35\xaf\x81\x7d\xcd\x28\x88\xea\x4a\xbf\x3a\x53\x0d\x82\x60\x5e\x41\x76\x56\x95\x78\x0b\x35\x04\xee\xb8\xa4\xf8\xe2\x68\x0a\xc4\x96\xb6\xea\x01\x02\xfa\x0d\xd7\xa5\x5d\xb5\x4a\x05\x2c\x16\x8e\x66\xa6\xc1\x70\x06\x35\xfd\xe6\x6e\x79\x91\x8f\x63\x0b\xae\xbd\x00\xcd\x59\xf6\xf2\x81\x15\xc1\xf5\xdf\xe1\x6c\xa6\xa1\xde\x1a\x7d\x2c\x4e\x2a\x19\x8b\xf3\x03\x22\x88\x51\xa6\x25\x48\x81\x3c\x04\xfa\xb7\x64\x2b\xa0\xd9\x4c\x51\xcc\x88\x11\x10\x47\x99\xc5\xee\xbb\x03\xad\x09\x2d\x4b\xf7\xc1\xfc\x8a\xb5\xb7\x98\xab\x9f\x92\x15\xed\x56\xdb\x82\xd6\xb5\x79\x9f\xe9\xa4\x73\x30\x7d\xde\xe2\xa3\xdb\xe4\xfd\x54\xe2\xc5\x91\x1f\xc8\x5d\x25\xb6\x98\xe6\x8d\x9b\xc3\x27\xeb\xe2\x50\x3b\x4e\x68\x83\xa5\xe3\x73\x91\x70\x74\x19\x9b\xe5\x3d\xca\x8d\x70\x8c\x92\x16\xe4\x3d\x83\xbe\x50\x3c\x00\xf2\xc1\xa9\x47\x97\xe5\x10\x4b\x03\xb2\x02\x0e\x8f\x87\x36\x48\x83\x5a\x68\xe4\xd6\xb4\x07\x91\x86\x2b\x36\x81\x30\x18\x6f\xd7\xc9\xc7\x34\x9c\x8f\xd1\x1e\xa3\x7e\x14\x1f\xb6\x1b\xc6\xf2\xf9\x99\xd5\x14\x95\xc8\x7d\x1e\x46\xfd\x4b\x87\x60\xf5\xe4\x76\x73\x5b\xd7\xe1\x32\x3a\x1a\x26\xa6\x40\x6d\x5e\x4d\xd4\x1d\x1b\x13\xe3\x35\xea\x27\xf2\x39\x3f\x27\xdf\x1d\x6e\xc2\x0c\xb5\xca\x6d\xd5\x49\x22\x6b\xf4\x45\xc0\xf0\x6f\x2d\x76\x0f\x2e\x84\x32\x6f\x03\xcb\xca\xbf\xb3\x87\x5e\xd9\xb1\x37\xbe\x77\xd7\x0d\x1a\x4a\xbc\x67\xc8\x48\x73\x09\x34\x15\x9b\x4c\xdc\xd5\x46\x4b\x48\x24\x92\xe9\x3c\x1b\x93\x69\xb2\x7c\x42\x86\x0f\x68\xd0\xa0\x41\x5d\xa7\x38\x5c\xdc\xeb\x88\x7e\xd2\x45\x52\x8c\xf3\x65\x92\x67\x0f\x54\x56\xcc\xe8\x51\x75\x9d\x8e\xf1\x9a\x19\xdd\x97\xc5\xbd\xcb\xf1\x2c\x59\x3d\x64\x5b\xb8\xae\xa3\x78\x8b\x42\xde\x1a\xe4\x14\x51\x93\xc3\xe7\xcc\x03\xf5\x72\xa7\x87\x96\xb8\xf1\x44\x85\xe5\x47\x13\x95\xd8\x8d\xec\x75\x44\x3f\xe9\x22\x8f\x24\xaa\xb8\xf2\x78\xa2\xea\xed\x38\x41\x54\x7d\x7d\x8d\x20\x2a\xb1\x8b\x89\x4a\xec\x46\x13\x95\x76\x7c\x1d\x22\xaa\xb0\xc9\x11\x44\xe5\x60\xb3\x9d\xca\x11\xb2\x74\xd4\x9f\x83\xc6\x5a\x5b\x3f\x08\x3f\x55\x0d\xbc\x19\xb8\xeb\x4a\xdc\xf7\x40\x89\x4d\x33\x8a\xa1\xff\xb0\x65\x82\x91\xf6\x50\x33\xc1\x3a\x81\x09\x98\x57\x7c\xc7\xdc\x40\x3f\x64\xea\xc0\xc3\x31\xd4\x1e\x61\x8a\x4c\x8c\xad\xd8\x41\x4f\x35\x5c\x13\x81\x86\x02\xb4\xc1\xca\x43\x02\x0d\xda\x55\xb3\x99\xc9\x6e\xc1\xdb\x1b\x04\x7f\x13\x50\xd3\x6d\x69\x43\xee\xd8\x7b\x25\xf8\x08\x61\x4e\x60\x9d\x31\xd8\x13\xf3\xc9\xcb\x05\xd9\xd3\x56\x85\x25\xcb\x32\xfc\xd0\x91\xaa\x9b\x2a\xc0\x85\x86\x77\x0e\x0e\x80\x99\xc3\x0c\x57\xc8\x6f\xe9\x04\xe2\x7e\xfc\x11\x4c\xeb\x1e\x92\x07\x25\x67\xf3\x7a\xcb\x2d\x0e\x0c\x38\xd4\x08\x64\x1a\x4e\x3e\xbd\x93\xe3\x7d\x62\x83\x03\xc3\xcd\x34\xe7\x04\xa5\x9c\x6a\x88\x3c\xb9\xf5\x70\x84\xf1\xaa\x3f\x24\x59\x4e\xa4\x74\x78\x33\x44\xa3\x1e\x43\x9d\x8e\x2d\x7b\xe2\x0a\x2a\xda\xce\x1a\x43\x9f\x52\xfd\x91\x43\x71\x43\x98\x7a\xac\xb9\x8f\x68\x2a\xbd\x77\xb1\x55\x7c\xd0\xc9\xc8\x18\x95\xbe\xde\x2d\x59\x29\x19\x2e\xe6\x1d\x03\xd1\xfe\xfb\x3d\x6b\xc8\xb7\x2b\xde\x54\xab\x99\x92\xa6\x6b\x06\xa9\xc1\x25\x6f\x6e\xc9\x1f\xbe\xfd\x01\x18\xe9\x8a\xef\x8f\xe8\x2c\xf3\x62\x7e\xf1\x11\xf9\x91\x1e\x97\x87\xf6\x38\xf3\x0c\x82\x07\xc1\x2a\x6c\x69\xc5\x77\xe7\x80\xc6\x10\xda\x9b\xbd\x17\x84\x6f\xb5\xc2\x40\xed\x8e\xde\x30\x01\xee\xbb\xf2\x2d\x29\x1f\xd0\x1d\x26\xe7\x47\x4f\xcd\x8a\xb7\xf2\xe1\x2d\xb9\x33\x28\x46\x5e\x37\x41\x26\xa1\x5e\x0b\x57\xe0\x23\x98\x88\x06\xd9\x55\x8d\x9b\xab\x55\x5f\xe1\x4b\x39\xc0\xf7\x3d\xe4\x17\xf8\x2d\xe5\x0d\x13\x64\x36\xc2\x44\xa3\xce\x6d\x69\x33\x65\xe9\xeb\x52\x76\x81\x2d\xb5\x55\xa3\x32\x21\x14\xb4\xfc\xdb\x41\x74\x57\x84\xdd\xd3\x15\x86\xfd\xfd\x17\x63\x7b\xb0\x34\x33\xbc\x41\x69\x4b\x9b\x15\x66\x36\x87\x8a\x06\x77\x25\xec\x07\x62\x7b\x1f\x7a\x5d\x53\x43\x3f\x6d\xbf\x09\x8c\x78\xb6\x19\x40\x7a\x92\x7e\x65\xcc\xa3\x49\xd8\x8f\xe2\x02\xe6\xf5\xc7\x43\x67\xad\xec\x72\x9b\xab\xa6\xb4\x26\x16\x22\x38\xa9\x3a\x52\x72\x06\x4a\x36\xe5\x71\xaa\x02\x7d\x8c\x6d\x6e\xc4\xe2\xea\x6d\x3d\x1b\xb1\xaf\x83\xdb\x35\xb1\x39\x63\x3d\xec\x1c\x54\xea\xeb\xac\x61\x23\xf3\x5c\x19\x68\xae\x5c\x8f\xaa\x3d\x3f\x63\x7c\x00\x75\x36\x54\x37\x91\x1e\x3e\x1d\xbe\x37\xdc\xd2\x66\xd2\x83\x1f\x3f\x66\x24\x3e\x84\xba\x8f\x8d\x36\x76\xd1\x94\xb7\x31\xfa\xca\x57\x82\x28\xc7\x90\x12\x80\x9e\xa5\x4c\xb8\xa3\x37\x8c\x80\xb6\x17\x22\x5b\x65\x19\xd7\x4e\x3d\x80\x2b\x9a\xc8\x36\xef\x41\xc2\x67\x67\x99\xcb\x49\x1f\xe2\x73\x79\x1d\x9c\xdc\x5a\xbc\x6e\x8f\x4b\xb1\x36\x96\x8a\xf4\x38\x02\x1a\xca\xc1\xc3\x29\xef\xbc\xb7\x45\xff\x89\xb0\xd4\x54\x02\xaf\x81\xea\xcb\xcd\x89\x47\xc7\x43\x86\x4b\x9f\x9c\x51\x84\x9f\x49\x1d\x60\x8d\xb1\x7f\x16\x8c\xfc\x45\xaf\xde\x5f\xe1\x86\xb4\x01\xb1\x1d\x27\x77\xbc\xbd\x21\x14\x66\x3b\xc2\xfb\xa6\x12\xe2\xc0\xc4\xf9\x8b\x4f\x5f\x7c\xf4\x09\x02\x2a\x98\xa6\x33\xc1\xb6\x83\xe9\x16\x33\x4b\x05\xa5\xe2\xa0\xdc\xde\x88\xa1\x53\x36\xce\xb4\xbc\xdc\x0c\xe1\xc9\x29\x7b\xb6\x96\x02\x4c\x1b\x8e\x90\x71\x90\x82\x95\x63\xd6\x57\x65\x05\xe0\x6a\xf3\x35\xd9\x0b\x76\x28\x79\xa1\xf5\xd6\x29\xe9\xc2\x5d\x97\x8c\x8c\x91\x70\xd6\x18\x58\x3f\x4b\x58\x61\x80\x88\xce\xf1\xaf\x73\x6b\x84\xf5\xf1\x77\xab\xc1\xfd\x32\x58\x5b\xa0\xa4\x33\x7c\xe7\x36\x2a\x5d\x87\xe6\xf5\xca\x49\xda\xdf\xa0\xfe\x24\xff\xa3\x6e\xce\x62\xfc\xcd\xa9\xc5\x82\xe2\xec\x91\x42\x93\xbe\x87\x92\xe9\x4a\xc7\x4b\x06\x8e\xee\x6c\x4c\xe1\x1e\x3f\xae\x54\x5c\xda\x29\x04\x1f\xb0\xa8\xde\xa2\x09\xd3\xc0\x50\xe1\xc7\xb3\xb0\x3c\xef\xfa\x86\xb7\x0c\xa7\x47\xce\x20\xef\xaf\xeb\x7d\xff\x7f\xe9\xea\x04\xba\xea\x27\x1e\x48\xb3\x46\xce\xc9\x3b\x0f\x7d\xe4\x03\xed\xbd\x09\x12\x26\x27\x3d\x7f\x99\xa3\x6f\xbb\x63\xf4\x06\x5c\xbe\x09\x25\x6b\x76\x47\xba\x6d\xd5\x6c\xd0\x38\x62\x4d\x3f\x3e\x3f\xd4\x76\xcb\x87\x54\x12\xe0\xe4\x2d\x9f\xd3\x6b\x06\x2d\xc6\x54\xeb\x82\x6f\xf4\x65\x1d\x1e\x12\xbb\xf3\x11\xc9\x31\x66\x83\x9b\xcd\x3a\x3f\x40\xc8\x50\xad\x45\xae\xeb\x91\xc9\x91\xaf\xe4\xeb\xa7\x63\xed\xae\x82\xa4\x3c\xc3\x83\x0d\xef\xd0\x8c\xf8\x92\x18\x9e\xdb\x51\x8a\x07\x0c\x3d\x01\x06\x9b\xdc\x4c\xae\x7b\x81\xf8\xc7\x8f\x2d\xcc\xaa\xf4\xe6\x67\xd9\x2b\xaf\xd7\xf1\x3b\x16\xca\x4b\x27\xbf\xf0\x1e\xfd\xd6\x72\x24\xa0\x68\x65\x46\xd1\xd1\xcf\x3e\x12\x47\x06\xfb\x93\xaf\xd5\xe9\x63\x2b\xa8\x00\xf2\x58\x0a\x46\x21\x8c\xe7\x27\x03\x58\x66\x68\x12\xe8\x8e\xf0\xa9\xae\xf9\x1d\x2b\x8b\xba\x12\x9d\xf7\x04\x40\xd6\x62\x0f\x11\x8c\x21\xc7\x81\x7e\x69\x06\x14\x0e\xee\x71\xdc\xe7\x9f\x8f\x96\xbd\xeb\x49\xdc\x55\xdd\x6a\x1b\x5d\x4e\x11\x01\xd9\x72\x96\x82\xf0\x37\xdf\x8a\xe5\x2b\xe5\xb0\x84\x12\x9a\x3e\xc8\xe8\xea\xae\xd3\xcb\x37\xc4\x96\x43\x99\x63\x54\x5f\x96\x7f\x06\x62\x85\x5b\x3b\x1b\x41\x40\xeb\xfa\xda\x49\x40\xf2\xf8\xe3\x90\x3d\x10\x6a\x18\x7d\x27\xc2\x03\x54\x08\x09\x1b\x31\x34\xcb\xf2\xec\x2d\xca\x78\xd3\xb1\x52\xf1\xfb\xe4\xc5\x24\x44\x24\x2d\xcb\xb3\x53\xb7\xe8\x71\xfd\xa5\xf7\x33\x29\xf8\xc5\x72\x62\x7f\xe9\x93\x5e\x14\xa9\x5b\xff\x17\xa4\x95\x34\xd6\x36\xfc\x13\xbc\x76\x66\x17\x97\x82\x30\x2a\x58\x51\x41\x4a\x09\xbb\xf8\xf2\xb3\x08\xf2\x7d\x8e\x63\x79\x6f\x83\x2d\x8f\x7f\xba\x11\x62\x66\xa3\xe0\xc6\x6a\xda\xb1\xff\x99\x26\xba\x62\xe4\x4b\xe4\x5f\x9e\xaf\xbf\x02\x1f\x01\xc7\x67\x0b\x20\x3e\x45\x0a\x0d\x5f\xf9\x08\xa3\x99\x9d\x6a\x6d\x0d\x40\x2f\xee\xb8\xe8\x20\x1b\x5a\x2d\x67\xba\x6e\x31\xdf\xbb\xd1\x89\xed\xdb\x6a\xc7\xda\x99\x52\x8d\x55\xfc\x7c\x66\x82\xa0\x12\x8e\x0e\x79\xec\x9a\x30\x80\x35\x3a\x9e\xe8\xf0\xe0\xb8\x0d\x5a\xe7\x91\xb4\xbb\xc4\x91\x9c\x3d\xc1\x91\x62\x92\x6f\x36\xd7\x6a\x22\xf3\xb1\x5f\x32\xcc\x81\x9c\xf2\x64\x49\xd4\xb0\x44\xe9\xbb\x5c\x26\x8a\x3a\xe9\x93\x7d\xd7\x17\xbf\x6c\xce\x03\xd3\x2f\x95\x57\x92\x39\xc9\x8f\xfd\x0c\x32\x5e\xfd\xe5\x26\xfa\xc5\xcf\x0b\x12\x6a\x5c\x74\xa9\xbc\x9a\xc5\x2f\x31\xec\x7d\x99\xac\xe6\xe5\x75\xe8\x7f\x45\x99\x8a\xfe\x5b\xc9\x9a\x02\x8d\x2a\xca\x35\xa7\xf4\x2a\xfa\xcd\x76\x25\xb5\xfb\x89\xf4\xc6\xa7\xe7\x62\xcb\x0d\x7e\x9a\x1b\x44\xf4\x12\xfc\x47\xa4\x5a\x1b\x18\x4b\x42\xd0\x29\x76\xe0\x3a\x72\xf0\x07\xf6\x0d\x6f\x55\xcc\x00\x59\xf1\x46\x54\xa2\x63\xcd\xea\x88\xac\x0c\xa1\x01\xf6\x35\xed\xe0\x2a\x3b\x57\x6c\x4f\x23\xdc\xe0\xb5\x7c\xd8\x43\xfa\x2c\xcf\x9d\x15\x1c\x8b\x95\xe3\x78\x43\x96\xb2\x4f\x4b\xbc\x64\x5b\x6d\xb6\x35\x58\xe6\x11\x2f\xa8\xe3\x4e\x7b\xe0\x67\x04\x73\x32\x69\x1f\xb1\x21\x50\x0a\xcb\xaf\x67\xa2\xab\xea\x9a\xac\x6a\x2e\x58\x39\x21\x9f\x63\xe9\x97\xa4\x65\x2b\x56\xdd\x82\x8b\xec\xea\x20\x9c\x26\xab\x86\x7c\xfb\x35\x6a\x96\xd1\x45\xc0\x84\x39\xf3\xa6\x84\x9b\x59\x4c\xc8\xd7\xe5\x86\xcd\x9c\x4a\xe3\x82\x8d\x95\xe5\xe2\xe2\xb3\x0f\x3f\xfb\x74\x16\xda\x1e\xd0\x08\xe7\x0b\x32\x59\xd7\x6a\x73\x1b\x7b\x96\xb2\xbf\x68\xcc\x1f\x8d\x34\x2d\xb9\xd9\x5f\xc1\x78\x05\xff\xfc\xf5\xeb\x67\x17\xaf\x9f\xfd\xd5\x04\x60\x25\x32\x85\x8c\xf4\x8e\x8b\x75\xbf\x21\x18\x68\x94\x1c\x37\x63\x0d\x53\x2d\x27\x91\x4f\xf3\xf2\x49\x58\x4b\xad\x87\x55\xdb\xfe\xce\x04\xc1\x6b\x2a\x43\xd4\x3e\xd8\xdd\x8b\x0b\xa5\xc4\x95\x44\xce\xee\xf7\xb4\x29\x7b\xf3\xbd\x18\xc0\x05\x80\x51\x55\x4c\x03\xfd\x4b\xd4\x85\x8b\x21\x0e\xe4\x9b\x6f\xb0\xe1\x62\xc7\x7f\xc2\x43\xd6\x9a\xf4\x30\x66\xe6\x31\x44\x2b\x38\xdc\x07\x09\x88\x72\xd7\xc3\x9b\xc0\x47\x41\x15\xd0\x39\x74\x7b\xaf\x72\xed\x82\xa9\xb7\x51\x41\x2f\xa6\xaf\xde\xb0\xb0\xc5\x54\x1c\x57\x3e\x78\x99\x06\x04\xd4\xe7\x60\x9a\xb9\x96\x3d\x6f\xd0\xe0\x8e\xdd\x8c\x99\xbd\xf2\x6a\x1e\x37\xfb\xa0\xf0\xe0\xec\x83\xf2\x03\xb3\xef\xf1\xd9\xce\xcd\xde\x71\xb0\xc6\xf4\xeb\x55\xcd\x8c\xbc\x19\x85\xbb\x7a\xaa\x27\x1b\x9a\x3a\x12\xd2\x6d\xbc\xa8\x08\xa1\x7e\x8e\x74\x93\x30\x0f\xbe\x09\x87\x92\xf6\xa7\x49\x7b\x32\xbd\x78\xc2\x28\x7a\x73\x2e\x25\xdc\x5a\x86\x63\xaa\xd3\x52\x06\x94\xcb\xca\x18\xa9\x6b\xd8\xab\xe1\x5d\xc2\xbf\x80\xd1\x3c\x39\xe3\xd0\x92\xde\xbb\x2a\x59\x36\x0d\x65\x33\x4c\x5a\xe5\x9c\xa9\x69\xb3\xf1\x12\xe5\xbb\x55\x6d\xc0\x17\xc2\x9d\x37\x9b\xb3\x77\x1e\xa0\xca\x9b\x49\x72\x48\xd1\x13\xd7\x18\x9d\xb0\x87\xc4\xad\x99\x6a\xe6\x2f\x25\xed\x68\x81\x02\xcc\x5f\x83\x36\x4d\x8b\xb4\xeb\xda\x33\xa7\xe0\x24\xc9\x9f\xc3\xe5\xea\xcb\x22\x85\xe4\xea\x21\x6c\x25\x1d\xcb\x2e\x46\x1d\x82\xe8\xcd\x06\x05\xe2\xa7\x95\xf7\xf3\x7d\xfe\xc4\x24\x5f\x5b\x8a\x92\xfd\xb7\x56\xf2\xe9\x64\x4b\x0e\x3d\x9c\x70\xc9\xfa\x9f\x4d\x50\xc6\x49\x8c\xd9\x4f\x82\x61\xf4\x99\xf7\x2d\xff\x02\x72\xbf\x8f\x7e\xff\xb8\x95\x06\x93\x32\xf9\x75\x42\x78\xae\xd3\xcc\xcc\x41\x3a\x98\x79\x90\x3d\x64\x7e\x9d\xc4\x85\xc8\x58\x81\x7b\x88\x0b\x53\x07\xf8\xf2\xe2\x63\x88\xec\x94\xdd\x4f\xef\xbf\xca\xa7\xe8\x72\x5b\xc7\xc8\xfc\x25\x9c\x4a\x63\x6a\xee\xd5\xfe\xb8\xcd\x59\x35\x8f\x87\x70\xad\x73\x6c\xf4\x5a\x7b\xe7\x24\x4f\x06\x7d\x9f\x62\xb4\xc4\x3f\xd1\x66\x63\xef\xf7\x57\xdd\xb1\x66\xa4\x95\xbf\xe9\x18\x6e\x13\x5f\x4d\x57\x2d\x17\x42\x6b\x99\xc4\x8c\xfc\x0f\xd6\x94\xbc\xb5\x39\x53\x20\xd2\x04\xfd\x68\xc1\x05\x08\x5a\x34\xe1\xab\x2a\x74\x63\x09\xbe\x86\xac\x9c\x91\x2f\x04\x11\x87\xd5\x76\xaa\xfc\x0a\x01\x5b\x93\x63\x54\x77\xa9\xf3\xaf\xac\x0d\xcc\x0c\xc7\xc8\x42\x17\xaf\x4e\xc8\x67\xdc\xbe\x65\x6b\xd9\x9e\x8d\x88\x0f\xac\x61\x72\x2a\x0f\x7d\x97\x3b\x2d\x4b\xc7\x36\xd4\x6c\x58\xd1\x6d\x0f\xbb\xa5\xcd\x87\x99\xf8\x16\xde\xa9\xa1\xe6\xda\x90\x2b\x06\xf6\x7e\xc7\xf0\x2e\xc5\xd4\x42\x4e\x5a\x90\xe1\xc4\x0a\xe3\xd4\x12\x9e\x82\xc1\xd8\xf5\xfe\xe8\x7b\x62\x61\x04\xd0\x92\x11\x44\x2b\x54\xfb\x69\xf0\x5b\x4d\xa0\x50\xc7\x11\xc3\x84\x36\x84\xad\xd7\x6c\xd5\xcd\x4c\x8b\xdf\x71\x97\xad\x4c\x94\xd2\xc0\xee\x12\x5d\xad\x98\xd0\xc0\x61\x33\xfb\xc8\xbf\x63\xcb\x9b\xaa\x2b\x44\x0d\x90\xca\xb0\x86\xe4\x21\x29\xb2\xf4\xad\xb2\x03\x22\x82\x4f\x1f\xa7\x30\xdc\xc2\x4f\x6d\x52\x38\x6d\xa9\xff\x3c\xba\x49\xf3\x30\x75\x5e\x69\x05\x3f\x38\x6c\xd6\x26\x9b\x09\xca\x27\x57\x2b\xe9\x35\xe3\x8e\xc3\xb5\x71\x85\xcc\x2e\xa6\xeb\x44\xc2\xae\xf0\x14\xb4\x74\x75\xa3\x4a\x3b\x0a\xf6\xb8\x29\xe5\x32\x24\xe9\xe3\x47\x18\xb9\x89\xfa\x1a\xc1\x11\xdd\xe6\x42\x8e\x98\x1e\xbf\x97\xbf\x7e\xe0\x92\x8c\xeb\x05\x39\x68\xfa\x6e\x4b\xbf\x72\xa8\x4f\x4b\xe6\x3a\x1d\xb0\xb1\x64\x0e\x73\x9c\x56\xe6\x84\x45\x0b\x12\xc3\x90\x88\xfa\x7c\x6a\x6a\x0f\x0d\xaa\x1d\x61\x7b\xfb\xc9\x0a\x08\x60\x04\x59\x39\x84\x72\x9d\x55\x41\x00\x79\x6c\x8f\xff\xae\x0a\x04\xae\x98\x6e\x4b\xc6\x1d\xb3\x5f\xe8\x77\xab\x64\x7c\x92\x63\x15\xc8\x38\x7a\xc1\x36\x1f\x49\x2f\xaa\x72\xc6\x39\x3f\x66\x5c\x3f\xd3\xc9\xfe\xbf\xa7\xee\x17\x3d\x75\xce\x2e\xff\x83\x0f\xda\x2f\x75\xc0\x40\x6f\x5f\xb5\x6c\xcd\xef\xcd\x05\xf0\xef\xff\x3c\xa7\x4e\xfc\xe3\x2e\x52\x14\xfa\xbe\x2e\x37\x2c\xb8\x09\xd3\xe1\x61\xc3\x82\x25\x32\x4f\xde\xde\x28\x3d\x0c\x80\xb0\xea\xc7\x33\x2b\x9d\x65\x21\x95\x50\x6f\xe9\x59\x2a\xf5\xe8\x09\x3d\x3e\xbe\xcb\xff\xcb\x79\x7e\x59\xce\x23\xfe\xf5\x58\x4e\xdc\xd8\xd0\x45\xee\xaa\x53\xfa\x8e\xa7\xeb\xce\xfe\x76\xd8\xc8\xba\xaa\xeb\x42\x1e\x82\x76\x58\x31\x99\x64\xa1\x4f\xe3\x86\x89\xc1\x1c\x20\x87\x6d\x12\x3f\xff\xe2\x72\x7f\x8f\x49\xdf\xda\x65\xd5\xb5\xb4\xd5\x02\xd8\x2f\x33\xe6\xd8\xbb\xa6\xf7\xb5\x33\x62\x98\xb0\xd5\x71\x80\x93\x67\x62\x1e\x23\x01\x5b\xf2\x55\x86\xbc\xa4\xad\x3a\x2d\xba\xbd\xa5\x61\x66\x44\x86\x71\x23\x13\x6f\x71\x48\xb1\x76\x39\xe9\xf1\x34\x4d\x69\x9f\xa7\x69\x27\xa1\x53\xb9\xa7\x09\xb6\xb7\x31\xed\x46\x49\xf5\x5f\xd5\xea\x06\x20\xf6\x01\x08\xae\xa1\xb7\xd5\x06\x71\x27\x56\x7c\xb7\xe7\x0d\x6b\x8c\xcf\x93\x60\x10\x91\x26\x50\xab\x05\xda\x8d\x19\x5c\x6a\x98\x01\x51\x65\xff\x6d\xe8\xed\xcb\x85\x98\x92\xc5\xe7\x87\xfa\xe5\x42\x00\xfc\xf9\xe7\x5c\xfe\x13\x55\x49\x0d\xbd\x3d\x25\x53\x8d\x6f\x9a\x9b\xe7\xa3\xd9\xea\x4a\x74\x05\x8c\xcd\xdc\x0e\x6f\x74\x87\x4e\x8a\x83\xde\x64\x8b\xba\xa8\xab\x0a\x8d\x7e\xbb\xbf\x7e\x6a\x76\xde\xe1\x14\xad\xf9\xfc\xa6\xd6\xd4\xf4\x1b\x7d\xfa\x41\x7d\x47\xc0\xdb\x82\x35\xc2\x04\xa1\xdb\x6c\xa6\xa1\x11\xdf\x4c\xe9\xd4\xcc\xa5\xa9\xa3\x63\xb5\x9f\xe8\x19\x4d\x97\x16\xe4\x5b\x76\xd4\xd1\xa5\xf0\x52\x07\x1a\xa3\xac\xfe\x9a\x54\xe6\x87\x1f\xdd\x30\xce\x60\x4b\x23\x82\x28\xd2\x4d\x9f\x7c\x5f\x0e\x8c\x71\xf8\x3d\xec\x66\x09\x0e\x5b\xf2\x91\xee\x86\x08\xc2\x4d\xaa\x24\xb4\xde\xd6\xae\x43\x47\x97\x0a\x84\x60\xbf\xaf\x9a\x8d\xd6\xf2\x2a\x9f\x07\xbe\x06\x78\xff\x8a\x1f\xc4\x39\x24\x5c\x32\x15\x75\xe3\x95\xe0\xb5\xa6\x63\xf8\xa7\xe3\xd7\xeb\x5b\x4f\xcd\x34\xdc\x14\xbf\xb1\xfd\xd4\xb2\xd3\x88\x0a\xc7\xd2\xe1\xb8\x9d\x1a\x96\x6d\x3c\x2f\x55\xdd\xa5\x9b\x85\x18\x7e\xac\x3a\xb6\x53\x69\x5a\x42\xea\x4a\x4f\x7d\x5c\xf8\x77\xb2\x4e\x2e\xe6\x3b\x5d\x38\x13\xde\x9e\x4a\x7f\x4f\x88\xce\x24\x67\x92\x69\x63\x75\x4d\x1c\x40\x28\xf8\x53\x2a\x77\x49\xdf\xb1\xb1\xae\x34\x1a\x3f\x3d\x40\xca\x42\x8c\x03\x04\x94\x35\xe0\x06\x94\x6c\x69\x5b\x12\x26\x5f\x6f\x16\xa6\x1c\x53\xea\x9c\x9e\x21\x04\x31\xbb\xaa\xba\xf6\x59\xcc\x5e\xfe\xa2\x82\x74\xc2\xcd\x73\xbd\x2f\xdd\x1c\xcc\x9e\xb6\x38\x2f\x91\x99\xe6\xfb\xe2\xfe\x92\x44\x05\xb4\xf4\xb2\x9f\x9a\xb0\xe5\x13\xc9\x29\xae\x64\x4d\xf4\xfe\x4a\xfd\x27\xe4\xcb\xa9\x58\x49\x6e\x69\x5b\x51\xc0\xb6\x77\x96\x4d\x4a\xbb\x26\xbf\x85\x1e\xa6\x7f\x22\xf4\xa0\x93\x19\x08\x32\x88\xa3\x6f\xdc\x8b\xf7\x6f\x66\x08\xe3\x3b\x2a\x96\x54\x54\xc2\xee\x0d\xfc\xb6\x69\xf9\x9d\x4d\xa3\x37\xd0\xb5\xbe\x89\x96\x90\xa4\xa2\x33\x57\x92\x72\x31\x93\xbf\xe0\xa7\x3d\x55\x58\x6d\x20\x01\x4d\x09\x6c\x1a\xe4\x4d\x01\x57\xc4\x85\xda\xd1\x05\xcc\xa7\xa3\x4b\x9d\x07\xc1\xcc\x46\xfe\x26\x1b\xe9\xf5\x44\x83\x92\xfe\x13\x35\x21\x86\xb8\x99\x36\xbe\xc2\x6e\xec\xb0\xbf\xa3\xb7\x90\xf0\xcf\xfc\x93\x2c\x5b\x0d\x55\xad\x7e\x68\xe8\xad\xfb\x27\x8a\x01\xf6\x6f\x95\xd8\x52\x39\xba\x8b\x3d\x6f\x84\x1c\x4f\x13\x35\xac\xed\xd5\x5e\x63\x5b\xb6\xc3\xb0\xa6\x60\x34\x0a\x45\x8f\xcb\xb6\xa5\x88\xd8\xd1\xae\x5a\xa9\x46\xd1\xd7\x0e\x33\xcc\xdc\x31\xa2\x5c\xf6\x3a\x4e\x56\x2d\x93\x12\xcb\xfa\x50\xd7\xc8\x62\xa6\x04\xac\x8e\x16\x7d\x1b\xbd\x52\x55\x33\x40\xbc\xe0\xc2\x69\x24\x48\x93\xee\xf0\x49\x59\x43\x5c\x94\xf0\x12\xf3\x42\xc0\x7d\xb9\x6c\x19\xbd\xc1\x40\x63\x5e\xd7\x74\x0f\x1e\xbd\x6a\xe7\xfb\x50\x8b\xa3\xfc\x54\x00\x51\x54\x2c\x59\x77\xc7\x58\x03\x5d\xc2\x2f\x80\xed\x00\xfb\x87\x4b\x54\xf3\x0d\x8f\x04\xd1\x25\x6d\x03\x31\xd4\xfd\xc5\x41\x0f\xff\x92\xad\xe8\x41\x30\x98\xa1\x8e\x92\xa9\x18\xc0\x88\x37\xef\x75\xda\x02\x2e\x57\xf7\x8e\x01\x1c\x38\xda\x4e\x4b\xb6\xaa\x29\xe2\xd0\xc8\xca\x55\x2b\x74\xe6\x84\x35\xbb\x73\xdb\x11\x1c\xd5\x55\x9a\xf4\x1b\x26\x3a\x56\xea\x94\xb1\x2a\x55\xa9\x76\x63\x06\xa5\xd5\xaf\x64\x51\x5a\x35\x52\x8c\x91\xcb\xee\x34\xd6\x93\x6a\x21\x25\xfd\xe7\xd7\x7a\x70\xb5\xbd\xd8\x14\x3d\x9e\xa9\xff\x67\xb1\xae\x0f\x95\x11\x4c\x74\x1e\xc1\xfc\xf0\x13\x9e\x50\x40\x2b\x20\x32\x4f\xc9\x73\x5b\x71\x47\xef\x95\xac\x08\xde\x51\xf1\xef\xc2\x49\x1d\x60\x3e\xbf\xf3\x60\x9b\x2b\xaa\x66\x5d\xdd\x9f\x0d\x76\x20\x26\x6f\x1c\xbd\xd7\xb8\x29\xa4\x62\x61\x42\xb6\x02\x3f\xfe\x59\x28\xec\x78\xf8\x79\x2a\xb7\xf9\x6f\x6c\xd5\x4d\xe5\xab\x4e\x54\x9d\x64\x1f\x3b\xe6\x1d\xcb\x02\xe9\x7a\x20\x96\xc5\xf7\xe6\x74\x6b\x5a\x9a\x4f\x7b\x72\xf6\x94\x0d\xf4\xc1\x89\x13\x93\xf6\xdd\xf4\x9a\x0c\xe2\x49\x3c\x67\x17\xd7\x99\x24\x8d\xab\xfd\xc4\x97\x5d\xb4\x1b\x8a\xa7\xbb\xde\xa2\x8d\xf9\xa2\x1f\xea\x67\x1a\x86\x4c\xa5\x52\x20\x0b\xb9\x17\x0b\x84\xfc\x94\xdf\x10\x75\x4a\x21\xa1\x2f\xcc\x0d\xbc\x98\x78\x1b\x37\xf4\x30\x8f\xf3\xf5\x49\x66\x61\xb3\x9f\x91\x85\x5a\x9f\x85\x64\x30\x1b\x95\x2c\x71\xa1\x9a\x5f\x08\x9d\xef\xea\x69\x6f\xfa\xa4\x90\x17\xf8\xbf\xcf\x03\xb7\xf8\x5c\xca\xcc\x48\x7a\xb6\xb7\x09\x5e\x64\x86\x33\x71\xda\x0d\xec\x94\xbe\x6e\x5d\x09\x4b\xae\x6a\x02\xfd\x7e\xf8\x34\x04\x4a\x88\xec\x49\x88\xcb\xd9\x71\x25\xef\x78\x97\x90\x1c\xa7\xa0\xd6\x96\x75\x6e\x3c\xbc\xad\x55\x26\x4c\xbe\xd6\x94\xa7\xf8\xad\x40\x98\xc5\x3f\x7a\x49\xf5\x74\x75\x46\xbe\xd4\x4e\xac\xe4\x3f\xe9\x2d\x7d\xb5\x6a\xab\x7d\x47\xf6\xf5\x61\x53\x21\x86\x39\xd8\xaf\x59\x63\x2a\x00\x73\xc1\x9c\xc1\xf8\xbe\xd8\x6c\x6a\x06\x32\x5a\xd0\x2d\x5e\x99\x68\x0b\x90\x03\x53\x69\xed\x3c\xa4\xf5\x9a\xdd\x2f\xf9\x3d\x69\xf9\x1d\xe1\x6d\xc5\x9a\x0e\xb1\xd3\xc9\x9f\x74\xae\x11\x59\x5a\x9f\x87\xe0\xde\x59\xa0\x00\xd2\xf8\xd4\x4b\xf0\x49\x39\xb3\x1b\x6b\x66\x6a\x33\x5a\x2a\xb9\xd5\xf8\x44\x45\x82\xab\x8a\xc5\x51\xc9\x3d\x50\x20\x62\x90\x48\x01\x13\x9f\x48\x89\x48\xcd\x57\x4c\x75\x46\x3d\x7d\xef\xc2\x4d\x28\x48\xd5\x09\x56\xaf\x55\x6b\x06\x62\xd8\x62\xde\xcf\xc8\x57\x54\x5e\xcb\x80\x20\x6f\xc1\x87\x4b\xd6\xa0\x1e\x0f\xc4\x84\x43\x57\xd5\x95\xbc\x0e\x66\x79\x79\x46\xfb\xb4\x7d\x99\xc9\x8b\xaa\xf6\x05\x04\xe5\xaa\x91\xe3\xb2\x9b\x69\x52\xa0\xea\x53\x00\xdb\xd9\x86\x98\xd6\xfe\xd7\x84\xb8\x13\x7e\x19\x64\xe2\xba\x42\x1f\x1b\xbf\xb8\x1e\x76\x16\x93\x8b\xdb\xe2\x73\x37\x4c\x74\x2c\x8f\x8d\xe7\x97\x3a\xa0\x1a\x1a\xd1\x54\xcf\xeb\xd3\x9d\x54\x52\x73\xf4\xd4\xeb\x46\x63\x78\x42\x86\x10\xc1\xf6\xb4\x95\xb2\xb9\x4e\x10\x22\x38\x59\xf3\xfa\x06\x1c\x0e\x03\x8a\x82\xb4\x31\xa8\x1a\x6e\x50\x5e\xaf\x56\xea\xd5\xc0\x5b\x02\x91\x45\x18\xda\x40\x85\xca\x42\x33\x8b\x08\x02\xe0\x22\xc6\x06\xbe\xce\x2e\xd9\xce\xf3\x35\xb4\xbf\xf4\x84\x5f\xc6\x00\x46\x31\x7c\x91\x3c\xb1\xf8\x5f\x2e\x46\xd1\x9b\xe0\x76\x2c\xc4\xaa\xe5\xfa\xc9\x2c\xe5\x2f\x63\xe4\x8b\xca\x14\xf6\xb3\xe7\x9a\x5d\x1c\x4d\xdc\x96\x5e\xfc\xdf\xb2\x86\xc1\x92\x0b\xd6\x4a\x09\x59\x5f\xd1\xb2\x41\xe4\x10\xc5\xfb\x0b\x8f\x43\xab\x9c\x11\xf8\x3e\x69\xd6\xd5\xe6\xd0\xaa\xcc\x13\xf2\x30\xb6\x8c\x1c\xf9\xa1\xb5\x6c\x13\x8f\xa4\x70\x16\xdf\x0d\x9e\x8a\xc4\x58\x79\x96\x77\x74\x5f\xdc\xb0\xa3\x38\x7b\xbe\x69\xab\xb2\xb0\x1f\x85\x21\xac\xe7\x0d\xbb\xef\xae\x88\x23\xaf\xca\x1f\x02\x71\x35\xaa\xad\x2e\xd4\xe7\x20\xdb\x7a\xb5\x95\xb4\x2b\x1b\xc9\x54\x54\xfa\xc4\x77\x1e\xb0\xf6\x9b\x84\xb5\x77\xc7\xca\x8a\x3a\xf5\x0a\x79\xc3\xbb\x63\x9a\xb8\xa0\x7f\x8e\x90\xec\xaf\xf7\x3b\x0f\x4e\x95\x37\x6e\x95\xac\xa8\xe1\x7f\x74\x05\x0e\x03\x10\x68\xff\x78\x19\xbe\x48\xe2\x9f\xfd\x97\x49\x56\xb8\xef\x1b\x77\xae\x77\xb5\xe3\x92\x39\x3e\xf2\xc9\x12\x0f\x37\xf5\x70\xc9\x77\xe0\x3d\x59\x9e\x3a\x37\x83\x3d\xe4\xfd\xd3\x99\x71\x9e\x3a\x0e\x7b\x24\x38\x8f\x2a\xe0\xd2\xc6\x30\x8a\x16\x92\x6c\x3b\x8f\xd1\xe4\xb3\xd3\x4b\x52\x6d\xcb\x45\x62\xb5\xd7\x81\x23\x4c\xb7\x10\x44\xe4\x96\x48\x0b\xa7\x86\xc8\xf2\xb9\x5e\xa3\xbd\x4e\xc8\xca\x19\x42\x76\x79\x58\xc2\xdc\x95\xa3\xf1\x91\xd5\xde\x64\x68\x51\x09\x44\x0d\x13\x9d\xd6\xb1\xc0\xe6\x8b\xa9\xc9\xc0\x6c\x35\x15\x90\xac\x4a\xf2\x77\xb8\x99\xf6\x87\x76\xcf\x05\x13\xe9\xf3\x8c\x0d\xf6\x9e\x64\x47\xee\x8b\x36\xf9\xe7\x3a\xae\xc9\x61\xfd\xcb\x1f\xd4\xa1\x59\xe5\xf7\x3f\x77\xbb\xea\xff\xd8\x90\x26\x95\x46\xfa\x7a\xa0\x21\x5f\x2a\xd7\xff\xf1\x5e\xb4\xe4\xdf\xaa\xdd\x9e\xb7\x1d\x55\xb2\x59\x0c\x3a\x03\x4a\x40\xa4\x3a\x90\x9a\x8a\x86\x17\xa6\x8e\x7f\xbc\x00\xbb\x90\x36\x1b\x79\x1f\xab\x27\x00\x2a\x94\xe5\x2d\x4f\x96\x4a\x35\xc7\xd7\x84\x42\x08\xf3\x9c\x2c\x0f\x9b\x88\x08\xd5\xbb\xc1\x51\xad\x67\xe7\xe7\x09\xd2\xd1\xf4\x1c\x03\x47\xc8\x0d\x7b\x95\x3e\x5a\xbd\xeb\xc6\xad\xb8\x88\x56\x90\x62\x10\xf5\x6a\xfa\x79\x82\x92\x1f\x86\xf8\xf3\x96\x94\xb4\xbd\x71\x04\x2b\xfd\xc4\xfb\x8d\xfc\x59\xf2\x05\x41\xe8\x86\x56\x0d\xa0\xae\x61\x25\x5b\xd8\x0a\x26\xf8\xc5\x18\x72\x02\x75\x92\x67\x3b\x31\xc5\x95\xde\xc6\x87\xf9\x1d\x32\xa6\xf6\x34\x84\x35\x02\x5b\xa6\x67\xeb\x09\xb8\x7a\x82\xc3\x26\x9b\x0f\x81\x88\x87\xc6\x98\x69\x26\x1e\x9f\x47\x2a\x29\x7b\x6b\xa6\xa5\x8c\xd5\xf5\x4d\x60\xc1\x8d\x2c\x59\x8a\x07\x6a\x8b\x46\xe2\x8b\x31\x88\xc9\xaa\xd1\x8f\xa1\xb3\x5e\x72\x70\x09\x7b\x58\x6a\x1f\x82\xf3\xd0\xbb\xf0\x69\x8b\xab\x2d\x17\x3c\xb3\x62\x8b\x6b\xf6\xed\x32\x84\x95\x97\xec\x06\x90\xf2\xb4\xe3\x61\xd8\x85\x13\x42\x3b\x38\x27\x7a\xda\x52\x3e\x91\xfe\x12\x1b\x93\xc5\xbf\xfe\x11\x30\x42\xc2\xf3\x1f\xf0\x0a\x7b\xfc\xe1\xc3\xe8\xd3\x2f\x4b\xbf\x8d\xc3\xef\xb4\xf3\x33\x9c\x7d\x68\xfd\xc9\x4b\x0f\xad\xbc\x8d\x93\x0f\x0d\xfd\x93\x1e\x7c\x18\xdb\x5b\x39\xf7\xde\xa2\xe7\x8f\x3d\x14\xfb\xd9\x4f\xbd\xd7\xcb\x23\x0f\x7d\x34\x21\x7a\xd2\x2a\x3e\x8d\xee\x46\x9e\x78\xb0\x5c\xdb\xcc\x39\xa8\x5e\xb6\x50\x67\xb4\x2d\x1f\x63\xb2\x8d\xad\x0e\x3a\x23\x8e\x52\x0b\x61\x78\xc0\x38\x28\x9f\xfd\xa1\xae\xcf\x5f\xbc\xf8\xe4\xa3\xf9\x3b\x00\xad\xb0\xe2\x3b\xf9\x96\x28\x3e\x9c\x5f\x7e\xfa\xf1\xa7\x17\xf3\x8f\xfd\x08\x7d\xda\x96\xae\x12\xe7\x8e\xb7\xa5\x7a\x30\x80\x9c\x5b\xc8\x1f\xb2\x81\xec\xb2\xb2\x8e\x60\x77\x3e\xd7\x95\xac\xae\x3d\xe1\xee\x83\x08\x77\xa8\x94\x0a\x6d\x77\x3e\x8c\x88\x69\x77\x4a\xfb\xca\xc2\x97\x64\x9b\x71\x6d\x9e\x5f\x27\x22\x1c\x3c\x93\xc9\x4b\x32\x03\x7b\x0c\xa6\x8b\xf2\xb1\x35\xc0\x72\xe1\xc7\x5a\x07\xde\x7e\xf6\xa3\x49\x01\xed\x64\x96\x0a\x61\xa4\x3b\xbe\xb7\xfb\x9b\xcb\x42\xee\x7a\xd7\xc1\x94\x21\xc4\x3d\x1d\xa9\xe0\xb8\xf7\x3a\xc9\xc8\xa2\x7e\x71\xb4\xc3\x5d\xab\x72\x27\xf4\xee\x79\x6e\x1e\xe0\x65\xab\xa3\x59\xaa\xee\x28\x5f\x08\xdd\x56\xbb\x48\xe9\xe0\x6b\x72\xb6\xc0\x73\xe3\x2d\xfd\x62\x02\x96\xfc\xdd\xc1\x18\xec\xe5\x13\x83\x12\x9c\x92\xa9\xab\x33\xce\x68\xab\x4a\xc9\x0f\xcb\x9a\x79\x99\xc2\xe5\xc3\x10\x69\x9c\x96\x00\x40\xef\xf4\x32\x8d\xb7\xfc\x03\x55\x7c\xcd\x79\x14\x77\x9b\x4a\x8b\x3b\x53\x74\x58\x1e\xb1\x2c\x64\x3a\x07\x93\xce\xc2\xb5\x8c\x2c\xe0\xa1\x51\xb2\xd5\x0d\xa6\xe1\x82\xce\x1c\xb7\x03\xb9\x00\xa0\x0c\xc6\x3c\x5c\xe4\xb0\xb7\xf9\xc8\x77\x87\xd5\x56\xf9\x54\x50\x21\x39\x0b\x3c\x12\x95\xe9\x04\x1d\x21\xe5\x58\x75\x4e\xf5\x6a\xd3\xa0\xfb\x03\x00\x3c\xc2\x1e\xce\x34\xa7\x09\xdc\x9b\xfc\x78\x1d\x30\x7e\x6c\x99\xd2\x6a\xcb\x07\xb3\x7c\xc8\x21\x2e\x95\x2a\xfd\x8a\xb1\xab\xd1\x2c\xe8\xd3\x4f\x2f\x2f\xc3\xcc\x5e\x17\xfb\xfb\x10\x01\x44\xae\x9f\x93\xe6\xca\xc1\x53\x90\x5f\x34\x23\x70\x16\xbb\xab\x3a\x0d\x1a\x14\x18\x54\xbd\xc6\x8e\x7e\x2d\x71\x58\xc6\x15\x95\x4b\xa0\x57\xcd\x86\x7f\xe4\x11\x83\x60\x18\xec\xbe\x73\xcf\xd9\xc3\x70\x15\x2b\x44\xf9\x97\xd4\x09\x3e\xd1\x9a\x3e\x13\x9e\xc1\x3a\x60\x2b\x5a\xd0\xc0\x7b\xf9\x7b\x00\xa3\xa3\x35\x74\x06\x78\x79\x74\xef\xdf\x61\xfa\xb0\x3c\xe4\xb7\xea\x98\xea\x28\x99\xa2\x1c\x1d\x2a\x7d\xc4\x33\xaf\x20\xa4\x2e\xdf\x7e\xf7\x32\xde\x7b\xba\x1f\x00\x52\xd1\xa5\x3c\x14\x95\x80\x1c\xc6\x5e\x35\x0a\x23\x21\x66\xd8\xbd\x37\x50\x82\x21\x92\xfc\x97\x79\x08\xa7\x11\x33\x9b\x13\x96\xfb\xad\x2c\x96\xc2\x1a\x3b\x7d\xa5\x42\xd2\xef\x41\x1e\x99\x93\x47\x2c\x56\xc6\x33\xf6\x77\x48\x9a\x0d\xbd\x4d\xd2\xac\xe3\x8a\xef\xdf\xfd\xfe\x29\xbf\xcf\x9e\xf2\x22\x62\x22\xc1\x01\xcb\x36\x14\x50\x5f\x70\xf6\xd5\xf0\x1c\x37\xde\xd3\xc6\xd7\xdb\xb9\xc9\xc5\x24\xef\x11\xe0\xdf\xba\xdb\x6a\xb7\x29\x74\xe6\xbe\xc7\xa0\x3c\x05\xbe\x2a\x8e\xc4\x14\x10\xaa\xd3\x91\x93\x85\xf8\xf4\xd3\x33\xf1\x97\xad\xda\x6d\xa6\xee\x5c\x3a\xbe\xf7\xfe\x56\x2c\xc4\xfa\x27\x88\x6d\x5b\x35\x37\x9a\xf9\x7c\xc3\x5b\xf2\xed\xd7\x57\x27\xc0\x90\x7d\xf6\xe1\x67\x1f\x87\xd8\x2f\xc8\xc6\xc0\xad\xa2\x34\xfa\xce\x3b\xf4\xae\xd0\x7e\x18\xe0\x48\xb2\xad\x04\x0a\x81\xac\xe9\xea\x23\xa1\xfb\x7d\x0d\x5e\x8a\xe0\x7b\x20\x58\xbd\xbe\x22\xa2\x6b\x59\xb7\xda\x0e\x4d\x32\x9d\x61\x74\xac\x34\xd8\xd3\xb6\xbb\x60\x4f\x90\xf8\x9c\xb4\x36\x92\xe6\xa4\x64\x63\xfb\x94\x7f\xe9\x7c\x12\xe6\x49\x94\xb9\xad\x65\xd9\x02\xbf\x78\x9e\x87\x7d\x06\x2d\xb1\x9b\x0c\x3a\x59\x5a\xeb\x96\x63\xf6\x48\x1e\xb9\x70\x04\xe9\x23\xe7\x97\x52\xaf\x7e\x77\x76\x68\xe8\x91\xd4\x70\xd8\x08\xf2\xce\x47\x49\xa2\xdb\x6f\xab\xba\xda\xdf\xd1\xba\xe3\xcd\xf9\x5a\x15\x7e\x47\xfd\xa3\xf8\x48\xb7\xa4\x65\xb5\x39\x51\x5e\x36\xa9\x50\xf0\xf4\xd8\x33\xb7\xf0\xf7\x6e\xfe\x6b\x75\x0d\x07\x15\x5c\xf9\x21\x6e\xf7\x4d\x92\x1b\xc3\xe6\xa3\x30\xeb\x73\x63\xe7\x01\x85\x79\xc5\x43\xd1\x1d\xfc\x92\x85\x76\xb4\xc5\x37\xc0\x42\x3b\xdc\x2e\x9c\x46\x16\xaa\x8d\x8e\xeb\xcd\xf6\x1d\x71\x5f\x8e\x20\x32\xcc\xe5\xfb\x8f\xa2\xb2\xb7\x31\xe1\xde\x29\x47\x93\xfe\x47\xd1\x9e\x7b\x1b\xe8\x4f\x1f\x84\x43\x49\xbe\xaf\xbd\x17\x68\xf8\xc1\x51\xf0\xc9\x1b\x9e\x36\x65\xcd\xe2\x1c\xf5\xfa\x95\x6a\x71\xb0\x75\x11\xa7\xeb\x77\x33\x89\xb6\x8d\x69\x6f\x30\xe1\xb6\x67\x58\x0e\xee\x9d\xf0\x8b\x2b\x27\x7b\xf6\xb2\xa7\x24\x79\x88\x94\x04\xee\x18\x43\x6f\x8c\x37\xe9\xe1\xe2\x46\x25\x46\xec\xbf\x6b\x7f\x8e\x11\xeb\x4b\x64\xdc\xa0\x3d\x03\xe0\xbb\xb9\x4c\xdb\xb9\xdd\x8b\x32\x6e\xff\xf3\x6d\x9e\x33\xc4\x7f\x99\xbd\x1b\x37\xe6\x41\xcb\x2b\xde\x10\xa0\xd0\x0c\x6e\x07\xd4\x72\x8a\xb1\x32\x82\x2a\xfe\x04\x06\x8e\x2d\x14\x2b\x7e\x68\xba\xb0\x55\xf8\xf1\xda\x2b\xb7\xa1\xfb\xb0\xd4\xc6\xb0\x77\xde\xee\xb7\xb4\x11\x36\x50\xeb\xae\x2a\xf9\x9d\xfa\x3b\x29\x18\xa4\xdd\xfe\x40\x4b\xc6\x9b\xf7\x3a\x52\xa3\x1f\xf9\xce\xf1\x70\x25\x62\x4f\x1b\x8b\xb4\xb7\xd2\xab\xe8\xa5\xb8\x31\xc2\xa9\xd7\x4c\xd5\xe2\x77\xb2\xda\x22\x52\x63\x7e\x73\xbe\x58\xad\x78\x5b\xaa\x38\x28\xd8\x1e\xaa\x7f\xc1\xd1\x1b\x9f\x3e\xda\xac\xb6\xf2\x19\xe9\x78\xa8\x07\x77\x50\x02\x99\x55\x6b\x23\x2d\x4b\xe6\xeb\xa2\x3b\xee\xd9\x24\xa3\x94\x1c\xaf\x8e\x9c\x27\x94\x9e\x0e\xf3\x88\xfb\x19\x0e\xc2\x74\xda\x7a\x99\x61\x11\xb9\x17\xee\x24\x77\x51\x16\xf1\xcb\xfa\x3a\x65\x54\x98\x49\xca\x2d\x57\xad\xc1\x63\x38\x09\x38\xe0\x0a\x7d\x1b\xb1\xbe\xeb\x61\x9c\xf8\x35\xa9\xa9\x71\x0b\x7a\x9f\xb2\xae\xc8\x4e\x85\xc8\x0d\x39\x8a\x67\x48\xea\x23\x9c\x16\x96\xfd\x4f\x45\xb7\x64\xfa\xa5\xe3\x94\xb0\x81\x96\x4a\x0c\x53\xee\xbe\xbc\x35\xde\x1d\xb6\xb4\x20\x67\xcb\xa3\x16\x87\xa7\x84\x92\x35\x6f\xef\xe0\x81\x5d\x53\xb1\xbd\x22\xaf\x9f\x9d\xbf\x7e\x36\x51\x7a\xb7\x64\x27\x91\xaf\x58\x50\xca\x79\x0b\x67\xf3\x97\xa9\xd0\x0b\xd9\x00\xda\x79\x74\x2a\x0a\x64\x17\xa0\xfb\x85\xf4\x6b\xf2\x8d\x09\x99\x1f\xea\xaa\x51\xf1\x0a\x9d\x3b\x43\x93\xad\x2c\x70\x7b\xcb\x8f\xc9\x37\x88\x39\xe5\x54\x24\x65\x60\x10\x33\xfe\x80\xae\x09\x30\xae\x95\x31\x09\x7c\xfb\xf5\x67\xc5\xc5\x05\xd9\xd2\xd5\x0d\x2a\xed\x95\x5f\xff\x16\x05\xbe\xed\x71\x0f\x33\xbb\x31\x73\x54\xfe\x39\xee\x7e\x2d\x0f\x55\xad\x4d\x02\x52\x76\xe6\x87\x4e\xa3\x70\xcc\x60\xbb\x17\x7a\x7d\x17\x41\x5a\x69\xb2\x51\x4e\xc8\x02\x60\x4a\xf1\x47\xd5\xd2\xfb\x28\x86\xbf\x0f\xcb\x19\x6d\x34\x3e\xed\x59\xcb\x96\x47\x6d\xe2\x41\x75\xe6\x22\x50\xd7\x2e\x66\xd8\x9e\xa6\x3e\x4e\xba\xb6\x5a\xdd\x90\x6f\xbf\x26\x55\xd3\x71\x93\x63\x44\x47\x17\x98\x79\x82\xb1\x63\x53\xa9\xc8\xf1\x60\xdc\x54\xaf\x9f\x29\xae\x47\xd4\x90\x6a\x07\x17\x5f\xc7\xea\xa3\xf6\xbf\xaf\x10\x7c\x35\x26\xd8\x2b\xd0\x35\x87\xe4\x17\x69\x9c\x4d\x2f\x36\xb2\x77\x40\xc4\x68\x78\x51\x1e\xf6\x75\xb5\xa2\x1d\x2b\x0c\xa8\xee\x93\x06\x11\x25\xeb\x08\xec\xea\x09\x8a\x8d\x2c\xb8\x96\xb9\xee\xe9\xa6\x6a\x30\x8e\x2c\xc3\x5c\x0d\xeb\x01\xee\x75\x68\x60\xba\xe5\xd9\xa4\x8f\x2f\x59\xf6\xb3\xa7\x1b\xe6\x68\xe4\x87\x8c\xbf\x29\x54\x16\x3b\x44\x97\x7f\x27\x7e\xbd\x4f\x29\x05\x9d\x72\xd1\x55\xe3\x43\x59\x3b\x25\x73\x38\xe6\x4e\x11\xbb\x98\x4f\x81\x82\x49\xb2\x7f\x77\xc8\x01\x06\x7a\x66\x36\x5a\x25\x1d\x7f\xf6\x15\xd3\x40\x61\x9a\x50\x82\x74\x0d\xc9\x59\xc6\x3e\x27\x79\x7a\x1c\x9a\x8b\x02\x0b\xc9\x80\x5f\xc4\x05\x33\x0e\x19\x01\x58\x73\x84\x8c\x6e\xd0\x9b\xdd\x26\x0d\x60\xb0\x39\xbd\x41\x8e\x87\xa8\x6c\x9c\xe2\xc1\x21\x68\x7b\xc9\x25\xcd\x22\x21\xd5\xf7\x3c\xfc\xfb\x9e\x6d\xcf\x7b\x8d\xc9\x69\x43\x43\xaa\xeb\xde\x87\xfd\xf3\x41\x8b\xb5\x61\x30\x71\xdb\xd1\xe2\x27\x76\x73\x1c\xb2\x45\x5c\x61\x04\xa1\x0c\x40\xa4\x38\x1e\x51\xf1\xd0\x13\xcd\x9d\x0a\x87\x04\x06\xc3\xaa\xa9\x78\x43\x3b\x56\x5e\xe9\x5b\x46\xde\x53\xaf\x9f\xc9\x9b\xfb\xf5\x33\x05\x99\x04\xd8\x59\x1a\x83\xa7\x3e\xc2\xd5\x6d\x87\xe4\x83\x2b\x39\x6e\xc0\xfd\xeb\x14\xa3\x8d\xe5\x57\xca\x96\x4d\xac\x95\xff\xf0\x79\x55\xfd\xa4\xc2\x89\x34\xbd\x1b\xae\xb8\x09\x74\xe3\xce\x37\x14\x7d\x53\xac\xba\xa8\x37\xd3\x34\xbb\xc6\x2f\x6e\xb2\x9c\xa9\x9f\x7f\x35\xac\xe9\x91\xaa\x9b\x5b\xc7\x1d\xa5\xd8\x3d\x6a\x94\x62\x97\x1b\x25\x7c\x71\x13\x1a\x05\xa3\x0c\x6b\xfa\xa3\x34\xf9\x8f\x10\xd9\xe3\x8f\xa6\x9c\x1c\xf7\x7f\x20\xe4\x7b\x62\x84\x6a\x58\xd0\xb2\x1a\x88\x3b\x0a\x7f\x08\x53\x12\x9c\x62\xa5\x3d\x88\x88\xde\xbd\x54\x9d\x9b\xd4\x0f\xd9\x48\xbd\x69\x82\x87\x4c\x78\x75\x86\xf7\xa5\xf6\x6c\x0b\x98\x65\xd6\xed\x27\xc5\xb5\x1e\xc3\x1b\x7d\x85\x4b\x9a\x43\x8e\xed\x6d\x04\x97\xcc\xba\xc1\xa5\x80\xf6\x4c\xf0\x31\x47\x48\x2e\x0c\x97\x6e\x94\xa7\xc1\x14\x19\x12\xd9\xf1\xb2\x5a\x57\xac\xf5\xc2\xfc\x16\xf0\x6d\x61\xe0\x51\x16\x21\x63\x58\x60\x24\xff\x92\x96\x3a\x3f\xc3\x60\xb4\xb9\x94\x10\x65\x71\xef\x4d\xec\xfd\x90\x0f\xb6\xc5\x72\xbd\xa9\x37\x9d\x22\xb9\xcc\x31\x17\x56\x7a\x8a\xa1\x7c\xd2\xf8\x0a\x71\xa4\xe7\x92\x0a\x66\xee\xf4\xec\x2b\x19\x06\xd3\x97\xde\xc5\x05\x52\xc4\xd2\x3e\x82\x22\x14\xa6\x5d\xd1\x72\xde\x11\xfa\xce\xc3\xbb\x6f\x22\xcb\x7e\xc6\xa7\xb2\x4f\x5e\x0a\x1e\x81\x5f\xef\xf6\xdd\x91\x40\xf7\x36\x96\x1a\xee\x83\x1d\x55\xba\x2f\xbc\xf6\x19\x14\xec\x83\x1c\xd2\x56\xef\xff\xe7\x20\x1f\x59\xeb\xea\x1e\x5f\x8b\xd8\x74\xd5\xa8\x08\x64\x21\x69\xa6\x6b\x88\x4b\x38\x19\x09\x1d\xdd\x81\xd0\x47\x49\x37\xfe\xc7\xaa\xae\x55\x9b\x86\xca\x01\x7d\x0c\x14\x76\x18\xd2\xae\xed\x10\x0a\x43\xd2\x90\x37\x44\x76\x41\xba\x5d\x72\xfb\xe1\x7b\x42\x35\xe3\x90\x31\xb8\x03\xf8\x69\xd3\x5b\x8f\xb6\xe4\xf7\x80\x56\x43\x7d\x43\xae\x5c\x3f\x9d\x40\x85\xb4\x36\x05\x95\xb6\xf0\x82\x33\x3a\x5c\x7d\x82\x1d\x9c\x22\x72\x26\x99\x0b\x2b\xf5\x82\x6f\x58\x07\x5e\xef\xac\x25\xbc\x21\x28\x85\x23\xf8\x86\x8a\xf1\x82\x43\xec\x25\xd4\x82\x90\x1c\x3c\xdc\x5a\x17\x8c\xa3\x7b\xe7\x01\x4b\xc7\x04\x88\xdf\x15\xd4\xd7\x19\xb6\x35\xf1\x9f\x7b\xea\xbe\x09\x4a\x2e\x37\x8a\x5e\x95\xe0\x00\xff\x53\x1c\xab\xbf\xc3\xa7\xac\x92\x6a\xf3\xa4\x73\x91\xef\x2b\x2d\xf9\xc0\xfa\xc9\xd3\xb9\x99\x92\x8b\xf9\xaf\x12\x3a\x4e\xe8\x62\xaa\x61\x07\xbd\x47\x42\x22\x69\xac\x2f\xff\xab\xfc\x8d\x9a\x6b\xc9\x07\x00\x3e\xac\xda\xcd\x92\x62\xa7\xb3\xcb\x49\x5a\x3f\xf9\xb7\xc3\x6e\xc9\xbb\x56\xbf\xa0\x2d\x7f\x35\x1f\x34\xf9\x91\xb3\xc4\x6f\xef\x9b\x96\x43\xcd\x63\x54\xd6\x7b\x8b\xda\xaf\xbd\xbe\x4d\xb6\xd8\x90\x2a\x31\x21\x5c\x9d\x62\x47\x30\xf3\x4e\x4f\xf2\xc5\x24\x37\x21\xf3\xb4\xb2\x9f\x9d\x70\xca\x64\xc0\x75\x2a\xd0\xba\x4f\x01\x3d\xe8\x9e\x4e\x6b\xd6\xf6\x27\x37\xb4\xdb\x0a\x65\xdd\x6b\xd3\xff\x21\xad\x45\xc6\x32\xb1\x02\xd9\xbc\xec\xb1\xc0\x08\x98\xd1\xdc\xfe\x79\x0d\xc4\x7c\xeb\x77\x8c\x96\xa0\x29\x95\x17\x41\x4d\xdb\x0d\x6b\x09\x54\x11\x7a\xfa\xa0\xd2\x37\x99\x4f\xe5\x4b\x00\x1d\x94\xd1\x65\x56\xfb\x11\xaf\x78\xb3\xae\xab\x55\x07\x48\x05\x60\x46\x91\x55\x9e\xab\xba\x02\xe9\xce\xa1\x53\xeb\xf8\x6d\xae\x0d\x05\x17\x07\x12\x0e\x0e\x07\x22\x84\xc0\xdd\x77\x47\xbb\xd5\x36\x1c\x98\x15\xd5\x7c\x21\xc3\x7e\x0d\x24\x0d\xeb\x82\xf3\x9b\x4a\xec\x2a\x74\x0b\x36\xad\x2a\x3a\xf8\x5a\x01\xd2\x6d\x19\xfa\x75\xe9\x2d\x06\x15\x22\x5d\x81\xed\xcb\x78\xfe\x42\x2a\x62\x75\x6d\xbe\x27\x0c\x91\x54\xcd\x66\x66\x09\x48\x3e\xb3\x4c\x6f\xc9\xab\x0b\x9a\xb1\x92\x13\xf9\x20\xa2\x1e\x79\x54\x2c\xb8\xdb\x17\xe5\xdf\x0e\xa2\x53\xbd\xc3\x32\x58\x78\x3e\x42\x66\xf8\xfb\x53\x12\xcd\x45\x4a\xa0\x13\xe9\x3c\xb1\xcf\x41\x8c\xe9\x17\x75\xc7\xda\x06\x10\x2e\x9c\x33\xe7\x22\x5f\x58\x29\x38\x2d\xfe\x42\x0f\xf0\x2a\x45\x27\x79\x39\x8c\x93\x6f\x4f\x1c\x7c\xfe\xf6\xc4\xef\xfa\x4e\x74\x1a\x28\x6a\x76\xcb\xea\x33\xd3\x8b\x3a\x67\x1b\xfc\x7d\x32\x25\xc3\x65\xf5\xf3\x65\x64\x79\xe7\xd3\x24\x7d\x81\xfb\x83\x7d\x6e\xd9\xbe\x79\x09\x4e\xd5\xb2\xf8\x37\xfb\xf3\x44\xf0\x88\x97\x22\xc1\xb6\x34\x71\x1d\x37\xcd\x9d\xaf\xb3\x47\x40\xa0\x4c\x22\x06\x20\xba\xad\xd5\x60\x2e\x7f\xe5\x87\x3c\x85\xe7\xda\x8c\x50\x57\x54\x2b\x62\x6e\x7a\xf7\x71\xa5\x90\xaf\x09\x6d\xaa\x1d\x6a\x57\xab\xb5\x23\xc1\xa3\xb7\xbf\xd6\x78\xbc\x6e\x5c\xb7\x18\xb7\x14\x6a\x09\x6e\xd8\x71\xdd\xd2\x1d\x13\x64\xdf\xf2\x4d\xcb\x84\x28\x96\xb4\x2d\x44\xd7\x56\x7b\x0b\x58\x08\xa0\x53\x0f\xee\xfd\x6a\x4f\xdb\x73\x53\x51\x25\x49\x98\x9b\x3c\x68\x1d\xcf\x55\x9a\x9b\x52\x56\xb3\xa8\x9a\xc9\x29\xe2\xad\xa2\xda\xef\x2f\x9d\xfc\x13\x90\x1c\x79\xbb\x8a\xbc\x85\xc8\xf2\x48\x56\x2d\x47\xa0\xe8\xaa\x8b\x9e\x65\xf3\xec\xb3\xcf\xf4\x1b\xbc\xfc\x52\x6a\x2a\xb3\x96\xfd\x42\x87\x2d\x37\x32\xf7\xa6\x53\xc1\x4d\x2b\xe1\xaf\x60\x61\xf0\x41\x4f\x8a\x2a\x8b\xa0\x3d\x9c\xf7\x68\x32\xb9\x6a\x3c\x5b\xda\x86\x86\x81\xf1\x4f\xdb\xde\x65\xa4\x6d\xb4\x94\xee\x9b\xd5\x2b\x18\x81\xff\x07\x4b\xa3\x88\xbb\x0c\xf4\x64\x86\x11\xa8\xcf\x67\xd1\xee\xca\x2d\x4f\xd0\x7b\x82\x20\xa1\xd3\xde\x83\xe7\x8f\x08\x8f\xb2\xf5\x57\x33\x47\x3b\x5c\x04\xf3\xa1\xe8\xaa\x9d\xa4\xe0\xd4\xa9\x75\x42\x81\xed\x08\xf6\x2d\x5b\xb3\x56\x14\x2d\x2b\x0f\x2b\x56\x16\x3b\x0e\xcd\xa0\x54\xfb\xf7\x03\x6b\x8f\x8e\xc6\x1c\x7e\x25\x67\xe9\x3a\x52\x32\x94\x7f\x7b\x1e\x58\xce\x88\x3d\x18\x86\xa4\x86\x68\x86\xed\x67\x48\xd4\xc3\x63\xf3\xe0\x65\x70\x2f\x95\x20\x6e\x02\xab\x94\x5b\xe2\x40\xa2\x87\xaf\x11\xbd\xeb\x80\xbc\x93\x37\xe4\xf3\x43\xfd\x72\x4a\x3e\xe7\xf2\xbf\x79\x4b\x3e\x2f\xab\xdb\x97\x28\xcc\x84\x71\x7e\x27\x9c\x22\x25\xb7\x7c\xc7\x0d\xd4\xac\x60\x5d\xec\xf8\xa0\x70\xc2\x9d\x9e\x50\x4d\x58\x09\x34\x01\x12\xb8\xfd\x52\xa2\x3e\xc2\xa9\x39\x99\x3f\x8d\xd7\xf9\xa1\x06\xc9\x8d\xd7\x59\x3c\xc9\x1c\x17\x72\x46\xd1\xe3\xcd\xfd\xad\x3c\xc1\xca\x14\x22\x6b\x10\xd8\x21\x17\x2b\x95\xa0\x2b\x90\x5c\x4d\x05\xf1\x66\xb2\x85\x56\x8d\xe8\x18\x2d\x01\xde\xab\xae\x54\x5e\x8c\xb2\xba\x5d\x08\x07\x11\xb9\xb2\x3d\x40\x93\xb6\x97\x19\xf9\x16\x87\x8e\x16\x7a\x50\xad\x18\x74\xea\x40\x6a\x42\xe0\x0e\xb0\x35\xb3\x52\x55\x0f\xb6\x15\x7d\x1d\xe8\xca\xda\x7d\x43\xb7\xa9\x6f\x20\x6f\x07\xce\xe2\xe5\x42\x90\x33\x9c\x9a\x90\xab\xcd\x77\x0c\xd1\xd2\xac\x83\x08\xe9\xb6\xfc\xb0\xd9\x4e\x5c\xae\xe8\x74\x87\x3d\x65\x58\xa3\x96\x1c\x7b\xbb\x55\x85\x26\x86\xc2\x7e\x07\xa6\x4c\x85\x33\x38\xa4\x6e\x70\x92\x70\x43\x22\x05\xd0\x3b\x41\xc9\x73\xd4\x13\xc0\x2a\x59\x84\xfa\xaa\x25\x52\x88\x37\xef\x25\xf4\xc7\xd0\x60\xfa\x92\x90\x55\xca\xd9\xbe\xd9\x3e\xd9\x76\xea\x34\xe9\xd9\x4e\x8d\x21\x34\x6d\xf8\x8f\x47\x32\xce\x04\x97\xad\x97\xc0\x97\x27\xdf\x36\xe0\xd0\x22\x65\xf6\xcc\x59\xe0\x4d\x44\xe9\xca\xa3\x1b\x91\x35\x9d\x88\x56\x8b\xae\x19\x53\xe9\xe3\xfd\x06\x42\x72\x77\x5e\x32\xb9\x4f\x7e\xf0\x98\x53\xea\x67\xb4\xf6\xbb\xcc\x27\xb0\xf6\xc7\x7c\xc9\xb3\xf6\xc7\x9f\x4f\x0e\xd8\x73\x5c\xfd\xf4\x09\xf3\x49\x6c\x38\x94\xcd\x77\x3e\x4c\xb6\x62\xec\xb0\xd3\x74\xe2\xaa\xc4\x52\x9c\x6a\x8b\xed\x5f\xd8\xd0\x54\xea\x38\x5e\x99\xc9\x74\x5b\x8c\x99\x06\x83\xcb\xe7\x54\x72\x1f\x79\x9d\x38\xdc\x28\xe5\x6d\xe3\xbc\x9f\x2d\x67\x51\x45\xde\x3a\x53\x39\xf9\x0c\xf7\x98\xd1\x13\x25\x73\x66\x74\xf2\x01\x79\x37\xf1\xd4\x73\xa2\xe4\xb5\xd2\x35\x44\xf8\xf0\x63\x89\x33\xe4\x7c\x9d\x0f\xfe\x1f\xa8\x12\x03\x5a\xfd\x8e\xb7\xd5\x4f\xbc\xe9\x68\x6d\x35\xf4\xe0\xea\x8b\xe8\xfe\xf4\xc8\x0f\x90\xc4\x0a\x78\x16\x4a\x38\xb8\x4b\xf0\xc0\xd3\xc6\x25\x72\xa6\xae\xb5\x09\xa4\xef\x36\x6d\xba\x4a\x87\x13\x11\x33\xfb\x51\x08\x13\x08\x95\x79\x8c\xcc\x41\x88\x4d\xe5\x09\xe2\x5d\x1f\x7a\x0a\x09\xf8\xcc\x7e\x40\xc2\x97\x24\xcd\x91\x75\x58\x42\xd2\x9e\xdb\xc3\x27\x3c\x23\x6e\x9f\xe0\x95\x6f\x29\x0c\xfc\x70\x9d\x8c\xa3\xb0\x89\x94\x01\x78\x54\xa3\x8f\x1c\x5c\x62\x9a\x3d\xc3\x8b\x4e\x4c\x9c\xfd\x34\x53\xf5\x83\xde\x7d\x79\xc4\x61\x8a\xc2\x90\xe2\x03\xde\x37\xe8\xc8\xf1\x6e\x4c\x6f\xc9\xfe\x46\xd5\x3c\x25\xd8\x82\x7c\x53\x1f\xc4\x36\x25\xa7\xa8\x8c\x46\x0a\x14\x03\xf8\xbd\x1f\x82\xdd\x71\x72\xc3\xd8\x3e\xe6\x17\x0c\x6c\xc4\xbc\x90\xff\x3b\x23\x7f\xe0\x02\x93\xad\x1c\x04\x5b\x1f\x6a\x2d\xe8\x20\x2c\xb2\x49\xa4\x27\xc8\x19\x9b\x6d\x66\x53\xc0\xb4\x10\x93\x48\xdc\x59\xc3\x30\x1f\x86\x8c\x19\x11\x32\x87\xb7\xfb\x7e\x2a\x4f\xb0\x6a\xe5\xd7\xb3\xcf\x4b\xa2\x17\x12\x25\x5e\xe3\xd0\x10\xea\x66\xaf\xf9\xa2\x2c\x63\xcd\xae\x7c\xf6\x28\xd6\xcc\xee\x3b\x5c\x7b\x73\xa1\x29\x6f\x08\xde\x90\xca\x0a\x9a\xfa\x29\x73\x7e\x4e\xbe\x6f\x37\xb4\xa9\x7e\xa2\x08\xd7\x50\x1f\xa7\x18\x60\xbc\x03\x65\xb9\x7c\x9f\xd0\x75\xc7\x50\x73\xbf\x40\x7b\xeb\x02\xdf\x0a\xe2\x54\xc5\xb1\xef\xfe\xea\xc8\x8c\x46\xfb\xaa\x5a\xc9\xab\x75\x8b\xcf\x7a\xb5\xbe\x1f\x4f\x3c\x0f\xa1\xdf\x4b\x52\xfb\xad\x8a\x1b\x35\x2e\x42\xd9\xde\x61\x56\x53\xe2\xeb\x80\x5d\xd5\x6f\xf4\xec\x7b\xe7\x01\x2b\xbd\x09\xc5\xaf\x01\xd9\xc2\xfe\xe4\xdc\xf8\x7d\x6f\xca\xd3\x20\xa7\x7c\x77\xfa\x5e\x13\xb0\x33\xd5\xcb\x5f\x4d\xd2\x60\x68\x31\x8f\xd2\x1d\x81\xfe\xad\xb7\xa3\x78\x2c\xbe\xec\x34\x02\x0a\xcb\x35\xcd\xa8\x20\x86\xd6\x28\x6b\x53\xca\xd5\xc0\x32\x94\xf2\xa9\x71\x8a\xf4\xfb\xd4\x98\x71\x42\x85\xe0\xed\x62\x5c\x5e\xf1\xab\xf3\x1b\x2a\x3a\xf7\x74\x55\x75\xc7\x2b\x44\x4f\x50\x52\xb2\x09\x91\xfe\x9c\xbe\x7c\x4f\xe0\x5e\x26\xe0\xeb\x03\xc4\x96\xdc\x30\xc6\x38\xb5\x63\xc4\x92\x96\xdb\x27\xf0\xa7\x79\x46\x4c\xc6\x3a\x19\xd8\xc9\x7c\x72\x79\x9d\xc6\x28\xfc\xa2\x2c\x2b\x05\xfa\xe2\xe4\x29\x5a\x5b\x15\xce\x2d\x6b\x85\x4e\x87\x55\x7d\xff\x4a\x67\x59\xc1\x30\x07\x5f\xcd\xe3\x6a\x79\x68\xa3\xb5\x41\x1d\xdd\x20\xd3\xfa\x76\x4d\x8e\xfc\x40\xee\xa8\x4a\x72\xa1\xbe\xab\x0e\xa6\xa4\xea\x6c\xe3\x8b\x6d\xcb\xd6\xbf\x7e\xfd\xec\x9d\xd7\xcf\x16\x58\xdb\x85\x38\x2b\x25\x03\x91\x83\x9d\xed\xf8\x4f\x55\x5d\xd3\x19\x6f\x37\xe7\xac\x29\xfe\xfc\xea\xbc\xe4\x2b\x71\xfe\x23\x5b\x9e\x7f\x0d\xaf\xa4\xf3\x55\x5d\xad\x6e\xde\x79\x45\xd7\xb4\xad\xfe\xfb\x0f\x7c\x59\xc9\x4d\x83\x16\xfb\x02\x17\x74\xac\x42\xd1\xf0\xe2\xef\x07\x5a\x57\xeb\x23\xa4\x28\x39\xee\xd9\xeb\x06\x67\xed\x92\xb8\x79\x75\xcf\x47\x24\x57\x70\xdf\xb8\x73\xc7\x30\xfc\xcd\xa1\x3b\xb4\xac\xd8\xb7\x9c\xaf\x95\xfd\x46\x85\xf2\xc0\x1c\x04\xa8\x14\xe4\xcb\xcc\xa8\xd5\x9e\x3a\x11\x8a\x73\x08\x90\x13\x33\xcf\x4c\x75\xb0\x3b\x4e\x45\x67\x6c\xe4\x26\x27\x27\x3c\x20\x10\x61\x03\xd3\x92\x90\x6f\xbf\xbe\xb8\x98\x9a\xfc\x18\x14\xc1\x87\x0d\x6c\xb2\x85\x8d\x3a\x01\x81\xe3\xd3\x0f\x3f\xba\x08\xd3\x8d\x3c\x87\x01\x59\xd0\xe6\x6b\x9d\x9e\x40\x8b\x53\xa9\xef\x29\x0e\x84\xe5\x02\x0e\xa4\xcf\x30\x7e\xec\xf5\x34\xc1\x22\xe1\x87\x34\x02\x9e\xcd\x66\x13\x40\xe0\xa9\x46\x12\xda\x0e\xef\x8b\xd3\xb4\xeb\xc5\xaf\xcb\xdc\x27\x39\x5a\xbf\x12\xd8\x6b\xdf\x87\xcd\xcb\x47\xce\x87\x6e\x1e\xd8\x88\xaf\x4e\x32\x5a\x10\xb1\xe5\x77\xc6\xbf\xc2\x19\xd7\x45\x5c\xac\x27\x4f\x60\xbe\xe2\x56\x72\xe8\x41\xaf\x40\x24\x60\x2f\x7e\x73\xc0\x04\xe1\xd8\xae\xac\x76\xcd\x9f\xe9\x31\x3d\x75\x9f\x34\x14\xce\xcf\x08\x22\x52\x25\x9f\x42\x4b\xe1\x9e\xe4\x49\x4a\x77\x36\x04\xaf\xe8\xe8\xca\xc4\x61\xd9\xb5\x74\xd5\x25\xa9\x66\x9a\xea\x72\x62\x4d\x71\xfa\xa3\x36\xdf\xe4\xd6\x54\xa5\x9a\xdf\xef\xeb\xa3\x14\x96\x41\x43\x65\x34\x14\x52\x5c\xde\x3a\xca\x0e\x23\x3e\xce\x76\xbc\xa4\x75\xc1\xf7\x4c\xdd\x81\x05\x81\xae\xac\x69\xe0\xa6\xaa\x4d\x12\x1f\x04\x5d\x07\x26\x8a\x15\x9d\xa7\x59\x61\x99\x15\xd8\x71\x10\x9f\x1d\x9f\x36\x4e\x8d\xa2\xac\x68\xcd\x37\x58\xc3\xf1\x8b\x21\x62\xcb\xea\xda\x38\xd0\xd0\x95\x76\xf0\xa0\x6e\x7f\x26\xa3\xa6\xac\xed\x96\x21\x77\xe7\x64\x89\xbe\x38\xda\x70\x2d\xff\x2d\xba\xc3\x7a\x8d\x8f\x0e\x77\xa6\x9a\x1d\xff\x57\x55\xd7\xce\xc4\x74\x1e\x27\xb9\x02\x19\x2b\x2e\x88\xc8\xd8\x63\x10\xad\x5d\xdc\x7b\xc6\xde\x64\x16\x17\x4f\x94\xf8\xca\x2e\xd7\x96\xe2\x15\x8f\x0d\xe3\x60\x84\x59\x3b\xb7\x3f\xab\xd9\x86\x1c\x98\x21\xe2\x94\xeb\xe1\x66\x74\x8d\xcf\x7f\x82\x7f\x14\xd0\x8c\xaf\x08\x37\xc7\xdd\x35\xe8\x78\x49\x73\xf4\x0f\x49\x8b\xb6\xbd\xd1\xc8\x57\xdb\x56\x3e\xa4\x78\x43\x7e\xac\x9a\x92\xdf\xe9\xcc\x5b\xca\x47\xca\xcf\x31\x3d\x03\xcb\x4d\xc9\x3a\x5a\xd5\x62\x4a\x04\x63\xaa\xb5\x91\x88\x88\x17\xf3\xcf\x2e\x2f\x20\x38\x33\x70\xd4\x3c\x3f\x27\x3f\x32\x52\xb2\xba\x5a\x82\xb3\x50\x7d\x24\x25\x44\xf4\x43\xc6\xb9\xe2\x8e\x2d\x6f\xaa\xae\x30\x3b\x83\x2b\x0d\xa7\xa9\xe3\x87\xd5\xf6\x7a\x41\x4a\x44\xdb\xa4\xaa\xb5\x4d\x43\xdb\xfa\x08\x92\x1c\xca\x44\x64\x79\xd8\x58\x50\x98\xe5\x61\x23\x66\xd8\x2a\xc8\x54\x92\x19\xff\xf7\xf2\xb0\x99\xad\x36\xd5\xbf\x57\xe5\xaf\x2f\x2e\x3f\xfd\xf0\xa3\x17\xce\xe5\x4d\x6b\xc1\xc7\xdf\xe0\x17\x9f\x7c\xfc\xd9\xa5\xa5\x98\x57\x70\x44\xca\xea\x16\x3c\xec\x14\x25\x38\x84\x03\x5e\xd3\x0a\x96\x4a\xb1\x05\x43\xf7\xea\xd8\xf5\x99\x47\x14\x0d\x18\x5a\xc5\xdb\xea\x8a\x3c\x77\x5b\x70\xa1\x23\x4c\x52\x54\x25\x70\xc9\x51\x49\xb6\xd1\x6d\x5b\x7e\xd8\x6c\xd1\x1b\x0b\xd3\xc7\x41\x09\x8c\x4f\x06\x66\xc2\x95\x93\x9a\x3a\xe0\x59\x29\x4a\x6f\xaa\x14\x8b\xd6\xe8\x6f\x58\x39\x53\x9e\x2a\x43\x3a\x64\x97\x92\x5c\xa7\x96\x97\x5a\xc9\xef\x9c\x83\x3a\x5b\xd3\x92\x59\x95\x74\xd2\x21\x02\x67\xe8\x7b\x42\xc0\xcb\x43\xfe\xb2\xe6\xed\xce\xac\x82\x6c\xac\x30\x3f\xdb\xc8\x5e\xd5\x17\xdc\xc6\xa6\xaf\xb8\xba\xfc\x1e\x57\x77\x67\xd9\xb5\x47\x77\x85\xec\x0c\xf1\x04\x01\x6b\xa5\xf8\x92\x52\x7d\xaa\x96\x31\x99\x6e\x5f\xdf\xb2\x5e\xdc\xf9\x1b\x87\x3b\xaa\x3d\xc6\x73\x41\x8d\x5f\xa2\x7f\xe3\x63\x04\xfa\xc5\xfc\xfc\xe2\x22\xcc\x6d\x65\x6e\x3a\xc9\x37\xa6\x49\xca\x01\xe7\x5e\x8f\x93\xfa\x69\x92\xf3\x0d\xde\x6e\xfb\x5a\x0c\x46\x95\xe1\x58\x6f\xbc\x8e\xf1\x2e\x9f\x3a\xbf\xf8\xc8\x30\x01\x0e\x5e\xdc\x80\xbd\x96\x07\xf8\xbd\xbf\xbe\x28\x22\xb1\xf2\x54\x79\xca\x05\x80\x3d\x71\xa9\x01\x4e\x17\x32\x04\x2e\x92\x43\x59\x10\x4c\xd5\x82\x0f\x55\x48\x2d\xa8\xfc\x75\x54\xf0\xd1\x6d\xc5\xee\xc8\x99\x5a\xe1\x09\xca\xb9\x41\xf0\x79\x20\x7e\xea\x1d\xc1\x8f\xa7\xef\xa8\x5f\x4f\xce\x5d\x11\x8a\x82\x11\x14\xac\xd3\x63\xec\x38\x99\x13\x76\xbf\x62\xfb\x4e\x5e\x41\x08\xb3\x9b\xca\xe6\xf6\x26\x5a\x0d\x67\x27\x17\x90\xd1\x5b\xa8\x0b\x78\x49\xdb\x60\xbe\xfd\x87\xa4\xd7\x59\xac\xdf\x5d\x2c\xba\x6f\x95\x4d\x26\x79\x3c\xfc\x03\xe2\xc7\x07\x65\x91\x31\x4c\xaf\x89\x78\x22\xa3\xdb\xf0\x64\xae\x54\xe7\x6f\x03\x8c\x3d\x74\x1d\x09\xf6\x41\xf5\x97\x20\x47\x94\xc5\x15\x35\xa2\x6e\xc0\xd4\xc2\x2d\xd1\x00\x77\xe0\x8b\x0d\xae\x31\x58\x36\x75\xb5\xe8\x6b\xc4\x6b\xc0\x7d\x84\x78\xc3\x71\xe4\xfc\xb0\x35\x73\xd4\x13\xcf\x13\xbf\x8d\x1c\xbe\x7b\xf6\x75\x1b\x54\x4f\x3c\x49\x92\x25\x86\x21\xdf\x93\xd5\x06\x9d\x29\xc3\x5a\xfa\x4b\x71\xaf\x6a\x59\x13\x89\x27\xed\xa1\x24\x28\x05\x6f\x56\xda\x0b\xdf\x93\xdc\x34\x09\xfe\x01\xe4\x18\x2f\xdb\x87\x3a\x9e\x74\x75\x53\xb6\x1a\xcd\xf3\xc9\x52\xb0\x69\x2f\x20\xc9\xdb\xbb\x50\xfa\xbd\xdd\xf6\x6f\xae\x6e\xa8\x30\x01\x4e\xe7\xe7\xe4\x1b\x5a\x32\x15\x42\x87\x5f\x91\x7d\x80\x20\xf2\xe0\x6a\x18\x54\x64\xbe\x7a\xc4\xdb\x2f\x61\xe3\xea\xc3\xb5\x7b\x5c\x71\xad\xf0\x0a\x83\x1f\x7e\xe0\x7b\x22\xf0\xc4\xe9\x63\x62\xde\x46\x88\xd8\x2d\x9f\x44\x2a\xe8\xc0\xac\xec\x09\x2f\x7b\xc7\xb9\x10\x90\x4c\xb8\x1b\xeb\xd0\x35\x3a\x53\xad\xe8\xe4\x7f\x2b\xc9\xf4\xb0\xdf\xb3\x56\x45\x4c\xe0\xcb\x6c\x64\xee\xfb\x3f\x1e\x3a\x35\x7c\x35\x42\xe3\x1c\x77\x16\x4d\x66\x22\x7b\xe3\x7b\x20\x0b\x46\x24\xdb\xf0\x5f\xca\xee\x4c\xbd\x60\xa2\xf0\xf1\xef\x15\xcc\x1f\xb8\x47\xe8\x00\x82\xd3\x93\x01\x83\x4d\x84\x69\x0c\x4f\x02\x05\xf1\x43\xc7\xf5\x9a\x4b\xfa\x57\xde\xdc\x90\x7f\x44\x41\xd8\xe3\x26\x48\xbe\x85\x6a\x46\x40\xe2\x21\x95\x20\x0d\xd7\x6c\x10\x56\xd6\xd5\x55\x5d\x91\xb3\x22\xd9\x73\x71\x9c\x64\x3f\xdd\x4f\xfa\x6a\xa5\xde\xc2\x3f\xc0\x8e\x82\x65\x4f\x19\x43\x35\x5d\xbb\x03\xcb\x22\xc3\x87\x01\xe6\x4e\x9d\x00\x9c\x25\x60\x34\xf0\xd0\x47\xc9\x1b\x20\xff\xb5\x36\x41\xdf\x7a\x2d\x13\x55\xc9\x04\x39\x53\xae\x38\xf2\x5c\xf9\xe7\x46\x52\xa1\x27\x3b\x4e\x2c\xcf\xb2\x3a\x9b\xf4\xbd\x99\x4d\x71\xa0\xb3\x19\x68\x65\x84\x4e\x65\x90\x4f\x62\xa0\x81\x9c\xec\xbe\x8a\x2d\x3f\xd4\x25\x59\x32\xf9\xf8\x96\x5c\xd2\xc8\x73\x4d\x78\x6d\xe6\xb2\x1a\x84\xb4\x87\x44\x6b\x49\xcf\x68\xe2\x51\x68\x3e\x83\x94\x8b\xc0\x7f\x84\x5d\x05\x57\xa2\x1e\x87\xc5\x96\x92\x7e\xe5\xe4\x1c\x4c\x3f\xfc\x35\xc9\x49\xa0\x45\xd6\x94\x28\x24\xc2\x8c\xa1\x41\x1d\xc4\xec\xe4\xb5\xd6\x88\x8e\xc6\x27\xd8\xfa\x99\x12\x9d\x25\xff\x8e\xb7\x37\x72\xc9\xa0\x82\x72\x07\x18\x58\x19\x52\x98\xc7\x22\xcc\xdd\xc4\xf1\x29\xd4\xb4\x10\xe7\x1c\x81\xe3\xbd\x1a\x79\xd6\xe3\x17\xc8\xb3\x9e\x00\x81\x7a\x34\xf7\x31\x5e\x69\x4a\x12\xd7\x83\x56\xdb\x68\x4d\x29\x0a\x16\xae\x12\x04\xa2\xc7\x20\xae\x46\x90\x35\x6d\xf1\xba\xaf\x4a\x26\x0f\x98\x4d\x69\x88\x30\x5d\xd5\x2d\x6b\x05\xad\x2d\x98\xef\x41\xd0\x0d\x9b\xaa\xe6\x96\x87\x0e\xf8\x11\xe4\x7f\x96\x6c\x6b\x5d\xdd\x9f\x60\xef\xf8\xe8\xd3\xf9\x1c\xdd\x1d\xde\xf7\x35\xee\x57\x23\x37\xc4\xbd\x5d\x19\x05\xb9\xd4\xbe\x05\x70\x33\xc0\x15\x4f\xbb\x92\xcb\xa3\x59\x62\xea\x10\xa5\xba\xdb\xf2\xbb\xf3\x6d\x55\x32\x43\xfe\xa6\x7e\xb1\x53\x2d\x0e\x82\xc7\x17\x9f\x7d\xf6\xd9\x67\x2a\xbd\x87\x12\x4d\x2e\xe7\x7b\x3f\xaa\xc7\xfc\x60\x5f\xb9\xd8\x93\x73\x2c\x5f\xc9\xf7\xbe\xe4\x1a\x46\x12\x78\xdd\x8c\x0b\xcf\x95\x8f\x01\x17\x47\x00\xbc\xf2\xa1\x85\xf7\x84\xb3\x0e\x2a\x2e\x54\xbe\x0c\xf7\xbc\x45\xa2\x48\xa8\x9b\x7c\xfb\x12\x7e\xdf\x95\xd7\xc9\x0d\xf2\x9e\x81\x80\xb3\x52\x48\xb6\xe7\x5c\x19\x51\x27\x89\x87\xd8\x89\x2a\x09\xd3\x8f\xf3\x5e\x1e\xf7\xfa\x1a\xf3\x98\x0d\x5b\x8f\x92\x94\xf5\xa8\x06\x4e\x7e\xf2\xa7\xa7\x92\x78\x10\x3e\x75\x06\xe9\x87\x79\x76\x76\xc1\x2a\x9e\xf6\xbe\x80\xce\x27\x09\x02\x10\x3b\xf2\x90\x20\x2e\xb1\xb3\x82\x72\x2f\xc1\xd7\x1a\xca\x40\xb5\x57\x6f\x5c\x5d\xd0\x7d\x9d\xa7\xdf\xda\x77\x72\xef\xed\xe5\xbe\xf6\x7b\x91\xed\x26\x9a\xbc\xaf\xaf\xb3\xa0\x30\xb3\x8e\xf3\xba\xab\xf6\xbd\xcc\x23\x7a\xea\xa8\x4a\x39\xdf\x77\x73\xf4\x54\xb9\x40\xb5\xfb\xfd\xa1\xd5\xcf\x6c\xed\xb0\xb0\xa2\x0d\x08\x14\xed\xb2\xea\x5a\xda\x1e\x55\x5c\x8e\xaa\x8f\x91\x94\x4e\x94\x47\xd5\x08\xd6\x76\xac\x94\x82\x0a\x25\x8e\x08\x85\xee\xcd\x9d\x64\x1f\xa6\xf1\x99\xd6\x92\x73\x15\xb0\xc3\x0f\x2d\xd8\x9b\x11\xa3\x51\x8a\x86\x8e\xc7\x45\xc7\x09\xbd\xe5\x55\xa9\x23\x3d\x64\xc3\x77\xac\x6a\x4b\x02\xde\x59\x98\xb1\xca\xec\x0a\x34\x08\xbe\x2b\x21\x10\xa1\x67\xd0\xc6\x55\x08\x4c\xda\x10\x93\x5c\xf3\x3b\x74\xad\x95\xfd\xdc\xb2\xf6\x48\x6a\x2e\x7b\xe4\x6d\xa9\x72\x4f\x31\x6d\x69\xd0\x0c\x19\xb8\xae\x6a\xf3\x3d\x41\x96\xf2\xed\x28\xfa\x13\xc3\x79\xa6\xe7\xcc\xc3\x50\x8f\xd2\x7d\x11\x62\x8c\x6c\xdb\x5a\x43\x70\x36\xb8\x3b\x69\x21\xb6\xa6\x7f\x6c\x1b\x9a\xf2\xbc\x28\x8d\x64\xed\x17\x31\x62\x75\x96\xcd\xf4\xa4\x1f\x8f\x95\x73\xb1\xef\x54\xe8\x07\xe2\x94\x50\xf1\x61\x20\x1c\xa5\x14\x5a\xb3\xa5\xd0\x07\xc0\xa6\x01\x71\x8d\xa7\xf1\x44\xcc\xba\xfb\x8b\x19\x63\xf5\x27\x26\x1a\xb8\xdf\xfa\x7e\x95\xe9\xde\xce\x52\x0b\x8e\x00\x1f\x71\x4b\x4e\xb4\x74\x50\x2d\x95\xfc\x32\x5a\x81\xd6\xe6\x4a\xb6\xce\x37\xbd\xdb\xe9\xaf\x81\x0f\x44\xd8\x37\xad\x7e\x8a\x09\x5d\x49\xa3\x75\x0c\x00\x07\xc2\x95\xec\x5b\xb3\xb7\xb0\xca\xad\x4d\x97\xfb\xb8\x75\x76\x93\xc2\x3c\x8a\xd8\x0c\x1d\x65\x57\x28\x06\xf8\x0e\x9d\x78\x4f\x5e\xa4\xeb\xb4\x17\xef\x13\xd6\x01\x54\x10\x8f\x27\xb7\x80\x0a\x7e\x46\x7a\x0b\x11\x36\xc7\x93\xdb\x5b\x58\x67\xf0\x63\x7f\xc2\x2a\x83\xd2\x07\x81\x45\xff\x72\x5f\x00\x3e\x96\xbc\x4a\xff\xd7\xaf\x5f\x3f\xeb\xf8\xfe\xf5\xb3\xbf\x1a\x79\x0b\xb5\xe9\x24\x60\x8a\xd6\x7c\x19\xd5\x87\x1d\x18\x68\xa1\x75\x11\xfc\x12\x6d\x20\x19\x0d\x34\xe2\xa0\xdb\xa4\x5b\x91\x8b\x34\xd0\x06\x00\x7e\x87\xd9\xa4\x5b\x0a\xaa\x47\xed\x51\xa2\x25\x28\x75\xed\x58\x99\x0a\x5f\xc3\x5a\xb7\x74\x1f\xf1\x6c\xdf\x15\x2e\x3e\xd4\x9e\x53\x93\xff\x53\xe8\xd6\x84\x5f\x07\x43\xfe\x93\x8e\x4e\x6a\xb5\x36\x03\x5e\x69\x7a\x51\xe3\xb8\x64\x8b\x07\xe2\x8a\x43\x0e\x50\xce\x9a\xee\xaa\x5a\xca\x18\xce\x5f\xc5\x92\x0a\x96\x77\xad\x20\xdf\x7d\xff\x83\x12\xd7\x2c\x4a\x0d\x6f\xad\x8c\x33\x33\xad\x9b\x78\xee\x76\xa7\xbc\x50\x7c\x77\x65\xe7\xaf\xc2\x29\x94\x45\x8e\xb4\x23\x73\x57\xd1\x40\xbf\x7f\x43\xe5\xab\x7b\x75\x03\xfb\x7f\x07\x1a\xb1\x05\xa8\xae\x17\xa8\xf1\xec\x00\x43\x9c\x4b\xf1\x34\x6c\x43\x87\xcf\xf7\x39\x1e\x7b\xbe\xd1\xfe\xaf\x8e\xe1\xdd\x7c\xa8\x59\xd7\x49\x99\x05\xf1\xe7\xbd\x55\x80\xa5\x02\x41\xd0\xff\xd9\x87\x7d\xf0\x8b\xa7\xda\x41\xdc\x46\x6c\x47\xbd\x97\x35\x68\x37\xdf\x5b\x20\xe7\xe1\xac\x75\xbd\xd6\x13\xd5\x56\xfe\x49\x61\xcf\x8f\x2a\x1a\x9c\x9f\xff\x03\x1f\x16\x7a\x21\xde\xe6\xc3\x42\xb5\x39\xf2\x61\x91\xc2\x0a\x51\x83\x3a\xd9\x28\x69\x2a\xa6\x00\xc5\xfd\x6f\xc3\x86\xc8\xa0\xc2\x30\x9e\x8b\x29\xef\xc2\xb9\xbc\xad\xf7\x8f\x6e\xbd\xe7\xfd\xe3\x17\xf1\x6e\x75\xfd\x9c\x9e\x93\xf4\xb4\x62\x29\x64\x6a\xfe\xc6\xf8\xa3\x31\xaf\xa6\xe4\x04\xfe\x21\x8f\x29\x3d\x29\xf3\x98\x0a\xbd\x99\x33\x6b\xa3\x02\xd0\x92\x4f\x2a\xa3\x7d\x2a\x92\xb5\xa7\x69\x72\x9b\x3c\x45\x3c\x4e\x76\x44\xce\x52\x9b\x3f\xe6\x2d\xe6\x57\xe3\x87\x2e\x00\x71\x70\x9d\x32\x82\x5d\x8e\x16\xae\x2f\xcc\xf9\x1f\x31\xfa\x5e\x99\x53\x17\x75\x5e\x92\x7e\xba\xc3\x13\xb6\x1f\x6b\x3c\x7e\xf3\xf3\x87\x36\xfd\x26\xc8\x1f\x6c\xa3\x03\x4b\x1e\x59\x05\x20\xb3\xa3\x37\x8c\x80\xee\x1e\x5c\x93\x61\x26\x25\x67\x28\x46\x80\xe3\x68\xc0\x93\xa3\x8c\x7b\x8f\x7e\x7e\xe4\xf7\xf5\x2d\x50\x82\xff\xda\x7d\x02\x25\x07\x14\x30\x82\x8e\x7f\xc1\x99\x8d\xa2\x72\xf7\x1d\xef\x06\x58\x9f\x42\xe5\x50\xe1\x67\xe0\x70\xbd\xaa\xa6\xf9\xdb\x5d\xda\x01\xcd\xc0\x13\x68\xc6\x5f\xce\x11\x24\xf3\x4b\xce\x2c\x45\x33\xae\x09\xf4\xae\xaa\x6b\x37\xa1\x83\xae\x8d\x4e\x02\x20\xa5\x01\x6c\x07\xc0\x73\x2e\x99\x96\xe2\xa0\x71\x84\x37\xf3\x2a\x84\x7b\x3e\x0e\xab\x13\x4f\xe1\xa5\x49\x36\xfa\x48\x59\x27\xcc\x88\x93\x59\xc0\xeb\x9c\x8b\x65\xec\x55\x33\x46\x64\xd4\x2e\x35\x01\xc8\xaf\x73\x24\xad\x4a\x29\xc8\xdf\x7b\xc2\x91\x6c\x03\xa3\xd7\xff\xc1\x37\xcf\xa0\xa2\xb5\x87\xdd\x9e\x7e\x12\x7b\x35\x5f\x4f\xe0\x22\x21\x0d\x3c\xf1\xea\xf9\x79\x67\x36\xea\xe6\x79\x94\x4e\xcf\x91\xcd\x1f\xa9\xd3\xf3\xc4\xbb\xc7\xea\xf4\xfc\xdb\xf3\x71\x3a\x3d\xf7\xb8\xc7\x40\x62\xdf\xaf\xd7\x82\x75\x2e\xd1\xc3\x8b\x3d\x80\x5f\xd6\x9f\x14\x7f\x0d\xb8\x6b\xa8\x9d\x0f\x58\x90\x9b\xeb\x24\xfd\x25\x89\xd9\x3d\x77\xbc\xd2\x9d\xd4\xe0\xe8\x0d\xf3\x27\xb6\xe4\xbc\xcb\x29\x08\x6c\xb6\x98\x25\x15\x41\x24\x6d\x30\x84\xde\x68\xc8\x34\x2f\x3d\x81\x1b\x6b\xc8\x84\xa8\x21\x8b\x9c\xd0\xe7\xe2\xa8\xab\xf5\xb8\x17\x8d\xce\x46\x31\xb3\xc3\x8c\x23\x1f\xdd\x6f\xa9\xfd\xf2\x7e\xbf\x4f\xae\x27\x14\xd1\xab\x69\x6c\xee\xdf\xf1\x8e\x19\xd7\x55\x05\x3d\x72\x65\x80\x49\x2e\x66\x90\xcd\x94\x1f\x04\xab\x67\x9e\x1f\xb8\xf6\xb6\x03\xaf\xa7\xfa\x48\x96\x8c\xec\x69\x53\x1c\xc9\x99\xa4\x4e\xd0\xf2\xac\xc1\xd9\x89\xb5\xc2\x89\x8e\xb4\x1e\x6d\x13\xe8\x80\x10\xdf\x3d\xb3\x6a\x75\x49\x05\x94\x01\xaa\x49\x56\xca\x11\x52\xa2\x87\x32\x05\xbf\x29\x84\xbe\xde\xed\x69\x57\x2d\xab\xba\xea\x8e\xe4\x0c\x3c\xdd\xbe\xa9\x5a\xb6\xe6\xf7\xa6\x83\x3b\xf6\x5e\xcb\x34\x3e\x3b\xc4\xe6\x99\xe6\x0d\xee\x24\x94\x7d\x81\x69\x20\xcd\x8c\x11\xb1\x03\x6e\x61\x70\x7a\xf4\x7f\xc7\x67\x61\x25\xe4\x1c\xc1\x75\xab\x6a\x4a\xc8\x63\x88\xca\x57\xdd\xbb\x8a\xed\xac\x6e\x99\x8a\xd5\xaa\x04\x51\x60\xf0\x88\x5b\xf0\xe1\x8c\x28\x30\x0e\xbf\x03\x59\x10\x36\xe5\xd0\x82\xe6\x10\x6a\x63\x95\x8f\x32\x55\x9c\xb1\x26\x3f\x9b\x21\x3b\xed\xea\x71\xaa\xc1\x35\xa4\x02\x34\x4e\x27\x34\x0c\x81\x61\x66\xe4\xfb\xa6\x3e\x3a\xc9\x79\x04\x23\x7c\xb5\x3a\xb4\x82\xd0\x8e\x50\xd2\x55\x3b\x35\xba\xcb\x59\xb8\x54\x0d\xbb\xef\x46\xae\xaa\xdc\xa6\xd4\xa8\xf5\x30\xd5\xe0\x0f\xfb\x15\x07\x78\x5b\x33\x6c\x3b\xde\x99\x4e\x16\x0d\x6d\xf4\xf8\xa3\xbe\xf1\x0a\x06\xf4\xfd\x80\x4a\xe2\xc3\x6a\xab\x30\x5b\xae\x90\xc0\xa3\x7a\xae\x35\xa5\x3f\xce\xb0\x3f\xb4\xd4\xf0\x99\x55\xcd\x68\xbb\xae\xee\x9d\x2c\x91\x3e\x61\x8c\x8a\x4c\x31\xfc\xc5\x4d\x11\x9b\x1a\x8c\x2f\x5b\x16\xe6\x77\xc9\x6e\xd7\x74\xc5\x8a\xdb\x4a\xa8\x03\x96\x1e\xaf\x1b\x56\x68\x06\x9a\xc2\x58\xf6\x66\xa1\x28\x74\x1a\xfe\x0e\xc4\x12\xff\x2a\xe9\x22\x70\xa9\xd5\x42\x7e\xa2\x71\x68\x04\x31\x51\x62\xb2\x9b\x4c\x21\x59\x75\xf6\x7c\xe0\xce\x5b\x9b\x06\xfc\xb3\xa6\x1d\xfb\x9f\xe0\x86\x96\x99\x0f\x8c\x30\xd5\x25\x34\x9a\xef\xd3\x0a\xf9\xe9\x2e\x0b\xaf\x4f\x0b\x19\x65\xb2\x06\x38\xc8\xd1\x6e\xa6\x74\xec\x02\x03\x30\x74\xaa\xf4\x90\x86\x22\xec\x07\xe2\xb4\x56\x68\x67\xe1\x2b\x5d\x2a\x0e\x11\x0d\x61\x69\x72\x5b\x4c\x46\x72\x84\x54\xd1\x1c\x47\x48\x60\xd7\xf6\xc1\x3f\xe4\x57\x7f\x9a\xff\x9c\xee\x68\x7e\x9d\x59\xbc\xd4\x91\x50\x85\xc8\x5c\x90\xd4\xe9\x28\xca\x03\x9a\xda\x26\xe9\x6c\x83\xbf\x67\xeb\xee\x5c\x07\x93\x34\x5d\xcb\x6b\x04\x29\x68\xe8\x6d\xbc\xdb\xaa\x04\x2c\xd9\x34\xf5\x41\x2e\xfb\x58\xab\x98\xaf\x56\x0e\x56\x59\x61\xd8\x82\x8f\x38\x38\xc1\xd7\xd5\xa6\x01\xc3\xd6\xd9\x45\xf1\xe1\x24\x1d\x42\x7b\x31\xd3\x92\x81\xac\xa6\xb3\x5d\xe4\xdd\xdf\x5f\xcc\x62\x0f\x78\xfd\xfc\x16\x7d\x80\xf4\x04\xaf\x55\x8b\xff\x90\xae\xae\x9f\xb5\xd1\x32\x25\x8c\xdf\x73\x1f\x38\x2a\xac\x71\x82\x85\xdb\x4d\x6d\xee\x80\xfc\x38\xe4\x14\x37\xef\x1e\xc0\x7e\xbe\xab\x6b\xc4\xe9\xd9\x34\x26\xb4\x42\x74\x1e\x89\x0c\x3d\x62\xc6\xfd\xb8\xcd\x51\x62\xa9\x9e\x69\xe2\x08\xdc\xc9\xe2\x79\x48\x53\x38\x0e\xd1\x4f\x71\x64\xe1\xec\x35\x5a\xbf\x49\x51\xe1\x3c\x1f\xaa\x1d\xdd\xb0\x2b\x30\x20\xd3\xd6\x94\x3c\xfb\x6c\x5e\xb2\xcd\x54\xa7\xb4\xaa\xe9\xea\x66\x4a\x66\x2f\x2e\x27\xe1\x4f\xf3\xf9\x85\x97\x77\xa4\xef\x9c\xb5\x7e\xd2\x88\x27\x8d\xef\xc5\x27\x8f\x1c\x20\xa2\x6b\xad\xa4\xbc\x0b\xce\x01\x1a\x66\x23\xb9\xac\x45\xb5\xe2\x4d\x96\x7b\xc0\xd7\xa1\x14\x8a\xd9\x83\x25\x2b\x3b\xa7\xcb\x28\x8d\x86\x0a\xba\xa7\xe7\x72\xfe\x2b\x72\x8e\xf8\xea\xf0\x5f\x0d\x2f\x5a\xb6\x67\x54\x05\x3b\xf5\x4c\x0a\x87\x1d\xaf\xb3\x9b\x91\x3e\x5f\xbb\x58\xea\x7c\xaa\x83\x2b\x73\x62\x17\xa6\xb6\xed\x42\x3f\xfe\xf7\x0a\x7a\x4d\xbd\x2d\x78\x4b\xf6\xd5\xde\x07\x8e\xa4\x0d\x01\x36\xc2\x4a\x44\xe1\x84\x37\x10\xc4\x10\x73\xc9\x6c\xa5\x90\x8c\xd8\x36\x90\xb6\x49\x56\xb0\x48\x9f\x40\x0e\x8c\xae\xb6\x08\x13\x06\xb2\xf4\x91\x1f\x5a\xf3\xd2\x22\x5b\x5e\x97\x62\x16\x0a\xbc\x6a\x30\xa2\xf7\x2e\xf1\x48\x3f\x08\x5e\x4b\x79\x5c\x5c\x5c\x66\x62\xab\xfb\x02\xc9\x53\xe9\x0f\xb8\x41\xe3\xe3\xf5\x4b\xad\x96\x70\x6e\xad\xce\x7b\xe4\xa9\x5d\x30\x71\x1e\x54\xe8\x48\x20\xc1\xc9\x1d\x73\x7c\x11\x6a\x7a\x24\xdd\x96\x0b\x96\x50\xc9\xf6\xdc\x21\xbe\xd1\xb0\xa7\x60\x94\x05\x02\x19\x77\x5d\x59\x23\xf2\x7d\x21\x20\xd1\xd3\x15\x71\xa2\x06\xae\x6d\x30\xfe\x15\x99\xbb\xf1\x6c\x89\xa3\x68\x36\x2f\x6d\xee\x4f\x94\x4b\xd8\xfc\xe3\x69\xdb\xe2\xe0\xc1\xd3\xa6\x54\xeb\x83\xa5\xe1\x1e\x91\xd4\x20\x37\xb9\xb0\x31\x41\x36\xf9\xb3\x7a\xa3\xe5\x41\x38\x13\x5d\x44\x40\xdf\x43\x9e\x1f\x96\x50\xac\xff\x80\xc1\xc0\x85\x87\xfe\xaa\x65\x54\x11\xd2\xb6\xea\x08\x6d\x19\x25\xcb\x23\xb9\x98\xef\xef\x41\x97\xc2\xf7\x0a\x2b\x57\x12\xfd\x2c\x44\x06\xcf\x2c\x73\xd5\x15\xb2\x21\x6d\xc9\x49\x67\xb7\x8b\xb5\x5b\x4f\x68\xca\xc7\xb2\xcc\x62\xc5\x24\x7a\x08\x81\x63\x7c\x21\x3b\x8f\xe0\x96\x60\x6d\x2b\xba\x77\x1e\x2f\x91\x48\x8b\x5f\xc7\x30\x1a\x78\x9d\x91\xc2\x3d\x62\x58\x59\x19\x33\xdc\x30\x44\x5c\xbb\x17\x3a\xa6\x0c\xe9\x73\x7c\x03\x96\x67\xf9\xf9\x16\x61\x73\x4d\xab\x96\xae\x82\xee\x62\xa1\x4a\xf5\x33\x20\x46\x7a\x3e\x8d\x56\x4d\xa0\x33\xed\xfb\xa6\x82\xa4\x31\x0c\x2a\x5d\x01\x56\xda\x75\x0f\x62\x88\x97\x0f\xf2\x4f\xbc\xa3\x1d\x46\xff\xb5\x2a\xf2\x1e\x22\x80\x6c\x66\x30\xb1\x77\x15\xa0\x5a\x75\x42\x1e\xdc\xa7\x62\x2b\x5b\x61\x67\x1f\x7e\x2c\x65\x98\x89\x0d\x57\x9a\xa5\x2a\x0f\x8b\x16\xba\x56\x42\x98\xd0\x9f\x1c\xbe\x15\x66\x45\x36\x65\xfc\x0f\xbe\xdf\x97\x3f\x30\x4f\x6d\xac\x74\x67\x2e\xca\x62\x6c\x85\x0f\xcf\xdb\x00\x10\xa7\x7e\x6e\xc3\x27\x79\x73\xb3\xb2\x90\x37\x82\xdb\x3c\x68\x96\xad\xc5\xd3\xc9\xa9\x34\xfb\xe4\x52\x28\x81\x91\x54\xcd\xba\x6a\xaa\x8e\x05\xfb\x72\x9d\x5e\x71\x93\x10\x3e\xb9\xb4\x85\xd8\xf5\xad\xae\xfe\x1c\xf8\xec\xa4\x96\x0e\x8b\xbe\x71\xde\xb6\xbf\x6d\x95\x78\x52\xb5\xab\x9a\xf5\xd0\xd5\xc6\x18\x34\xe7\xbf\x4a\xa0\x3d\x01\xcc\x93\x46\x91\x07\xf3\xcb\xa5\x2d\x17\xf0\xa0\xac\xfa\xc2\x5f\x1a\xdb\xe3\x2f\x4a\x8a\xd1\xfd\x16\x11\xde\xdb\x27\xaa\x40\xab\x31\x96\xc6\x36\x98\x16\x21\x5e\xc6\xb7\x40\x5f\x51\xb6\xb4\xb1\xb9\xca\x4e\xcc\x53\x16\x9c\x8c\x69\xf0\xeb\xc6\xb1\xab\x3b\x0b\x63\x54\x38\x57\xe4\x62\x76\x29\xae\x33\x29\xef\xa3\x6d\x22\x25\x5b\xd5\x14\xab\x16\x0d\x2f\xaa\xdd\x9e\xb7\x1d\x6d\x3a\x95\x30\xb5\xda\x34\x85\x4e\xdf\x2e\x5b\x7c\xc8\x26\x77\x27\xff\x66\xea\x5e\x93\x37\x92\x26\xbe\x6c\xf9\x9d\x60\xad\x15\x7e\x55\x7b\x52\x32\xd1\xff\x89\xdb\x93\x5f\xbd\xa6\x4c\xbd\x5d\x55\x96\x35\xcb\xd5\x53\x5f\xd3\x55\x95\x63\x51\xa6\xaa\xfa\x9a\xae\x0a\x97\xa0\x76\x4c\x8a\x47\xeb\x7c\xed\xa9\xaf\xa6\x9c\xa9\x9f\x98\xf2\x63\xb6\xcb\x07\xf8\xb7\xe7\xd6\x85\xa8\x5f\x6e\x2c\x2a\x3d\x5e\x0b\x53\x0b\xb1\x5f\x6d\x1a\xde\xb2\xe2\x8e\xb6\x0d\x88\xf7\x6b\x5a\x0b\x4d\x98\xef\x3c\xa8\xf2\x6f\x12\xba\x02\x0f\x73\xdd\x9d\x8a\x61\x86\xd4\xd6\x07\x8a\x46\x58\x88\xb8\xd1\x21\xb0\xf0\x3c\xe0\xbc\x93\x8c\x34\x1c\x81\x3d\x08\x4e\x07\x25\xdb\xb7\x6c\x25\xc5\x81\xd7\xcf\x7e\xd8\x32\xb2\xb0\x4b\xb3\x20\xb0\x58\xaf\x9f\x4d\xc9\xeb\x67\xb7\x1f\xcd\x3e\x9a\xcd\xd5\xbf\x2f\xe5\xff\x06\xeb\x64\x5e\xcb\x76\x89\x4d\x96\xc6\xb7\xbf\xd6\x66\x95\x43\xc5\xcc\xc5\xa7\xa8\x98\xd9\x41\xfa\x19\x5e\x1e\xc1\x80\x6c\x96\xe5\xf2\x57\x13\x9b\x73\x00\x75\x15\xc5\x7d\x72\xab\x7a\x57\x28\x9c\x59\xb8\x54\x97\x63\x96\xea\x31\xc4\xfd\x98\x6c\x10\x0e\xb1\xbf\x7e\x36\x5b\x6e\x6c\x66\x61\x18\x1b\xb4\x31\x25\x5d\x8b\x29\xf8\x23\x06\x1f\x68\xc7\x4e\x18\x81\x3f\x86\x88\x1a\x70\x30\xe6\xe7\xde\x51\xb9\xee\x2a\x9b\x02\xe2\x53\x22\xfd\x8e\x97\x34\xc1\xdf\x53\x53\xd3\x7d\x46\x3e\x0c\xc2\xbf\x47\x8d\xe4\xb6\x2c\x77\xb7\x4f\x07\x38\x15\x26\x79\xf7\x64\xf9\x99\x12\xbe\xed\xd5\x60\xa4\xe0\x94\x0b\x9b\xeb\x65\x1f\xb1\x5e\xfb\xce\xf5\x9a\x52\x0f\xdf\xc7\x36\x87\x26\x10\xa7\x39\xad\x81\x78\x6c\x83\xfa\x5a\x7a\x88\x1e\xd4\x8f\x6d\x11\x2c\x79\xee\x10\x95\xd6\xe3\xd4\xf6\x6c\x8b\xf3\x78\x3f\xe6\x3d\xeb\x8d\xe5\xfd\x05\x9f\xf7\x2e\xa8\xac\x11\xae\xe8\xbc\x7f\xc5\x8a\x79\xbc\x64\xf3\xbe\x25\x81\x51\x05\x6b\x32\x8f\xe7\x7c\x4a\xae\x72\xd5\x56\x94\xac\x3c\x48\x43\x82\x6d\xc4\x7c\xd6\x5b\x63\xf7\x58\xfb\xd5\x73\x47\xda\x3b\x41\x4a\x7c\x36\x07\x49\xb9\x23\x1a\xa1\x37\x10\xb2\x9f\x7b\x7f\xcb\x52\x09\x96\xa1\x5d\x1a\x87\x1b\xe8\xa9\x6d\xa3\x56\x1c\x02\x71\xb2\x6e\xf5\x37\x45\x72\x69\xbf\x4e\x19\x81\x63\x3d\x7d\x54\x6b\xa1\xa7\xf2\x63\xc7\xe1\xba\xb6\x3f\xb6\x45\x92\xcf\x5f\x76\xca\x50\xac\xb5\xff\x49\xbb\xf2\xc4\x41\x6c\xc6\xd0\x66\xbd\xe9\x6b\x03\xdf\xec\xc9\x76\xe4\xe3\xbb\xa7\xe6\xbe\xaa\xeb\x74\xff\x5e\x89\x9e\x16\xe6\xc9\xea\xf3\xd1\x17\xe7\x88\xeb\xf1\xcf\x5d\x55\x57\x26\xd3\xcd\x8a\xef\x76\xbc\x21\x0b\xa5\x0b\x58\xa8\xc8\x48\xa3\xb1\xf8\x17\xc9\x78\xa8\xc6\x69\x59\xab\x9a\x8f\xb0\x32\xfe\xac\x34\x09\x10\x25\x7b\x85\xa2\x6f\xc8\x83\xd5\x82\xc4\x4c\x35\x9b\x56\x2e\xb1\x90\x1d\xdf\x6c\x20\x72\xd5\x2e\x65\xd5\x90\x7d\x5b\xa1\x1f\x1a\x4a\xf2\xf0\x64\x87\xdf\x3c\xe1\x2f\x3f\xec\x59\x59\x40\xf1\xd3\x46\xec\xbe\xcd\xbf\x6a\x59\x59\x75\x57\xe4\xbb\x6a\xc5\x6b\x2a\xc8\x6f\x69\x5d\xd3\xcd\x56\xa1\x1d\xbe\xfa\xf3\xb7\x3f\x90\xaf\x5e\xbd\x42\x33\x18\xdb\x2d\x25\x6f\x63\x62\xcf\x1b\x61\x94\xdd\xe3\x13\xf0\x86\xfe\x57\x81\x8b\x41\x26\x05\xc3\x10\xf4\xf4\x00\xfc\x73\x34\x6a\x70\xb7\x80\xe7\x60\x05\xca\x36\xf8\x27\x14\x82\x7f\xf1\xe5\xdf\xd8\x0a\x3d\x63\x6e\xab\x92\xf1\xd3\xe2\x32\xc2\x88\xc4\x24\x96\x8a\x59\x80\x44\xee\x85\xd0\x35\xc2\xa0\x4e\x21\x29\x44\x93\xa1\x62\xcf\x56\x92\x15\x76\x15\x07\x12\xe9\x2d\xa1\x08\xa7\xbf\x50\x71\x7f\x45\x9a\x6e\x7b\xd6\x5f\x6a\x4a\x2e\xf0\xa5\x30\xd0\xd8\x71\x5c\x63\x16\x27\x3e\x2a\xf8\xce\xc3\xd0\x78\xdf\x2c\x8f\x83\x85\x8e\x46\x56\x4a\x41\x17\xb9\x56\x8c\x3d\x6b\x57\xac\xe9\xe8\x86\x9d\x41\x82\x41\x76\x36\xd4\xf4\x74\x70\x45\x27\x93\xb7\xa3\x1c\x83\x94\x95\xec\x1e\x13\x29\x76\x2a\xf9\x18\x2a\x61\x30\xf9\x02\xfa\x16\xa1\x67\x92\xcd\x5f\x06\x6e\x47\xd6\x53\x89\xa3\xdd\xe9\x5f\x2b\x69\xad\x9c\x83\x65\xd1\x2d\xbf\x73\x93\x85\x3e\xa4\x72\xd5\xa6\x78\x75\xd0\x0c\x82\x95\xf7\x34\xa3\x0a\x0c\xb7\xd4\xf2\xbb\xa2\x65\xb7\xac\x15\x2c\x3b\x20\x53\x60\xec\xc0\x4c\x85\xdc\xc0\x72\x2d\x26\xdb\xbc\x6b\xe9\x3e\x9c\xaa\xc5\x63\x1d\x31\xa8\x86\x3b\x4d\x78\x0d\xa8\x2f\xc3\x4d\xc8\x62\xe1\xac\xec\x18\x4e\x58\xa0\xb5\x14\x95\xfc\xc9\x58\x48\xdb\x11\xf5\x41\x41\x3f\xf7\xe7\x82\xa0\xbc\xf3\xb1\xb5\x2f\x52\xb5\x2f\x46\xd4\xc6\x34\x13\xaa\xf7\x87\x20\xf5\xc4\xf8\xfa\x17\xa9\xfa\x17\x19\x52\x08\x5c\x49\x9c\xc6\x3a\xda\xa2\x7e\x21\x8d\xaf\x8b\xdf\x53\x83\xca\x36\xc9\x9a\x52\x0d\x2d\x0b\xd9\x7b\x5a\x83\xca\x85\x31\xd5\xa0\xfa\x74\x52\x73\x1a\x0c\xf6\x61\x00\x9c\xfc\xb4\x56\x29\xe6\xa7\xcd\xb7\xaa\x0a\xa4\xf7\xc7\x71\x05\x8d\xf7\x86\x3c\xe4\xd0\xd9\x93\x43\x4c\xb6\xa5\x37\x25\xd9\x56\x6e\x47\x92\x2d\xe9\xdd\x08\x5b\xea\xd9\x8a\x64\x3b\xc6\x88\x13\xb4\x93\x36\xee\xf4\xaf\x53\xcb\xba\xd5\x36\x1a\x91\xfe\xbd\x6f\xc9\x7b\x0e\x84\x57\x60\xe4\xaa\xf7\x1c\x86\x54\x73\xfd\x0b\xdf\x73\x10\x82\xc6\x06\xd7\xbe\xe7\x10\x04\x4d\x0d\x1f\x81\x4c\x8b\xf6\x00\x24\x5b\x4c\x93\x7f\xff\x4e\xe0\xf6\xc5\x0d\x8e\xd8\x57\xc1\xea\xb5\x33\x36\x79\x2b\xb8\xdb\x20\x3f\x5f\xe5\x2f\x8b\x54\x1b\xd1\x69\xc4\x36\x46\x91\x85\xdf\x52\x74\x16\x9d\x96\xfa\x29\xc2\x6f\x27\x3a\x89\xd8\xce\x20\x31\xf8\xad\x44\xe7\x10\x5b\x19\x71\x0c\xc3\xf5\x09\x4e\x21\xb6\x93\xd9\xac\xa7\x88\xc1\xff\x42\x42\x2b\xa7\x0e\x41\xa3\xa2\xfc\xc1\x8d\x4c\xca\x5c\xf7\x5e\x35\xa5\x4e\xf4\xd2\x45\x8f\xa9\xd7\xf0\x86\x39\xdd\xc1\x9f\x6f\x7f\x17\xac\x7a\xe2\x20\x58\x5b\x20\xdc\xbb\x56\x58\x3b\x3f\x79\x4a\x0a\xe7\xf7\x9c\xa2\xe2\x6d\x8d\x4a\xeb\x15\xf4\x90\x4c\xf2\x2e\x77\x3c\x56\xf9\xf0\x56\x07\x03\xd6\x71\x50\xa1\x69\xc5\x99\x1a\x9e\x49\xe9\x27\x47\xa8\xff\xd0\x23\xd4\x7f\xcb\x11\xea\x7f\xcb\x41\x5a\x1d\x84\xad\x1f\x8f\x53\xe5\x0f\xe4\x6d\xb7\xa5\x4d\x09\x9a\x1b\x48\x0a\xe1\x40\xe3\xf6\xe7\xd4\xf1\xdc\x97\x7b\x21\xe2\x74\xf5\x37\x4e\x2f\x1e\x2c\x6a\xa2\xa3\x53\x9d\xa3\xd3\x7d\x89\xae\x5a\xdd\x1c\xed\x94\xfe\x43\x41\xfc\x09\x72\x66\x3b\xc5\x42\x93\x58\x85\x83\x1f\x52\x0a\x9c\xa8\x5b\xa7\x68\xe8\x1e\xf8\x6a\xd5\x32\xd6\xb4\x10\x38\x6d\xed\x20\xa2\x2d\x78\x53\x1f\x03\x96\xa3\x7e\x75\x22\x1b\xd5\x2f\xe8\x6d\x60\x11\xed\xc3\x1a\xf6\xfb\x99\x67\xc8\x86\x98\x54\xa5\x0a\x33\x39\x4c\x30\xdc\x58\x5e\xdb\xde\xa8\x30\x21\xa5\x4d\x65\x79\x77\x77\x37\xa3\x17\x17\xc7\x7d\xcb\xff\xc6\x56\x1d\xe4\x59\xd8\x73\xd1\x89\xf3\x17\xf3\x8b\x0f\x8b\xf9\x45\x71\x71\x51\x40\xf6\x42\x5e\x6c\xab\x92\xe9\x8b\x37\xd1\xd4\x4d\xd5\x75\xc7\x4d\xd5\xd2\x43\xc9\x6a\x68\xe8\xc5\xfc\xe2\xe3\xf3\x8b\xf9\xf9\xc5\x87\xe7\x2b\x21\xb0\x3e\x6d\xca\x42\x30\x76\x73\xee\x78\x2c\x98\x15\xe9\xf5\x70\xd5\x2a\xb3\x20\x27\xc2\x85\xef\x68\xaa\xf7\x4f\x03\x6d\x14\xf2\x3b\x40\x43\x56\x18\xa5\x35\x3e\xb1\xc4\xe5\xc7\x9f\x7e\x9c\x8d\x54\x45\xaf\x69\xf9\x06\x3f\x9b\x4f\x89\xfa\xff\x49\x0a\xc4\xd1\x64\x38\x49\xa5\x33\xff\xb3\x00\xce\xb4\xe2\xcd\xdf\x0e\x0d\x46\x7b\x43\xec\x82\xa1\x1d\xc8\xef\x93\xd8\x5f\x4c\x19\xde\xbd\x27\x30\xeb\x16\x2b\x67\x56\xdd\x2c\xd8\xfa\x80\x49\x75\x5f\x3f\x7b\x75\x53\xed\x65\x23\x3b\x8a\xdd\x00\x0a\xea\x33\x52\x57\xcd\x8d\xb8\x26\xc2\xc9\x2c\x2e\x49\xe1\xee\x43\x48\x68\xfa\xc3\x9f\x60\xfb\xcf\xbf\xfb\xfe\x87\xaf\x8b\x1f\xbf\xfa\xe2\xb7\x2f\xe6\xc5\x0f\x5f\x7f\xf5\xbb\x57\x85\xfc\x79\xfe\xd9\xfc\xf2\xfc\xb7\x17\x56\xdf\xa4\x14\xc7\xbf\xfb\xe1\x0f\xbf\xbf\x24\x5f\xf2\xaa\x66\xed\xbe\x86\xc8\xaa\x70\x8b\x5d\x12\xd6\x1e\xbb\x4e\x80\xe4\xbb\x57\x18\x97\x95\x38\xa5\xb4\xab\x56\xbe\xee\xd4\x71\xf0\xd7\xb4\xe0\xfc\x64\x37\x0d\x42\x77\x6b\x66\x9c\x7f\xe5\xbe\xb9\xc1\x01\x19\xc8\xcd\x27\xb8\xad\x99\x04\x06\x60\xf2\x75\x52\x8f\x7b\xd9\x0d\x22\x7b\x31\x7e\xc9\xd7\xc9\x54\x00\x53\x56\xb6\x1f\xdf\x82\xe5\x56\x03\x19\xc0\xaf\x98\x12\x0b\x1e\x79\xd7\xfd\x88\x71\x24\x8d\x4e\x40\xe4\xdc\xc7\xfb\x96\xef\xa7\xe4\x39\x5d\x2e\x5b\x76\x2b\xa9\xff\x4c\xed\xe8\xdd\xd4\xec\xe4\x76\xe2\xd9\x3d\x44\xf5\x13\x9b\x92\xe7\x35\x6b\x36\xdd\x16\x2e\x4a\xf9\x8b\x35\x7e\xbc\xf3\xa0\x9a\x03\x8b\x8d\xfc\x26\x2f\x49\x79\x67\xb6\x7c\xff\xe6\xca\xd4\xcc\x88\x3c\xaf\x9b\xd9\xee\xae\xb8\x98\xcf\xfd\x14\x0d\xe0\x0a\x1f\xae\xde\x6e\xeb\x14\x74\x95\xf6\xf1\x13\xe4\xfc\x9c\xfc\x0f\x95\x25\xc5\x55\xc1\x6e\x59\xbd\x57\x28\x3d\xb3\x5d\xd5\x14\xb7\xa6\xeb\xaa\x29\xdc\xac\x74\x71\xdf\xb2\xf4\xd6\x29\xed\xa5\xac\x4b\xf8\x50\x98\xa6\x7b\x9b\x35\x4d\xf6\x36\xf7\x48\x42\xf8\x03\xc6\x11\x49\x4a\xf8\xa3\xce\x4e\xfc\x2f\x67\x2e\x8c\x49\x56\xdf\x2f\xbb\xa9\xbd\x79\xf6\x8e\xa3\x60\x9e\x70\x21\xd8\xc7\x31\x37\x7a\xe4\xeb\x59\x1e\x4f\xa0\xe3\xa8\xa1\x2e\x6e\x69\x9a\x2c\x78\x4c\x75\x69\x4b\x12\xd3\xbb\x72\x5e\x8a\x47\x60\x0b\xa7\x87\xd2\x8e\x1d\xca\xfd\xe8\xa1\x68\xc7\xa7\xd3\x07\xb3\x7c\xfb\xeb\x62\x9c\xa6\x4e\x1f\x4d\xfd\xf6\x97\x46\x39\x5c\x8d\x1a\xcb\x9b\x00\x69\xeb\xfc\x9c\x7c\xc7\x36\x60\xb9\x55\x02\x94\x20\x67\x6c\xb6\x99\x4d\x35\x98\xf6\x6c\xb7\x2c\x9a\x0b\x44\xd3\xd6\x25\x6f\x59\x2b\x54\xf6\x49\xf8\x7e\xb1\x98\x78\x87\x67\xc4\x19\xf8\x8f\x6a\x4d\x5e\x3f\xd3\x33\x7b\xfd\x8c\xfc\xdb\xaf\xc9\xeb\x67\xf3\xd7\xcf\xbc\x63\xb2\x73\xde\xb3\xce\xf1\x30\xa2\xde\xd0\xe9\xd8\x75\x89\x06\xdc\xf5\xde\x1d\x93\x3d\xb8\xeb\xec\xc2\x42\x16\xa3\x77\x7c\xd7\x0e\xf5\x7c\x3f\xb6\x67\x8d\x51\x32\xbe\xef\xe5\x5b\x9b\xb5\xa6\xf4\x13\x3a\xaf\xdf\xda\xc4\x35\x34\xe1\x63\x29\xfb\x15\xdf\x31\x22\xf6\x6c\x55\xd1\x5a\x47\xb7\x1e\xba\xaa\x16\x3a\xf1\x57\xa0\x22\xb4\x84\x95\x55\x0d\xba\x04\x25\x0b\xe9\x60\x09\x77\x45\x2d\xb2\x5b\x48\x3e\x61\xb3\x8e\x59\x38\x20\x19\xaf\xed\xfb\x81\xb6\x5b\x2b\x0b\xf7\xb4\xbe\x7c\xe4\xc8\x35\x09\x0c\x34\x5f\x3f\x72\xf0\xb8\xc9\x3d\x8d\x47\x2f\x6f\x54\x29\x42\xe0\x77\x73\x63\x9f\xde\xfa\xe7\x42\xfe\x9c\x0e\x0e\x1c\xe7\xc7\x11\x20\x26\xf6\xbb\x75\x44\x38\x2c\xe7\xe7\xe4\x3f\x0f\x02\xa4\x9b\x15\x15\x8c\x2c\x52\x69\xa9\x81\x9d\x02\x46\x7d\x43\xa8\x02\xc9\xd7\x43\xcc\xa4\x9d\x4e\x43\x70\xaa\xd4\xeb\x64\x79\xd8\xac\xab\xfb\xa9\xf7\xbc\x13\x1d\x5d\xdd\xe8\x57\x11\x3c\x7b\xff\x7e\x60\x02\x74\x4d\xe7\x17\x1f\x7f\xf6\xd1\x27\x9f\x7d\xfc\xc9\x79\xc5\x2e\xe6\x0a\x81\x62\x2f\xd8\xa1\xe4\x05\x84\xcd\x17\x90\x17\xb3\x2b\xee\x78\x7b\x53\xc8\xf7\x29\x3f\x74\x45\xe8\xc0\x9d\x8b\xca\x00\x58\x86\xf0\x8d\xfc\xe6\xa9\xce\x69\x3f\xb0\x7b\xe3\x2e\x35\x83\x28\x96\x1d\x6f\x38\x66\x48\x7d\xe8\xc9\x6c\x61\x4b\xa5\xc4\xf5\x2f\xb4\x63\x84\x6d\x56\x59\xf0\x08\x79\xf0\xe2\x51\xf5\xcf\xa1\x2c\x0d\x65\x8c\x6d\xfc\x21\xf5\xbc\x4c\xd7\x31\x16\xf5\x87\x94\x02\x21\x5d\xa7\x6b\x0f\x0d\xa0\xad\x3d\x38\x41\xcb\xee\x87\xb3\x89\x9d\xdb\x9f\xac\xb7\x16\x75\xa7\xf9\x2f\xa3\x41\x97\x33\x0b\x15\xe8\xc1\xae\x64\xd5\xe8\x7e\x5d\xe5\x48\xef\xd7\xcd\xeb\xd2\xfd\xca\xca\xa4\xf2\x90\x08\x4f\xce\xbf\x2f\x25\xc5\xea\x98\x4b\xe5\xad\xa3\x37\xb1\xe6\x77\xac\x05\xe6\xa0\xdb\x74\xa2\x33\xed\xc7\x24\x01\x40\x9e\xed\x5c\x5d\xfb\x31\x59\x77\x45\xf7\x55\x47\xeb\xea\x27\x96\xa8\xeb\x7c\x4c\x9d\x93\x1f\x31\xa6\x5e\x3e\xea\xa0\xd8\x0a\x5f\xb3\x6e\x36\x97\xda\x04\x2b\xe4\x33\xbe\xd4\xa9\x25\x8f\x5b\x81\xd5\x1e\x68\x25\x5e\xfc\x59\x9c\x5b\xa6\x7f\x34\x99\xd3\xe9\x16\x59\xf2\xba\x24\x03\x93\x82\x32\x43\x8d\xa0\xe5\xb6\xbf\x91\xdc\x94\x70\xc5\x5d\x8f\x17\x27\xd3\x8e\xfa\x98\xda\x34\x27\x38\x0f\x23\x09\x2c\x0d\xaa\x00\x80\xff\x8f\xb6\x6b\xe9\x8d\xdb\x06\xc2\x7f\x85\x75\x8b\x20\xeb\x7a\x57\xeb\x1a\xbe\xac\xe1\x4b\x9b\x00\x0d\xd0\x43\x80\xb8\xed\x21\x76\x2b\x4a\xe2\x4a\xac\xb5\x22\x4d\x6a\x13\x2b\x80\xff\x7b\xc1\xe1\x5b\xe2\x3e\x5c\xbb\xbe\x78\x21\x89\x43\x72\xf8\x9e\xe1\xf7\x0d\xda\x79\xed\xff\xd9\xf8\x84\x78\x3e\x22\x1b\xde\x60\x49\x65\x08\x41\x82\x17\x87\x11\x51\x0b\x03\x71\xac\x86\xa0\x7c\x9e\xc7\x33\xdd\xb7\x37\xdb\x9e\x54\xc1\xf7\xc1\xc3\xa9\x91\x44\x67\xd0\xe2\xf2\x7e\x7e\xb9\xf4\x89\x62\x3a\xa1\xcb\xd9\x8e\xa9\x1e\xe6\xea\x69\x3a\x78\x9e\x4c\xa7\xad\x22\x54\x96\x3e\xf3\x86\x56\x24\xa5\xb6\x06\xae\x1c\x8e\xa1\x7a\x09\xf5\x78\xde\x29\x6b\xd6\x4b\xd2\x51\xed\xac\xbc\x9a\x6f\x0d\x40\x39\x08\x4c\xe4\xe3\xc9\x44\x09\xb3\x0c\xbd\xb3\xd0\xbc\x4a\xd3\x90\x42\xf0\x1c\x89\xb4\xe5\x3c\x88\xb5\xad\x36\x29\x98\x6a\x4e\xea\x1d\xa1\x6a\xc6\xa2\x7f\x97\xa4\xb2\x8c\xa4\x70\xa4\x74\x4e\x3a\x95\x32\x07\xb3\xf6\x87\xf7\xe8\x0d\x7a\x5f\xd5\x04\xfd\x46\x6a\x5c\x0e\x7e\x92\x05\x26\x5e\x5f\x31\x1d\xfa\xc7\x35\x8d\x89\xee\x93\xb6\x6c\xa9\x1d\x05\xb2\x0b\xa7\x11\xf6\xb0\xa5\x82\xc8\x08\xf6\x8e\x98\xd0\xd7\x8d\x75\x50\x68\xc0\x9f\xc1\x16\xc6\x5a\xb6\xb4\xc1\x7b\xb4\x0c\x6b\xe5\x26\x3d\x09\xf0\xa5\x7f\x43\xda\x96\x72\x49\xe5\x1e\x57\xc2\x7f\x37\xc6\xdd\x0c\x9c\xd5\x02\xf3\x66\x18\x17\x75\x32\x42\x5f\x0a\x19\x3d\x8c\xc9\xd5\x58\x47\x9d\xef\x37\xb3\x53\x37\x9b\x4f\x0d\xaa\x9d\xfb\xfb\xb7\xe8\xbb\x6b\xb4\xb4\xa2\xf1\x34\xb7\xc3\xc8\x5d\x57\xa2\x11\x60\xf7\xd8\x12\xcc\x52\x27\xce\xa7\xa3\xe0\xbd\x79\x5a\xc3\xb3\xfc\x79\x08\x5f\x73\x4d\xff\xd3\x27\x04\x84\x5a\x48\x10\xc7\xae\x1d\xb7\x65\x7a\xda\x08\x9b\xeb\x00\x63\x42\xb8\x61\xee\xd8\x7c\x43\xa5\xa4\x5d\x3d\xaf\x49\x47\x04\x2d\xed\x9b\x7b\x32\xa8\x01\x6c\x83\xba\xad\xd0\x32\x5b\x22\x1c\x92\xbb\x8c\xd9\x3f\xd2\xf1\xd3\xf6\x22\x41\x27\x9e\xb3\x03\x5a\x86\xba\x07\x9a\x3d\xff\xbf\x00\xc1\xe6\x1c\xf2\x87\x23\x86\x05\x63\x02\xc0\x3c\xdc\xb9\xc4\xb8\x9e\xb4\xce\x43\x0a\x59\xfb\x22\x01\xf0\xa1\xdd\xce\x54\x7a\xd2\x78\x31\xc4\xe7\xcc\xc5\xe1\x57\x8f\x1f\xb6\xb8\xa5\xeb\x01\xee\xbc\x0f\x9c\xd8\x4b\x03\x6c\x2b\xca\xc0\xb9\x1b\x78\x4b\x9b\xcb\x82\x67\x1b\x4c\xbb\x45\x29\x65\x56\xb4\xac\xc8\x36\x58\xf6\x44\x64\x52\x94\xd9\xdf\x80\x42\x51\xaf\x8c\xa4\xeb\x57\xfb\x03\x71\x1f\x01\x13\xa3\xef\xb6\x6b\xaa\xe5\x0f\x30\x39\x57\x3e\x86\x1b\xb0\x4d\x7b\x77\xcb\xaf\x37\x37\x1f\x91\x20\x70\xda\x05\x56\xef\xc8\xe3\xc9\x1b\x4e\x49\x05\x15\xab\x48\x8b\x87\x79\xcb\xb0\x26\x16\x67\x5b\x61\x20\x35\xaa\x9e\xaf\x5e\x97\x31\x99\x07\xb5\x7b\x38\x19\xd1\x76\x04\x18\x20\x84\x4e\x8d\x1d\xe5\x74\x14\x4b\xec\x74\x12\x21\x01\xb0\x99\xc6\xa1\xad\x8d\x5e\x6b\x5a\x5e\x01\x88\x0b\xae\xfd\x6f\x7b\x94\xc3\x60\xcb\x61\x13\x9f\xfb\x31\x98\x7b\x11\x6e\xb7\xa5\xf6\x40\xe3\x75\xfa\x67\x78\x08\xc5\x93\x68\x0d\x1d\xc0\x05\x79\x19\x0f\xf3\xd4\xd4\x99\x65\x21\xa9\xc0\x4e\xec\xb7\x8d\xb2\xf0\x78\x40\xa0\xb3\xf4\x61\xaf\x84\x37\x9a\x8a\xb8\xe8\xbb\x68\x1d\x98\x6c\x8d\xb6\x5d\x45\x84\xea\x44\x57\x7b\xcc\x87\xfb\xd4\x19\x33\x0d\xda\xd1\xa5\xb4\x6c\x93\xe3\xcf\x8d\x20\xeb\xbb\x51\x3b\x65\x59\x64\xc7\x41\x6f\x6f\x4f\x10\xee\x7b\xf1\x56\x7d\x3c\x43\xb7\x27\xb3\xc0\xb4\xe3\x6b\x58\x14\xe2\x73\x4f\xfb\x96\xdc\x4d\xda\x3d\x29\x0d\xbe\x8d\xc5\xbd\x5e\xcd\x9c\x98\x77\xc0\x11\x08\xa1\xcb\xe1\x76\x01\xea\x1b\x0c\xb4\x70\x68\x2d\x70\x0d\xd2\x68\x45\xba\x9e\xae\x29\x11\xf2\xcc\xa5\xd3\x0c\xf9\x90\x53\xfe\x0f\xfe\x82\x65\x29\x28\xef\x57\x39\xd2\x16\x28\xb5\xc5\xea\x59\xc9\x5a\x9f\x61\xac\xd4\xbf\xae\x6f\x4f\xbe\xbf\x3d\xb1\xba\x38\x9b\xbe\x0d\xa4\xfa\xef\x82\x36\x48\x9b\xd2\x9c\x8a\x78\x88\x0f\x8a\x76\x64\x5c\xad\x24\x23\xeb\x4c\x64\x08\xe5\x6e\x88\xc2\x96\xf1\x61\xcb\xfa\x28\x68\xdd\x1e\x7e\x81\x5a\xe0\x61\x7e\xb9\xd4\x6c\x8e\xbe\x89\x4a\x0d\xee\x29\x59\x45\xae\xd0\x56\x02\x8e\x30\x4a\x9f\x87\x9b\xe7\x73\xfe\xe8\x81\x4d\xb5\x89\x14\x3a\xa7\x9d\xa4\x15\x59\xe9\xe9\x72\xdc\x21\x7a\xab\x41\xba\xa9\x43\x58\xd4\x71\xa9\xb9\x49\xdc\xfc\x64\x7f\x5c\x78\x21\x4c\xf0\x06\x77\x72\x85\x2e\xdc\x40\xfb\x4a\x2b\xf6\x35\x78\xe2\x04\x25\x05\x04\xa5\x80\x36\xdc\x51\x88\x64\x9f\x46\x65\x83\xbb\x9a\x48\x1d\x4d\x21\xf4\x0b\xc0\x07\x03\x84\x14\xfd\x46\x60\x3a\x74\x8e\x78\x7d\x73\xe6\x9e\xe8\x79\x4e\xd3\x88\x32\x49\x04\xc2\xa5\x60\x52\xa2\x42\x53\x0c\xc9\x85\x93\xf6\xa7\x25\xcb\x54\x07\x0f\xe3\x65\x00\xd7\x59\x41\x4a\xac\xfa\x39\xed\xf5\xe1\x47\xa2\x5c\xe5\x07\xe0\xcf\x5f\x1a\xc1\x36\x64\xa1\x12\xe3\x56\x32\x27\x4c\x4b\x52\xa9\x72\xdf\xc3\x72\xc4\x3a\x9b\x16\xcb\x40\x9e\x17\x64\xdc\x6f\x4a\x5d\x5e\x79\x2a\xc5\x0a\xfd\xa0\x57\x1a\xd0\xa4\x7a\x12\xf7\x57\x1f\x76\x03\x6c\xf2\xfe\x3e\x82\x49\x06\xe7\x6e\xaf\x9d\x9d\xf6\x7f\x77\xee\x7b\xa1\xb0\x44\x7b\x96\x6c\xc3\x59\x67\xe9\xab\x11\x5a\x74\xf8\x4b\x81\x83\x8c\xa6\xec\xff\xbe\x5c\x05\xae\xea\x63\x07\x20\xac\x7a\xe3\xa2\x2c\x7a\x7f\x3f\x2f\x66\x5b\x68\x31\x97\x04\xc0\x58\xf0\x2b\xae\x8e\x5b\x19\x2b\xe7\xfb\xea\x9b\x70\x4d\x3a\x8e\x4d\x25\xbd\x38\xe9\x32\x19\xbe\x2e\x4b\x99\xa0\xb3\xf0\xb9\x55\x51\x6e\xa6\xde\xe7\xfc\x31\x9a\x6e\x2e\x96\xcb\x67\x64\xa8\x8e\x48\xe1\xca\x13\x1e\xb1\xc3\x3a\x87\xa5\x08\xaa\xaf\xa6\xa8\xf0\x1d\xf4\xbd\x1f\xcd\xff\x49\x61\x7d\x4c\xec\xa0\xb2\x11\x01\xf7\xae\x72\xa2\x05\xe4\xa5\x8b\x1b\x6a\x7d\x52\xe2\xe7\xe5\x77\xe4\x74\x43\xba\x2a\x70\x78\xdc\x3d\xfd\x1b\x00\x00\xff\xff\x93\xc0\x6a\x54\x01\xfd\x09\x00"), }, "/static/lib/elm-datepicker": &vfsgen۰DirInfo{ name: "elm-datepicker", @@ -150,9 +150,9 @@ var Assets = func() http.FileSystem { "/static/script.js": &vfsgen۰CompressedFileInfo{ name: "script.js", modTime: time.Date(1970, 1, 1, 0, 0, 1, 0, time.UTC), - uncompressedSize: 111077, + uncompressedSize: 110990, - compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xdc\xbd\x0b\x7b\xdb\xb8\xae\x28\xfa\x57\x1c\xed\x6c\x2f\x72\x0c\xab\x76\x5e\x6d\xe5\x70\xf9\xa6\xef\xf7\x23\x49\x3b\x99\x66\x72\x72\x28\x99\x76\xd4\xd8\x94\x4b\x51\x71\xd2\xd8\xfb\x6f\xdc\x1f\x74\xff\xd8\xfd\x08\xea\xed\xc7\x74\xf6\x5e\xfb\x9c\x73\xef\x5a\xf3\xa5\xb2\x04\x82\x20\x09\x82\x00\x08\x82\x5b\xc3\x44\x06\x3a\x8c\x24\x91\xf4\xde\x49\x62\xd1\x88\xb5\x0a\x03\xed\xf4\xb2\x0f\x0d\x45\x24\x28\xd0\xf4\x5e\x09\x9d\x28\xd9\xd0\x2e\x67\x12\xb4\x3b\x64\x0a\xf4\x22\x07\x1b\x93\x02\x44\x91\x1d\xd0\x90\xa3\x56\xf9\x87\x72\x6d\x19\x3a\xa2\x40\xd2\xc5\x82\x16\xa8\x06\x44\x94\x50\xed\x82\x28\x50\xe9\x65\x54\x1b\xb1\x0b\xa2\xc1\xe2\x2f\x57\xa0\x49\x52\xaa\x60\x0f\x92\xa2\x02\xb1\x8c\xed\xef\xd6\x99\x10\x01\x79\xad\xe5\x6a\x03\xc2\x4b\xd5\xee\x03\x2f\xaa\x4d\x96\x11\xfe\x0b\x28\xe1\x24\x81\x32\x2d\x65\x62\x04\x09\x4a\xc4\x1c\x40\x50\x10\xc3\x97\x71\xfe\xf7\xd0\x17\x10\x0e\x35\x0a\xcb\x24\x26\x24\x2a\x91\xf8\x10\xa2\x82\xc4\x60\x19\xed\xff\x32\xaa\x23\x12\xc0\x32\xdd\x65\xc2\x39\x09\x4b\x84\x3f\x82\xb0\x20\x3c\x5a\xc6\xfc\xbf\xb3\x2d\x21\x89\x60\x65\x6b\xca\xcd\x89\xc8\xb0\xd4\x9c\xc7\x30\x2c\x9a\x13\x2e\x23\xff\x3f\xac\x85\x43\x12\xc2\xba\x36\x96\x1b\x39\xab\x89\xb9\x1d\xc6\x98\x74\x79\x5f\xba\x43\x62\xde\x7b\xa6\x1e\xa2\x4b\x25\xee\x6c\x09\x28\x88\xdc\xad\x96\x01\x91\x97\x22\xa2\x54\xf0\x36\x2b\x08\x45\x93\xf7\xea\x45\x21\x29\x17\x26\x49\xa9\xfc\x4d\x51\x1e\x8a\x7e\xdc\x5f\xc6\x00\xbc\x86\x83\xf0\x12\x9a\x61\x19\x0d\x14\x63\x74\xb0\x0a\x11\x04\xcb\xa8\x48\x50\xc2\xe6\x57\xb1\x41\xc1\x06\x0f\x57\xe3\x83\x68\x25\x46\x12\x95\x90\xc6\x75\xa4\x50\x30\xdc\xa3\x75\x68\x21\x5c\x87\x98\x84\x74\x71\xc3\x55\x23\x64\x03\x52\xb0\x8a\x1d\xf6\x61\xa4\x88\xf9\x26\xd8\x91\x52\xfc\x8e\x48\x0a\x09\xeb\xf4\x92\x43\xd9\x4b\x5a\x2d\x2a\xce\x93\x0b\xa6\x89\x6a\x25\xb4\x97\xad\x2d\x0b\x0a\xdb\x6c\x5c\xc1\x54\xe0\xd1\x05\x1e\xc1\x3a\x3d\x71\x28\x9b\x4d\xe5\xfa\x3d\xd1\x6a\x51\x7d\x2e\x2e\x98\x72\x39\x28\x66\x5e\xe5\x0b\xeb\x58\xc8\x91\xbe\x62\x02\x2e\xcd\xb2\x45\x17\x14\x26\x8c\xd4\x2b\xc8\x26\xe2\xb9\xbc\x58\x50\xd8\xd4\x90\x0c\x21\x24\x29\x2d\x82\x02\x67\x9d\x1e\x3f\x14\x3d\xde\x6a\xd1\xe4\x9c\x5f\x30\x7d\xce\x2f\x32\x0a\x92\x73\x79\xc1\x14\x24\x0b\x0a\xeb\x9b\xa5\x32\xac\x59\x4f\xe9\x56\x37\xeb\x2b\x5d\xf4\x95\x3a\x4f\x72\xbc\xe2\x5c\x5f\x30\x09\xe2\xd7\xe9\x35\xc8\x04\x22\x53\xcc\xcc\x4c\x7d\x9e\x5c\x80\xca\xbb\x5e\xfd\x22\xa6\x76\xb7\xd7\x39\x64\xa2\x27\xda\xed\x1c\x91\xa8\x21\xa2\xbd\xbf\xd3\xd6\x15\x2d\x95\xc4\xb4\xb5\xc2\x16\xff\xe5\x51\x41\x69\xd4\xe2\x60\x46\x27\xc7\x9c\xac\xc4\x9c\x73\x4f\x3c\x0e\x03\x81\x2d\xf8\x0b\x0a\x54\x41\x81\x6c\x0b\xe0\x19\x1d\x2d\x92\xe4\xd4\x1d\x26\xfd\xec\xd1\x4b\x28\x85\x80\x75\x7a\xc1\xa1\xe8\x05\xad\x16\xe5\xe7\x81\x19\xdf\xe0\xa2\x67\x70\xda\x2f\x49\xf6\xa5\x25\x0c\x4f\x05\xf9\xd8\xf3\x15\xcc\x54\x1a\xc5\x35\x9f\x82\x48\xc6\xd1\x58\xb8\xe3\x68\x44\x64\xcb\xf1\x1a\x4e\xeb\x8a\x50\x0a\x6a\x41\x0b\xcd\xf4\x8a\x64\xf0\xce\x61\x28\xb5\x50\x92\x8f\xe3\x7f\x3a\x85\xf8\x98\x9a\x75\x40\x5f\xa9\x68\xd6\x78\xae\x54\xa4\x88\x73\xa5\xf5\x34\xf6\x1e\x3c\x18\x85\xfa\x2a\xf1\xdd\x20\x9a\x3c\x10\xe3\xc9\x83\x20\x52\xe2\x81\x3f\x8e\xfc\x07\x5d\xb7\xe3\x76\x1e\x5c\x85\x52\xc7\x0f\x9c\x96\x6c\x39\xee\x64\xe0\x94\x24\xd2\xa8\xc6\x22\x20\xd8\xf9\x05\x24\xec\x1a\xbb\xb9\x03\x82\xf6\x92\x66\x93\x68\x26\xdc\x69\x34\x25\x94\xf6\xcc\x37\xed\x72\xd0\xae\x8f\xdf\x4b\xc3\x99\x63\xbd\x2e\x96\x92\x70\x48\xba\x9d\xce\xa1\xa6\x19\x3b\xb9\xd3\x24\xbe\x22\x97\x58\x2f\x85\xad\x4e\x2f\x1c\x12\xc9\x18\x53\x29\x84\x7d\xe3\x44\xfe\x77\x11\x68\x67\x8b\xe9\xbb\xa9\x88\x86\x0d\x39\x9f\xcb\x64\x3c\x36\x42\x32\x7f\xca\x8a\x38\x59\xc5\x0e\xcb\xc1\x9b\xcd\x29\xd9\xa7\xb0\xd5\xed\x65\x6d\x4b\x1a\xa1\x6c\x48\x77\xfb\xb0\xd3\x6c\x12\xc9\x7c\x6d\x64\x99\x32\xff\x1a\x42\x24\x0d\x87\x64\xeb\x9a\x48\x9c\x99\xe6\x8f\x6e\x75\x4d\xf3\x52\xaa\xba\xbd\x8c\x3c\x14\xb9\x47\x6c\x4c\x46\x14\x4e\xd8\xea\x01\xdf\x1a\xa5\x8c\x5b\x8c\xee\x69\xc6\xb8\x2b\x5b\x97\x75\x0f\xf6\x44\xbf\xe3\xc9\x43\xd5\x6f\x77\xbd\xae\xe9\x8b\x2d\xe9\x6e\xa7\xdf\x89\x66\xa7\x44\x1a\x49\xeb\x72\x4a\xe7\xf3\xf4\xb7\x0f\xca\xf5\x29\xed\x6b\xcf\xfc\x0a\x40\xb9\x01\xc5\x76\xf7\xa4\xeb\xa3\x9c\x6e\x36\xb7\xaa\x65\x7b\x92\x61\x39\x23\xb1\xf3\x21\xd4\xf3\xb9\xc1\xd6\xef\x7a\xca\xf5\x4d\xfd\x1d\xbb\xc0\x3c\x5f\xd3\x4c\xdb\x28\x7a\xd8\x59\x50\xf8\xb6\x56\xb4\xa7\x40\xdd\xf5\xd3\xa3\x73\x78\x9a\x4d\xf4\xb5\x10\x2c\x03\xa1\xf0\x7d\x99\x9c\xf4\x6b\x2e\x07\x0f\x3b\xfd\x1b\xed\xa9\xfe\x40\x7b\x63\xbd\xa0\xf0\x94\x75\x8a\xa1\xb8\x2c\xa3\xbe\xe7\x9e\x04\xdf\x53\x8b\x82\x7d\xdf\x54\x65\x51\x06\x01\x81\xa7\x4b\x50\xef\x2c\x96\x6c\xda\xdc\x2f\xb0\xc7\x35\x72\x19\xb5\x4b\xc4\xb9\xbe\x28\x5e\x2a\xfb\x52\x99\x97\xb9\x6c\x35\xa5\x3f\xb0\x31\x79\x55\xe2\x94\x57\x16\xb1\xe1\x13\x63\xbd\xca\x51\x89\xad\x73\x3e\x69\xa9\x94\x35\xfc\xec\x95\xea\x59\x21\xff\xda\x0e\x72\x3a\xc2\xbd\x92\xa4\x36\xdc\x60\xdf\x52\xc1\x84\xeb\x17\xa0\xd9\xf8\x23\x3d\x67\xec\x7e\xdb\xeb\x2c\x0a\x82\x5e\x57\xfa\x6b\xdb\xeb\x42\xde\x67\x06\xfe\x23\x1b\x93\xd7\x25\xfa\x8f\x8d\x98\xca\xaa\x55\xec\x0c\x34\x93\xa9\xec\xed\xe9\x76\xbb\x47\x95\xa9\xf8\x5c\x57\x17\xae\xbc\xf8\xd7\x6a\xf1\xf3\x8b\x12\xd9\xca\x4a\x0f\xe9\xf2\x52\x49\x03\xf7\x73\xa3\x0a\x74\x7e\xd1\xc3\x39\xa0\x8d\x76\x62\x38\x1e\x34\xd3\xa6\x17\x2c\x3a\x5c\x9d\x50\xa4\xf1\x42\x9c\x1d\x1b\x1d\x97\xc2\x33\x46\x74\x0d\xb3\x11\x6b\xb9\x50\x29\xe3\x6e\x36\x45\xb5\x02\xc0\x6e\xa6\x89\xad\xe6\xae\xa8\x06\x44\xb5\xaa\xc4\x54\x15\x2c\xd5\x63\x14\xea\xac\x26\xbe\x54\x53\xb3\x99\xac\xaa\x0e\x12\x96\xb8\x3e\xe5\xb6\xd2\xdb\x6a\xa5\x90\x54\x2b\xe6\xa6\x62\xb1\xa2\x62\xa3\x89\x67\x55\x07\xab\xab\x6e\x36\xf9\xfa\xfa\x81\x33\xee\xfa\x34\xb0\x54\xdc\x2c\x53\x01\xbc\x4a\x49\x50\x9b\xfd\x1a\x0a\xa3\xe7\x98\x18\xa6\x70\xe3\x48\xe9\x75\x22\x06\xa5\x39\x8a\xf2\x05\xfe\x07\x2f\x2b\xf2\xe8\x17\xb1\xb1\x99\x81\x2c\xf3\x25\x63\x6c\xac\xfb\x1d\xcf\x3c\xdc\x68\x94\xc9\x58\xc1\x3a\x41\x25\x5b\x46\x07\x83\x17\x6b\xa5\xa1\x6c\x6f\xd0\x13\xe4\x6f\x58\xfa\xfd\xfa\xd2\x0f\x36\x95\x7e\xa0\xe6\x1d\xfc\xfc\x9e\xeb\x2b\x77\x1a\xcd\xd6\xeb\x2a\xff\x2e\x57\xe1\xf9\x77\x26\xb3\x96\x77\xcc\x52\xdb\x9f\x92\x6e\x97\x7a\x9d\x43\xd5\x6c\xca\xc3\xce\x7c\xae\xcc\xea\xd9\x39\x94\x7d\xd5\x92\x5e\xaa\x6d\x62\x65\x5c\x73\xb9\x43\x51\x04\x7d\x66\xf8\x26\x10\xe1\x18\xbe\xd8\xe7\xe1\x38\x8a\x14\x3c\xb1\x3f\x54\x94\xc8\x01\xfc\xb0\x3f\xc6\xd1\xa8\xb7\xae\x39\xcd\xe6\xa6\xc6\xce\xe7\x9b\xbe\x6e\x31\x66\x94\x2b\x43\xcf\x27\xb6\x69\xac\x7a\x7f\xeb\xe3\xaf\xe9\xd2\x76\x55\xe0\x4c\xb9\xc1\x15\x57\x4f\xa3\x81\x38\xd2\x24\xa1\x3d\x7e\xb8\xbf\xbf\xf3\xf8\x60\x3e\xdf\x3f\xd8\xed\x3e\x3e\xe4\x7d\x52\xd6\xb8\xc1\xa8\xe0\x5e\xf9\x55\x4b\x9d\x27\xad\x2e\x7e\x61\x3b\x74\x91\xab\x50\xdf\xa3\x50\x12\xc7\xa1\x1b\x0d\x9b\xf3\x0b\xa8\xe8\xc6\xd6\x06\xc9\x49\x33\x2a\x4e\xb0\x44\x61\xd2\x6a\x41\x50\xa5\x32\x98\xcf\x09\x6f\xd9\x02\x86\x42\x90\x84\x53\x23\x0a\x70\x66\xf3\x9c\x2c\x5d\x22\xab\xf7\xb7\xec\xa2\x8c\x26\x6d\x69\xd2\xbf\x4c\x93\xce\x69\xb2\xd6\x90\x59\xcb\x16\x85\x36\x8e\xa3\xff\x96\xfd\x0a\x2d\xc6\xa4\x4a\xe9\x48\x18\x1a\x55\xbc\x4a\x87\xa0\x3d\x5b\x47\xc2\xf8\x3f\xd9\xfe\xc1\xee\x4e\xa7\xd9\xdc\x7f\xb8\xbb\xb7\xfb\x4f\xc6\xfb\xfa\xbc\xdd\x16\x17\xad\xc4\x4b\xaa\x14\xc0\xef\xeb\x78\x4f\xb9\xf1\x74\x1c\x1a\xa9\xb5\xa0\xf0\xc7\x7a\x28\xec\x53\x04\x92\x92\xfd\xa2\xb5\xf4\x0b\x5c\x6b\x17\xe2\xfb\xd4\x80\x32\x6b\x71\x52\xe5\x05\x4d\x51\x31\x27\x82\x25\xf5\xe6\x26\x7d\x75\xde\x6e\xeb\x8b\x96\xf0\x0a\xfd\xb8\xb3\xc8\x14\xe5\xb4\xdf\x95\x64\xff\x32\x32\xb6\x7e\x9d\x8e\xee\x22\x27\x88\x82\x96\xeb\xf4\xf3\xad\xff\x50\x6e\x28\x07\xe2\xf6\xe3\xd0\xf6\xae\x58\x07\x6a\x04\x61\x0d\x36\x59\x0b\x9b\xe9\x39\x87\x79\x0b\x8d\xf6\x3d\xe6\xb1\x7e\x9d\x23\x60\xf9\xb7\x76\x06\xbe\xa0\xc0\x97\x71\xda\xae\xca\x55\xa7\x70\x48\xf4\x61\x37\xd3\xf6\xce\x4a\x8a\x5d\x07\x50\x0d\x69\x77\x0f\x89\x28\xd3\x8a\xd6\x59\xa6\x7d\x08\x0a\xa2\xc5\x74\x55\xe7\xc0\x91\x0a\xd6\x35\xc7\xa8\x7a\x1d\x18\x64\xba\xde\x3a\x51\x69\xc0\xba\x20\x0a\xb0\xc2\xd3\xba\x04\xb7\x0b\x43\x4f\xc2\x28\x53\x1d\x87\x9b\xaa\xde\x43\xa5\xfb\xca\x93\x8b\x94\x50\x7f\x6d\xbf\xe3\xcf\x73\x75\x61\x46\x27\xde\x30\x4f\x52\x38\xd0\x08\x39\x96\xab\x95\xbb\x3a\x30\x88\x8b\xf5\xfa\xd9\x32\x30\x24\x17\x9b\xb4\xaa\x55\x05\x80\x63\x91\x64\x65\x91\x92\x2f\xb3\x56\x08\x02\x2c\xc6\xd7\x14\x2b\x39\x2d\x97\x0a\x42\x84\x45\xa3\xb5\x45\x4b\xae\xc9\x15\x85\x21\xbc\x58\xb5\xfa\x68\x75\x97\x15\xba\x31\xaf\xde\x9c\x7c\xfc\xe0\x4e\xb9\x8a\x05\x6a\x66\x01\xd7\xc1\x55\xc9\x99\x3d\xd1\x64\x46\xae\x34\x38\xa7\x57\x61\xdc\x08\xe3\x86\x8c\x74\xe3\x86\x8f\xc3\x41\xc3\x94\xdc\x6a\x38\x2d\xe9\x4e\x44\x1c\xf3\x91\x00\x83\xc0\x28\x47\x03\xc3\x05\x37\xb2\xc4\x66\x37\x69\xed\xf1\x2c\x44\xfc\xee\x36\xbd\x0f\x78\x2c\x1a\xbb\x5e\xea\x20\xf0\xa3\x68\x2c\x78\xc9\x3f\xa0\xfa\x33\xa3\x2c\x7a\x57\x92\x38\xbc\xf1\xe4\xe3\xc7\x77\x8e\xd1\xfa\xb0\xd4\x4e\x56\x4a\x26\x13\x5f\xa8\xc2\x4a\x57\x7d\x04\x97\x8d\xd7\x1f\x4e\x0d\xb8\x47\xd4\x21\x6b\xef\x74\xf7\x1e\xee\x3d\xda\x3d\xd8\x7b\x38\x9f\x17\xcf\x87\x4c\xcd\xe7\xa4\x33\x57\xd4\x68\x22\xb4\xd9\x24\x5b\x61\xfc\x22\x94\xa1\x36\x5d\x31\x9f\xab\x7f\xef\xd2\x3a\x3a\x24\xc9\xd2\xb0\x57\xa3\x61\x0d\xe1\x2f\xde\x7d\x3c\x3a\x2d\x28\x3f\xc8\x4a\xd5\xed\xc6\xac\x94\x6a\x84\x32\xd6\x5c\x06\xe6\xe5\x09\x02\xe1\x97\x96\xe3\x64\x28\x4f\x4e\x8f\x5f\x7f\x78\x59\xe0\x7c\xec\x65\xb2\x2d\x75\xba\x98\x02\xd2\x0d\x2c\xbc\x79\x59\xc0\xee\x67\xb0\xa5\x96\x3c\xcc\xde\xa1\x96\xe4\x86\xb1\xd5\x96\x14\xed\x6f\x4b\xeb\xba\x80\xe3\xac\xee\x77\xaf\x4f\x4a\xad\x79\xf4\xd7\x25\x27\x32\x2d\x2a\x1b\x47\xc7\xc7\x47\x7f\x14\x85\xbb\x1d\x2f\x93\x9f\x83\x95\x0e\x25\x55\xb8\x91\xe6\xf3\xad\xcc\x44\xcf\xc4\x6b\x8a\xf4\xe3\x93\x37\xcf\x9f\x9e\x36\x66\xa1\xbe\x6a\xf0\xc6\x30\x14\xe3\x41\x43\xf2\x89\x18\x34\xfe\xa7\xd3\xd2\x2d\xe7\x7f\x62\x85\x56\x0a\xdf\xa4\x44\x9d\xeb\xc2\xc5\x19\x0a\x22\x68\x5f\x78\xc8\xe8\x53\x6d\x66\x10\x5a\x3d\x96\xc4\xae\x67\xc8\x13\xb8\xc2\xd5\xdb\x58\x23\xa4\x68\x5d\x38\x24\x2a\x5f\x65\x74\x05\xac\xf1\xee\xe3\x87\x97\xcf\x8f\x1b\x1c\x71\x35\x3e\x08\x31\x68\xe0\x62\xd0\x40\x62\x1b\x7e\xa2\x1b\x91\x1c\xdf\x35\x62\x21\x1a\x4e\x2b\x43\xd3\x72\x1a\x42\x6a\x15\x8a\x18\x2b\xf8\x85\x96\x8c\xea\x2d\xd9\xf1\xfe\xb2\x8b\xff\xa2\x81\xb6\xa7\xf3\xee\x4c\x80\x33\xbb\xc4\x25\x76\x60\xb0\xd9\x57\x3c\xfe\x38\x93\x9f\x54\x34\x15\x4a\xdf\x91\x84\xd2\xfb\x12\xb5\xc9\x85\x55\x16\x90\x54\x5a\x16\x31\x53\x0d\x49\x4a\x2f\x67\xaf\xc9\x25\xb1\xbf\xa0\x50\x5e\x67\x9a\xbc\xd6\xa4\x68\xd0\xae\x57\x18\xbf\xd2\x1d\x42\xc4\xa4\x3b\x82\x90\x75\x7a\xe1\x61\x94\xaf\xc8\xad\x56\x4a\x40\x74\x1e\x5e\xa4\x83\x53\xad\x5e\xf4\x02\x16\x10\x53\x59\xa9\xa6\x20\xab\x65\xcf\x2b\xc8\xaf\xf5\x34\xbe\xbe\xc2\x92\x46\x34\x88\xb4\xc4\x7e\x4e\xd7\x90\x9d\x81\x6f\xa8\xea\xf9\xae\xdf\xf3\x99\xef\xfa\x29\x31\xbe\xf5\xe9\x84\x43\x52\x23\x65\xc8\x5e\x1b\x84\x30\xcc\x89\x99\x68\x72\x87\x2d\x1f\xd2\xbc\xe9\x5e\x4d\x38\x5b\x17\x51\xfa\xb5\x53\x9a\xe1\xd2\xb4\xaa\xf0\xdb\x6c\x6f\x76\xcd\xaf\xdc\x1c\xb8\xb7\x3d\x6c\x05\x38\xee\x0d\xa4\x3d\x18\x54\x07\x70\xa4\xcd\xb2\x83\x03\x88\xfb\x09\x81\xcb\x4b\xfd\x69\xac\x84\x92\x4f\x7b\x52\xde\x42\x9d\x91\x48\x40\x4e\xc6\x8a\x0d\x55\xbb\xf1\x54\x94\xbe\xaa\x6a\x16\xf9\x12\xf5\xfc\x76\x2a\x02\x1d\xca\x91\x59\x94\x70\x31\x2a\xfc\xf2\x32\xf7\xd8\x2d\x7b\xb2\xa5\xbb\x6d\x56\x80\xdc\x85\xbb\xd5\xed\x2d\xad\x53\x1d\xaf\xda\xf5\xd2\xe5\x06\x8f\xcb\x7b\xe9\x32\x96\xae\x4b\xe9\xd2\x90\xca\xfa\x8a\xc8\xdd\xea\xd4\xc5\xb5\x1b\x20\x8e\x20\x13\xc3\xa9\x4c\xcd\x26\x6c\x0a\x36\x95\xb9\xff\x38\x17\x9c\x39\x86\x01\x62\x18\x34\x9b\xcb\x50\x25\x5a\x05\x42\x89\x55\x50\xbb\x05\xd4\x10\xa1\x86\xcd\xe6\xc8\x40\x8d\x40\xb9\xa3\x62\x1a\xe4\x50\x57\x08\x75\xb5\x0a\x57\xbe\xb8\x94\x10\x94\xd8\x6f\xb4\x5e\x6b\xde\x2a\x54\xee\x62\x10\x4a\xea\x73\x4f\x1c\x6a\xdc\xc8\x34\xcc\x67\x2a\xc6\x4d\xb5\x73\x71\xb1\xce\xfb\x3f\x5b\xab\x88\xa2\xc2\x63\x57\xdf\x70\x78\x47\x14\x18\x01\x08\x92\xb6\x1c\xa7\xac\x18\xdf\x95\x39\x50\x22\xce\xdb\x4d\xe6\x9d\xdd\xc8\xd4\xa9\x1e\x7c\x2d\x99\x41\x5b\xa0\x3b\x2a\xa1\xbb\xdf\xf6\x3a\xc0\x8d\xd2\x9c\x7f\x3e\xa9\x7e\xee\xd6\x3e\x9f\x56\x3f\xef\x80\xef\x49\x08\x3c\x53\x85\xd5\xd2\x9f\x6f\xd0\xd2\x77\x11\x7a\x80\x8a\x3f\x7c\xdb\x00\xb8\x57\x02\xc4\x56\x7c\x97\x65\x9f\xfc\x53\x24\x42\xa2\xeb\x19\x84\xf7\x5d\xb6\x5a\xa9\xa9\x80\x3d\x78\xe5\x9d\x5f\x2c\x32\x09\x79\x66\x60\x41\x16\x2d\xb8\x2c\xcf\xf8\x53\x49\xca\xd3\x5c\x92\x23\x49\x9e\x1a\x00\x4a\xcb\xf3\xfc\x4d\x4a\xa0\x74\xaf\xac\x81\xa4\x28\x20\x62\x6c\xf2\xbb\x4a\x4b\xca\x63\x51\x43\xff\xc6\x7e\x05\x5b\x0d\x56\x61\x9b\xf7\x41\xb2\xad\x2e\xbc\x92\xc6\x32\xcb\x2b\xc5\x0a\x8c\x9c\x78\x25\x53\x4f\x36\x85\xad\x0f\xa9\xbf\xdb\x94\xe8\xf4\x24\x7b\x25\xdd\xf8\x2a\x1c\x6a\x42\x7b\x74\xab\x1c\x15\x82\x3b\x3a\xca\x1d\xa6\x16\xb3\x34\xf3\xc9\xdd\x36\x2c\xde\xb1\xfb\x62\x5d\xf3\x4f\x0e\x37\x32\xb6\xe7\x08\xc5\x8f\xec\x51\xe5\x8e\x98\xf9\x19\xa2\x88\x35\x93\xc7\x36\xc8\x20\xc4\x0f\x3e\x31\xe8\xcc\x72\x93\x41\x2e\xc4\x38\x16\x86\x5a\x0c\x1e\xc9\xf7\x19\xdc\xa1\x1b\x60\xd5\x7e\xa5\x27\x0c\x1e\x69\xba\x10\x5d\x10\xe1\x90\xec\x5b\x6a\x52\xf2\x94\x7b\x55\x9d\x83\x69\xc5\x43\xac\xf8\x2a\x6b\x32\xc5\x4a\x1b\x86\x06\xc3\x5d\xe8\x84\xec\x78\x5d\x63\x0a\x1a\x50\x08\x3d\xe5\x8e\x16\x90\x95\x1d\x2c\x16\x0b\x22\x69\x0f\x7b\x7b\xb1\xd8\x60\xcd\xbd\x36\x03\x25\x40\xba\xc1\x33\xf3\xe7\xb1\xf9\xb3\x57\x2c\x08\xcb\x31\x37\xf4\x7e\xb1\xa8\xec\xe0\xbd\xae\x19\x72\x76\xed\x9a\x91\x81\x04\x09\xaa\xaf\xdc\xe1\x98\x8f\x62\xef\x26\x0a\x07\x8d\x0e\xed\xe1\x2a\x36\x9f\x4f\x49\xea\x16\x8d\xd8\xfd\x02\x42\x46\x02\xa6\x09\x2e\x65\x66\x25\x66\x9c\xf8\x10\x9a\x45\x71\x85\xed\x0f\x02\xa5\x94\x30\x1a\xd0\x47\x99\x79\xa7\x3e\x1a\xf1\xd4\x4b\x5c\xde\x6c\x12\xa2\x99\x9e\xcf\xef\x17\xf4\x5c\x5c\xb0\xc4\xe5\x04\xcd\x24\x30\x10\x2b\x10\x0a\x76\x3f\x42\x8b\xda\x92\xb8\x80\x84\x49\x37\x00\x6e\x74\x64\x30\x7a\x8e\x40\x3d\x67\x98\x6f\x4f\xb9\x57\xec\xa9\x24\x33\xf2\x5c\xe6\x1d\xd5\x28\x87\x2c\xe1\x17\x09\xf7\xdb\xde\x3e\xf8\x5e\x99\x19\xec\xde\x8d\x74\x79\xc5\x9d\xec\x6e\xf7\xef\x08\x07\x81\xc2\xcd\x0b\x9a\xcd\xa8\x7f\x8b\x31\x7d\xca\x0d\x41\xb9\xdf\xcd\xdb\x3b\x7c\x11\xf4\x95\x6b\x86\xda\xbc\x32\xc3\x00\xd2\xf5\x29\x5d\x90\xb2\x7f\x4d\x2f\x48\x04\x7e\x69\x80\x7c\xdb\x54\x33\x26\x02\xa4\xe9\xd6\x21\x09\x8d\xae\x00\x8a\xc2\x4b\x49\x22\x08\x5c\x1f\x12\x12\xd2\x1c\x47\xf5\x2d\xf0\xfe\xfd\x34\x52\x3a\xf6\xf8\xc2\xbb\x4f\x77\xb7\x24\xbb\x5f\xe0\x00\x1e\xff\xaa\x4c\x50\xee\x88\xd4\x45\xc2\x9a\xf5\x62\x46\xde\x49\x90\xee\x15\xa4\x62\x5b\x55\x59\xee\xeb\xe6\x68\x30\x14\xe6\xd7\x9e\x82\xb1\x11\xe8\x85\x6c\xfb\x59\x97\xe8\x13\xf3\xdd\xb4\xe1\xd9\x46\x51\x2e\x3d\x09\x51\xcd\x87\xf3\x32\x5f\x8c\x90\x85\x20\xc9\x76\x3a\x91\x2d\x5f\x48\xb2\xd5\x01\x05\x09\x2e\x74\x14\xcc\xef\x2e\xe8\xfc\xb7\xa4\x6f\xd2\xf5\xf4\x7e\xdb\x73\x86\xb7\x0e\x70\x2f\x39\x17\x17\xf3\xf9\x7d\xe8\x9d\xc1\x77\xef\xac\x12\xb5\xf6\xa2\x34\x6f\x53\x2d\x49\xe5\x5a\x52\xd7\xb3\x13\x40\xb9\xd7\xc0\x19\xe1\x2c\x81\x88\x09\x98\x11\xd9\xff\x28\xcf\xf9\x85\x2b\x3c\xfb\xef\xb0\xa2\xe7\x15\x5b\x89\x51\x4f\xe1\x76\xd5\x0f\x6a\x44\xe7\xd4\xc8\x8d\x7c\x09\x36\x3a\x62\xb1\x1d\x65\x26\x08\xd1\xe7\xc9\x85\xa9\x86\x43\xc2\x48\x82\xce\x66\x5a\xa2\x1b\x64\x3f\x71\x43\xf6\x9a\x70\x48\xdc\x90\x7a\x89\xfb\x3d\xfd\xf1\x9d\x42\x42\x73\x67\x42\x61\x48\x28\x77\xd2\x0b\x5c\xdf\x98\x04\xae\x4f\xb1\xad\x86\x39\x4d\x6b\xd3\x8a\x7b\x15\xb7\x05\x92\x91\xf6\x89\x1b\x81\x86\xfb\xa9\xa7\x5c\x09\x3f\x3c\xb1\xb0\xcb\x14\x87\xa8\xe8\xbc\xf7\xd8\xdc\x8f\xf2\x5c\x5e\x34\x9b\x53\xb2\x5b\xea\xd7\xcf\x55\xae\x43\x48\x40\x48\x76\x2f\xbc\x2f\x12\x94\xa7\x80\x7b\x4f\xe4\x02\xbe\xe6\x6b\xe0\x97\xb5\x5a\x4e\x25\x6c\xe5\x49\x3e\xe1\x35\x04\xec\xfc\x02\x22\x86\x98\x5d\x65\xa4\x9d\x66\x1d\xa8\x4d\x0f\x3b\x18\xb1\xd0\xa7\xe1\x44\x44\x49\x49\x66\x67\xab\x35\xa5\x0b\xd0\xf9\x60\x94\x3e\x07\x63\xc1\x55\x56\x4c\xa1\x3f\x28\x83\xb2\x75\xfa\x2c\xb4\xed\x72\x83\x35\x7e\xff\x9e\xca\x36\x2d\x69\xa1\x02\x06\x90\xb0\x88\x28\xb4\x09\xad\x79\x92\xe9\x8f\x1c\xc3\xa2\xf8\x05\x29\x02\xe5\xc2\x05\x85\xfb\x38\xf1\xe3\x40\x85\xbe\xa8\x88\xbd\x20\x5b\xd5\x17\x90\xc8\xd5\x20\x44\x9a\x25\x20\x48\x1d\xf6\x94\x96\x5c\xcb\xf4\xb0\x33\x9f\x07\xb8\x31\x80\xbe\xfc\x2e\x5d\xd8\x59\xfb\x43\xf6\xd6\x48\x9e\x55\x06\x0d\xee\x85\xd2\x4c\xcd\xfa\x24\x99\x93\xc8\x81\x18\x86\x52\x0c\x0a\xdb\x7c\x10\x05\xc9\x44\x48\xdd\xcf\x1e\xbc\xfb\xd2\x8e\xff\xdb\x5c\x39\xe2\xd3\xa9\x90\x83\xa7\x57\xe1\x78\x60\x3a\x7c\xd5\x02\x2b\x98\x70\x65\x34\x10\xc5\xb2\x31\xe5\x4a\x48\xfd\x21\x1a\x08\x57\x89\xe9\x98\x07\xc2\x22\xd8\x56\x44\x96\x97\xdc\x05\x05\x41\xe1\xbe\x22\x6f\x7e\x5f\xa9\xcb\x9a\x96\xfc\x51\xe1\xc7\xb2\x5b\xf4\x2f\x36\xc1\x3a\xa5\x31\xbf\xcf\x64\x08\xef\x89\x16\x4b\x5c\x7f\x3e\xef\x40\xba\x97\x95\x14\x5b\x6c\xad\x62\x97\x0a\x85\x6c\xe0\x05\x30\xf0\x06\x0a\xe3\x1f\x3d\x0d\x43\x8f\x83\xef\x09\xd4\x10\x48\xba\xe2\x83\x54\xff\x1d\x04\xfe\x1a\x89\x3b\xbf\x44\xa2\xdd\x99\x51\x9b\xb4\xf4\xef\x9e\xc4\x25\xc5\xf7\xba\x2d\xa2\xb0\x72\x5a\x19\x20\xad\x6a\x65\xf6\xcd\xf2\x03\x13\x4f\xc1\x75\xa6\x59\x2c\xd6\x08\x0e\xad\xc8\xb9\x04\x75\xb1\x42\xef\xb2\x7a\x63\xca\xb4\x42\x6d\x30\x86\x2c\x0e\xd0\xab\xb0\x64\x61\xcf\x0b\x74\xa7\x2b\xb6\x41\x21\xcc\xf1\x80\x58\x85\xa9\x08\x87\x46\x5c\x5c\x31\xb2\x71\x03\xa0\x84\x0e\x92\x55\x08\xcb\x61\xd2\x8b\x5f\xd8\x20\xa8\x20\x04\xbe\x0a\x65\x35\x72\x7a\xf1\x4b\x5b\x08\x35\xb4\x10\xac\x42\x5c\x8f\xa5\x5e\xfc\xe2\x36\xc3\x12\x72\x88\x56\xa1\x5f\x0e\xae\x5e\xfc\xf2\x66\xc4\x8a\x2a\x20\x5c\x55\xc9\xaa\x60\xeb\xc5\xfa\xc8\x0d\xa3\x9f\xf0\x8e\x53\xd2\x81\x28\x04\x1b\x66\x8a\xc3\xbb\x65\x60\x88\x36\xc2\xee\x54\x60\xc3\x8d\xb0\xbb\x65\xd8\xde\xba\x79\x80\xa0\x7b\x06\x54\x41\xe4\xdd\x0f\xb1\x84\x5e\x54\xa6\xea\x50\x15\xb2\xd4\x31\x6b\xd1\x54\x3b\xc6\xa0\x72\xa6\x8e\x27\xd7\xcc\x51\xd3\x09\x68\xae\x6d\xf7\x67\x84\x2b\x30\x0a\x07\xd1\x4c\x82\x64\x63\x81\xfb\x8b\x11\x35\x02\x47\xb8\xdb\x46\x34\xf7\xef\x88\x2f\x40\x1e\xee\xf6\x63\xe5\x8d\x15\xc4\xc2\xa8\xbe\xc2\xe5\xd4\x9b\x91\xa1\x48\xfd\xc4\x0b\x4a\xbd\x34\x3e\x0d\x44\xb6\x9b\xa7\x20\x5e\xd7\x0f\x8d\x4b\x22\xed\x72\x6c\x44\xa2\x19\xb3\xb5\x3d\x16\xbc\xf3\x0c\x68\xf0\x8e\x02\x7f\xe2\x29\x97\x3f\x01\x7e\x63\xfe\xbd\xa9\x74\x05\xca\xc5\x92\x2e\x78\xbf\x28\x85\x95\xe5\x4e\x23\x0e\x82\x69\x77\x1b\x12\xa6\x5d\x89\x21\x00\x51\xcf\x0c\xde\x16\x63\xa2\x4f\x34\x53\xa8\xba\x12\xf3\x0f\x33\xab\x97\x19\x2c\xc6\x98\x68\x36\x9d\x60\xcc\xe3\xd8\xfc\x48\xfa\x37\x8a\x68\x7b\x5a\x01\x55\x48\x4e\x3d\xfb\xf5\x03\x9f\x88\x1c\x42\x59\x08\x85\x10\x8b\xe5\x30\xb8\x1b\x55\xd1\xbb\x99\x3c\x57\x17\x3d\xf3\x87\x89\xbe\x68\x39\x0d\xa7\xa5\xbd\xd2\x79\xb5\x6d\x55\x75\x7f\x6d\x67\x16\x78\xbe\x45\x60\x20\xdc\x6b\x8c\xf0\xbc\x66\xd2\x9d\x60\xfc\x31\xcd\xbc\x07\x39\xd8\x27\xe9\x06\x4a\x70\x2d\x4e\xc5\x2d\x2e\xe1\x36\xda\x2e\x1c\x92\x3d\x04\x2b\x79\x77\xa5\x7b\x8d\x26\xe4\xf7\x9e\xf9\x24\xdc\xed\x1e\x5d\xda\x03\x48\xfa\x09\x3b\x4f\x40\xb8\xdf\x2f\xbc\x6c\x27\xda\x28\xc8\x46\x69\xb8\xee\xd9\xb8\x8f\xfb\xef\x5e\x02\x53\x4f\x65\x0e\x1e\x12\xb0\x6d\x45\x04\x18\x1b\x59\x8c\x27\x97\xe2\x46\x48\x7d\x69\x54\x8c\x4b\x25\x86\x8c\x43\xb0\x08\x87\x64\xb7\x4c\xf5\x44\x11\x63\xc0\x5e\x11\xe9\x8e\x28\x28\x90\xee\x80\x42\xd0\xcb\x1d\xf8\xfd\xbc\x59\xcf\xc7\xc2\xa8\x3b\x1f\x4e\x88\x74\x87\x80\x1b\x59\xf5\x6f\xb8\xbd\xd5\xfb\x21\x9b\x4d\x87\x9b\xf9\xe2\x06\xcd\x66\xe0\xf2\xc1\xe0\xb9\x21\xe4\x5d\x18\x6b\x21\x85\x22\x4e\x30\x0e\x83\x6b\x07\x7e\x48\x12\x50\x0a\x86\x84\xb4\xe6\xdc\xb9\x18\xa1\x51\xbd\x62\xdb\xe0\xad\x24\x01\x6c\x2b\xd2\x35\x8d\xe8\x47\xe7\xe1\x85\x67\xfe\xe0\x46\x40\xae\x68\x06\x25\x9f\xb6\x5a\x72\xae\x1b\xf3\x4b\x97\x43\x56\x7a\x46\x24\x99\x81\xe8\xaf\xf4\x25\x30\xe9\xc6\xfa\x6e\x2c\x56\x46\xa4\x2e\x88\x84\x84\x7a\xe9\xe4\xaf\x62\x28\xdb\x7e\xd2\x0c\xc8\x8b\x18\xb9\x08\x9f\xcc\x34\x28\xcc\x41\x5d\x84\xf2\x88\x0b\x08\x98\x31\xf5\x0c\xeb\x70\x74\x03\x05\xf6\xaf\xfb\xc3\xdd\x66\x8c\x71\x34\xec\xdc\x1f\x8c\xf7\x82\x48\xea\x50\x26\x62\x21\x5d\x25\x26\xd1\x8d\xa8\x76\xb4\x30\x2b\x50\x50\x38\x34\x42\x30\x53\xb9\x74\xee\x27\xb3\x29\x86\xee\x0f\xd0\xec\x06\x45\x07\xc8\x6c\x0b\x44\xd3\x52\xaf\x41\x62\xc4\x98\xa2\xa0\x98\x76\x39\x70\x96\xf4\x93\xc3\xdd\xbe\x72\xb9\x67\x84\x88\xa7\x40\xb3\xae\x99\xa2\xca\xf5\xbd\x5d\xc6\x92\x66\x13\x65\x4a\xc0\x88\x6e\x36\x4d\x17\x46\xd3\x4f\x2a\x9a\xf2\x11\xb7\xcb\x0d\x90\x9d\x25\xf0\x1b\x6a\x40\xa7\x0a\x19\xf7\x99\x18\xf2\x64\xac\x09\x85\x90\xf6\x04\x0b\xdc\xef\x3d\x1b\xdc\xbb\x1c\xb5\x2e\x28\x67\x82\x70\xda\x43\x1f\x58\xc1\x44\xb9\x35\x12\xb5\xdb\x3d\x03\x73\x1e\x5d\x18\x30\x63\x47\x4c\x17\x01\xe1\xe8\x25\xc9\xd6\x6e\xf7\x07\x93\x30\x5c\x10\x05\x9c\x82\x5c\xe6\x5b\x01\x01\xf8\xaa\xd9\xbc\x9f\xf2\x38\x0e\x6f\x84\x37\x36\x75\x1e\xee\x18\xed\xc1\x08\xb6\xc0\xba\xe0\xd6\x8f\x85\x05\xcb\x54\x3d\x64\x11\xe4\x9d\xdd\x55\xdc\x97\xab\xba\x96\xe3\x4a\xb1\x3e\x3d\xd1\x97\x6e\x2c\xf4\x91\xd6\x2a\xf4\x13\x2d\x88\x3d\x62\x96\xd6\x5b\x7a\x4d\x17\x39\x7f\xee\xfd\xbd\x3a\x20\x61\xc2\x1d\xa2\xb4\x89\x96\xea\xfb\x70\x42\x12\x58\x5d\xa7\xfd\x54\xd4\x7b\xc3\xc7\x89\xc8\x45\xfd\x95\x08\xae\xc5\x20\xfd\x89\xce\x36\xc6\x12\x33\x27\xd0\x0d\x47\x17\x0b\xad\xee\xee\x67\xa1\x1c\x44\xb3\x15\x62\x43\x3b\x76\x57\xe0\x23\x8a\x4a\xd7\x9a\x66\xf9\xa6\xe6\xfd\x02\x9c\x74\x60\x1c\xb8\x1f\x09\xed\x95\x54\x1b\x5f\xb1\xad\x8e\x51\x4d\x8a\x50\x8a\xd2\xce\x55\x65\x09\x38\xcf\xa3\xcc\x47\xa9\xec\x80\x0e\x2d\x9f\x70\x9e\xaa\xb2\x09\x77\xbf\xed\x29\x50\x9e\x86\xd8\x13\xa0\x53\x3d\x1e\x92\x4c\xa1\xcf\x1d\x25\x45\x30\x51\x69\xeb\x45\x55\xce\x7b\x60\xec\x65\x26\x98\xa4\x51\x13\x8c\x36\x61\x26\x63\xb2\xc5\x98\x15\x05\xdd\x2d\xec\xb1\x1d\x7c\x51\xf6\x76\x4c\xcd\xda\xd9\x01\x81\x1b\xa2\x6c\xb5\x1f\xc7\xc8\xd4\x5f\x3c\xcc\x64\x96\xd7\xfc\x48\x5a\x6a\xc9\x49\xd7\x18\x4a\xd2\x1d\x80\xf0\x04\x0c\x3d\xb3\x0e\xf8\x9e\x74\xfd\xc5\xc2\x08\x06\xce\xba\x8b\xd4\xf7\xc4\x53\xcf\xd3\x7e\x65\x37\x78\x0c\x91\xa9\x1c\x42\x16\xe4\xfb\x8a\x2c\x64\x8c\xe5\x12\x7e\xd8\x6c\x86\x66\xa6\x0e\x59\x70\x1e\x1a\xe6\x30\xb2\xdd\x74\xc0\xb0\xdc\x56\xa2\x70\x21\xbe\xa6\x3d\xf3\xa0\xcc\x8a\x6c\x15\xa3\xda\xd8\xb9\xd7\xa0\xdc\x6b\xf0\xcd\xf8\x61\xb9\xce\xa1\x9f\x47\x97\x61\x7f\x75\x41\x80\x4f\xf3\xd0\x91\x8c\xd8\xd8\xac\xcd\x30\x66\xca\xfd\x0e\x03\xb6\xd5\x85\x1b\x53\x1d\x2e\xd6\x37\x66\xb1\x1e\xb0\xad\x0e\x2c\xad\xd8\x71\x3f\x66\xe7\x31\xdc\x98\x15\x3b\x4e\xc3\xb7\xcd\x8a\x7d\xc3\x6e\xdc\xeb\x7c\x65\xdb\x66\x2a\x45\xb5\xbd\x1e\xd5\xb8\x3f\x66\xe7\x63\xd8\x36\xa8\xc6\x16\xd5\xb6\x41\xb5\xcd\xb6\xdd\xeb\xac\x89\x83\x66\x33\x4e\x9b\xb3\xc5\xd8\x38\x7d\xec\xd7\xb9\xc1\x23\x64\xb0\x6e\xda\xb3\x4e\x4f\x1f\x16\x67\x0c\xec\x4e\x9e\x3c\xd7\x17\x86\x13\xcf\xf5\xc5\x8a\x6d\x3c\x12\xc3\x98\x7a\x31\x63\x6c\x4c\xe7\x73\xac\x67\x07\x04\x8c\x6d\x17\x9b\x7e\xbf\x81\x6d\xc3\xd2\xad\xee\xd2\xde\x37\x0e\x82\x74\x39\xee\x2b\xf2\x74\x0c\x76\xd1\x8d\xcd\x97\xb6\xd1\x11\xdd\x2c\x9f\x21\x70\x5b\x0f\x33\x5a\x82\xb8\xce\x20\x76\x3d\xdc\x3f\xbe\xc2\x7a\xae\xd6\x4e\x13\x9f\xdd\x19\x2e\x19\x80\x32\xaa\x87\x9f\xd2\xb3\x87\x3c\xd1\xf3\x99\x72\xc3\x62\xc3\xb5\xdc\x82\x0c\x72\xdf\x72\x4f\xd9\x81\x5c\xa2\x26\x49\x97\xf4\x5e\xbe\xa1\x6c\xd6\xb6\x74\x37\xb7\x4f\x08\x2f\xd7\x4e\x4b\x95\x73\x63\x8c\x66\x72\x81\x7a\x25\x8a\x4b\x67\x8e\x55\x4d\xc1\xc8\x2c\xb5\x22\xf4\x43\x52\xa3\xd6\x6c\xe1\xd2\x6a\xd4\x93\xec\x69\x37\x7f\xda\xc3\xa7\xbe\x0d\x14\xe9\x93\x88\xc9\xf3\xe4\x82\x32\xc6\x88\x0d\x73\xa6\xcd\x66\x2a\xbf\xd3\x12\x99\xfc\xb6\x32\x28\xd5\x79\x74\xb3\x49\x48\xc0\x22\x6a\x94\x13\x12\x31\x4e\xdd\x6d\xdc\x86\x0e\x5c\x0e\x51\x7a\xdc\x8a\x08\x26\xec\x7e\x8b\xd5\xeb\x2b\xbf\x75\x3f\x55\xc0\x74\xdf\x71\x32\x55\x4a\x9b\x0a\x76\xed\x5b\x2b\x4b\xd1\x56\x33\x62\x69\x08\x51\x26\x5e\xbd\xe5\x93\x3e\xe7\xc9\x85\x41\x63\x56\x0a\x2f\xed\xe4\xec\x68\x9a\xa9\x11\x12\xd3\xd9\x75\x82\xb0\xdb\xc2\x34\x62\x06\x7b\xaf\x42\x74\x68\x04\x62\x58\x3e\xdb\x59\x1c\xe2\x2e\xc9\xf0\x4c\x72\x0b\x94\xdc\x02\x24\x4b\x32\x41\xa7\x18\xcf\xa6\x99\x3a\x94\x7d\x1c\xd4\x03\x10\x70\x7f\xe3\x29\x08\x3d\x3c\xdc\xe0\xc9\x43\x95\xf2\xc1\x43\xfb\x49\x82\xf0\xf8\xa2\x50\x8b\x03\x26\x0f\x55\x1f\x2d\x57\xd6\xe9\x45\x87\x41\x2f\xca\x82\x41\x42\x96\x9c\x47\x17\xbd\x91\x22\x21\xf0\xf3\xe8\x02\x34\xb4\x5a\x36\x76\x35\x44\x67\x54\x89\x4b\xaf\xd5\xea\x03\x39\xc0\xd9\xfd\x22\xf3\x45\x5b\x05\xdc\x34\x63\x98\x0b\x68\xf0\x59\x98\x3d\xc6\xac\x03\x63\xd6\x81\x01\x13\xbd\xf8\x70\xd8\x6c\x8e\x0f\xfd\x74\x83\xf5\x06\xb6\x19\xb9\x61\xd1\x79\x7c\x41\x5d\x0e\x13\x46\x9e\xb3\xf0\x7c\x8c\x3f\xae\xd8\x8d\xeb\xc3\x94\x3d\x77\x7d\x23\xd8\xb7\xb7\x18\x9b\xd8\x52\x23\x98\xc1\x1d\xdc\xc2\x35\x1c\xc1\x89\x29\xdc\xea\x5e\xc0\xa9\x29\xd8\xea\xe2\x22\x70\xd2\x6c\x92\x19\x3b\x71\x7d\xb8\x63\x13\xc3\xa6\x23\x76\x62\xf8\x0b\x4e\x9b\x4d\x72\xcd\x4e\x5d\x1f\x8e\x98\xd1\x90\xc9\x2d\x3b\xc5\x0f\x47\xcd\xe6\x1d\x1d\x29\x72\x05\xd7\x90\x40\xab\x35\xa0\x70\xa2\x30\xd9\xc4\x36\x4c\x61\x6c\x54\xb2\x41\x8b\x5d\x59\x4f\xe1\x69\xf6\x65\x66\x21\x07\x2d\x36\xb3\x5f\xe2\x16\xdb\x81\x71\x8b\xed\x58\xfd\x32\x1c\x92\x23\x3a\x68\xb5\x32\x5c\x93\x0c\x57\x5e\xd3\xa0\x8c\x37\x6e\xb1\x6e\xb5\xf4\x1d\xcd\xeb\xba\xca\xeb\x4a\xa1\x47\x8a\xcc\x60\x9a\x51\xbb\x4c\x43\xb7\x97\x6d\x2e\x6f\x9d\xcc\xe7\xa3\x2d\xc6\x6e\xa9\xaf\x04\xbf\xee\xd5\x71\xd6\xa9\xab\xd5\x71\xbd\xbe\x8e\x9d\x85\xd5\x64\xb1\x3d\x65\x5a\xf2\x16\xb5\x60\xdc\x6a\x2d\x70\x5b\x20\x3e\x1c\xf6\xb2\xf6\x94\x06\xdd\x8e\xf3\x72\x41\x7b\xbc\xb2\xe0\x95\xe7\xf0\x8d\x7d\x9b\xcf\xcf\x2f\x7a\x29\xbd\x25\x5e\x79\xee\xfa\x90\x2a\x54\xdf\x28\xd6\x48\x3a\x87\xd9\x94\x9a\xcf\x3b\x87\x41\xfe\xfc\x2d\x93\xa0\x8f\xcc\xcc\x99\x79\x09\xdc\x7a\x01\xdc\x79\xdf\xd2\x0d\x9f\x23\xc5\x9c\x4b\x31\x9e\xfc\x7e\xf0\xe4\x5d\x29\xa9\xcd\x89\x5a\xb5\x35\x8d\xe7\x0f\x4d\x0f\x07\xd9\xda\x91\x1e\x0a\xbb\x57\x5e\x02\x47\x5e\xc0\xee\x03\xaf\x03\x3f\x3d\x01\xe6\x45\x9c\x7b\x6f\x53\x3d\xc3\x94\x67\x01\x9a\x51\xc6\x4e\x0d\xdc\x80\xde\xd7\x30\x2c\x28\x04\x6e\xc0\x76\xd2\x1d\xee\x8a\xe2\x12\xb8\x3f\x41\x40\x04\x81\xab\x0c\x94\x62\x89\x45\x1b\xb8\xb1\x1b\xb3\xfb\x99\x17\x59\x0c\x8b\x8c\xfa\xd6\x91\xca\x5c\x99\x45\x70\xca\xf2\x4a\x94\xb7\x8b\xe7\xc1\x05\xdc\x92\x96\x11\x12\x54\x09\x11\xc0\xdd\x9f\x10\x40\x92\x2e\xee\x53\x45\x14\x3c\x86\xc4\x74\x70\x00\x47\x46\x34\x2d\x4e\xab\x34\xd8\x30\x84\x7b\xc5\x72\xd8\xcc\x83\x8e\x9d\x72\x1f\x78\xdd\x52\xbf\xa9\xf2\xda\xf9\xbc\x24\x95\xb6\x4a\xdb\xe6\x35\x8f\xa9\x15\x76\x46\x49\xed\xd9\x70\xbe\xd0\x55\x96\xa9\xcc\xda\xca\x53\xb6\xf2\x21\x66\xa1\x55\x9e\xcd\x10\xc4\xfd\xe7\x86\x1e\xed\x5e\x43\xe8\xc6\x10\x51\xef\x11\xbe\x25\xa1\xab\x99\x82\xd0\x4d\x58\x04\x9d\x43\x62\xe4\x5b\xec\xce\x68\xae\x26\xda\xea\x7d\xe8\xa4\xd5\x53\xef\xf1\x72\x41\x62\xea\x8a\xcd\xb2\x12\xbb\x47\x6e\xcc\x94\x45\xb5\x19\x11\xf5\xca\x38\x28\x6c\x11\xd3\xaa\x56\x0b\x37\x4b\x09\x36\x8b\xfe\x33\x67\xc0\x04\xb9\x78\xcc\xb4\x6d\xd3\x1e\xea\x5f\xb9\xf0\x1e\x30\x9d\x2a\x95\x03\xab\x54\x0e\x0a\x35\xd1\x54\x3c\xb0\x1d\xd8\xea\x42\x00\x6a\x85\x6b\xc8\xce\x91\x1b\xa6\x5d\xd1\xcb\x94\xd4\xe0\x2a\x1c\x0f\x3e\x44\x03\x11\xe7\xcb\xcf\x84\x75\x7a\x93\xc3\x9b\x6c\x21\x9b\x64\x6b\xcf\x95\xb1\xfc\xd9\xb8\x7f\x73\x3e\xb9\xf0\xcc\x1f\x94\xf0\xad\x16\x6f\x11\x3b\xf1\x71\x2a\xf0\x43\x36\x6c\x36\x87\x87\x6c\xda\x6c\x92\x84\x49\xb2\x7d\x3e\xb9\x80\xab\x74\x6c\xa7\x90\xf7\x41\xad\x07\xf2\x2e\xe8\x71\x36\x5d\xe4\xfd\x91\xd9\x66\xd0\x01\xe5\xfa\x50\x4e\xac\xf2\x4d\x2d\x6d\x5a\xa0\xab\x2e\x53\x91\xa5\x47\x4a\xcc\x06\xdf\xcd\xb3\x2e\x07\x26\x7e\x57\xab\x14\x65\x55\x56\x94\xeb\xb6\xb2\x06\x51\x8b\x1c\x59\xda\x87\xcf\xf5\xe0\x95\x4e\x22\x26\x4b\xdb\x7f\xa0\xd9\x36\x32\x2c\xed\xe9\x15\xe3\x35\x9f\x93\x55\xaf\xad\x97\xa9\x3e\xb6\x3d\xd1\x6c\xea\x2d\xc6\x64\xb3\x59\xdb\x56\xd4\x20\x4b\x47\x98\x71\xb7\x3c\x06\xe5\x26\xb5\x58\xfa\xd4\x89\xe6\x26\xe6\x3b\x85\xfa\x66\xbb\xcc\x90\x3e\xe3\x9a\x93\x0e\xc8\x5c\xe7\x29\x41\xe7\x6a\xbd\xed\x5a\x37\xae\x2b\xf3\xab\x48\xef\xaf\x7a\xe9\x7e\x67\xca\x8d\xbd\x55\x9f\xd8\xfd\x77\xcf\x34\x61\xea\x29\x37\x59\x64\x55\x1f\x78\xe5\xf3\x53\x71\x9a\x86\x45\xbb\x21\x86\x2e\x66\x1e\x0c\xdb\x23\xb2\xc4\xf6\xe7\xda\xbd\x29\x54\x3e\x99\x85\x83\x16\x0a\x13\x41\x7c\x14\xd5\xbd\x4a\x41\xc1\x4c\xd1\x9e\xc8\xd7\xaa\xb4\xa6\x50\xc6\x42\xe9\x27\x62\x18\x29\x41\xb6\x15\x49\x30\x5e\xd2\x4d\x28\xf0\x7a\x3d\x8f\x8d\x09\xb3\x95\xd6\x40\x0b\x27\x42\x79\x83\xb8\x44\xb6\xe9\x67\x2b\xc0\xb5\x7b\x54\x36\x56\x1a\x9d\x2d\xb3\x00\x29\xf4\xab\xad\x2d\x1c\xb8\x31\xb3\xb3\xc0\x9d\xe5\x43\xf6\x68\x15\xbb\x66\x5e\x12\xdb\x91\xd5\x2f\xe1\xb0\xec\x6e\xd0\x2c\x77\x0f\x3f\x4b\xb7\xca\x5f\x28\x3e\x42\x3f\x71\x9e\x0b\xa7\xdc\x3f\x99\xfa\x7c\x2e\x2e\xdc\xa3\xde\x5b\x69\x2c\x4b\xc6\x58\xe2\x06\xfd\xc4\x8d\x3d\xd3\x5f\xee\x4f\xec\xae\x52\x24\xd3\x82\x68\xf7\xce\x1e\xda\xcf\x1b\x50\x64\xae\x60\xda\xbd\x4d\x03\x13\x92\x72\x60\x42\xba\xce\x27\xe7\xdc\x68\xba\x81\x7b\x04\x11\xdb\x41\x47\x44\xd0\x8f\x6c\x5d\x51\x5a\x57\xaf\x36\x6c\x11\x54\x86\x3a\x70\xd5\x05\x5d\x88\x66\x13\x77\xfe\x45\x29\x30\xc6\xe6\x55\xa8\x1e\xef\x50\x6e\x4c\x24\xed\x0d\xac\x67\xd3\x9b\x92\x6e\x87\x2e\x16\x24\xc1\x74\x21\x0c\xa7\x28\x91\x4c\xe4\xed\x2b\x85\x6a\x3e\x55\x69\x04\xa4\x4d\x2e\x65\x58\xfe\xf4\x6e\x2a\x32\xd6\xf8\x5d\x12\xe9\x6a\x71\xab\x9f\x46\x52\x0b\x69\x8f\xff\x75\xb7\xd6\x80\x3a\x4e\xd1\x49\x59\xa2\x01\x9e\xb9\xf0\x62\xa8\x1f\xef\x2c\x9d\xee\x54\xec\x35\x99\x91\x50\x41\xe2\x4a\x3e\x11\x90\xb8\x68\x21\xe2\x8e\x48\x71\xe2\x5e\xba\x9a\x8f\x3e\xf0\x89\x70\x75\xf4\x2e\x9a\x09\xf5\x94\xc7\x82\x50\x08\xd8\x19\x5a\x16\x45\x07\x82\x28\xbc\x3f\x58\x57\xc0\x5e\x93\xa7\x8a\x44\xe7\xe2\x82\x42\x90\xf7\xe7\x1d\xf9\x03\x8f\xa9\x42\x50\x89\xa5\x50\x20\x41\x97\x36\x69\x31\xd4\x10\xf3\x78\x3c\x33\x7f\x1e\x9b\x3f\xa5\x60\x45\x3c\xcd\x9e\x45\xd8\x0f\x7c\x48\x58\x80\xdd\x03\x9c\x3d\x55\xa5\x48\x95\x77\x95\x78\x8b\xdc\x4d\x2e\x70\xa2\xb1\x2b\xa3\xa8\x2a\x33\x62\xdf\x14\x31\x6b\x97\x59\x3d\x8c\xc9\xb7\x28\x36\xe2\x2f\x2b\x5b\xe8\x96\x4c\x51\x25\x53\xac\x25\x53\x80\x2c\x85\x33\xdc\xa2\x6b\xfc\xd6\x1e\x01\x40\xb2\x03\x33\xb5\x74\xa8\xc7\x02\x22\xf3\xe8\x47\x83\x3b\x08\x4d\x13\xa2\xf5\x4d\xf8\x21\x59\x62\xc3\x18\x18\xc7\x33\xff\xec\x0f\x49\x1c\x53\xd4\xa1\xe4\x8c\x12\xe5\x06\x3c\x6d\x5d\x68\xd6\x9d\xc8\xb4\x2e\x82\x10\x0c\x5b\x43\xc8\x34\xfc\x90\xac\x03\x01\x3a\x55\x82\x83\x66\x93\x64\x44\x30\x3c\x0e\x7d\x40\x6d\xf3\xe1\x8d\x5a\x19\x38\xa3\xc4\x8f\x44\xc4\xfa\x48\x86\x13\xdc\x01\x78\xa1\xf8\x44\xf4\x57\xbe\xad\xc4\xfd\x94\xe2\x9d\x24\x74\xc5\xee\x83\x83\x0e\x2d\x45\xdc\xbc\x53\xc4\x7a\x62\x89\x4e\x4f\xc0\x94\xa3\xa3\x39\xa1\xf7\x09\x6a\x27\x49\xbf\xe3\x91\x37\x8a\x70\x0a\xb8\xd3\xda\xcd\x27\x59\xed\x24\x1e\x93\xa0\xfa\x04\x61\x50\xfc\xa0\xb2\xd2\x35\xea\x5a\xc7\xfe\xb4\x48\x12\xb6\x53\x8e\xa2\xff\xa0\x8a\x0d\xf4\xe7\xc2\x74\xcd\x38\x0a\xb0\x45\xee\x95\x59\x84\x5d\x3e\x9f\x4f\x49\x97\x2e\xd6\xc6\x33\x46\x11\x7c\x13\x95\x90\x2f\x7a\xaf\x9a\xcd\xab\x30\xd6\x91\xba\x73\x47\x11\x51\x14\x24\xb1\x69\x1a\xb0\xa5\xaf\xd6\xee\x02\xaf\xc6\x96\xa1\x32\x86\xc8\x89\xe6\x5a\xa0\xcf\xdc\x81\x12\x5e\x38\x53\x6b\x53\x28\x6c\x46\x9a\xea\x00\xeb\xf0\xde\xd7\xdd\xf9\x65\xef\xfc\x02\x56\xec\x98\x78\xd5\x80\x62\x78\xbd\x9a\xad\xec\x6e\x41\xdf\xfe\xe3\x9d\xa9\xf2\xbe\x7f\x35\xd0\xe4\x52\x92\x5a\x40\x5d\x39\xb7\x29\xbd\x7f\x2a\x49\x82\x01\x60\x45\x82\xd3\xe5\x1d\x20\x55\xdd\x01\xc2\xd3\xd2\x25\x42\xf5\x9a\xbd\x1f\x1b\x72\xb7\x2a\x86\x22\x3d\xc3\x53\x3e\xc5\xa4\x68\xff\x5a\xe3\x2e\xbe\x77\xa4\xcb\x7b\xf1\x1f\x53\x5e\x5f\x11\x3d\xab\xe8\xfd\x1b\x55\x1e\x17\x1b\xe8\x9e\x05\xa9\xb9\x23\xa1\xd3\x4d\xda\x27\x77\xaf\x07\x66\xae\x28\x22\xfb\x47\x92\x18\x99\x46\xbd\x13\x49\x06\xb8\xe1\x67\x27\x31\x46\xed\xaa\x6a\xd4\x6e\x11\x28\xf7\xb1\x2e\x5a\xb2\xd5\xea\x5c\x5d\x10\x0a\x4f\x37\xc5\xed\x6a\xb6\x1c\x70\xf2\x5a\xb9\x71\xa0\xa2\xf1\x18\x21\xe1\xe9\xa2\x1e\xf8\x58\x6d\x19\x86\x3a\x6a\x42\x4b\x67\x06\xf4\x86\x78\x8f\xf5\xe4\xa6\xb5\xbe\x13\x43\x63\x86\x65\x3f\x4f\xa3\x29\xd3\x69\x23\x0c\xee\xaf\x8a\xfd\x55\x82\x99\x5c\xe3\x0d\x98\x6a\xf1\xc3\xc2\xeb\x17\xb1\x4e\x2f\x68\x36\xa3\x43\x6e\x17\xd1\xd0\x68\x33\xc5\x21\x7d\x63\xde\x33\x79\x1e\xb5\x5a\xb8\x11\x76\xae\x5a\xad\x8b\x66\x93\x74\x3b\x8c\x85\x7d\xa2\x5b\x2d\x10\xac\x4b\x3d\x22\x5a\x2d\xc0\x34\x0e\x8c\x91\x83\xdd\xbd\x47\x8f\x9a\x21\xed\xd7\xca\x79\xdd\x62\xff\xfb\x0d\x09\xfa\xca\x6b\x77\xd3\x28\x2c\xf8\xb9\x21\x2a\x4c\x1d\xe6\x66\x51\xb5\x0a\x5d\xa5\x94\xf6\x25\xd1\x6e\x9c\xf8\xb1\x36\x86\xc9\x0e\xa5\x7d\xd5\xda\xf1\xda\x5d\x4f\x12\x7d\xae\x2e\x68\xdf\xf9\x53\xa2\xbb\xf6\x5c\x5d\xf4\xdb\x3b\x9e\x6a\x75\xcd\xd7\x76\x77\x41\xe1\xd9\xa6\xb0\xb4\x6a\x3d\x46\xbb\x59\x50\x78\xa9\x56\x66\x41\xe8\xc9\xc2\x0a\x93\x99\x22\xa7\xab\xa9\x0f\xec\xfe\xb5\x3e\xdc\x7b\x34\x9f\xef\x3f\x2c\x32\xa8\xc9\x42\xab\xa2\xf0\x42\x6d\x4c\x6f\xd1\xe9\x15\xfd\xd2\x53\x85\x72\x5a\x23\xb6\xbd\xf7\x08\xb7\xe7\x0e\x3b\xf3\xb9\x3c\x64\x49\xea\x89\x13\x4c\xfe\x26\x5a\xc9\x22\x8f\xc9\x51\x76\x1c\xde\xab\x0d\xa9\x1d\x3a\x2b\xdb\x26\x56\xb5\x6d\xef\xd1\x3f\xc5\x7c\x2e\xfe\xb9\xff\x90\x86\x43\x72\xb0\x6f\x7f\x3d\xec\xa0\x7e\x28\x0e\x1f\x3f\x9c\xcf\xbb\x9d\x9d\x43\x91\x92\xa3\x59\xf7\xe0\x37\xdd\x12\xed\x47\x0f\xad\x5f\x2f\x7f\xb1\xbf\xdf\xab\xbe\xd8\x7b\x54\x10\x2d\x31\x1c\xb0\xf7\x57\xcc\x9f\x94\xf2\x26\x20\x43\xf3\xc3\x4e\x3f\x9b\x01\x1e\x6f\xc9\xc2\xef\x1d\xa4\xce\x99\xa8\x36\x0d\x5a\x2d\xda\x33\x4c\x1f\xf5\x89\x60\x5d\xd0\x36\x9d\xcb\x12\xd3\x47\xb4\xd9\x34\xb0\x8b\x9c\xcd\x79\xca\xe1\x36\x7d\x4e\xa5\x77\xcb\x11\x81\x35\x41\x69\xe3\x3a\x24\x93\x62\xd6\x38\x7b\xff\xee\x95\xd6\xd3\x63\xab\x86\x98\x91\x83\xd3\x21\xd1\x8c\x53\x63\x2d\x2f\xef\x41\x4f\x55\x34\x52\x22\x8e\x9d\x8a\x44\xc9\xda\xf8\x34\x9a\x4c\x13\xcd\xfd\xb1\x68\x36\x9f\x9a\xf9\xc2\xc9\x7d\x10\x78\x46\x19\xe0\x03\x31\x80\x60\xe0\x49\x57\x47\x9a\x8f\xed\x6a\xb0\x22\xc8\xc0\x11\x4a\x45\xca\xa9\xc4\xe5\x91\x13\x49\x8e\x86\x6b\x4b\x68\xab\x1e\x2d\x97\x39\x59\x5f\xc6\x10\x54\x2b\xb0\xca\xcc\x5b\x71\x74\x62\xc0\x71\xd7\x3f\x9e\x46\x32\x16\x5f\x8e\xdf\x81\x7f\xe2\xdd\x07\x57\x9e\x74\x63\xcd\x75\x12\x43\xf0\x2e\x7f\x3e\x15\xb7\x7a\x01\xc1\xcf\x15\x47\x5c\xb6\x23\x9b\xa0\xa4\xc8\xc2\x56\x4c\x05\x99\xe6\x78\x71\xfe\x54\x7f\x4a\x87\xc2\xea\x74\x33\xc0\x21\xb0\x46\x89\x31\xe1\x32\x26\x74\xbc\x86\x43\x7b\x9d\xc3\x08\xf5\xb6\x20\x95\x58\xa1\x1c\x91\x0e\x44\x46\x83\x2e\xbf\xda\x69\x45\x14\x14\xbb\x23\x1f\x86\xe5\xe4\xdf\xc5\x1a\x71\xad\xc9\xa9\xb1\x6a\xfb\xbc\xe5\x00\x66\x55\xe0\x1e\xa7\x0b\x3c\xc6\x9a\x87\x9e\x11\x69\x96\xd7\xa3\xf1\xf8\x38\xed\x95\x57\x82\x0f\x84\x8a\x09\xa5\x10\x94\x7b\xcb\x1e\xb9\xc2\xbd\x49\xdb\x3f\x87\x3b\x9d\xce\x7c\xbe\xdb\xe9\x1c\xb2\xec\x15\xcd\xc5\xa2\x51\xcd\x59\x51\xd8\xf4\x25\x9c\x48\x72\x3b\x34\xeb\x74\x4f\x31\x45\x74\x4d\x6b\x38\xb2\xb1\x7f\x1e\x59\x5b\x78\x46\xee\x86\x36\xa1\x98\x59\x3e\x89\x84\xc4\x0d\x70\xf3\x75\x41\x7b\x5a\xdd\xdd\x4b\x37\x9a\x0a\x49\x12\x37\x78\x0f\x89\x3b\xe0\xb0\xd5\x59\xce\x3e\x81\xbc\x75\x3d\x24\x06\xc0\xa0\xd9\x5a\x9f\xad\x26\xf8\xd9\xd3\xae\xdf\xb3\x59\xe3\x30\x88\x24\x9d\x69\xb6\x8b\xcc\x0c\xb1\xd9\xcd\x5c\xdf\x58\xda\x39\xb9\x77\x53\x14\x7c\xca\xf5\x41\xba\xb3\x50\x5f\x3d\x55\x62\x20\xa4\x0e\xf9\x38\x36\x36\xd0\xc0\xcc\x52\xe5\x06\xfb\xd4\x58\xcc\x6e\x3a\x03\x4c\x91\x7d\x97\xdb\x86\x65\xe9\x05\x12\x37\xe0\x45\x14\x46\x2c\xe4\x80\x3c\x1f\x12\x41\xfb\x64\x05\x3d\x4e\x6a\x3e\xb7\x0d\x05\x8e\x3d\xec\x2e\x5c\x9f\x7a\xf8\x54\x56\x42\x5c\xee\x47\x4a\x13\xba\xa8\x6b\x3b\xd5\x50\xd3\x0e\xf8\x9e\x76\x7d\xe0\x95\x29\x20\x99\x11\x0d\x85\xf3\x6d\x46\xbe\x0d\xf3\xfc\xf4\x48\xf7\x17\xb5\x26\xad\x8d\x33\x72\x7a\xd2\x0d\x3e\x36\x9b\x44\xb7\x98\x33\x71\xcc\xfc\x0e\x44\xfa\x33\x74\xec\x38\x16\xec\x7b\x2c\x46\xcf\x6f\xa7\x48\xd5\xf2\x48\x1e\x69\xa3\x59\x3f\x59\xaf\xf3\xcb\x64\x3c\x46\x83\x6f\x92\x96\xdc\x9c\x52\x16\xd2\x5d\xc4\x8e\x99\x99\x36\xd4\x24\x4b\xe1\x03\x11\x6b\x77\x7b\xbc\xd5\x3a\x94\xcd\x26\x86\xc3\x8a\x5b\x11\x90\x80\xd2\x66\x33\xda\x2a\x43\xf6\x0a\x84\x61\x1e\xc1\xd5\xee\xc2\x30\x0d\x57\x09\xcd\xf4\x0e\x33\x3f\x3f\x13\xe7\xe1\x45\x6f\x78\xde\x6e\x87\x17\xcc\x37\x8a\xb3\x8f\x6a\x73\x92\xa5\xf1\xfb\xee\x83\x38\xef\x5c\x80\xb0\x22\x02\x38\x1c\xe3\xa9\x7d\x1b\x8c\x92\x55\x9a\xcf\xe6\xe2\x15\xd3\x90\x26\x18\xd4\xe5\x65\xc5\x66\xcb\x4a\x3d\x48\x9d\x3c\xdf\x5d\x66\x00\xd5\x74\xcd\x70\x48\x82\x56\xeb\x9f\x2c\xc9\xb5\x90\x92\xe3\x85\xab\x11\x6a\xe7\x59\x18\x47\x7b\x17\xb2\x74\xd1\xca\x34\x52\xe5\x29\x9e\x72\xc8\x73\x75\xd1\xd3\xe7\xed\x36\x86\xb3\x5e\x6b\x22\xb0\xb1\x79\x9e\x7f\x6c\xae\x84\x02\x7c\xa9\x8a\x9d\x0b\x08\xe0\x38\x57\xf5\x29\xfc\xd8\xac\x09\xe9\x6c\x4c\xcb\x63\x59\x19\xd9\x9e\xcc\x65\x72\x90\x0d\xab\xa0\xe9\xfe\x99\xd5\x40\xf2\x00\x56\x7b\x78\x87\x43\x2a\xaf\x29\xad\x22\xce\xbd\xfb\x35\x78\x4a\x61\xe5\xc0\x7c\x5a\x6b\x01\xcb\xe6\xa6\x14\x75\x1b\x33\xe0\xfd\x8f\x0d\x25\xd5\xe1\xa1\x5c\xd0\xde\xd9\xda\x7a\xd5\x3f\xff\x29\x37\x64\x3a\xfe\x27\x7e\xee\x55\x12\x2c\x8a\x75\xc7\x21\xf3\xf3\x5e\xaf\xa5\x16\xea\x86\x8f\xcb\x56\xd0\x53\x49\xc4\xc6\xd3\x5e\x79\x21\x45\x6b\xe7\x71\xdf\x96\xa2\xdb\x1b\x33\xf2\x5d\x83\xf3\xa7\x6c\x34\x1a\x0d\x07\x66\xe4\x29\xfe\x72\x40\x96\xf7\x43\x7e\x2f\x97\xb8\x23\x97\x7a\x6d\x03\x5b\x46\xdd\xef\x18\x49\x96\x17\xfe\xa3\x5c\xf8\xf1\xc3\x43\x46\x24\x3b\xc3\xa3\x56\xcd\xa6\x3c\x64\xdd\x9d\x9d\x02\x56\xea\x02\x36\x07\x3b\x64\x8f\x3b\xcd\xe6\xc1\xfe\x21\x2b\xf9\x43\xd5\x6a\xc8\xfd\x87\xcd\xe6\xde\xa3\x0a\xa4\x2e\x41\x5a\x62\xe6\x73\xac\x67\x3e\x47\x24\xa5\xbb\x30\x74\x25\xbb\x40\x71\x01\x45\xe5\xbd\xcb\x4b\x37\x3c\xac\x29\x11\x94\xde\x3b\x0e\xda\x34\xa8\xf8\x6a\xf6\x11\x42\xcd\x26\x30\xd4\x8c\x54\x3c\x15\xa5\xc3\xc6\xca\x0d\x30\xbf\xf0\x00\x92\x75\x6c\x76\x47\x42\x0d\xd2\xdd\xee\x6b\x2f\xc1\xd8\x69\x6e\x46\xb8\xfc\x31\x01\xfc\xc7\x22\xb6\xe6\xc7\x9a\x73\x7d\x36\xaa\xb6\xbd\x83\x3b\x64\xdb\xd5\xac\xb8\x46\xf3\x32\x64\x48\xe0\xec\x0e\xdd\xeb\x3e\x68\x37\x80\x3b\x32\x44\xcc\xa0\x5d\x81\x39\x91\x13\x50\x8c\x83\x66\x02\xcf\x7f\xf8\xab\x34\xc7\x06\x16\x5a\x6b\x07\xce\x48\xa4\xc1\x66\x18\x46\xc3\x03\xce\x0c\x17\x41\xbc\x12\x95\x64\x12\x7e\x01\x9d\x2c\x63\x1a\x6b\xd6\x85\x81\x66\x3b\x70\xa3\x59\x07\xb6\xf5\x5a\xd9\xb1\xa0\x30\x59\xa9\xfb\xe6\x39\x20\xe0\x4a\x6f\x3a\x0f\x9c\xa7\xf9\xa5\x30\xdd\x00\xd8\x29\x03\x8e\x36\x00\x76\xcb\x80\xb3\x35\xa4\xa5\x27\xfe\xe0\x6e\xcd\xf7\x9d\xf4\xfb\xad\x66\x2f\xe1\xfa\x2f\x90\x1c\x69\x66\xea\x5d\xc0\x89\x66\x4a\xc2\xa9\x66\x1f\xe0\xb9\x66\x33\x09\xdf\x56\x0f\x48\xcb\x71\x16\xf0\x5d\xaf\xf7\x48\xfe\x01\x12\xbe\xda\x3c\xb3\xf0\x74\x2d\xdc\x31\x99\x91\xdf\xc1\xe6\x89\xa1\x70\xa9\xd9\x46\xa6\xdd\xd2\xf5\x34\xce\x02\xf3\xe9\x5a\x86\xc5\x3c\xff\x59\x4a\xe7\x32\x83\xc2\x1b\xcd\x7e\xc2\xbb\xbf\x40\xde\xcd\x52\x67\xe7\x2a\x79\x5a\x83\x84\x84\xa9\x76\x17\x6b\x88\x34\x96\xeb\x49\x26\x40\xb1\x04\x34\xe3\xa6\x82\x0f\x7a\xfd\xcc\x7d\x67\x67\xce\x99\x69\xe0\xab\x0d\x70\x6f\x0c\xdc\x8c\x7c\xd0\xd0\x81\xdf\x15\x51\xb4\xdd\xa5\x36\xd7\xf7\x59\x75\x08\xb2\xe0\xde\x92\x49\xdd\x29\x65\xf4\xae\x24\x00\x55\x7d\xe5\x75\x3b\x3b\x7b\xbf\x11\xd5\xc6\x0f\xb4\x55\x29\xd8\xa5\x6d\x4c\x16\xd9\x3a\xd8\xdf\xdf\x3d\x58\xc0\xeb\x35\x33\xf9\x52\x43\xa4\xd3\x89\xf5\xf1\xef\x90\x83\xae\xcd\x3a\x4d\x97\x44\x1a\x15\x4d\xa6\xeb\x7d\x97\x52\xcf\xbe\x6a\xc9\xf3\x6e\xf1\x7e\x87\x52\x54\x77\xe0\x78\x5d\xb7\x39\x7f\xca\x3f\x25\x71\x5a\xdf\x34\x91\xad\x2e\x6d\x11\x87\x36\x9c\xd6\x5b\x45\xbe\xea\x34\x91\x09\x7c\x5d\xd9\xa2\x19\xf9\x69\xba\xfb\x8c\x2e\xe0\xe7\x32\x72\xe9\xa5\x7c\xb1\x22\x03\x51\xf9\x08\x94\x44\xde\x5b\xf2\xc2\x7e\xcc\xf2\x71\x76\x6d\x32\x87\x22\xac\x36\x4f\xf7\x00\xb2\x74\x05\x08\xf9\x43\x11\xb3\x00\x70\xbb\x52\x29\xb3\x52\xce\xc8\x89\x06\xad\x4d\x87\x13\xa3\x35\x19\x5d\x1b\xd9\x2f\xe9\x3b\xae\xd3\xd2\x9e\x73\xfe\x0f\xcc\x56\xf6\x8f\x0b\xc7\x72\x3c\x37\x0c\x99\x1f\x11\x69\xe4\x1b\xf1\x59\xb4\x81\x0f\x01\x73\xce\x6d\x5f\xb9\x9c\xb6\x9c\x0b\xa7\x8c\x37\xd8\x84\x65\xc7\xcb\x4e\xe9\x70\xd3\xae\xc8\xf5\x71\xca\x44\xae\x9f\x9d\x0a\x0b\x19\x51\xae\xdf\x77\x4e\xaf\x44\xe3\x4d\x1c\x49\xf7\x99\x08\xa2\x81\x70\x23\x29\x3e\x0e\x1b\x5c\x37\xbe\xc7\x91\x74\x5a\x56\xfd\x70\xe0\x35\x36\xd3\x73\x96\x40\x1d\xda\x72\x1a\x43\x1e\x8e\x31\x27\x5b\x43\x5f\x89\xc6\x30\x1a\x8f\xa3\x99\xcd\x28\xf5\x4d\x93\xdf\x15\x89\xa8\x81\x9a\xf1\xbb\xd8\x73\x7a\x35\xc5\xc6\x28\x33\xd8\xa0\x10\x66\xe4\x95\x86\x63\x8d\xd1\x37\x0b\xc9\x38\x13\x2c\xc2\xdb\x57\x12\xa6\x4a\x4d\x4c\xb5\x50\xe7\x98\xcb\x46\x28\x75\xd4\xe0\x2b\x5a\x80\xa9\xed\x64\xd4\x98\x46\x71\x1c\xfa\xe1\x38\xd4\xa1\x88\x9d\x96\x6d\xf4\xfa\xf6\x6d\x39\xc5\xf6\x6f\x80\x03\x1f\x61\xb6\xf9\x74\xe0\x43\x86\xe5\x3f\xa9\xc8\x1f\x8b\x89\xad\xc4\x34\x19\x37\x59\xd7\x61\x6d\x39\x9e\x69\x26\x6a\x70\xde\x72\xd9\x51\x78\x23\xa4\xc5\x80\x70\x0e\x6d\x91\xb7\x8a\xcc\xc8\x73\x0d\x7b\x80\x5d\x97\xbe\x0e\x8c\xe8\x7a\xa6\x37\x1c\xfe\x2d\x2f\x5a\x10\x78\x1a\x06\x78\x50\x1a\x5e\xe2\x81\xec\x17\x9a\x7d\x86\xf7\x6b\x45\xda\x0f\xa2\xe8\x83\x1f\xd6\x88\xfc\xac\xd9\x0b\x4d\x66\xe4\xbd\x86\x1d\xd8\xdd\xa1\x14\xbe\x68\x76\x4b\x9e\x19\x61\xf7\x59\xc3\x4b\xf3\x1f\x85\x27\x9a\x85\xf0\x63\xfd\x42\x8d\x47\x9f\x21\x5c\xab\x8c\xdb\xba\x3e\x69\x76\x04\x6f\x35\xfb\x02\xbf\xaf\x5e\xbb\xb2\x6c\xb2\xf0\xc7\xda\xaa\xb2\x9b\x16\xfa\x98\xbd\x1b\xa4\x60\x2f\x40\x09\xb6\x0d\x5a\xac\x76\x54\xf7\x32\x83\x7d\x46\x94\x80\xdd\x1d\x90\xd6\x8f\xe5\x83\xb6\xf3\x2b\xed\x4a\xed\xf2\x45\x96\x01\x4f\x14\xab\xd9\x6b\x14\x19\x76\x55\x41\x23\x5d\xfc\x55\x3d\x2f\x34\x51\x0f\x76\x77\x72\x39\x93\xfb\xbd\x0b\x02\x5c\xde\x93\x6c\x46\xb4\x40\x49\x97\x61\x4e\x96\x31\x63\xd2\x40\x91\x61\xde\xdd\xf9\x4d\xb9\x02\x04\x7b\x9b\x8e\xd8\xee\x0e\xe8\x76\x97\x52\x90\x4c\xf6\x0d\x0f\xba\x23\xea\x29\x77\x04\x06\xbb\x30\xd8\x4d\xe9\x5e\x7e\x7e\xfb\x99\x86\xdf\x0d\xd4\x90\xb6\x34\xcc\xc8\x1f\x18\x3a\xff\xdb\x67\x4d\x11\xb2\xc8\xaa\x57\x86\x4c\xb9\x00\x3f\x53\xe0\x82\x3d\x87\x40\x6c\xd8\x89\x49\x17\x6d\x75\xd8\x29\xda\x9d\x08\xd8\xea\xc2\xfd\xc8\x13\x20\x3c\xfd\x60\x77\x67\xde\x81\xa1\x97\xa4\x2e\x16\xce\x52\xcd\xea\x8e\x3c\xc1\x36\xa1\x03\xa6\x67\x54\x4b\xc5\x54\xdb\x34\x92\x69\x10\x76\xb4\x38\x08\x0a\x09\x4b\xf0\xc4\xf2\xca\x0e\xeb\x1c\xca\xfc\x14\xe9\xbf\xef\xee\x80\x60\x88\x57\x83\x6c\xeb\xd2\xfe\xde\x0d\x09\x84\xa9\xa9\xad\x4d\x0d\x12\xce\xa0\x08\xf7\xf8\xa2\x0d\x37\x8b\x15\x3c\xba\x25\xdd\xed\x05\x0c\x05\xf3\x25\xf8\x82\xc5\x12\x62\xb1\x59\x81\x1b\x57\xbf\xaf\x58\xb8\x32\xce\xae\x05\x68\x75\x6b\x81\x59\x3b\xb9\xbc\xca\x6e\x37\x5b\x2c\x60\x20\x18\xd7\x70\x23\xd8\xe6\xb3\xf8\xf7\xfc\xc0\xe3\xe0\x07\x9e\x02\x9e\x78\x02\xfc\xc4\xd3\xe0\xdf\x79\x12\x82\x53\x0f\xfb\x72\x5b\x30\x2d\x61\x22\x36\xcf\xcb\x2b\xc1\xa4\x84\xa9\x58\x2b\x08\x0e\xbb\x7d\xe5\xdd\x91\x2b\xc3\x7b\x13\x7b\x4c\xd1\xb0\xcd\x48\x30\x2e\x61\xb6\xb1\x9c\xe3\xd8\x82\x1d\x48\x6f\x52\xb9\x13\x6b\x8e\x4f\x75\x30\x4e\xa6\xa2\xd6\x80\x60\x7b\xbb\x78\x58\x61\x6f\x9f\x31\xdd\xef\x7a\x1d\x48\x98\xe8\x25\x45\x68\x53\xab\x55\xc4\xdf\xd6\x12\xb4\x63\x50\x64\xba\x4d\x95\x9f\xe6\x3a\xd2\x3d\xc5\xba\x9d\xdf\x54\x8b\x97\xb6\x63\x12\xc6\x44\xff\x48\x7b\xd7\x9a\xd8\x9a\xda\xca\x53\x74\x01\xb7\xeb\xe6\x44\x38\x24\x81\xa9\x64\x3e\x9f\x91\x6d\x01\xce\xff\xe5\x40\x42\x4b\x75\x58\x8a\x66\x64\x24\xc0\xf1\xcc\x37\xa4\x26\x5d\xc7\x39\xae\xe3\x55\xe0\x80\x71\x3c\xf7\x79\x27\xc8\x8c\x4c\x05\x04\xad\x2e\x66\xeb\x49\xc5\x0d\x2f\x4c\xc7\x23\xdd\xe3\x2c\xf7\xb9\x5e\x6b\x32\x24\x37\x02\x75\xd9\x99\xb0\xd1\xc4\x3c\x3b\xdd\xb2\x58\x02\x4a\xe0\x48\xe7\x5f\x29\x5c\x8b\x95\xab\x91\x6d\x9d\xa8\x37\x28\x49\x1b\xf4\xc0\x01\xeb\x81\x4a\x4c\x83\x12\x96\x14\xf9\xb4\x6e\xc8\xad\xa5\x65\x6a\x38\x55\x50\xc4\x88\x94\x25\x65\x82\x52\x30\x83\x29\x4b\x66\x01\x47\x62\x85\xc1\x60\x29\xd1\x75\x4a\x44\x4a\x49\xdf\x01\xab\xfa\x09\x9b\x66\x54\x14\x94\xdc\x92\x6b\x53\xc5\xb5\xb6\xfd\x29\x5a\x5d\xd0\xd4\xd0\x83\xd4\x08\x74\xd8\x56\x41\x6d\xcf\x18\x52\x4e\x56\x8a\xa0\x40\x97\xf2\xc3\xa6\x84\xe8\x94\x90\x7f\xcb\x92\xe0\x1a\x93\xe9\x5e\x33\x5d\x10\x72\x47\x8e\xca\x84\xe8\x56\x17\x93\xa1\x21\x19\xba\xbc\xd5\x91\x02\x1e\xa5\x97\xd2\x9d\x0a\x26\x24\x3c\x17\xab\xf5\xe9\x53\x01\x78\xcd\x96\xf7\xe0\x81\x03\x92\xf6\x67\xe4\xc4\x4c\x32\xac\xe2\x21\x48\x4a\xbd\x02\x26\xae\x00\x75\x2d\xd0\x23\x04\x32\xea\xfe\xb7\xe5\x19\xd9\xeb\xd1\xce\x02\xbe\x0b\x76\x24\x41\x4a\xf6\x5d\x98\xc9\xf8\x74\x2d\xb3\x88\x22\x41\x8c\x40\x2e\x16\xf6\xf8\x09\xcf\xde\x5b\xee\x8e\x18\xb7\xef\x23\x3b\x5a\x11\xc2\x46\x25\x58\x0b\x51\x4a\x9a\x92\xc0\x0c\x43\xce\x66\x18\xd1\x85\x97\x29\xb8\x1c\xf6\x3b\x9d\x43\xdd\x47\x33\xc9\x90\xf1\x5a\x1b\x15\xd5\xbb\x25\x4f\x85\xf5\x9a\xb4\xba\xa8\x84\x16\x5d\xbb\x8c\x4a\xad\xf9\xaa\xea\xaf\xab\x17\x27\x5c\x8a\xf5\x5b\xed\x79\xfd\x1d\xcb\x45\x6f\x2a\x5c\x54\xbe\xea\xe5\x8e\x5c\x0a\x58\x1f\x07\xa4\xc1\x5e\x02\x96\x3b\x57\x28\xbc\x13\xec\xb9\x84\x0f\x62\x5d\xd0\xc8\x8c\xbc\x13\xab\x76\xd8\xbe\x0b\xa2\x30\xea\xc6\xa2\x79\x55\x21\x5f\x63\xf0\xd9\x6a\x14\xea\x57\x50\xcf\xd2\x7b\x7f\xe9\xc2\x4c\x61\x5b\xc5\x99\x60\xc7\x12\x5e\xaf\x5d\x14\x2e\x25\x41\x8c\x67\xc2\xb6\x91\xda\x5b\x06\x36\x78\x9a\x3e\xac\xac\xbe\xb3\x00\xa2\xd8\x8c\xbc\x11\xf0\x3a\x45\x05\xd8\xaf\xaf\x04\x89\x34\x85\xef\x82\x9c\x51\x48\xad\x52\xb1\xa1\x02\x64\xee\x05\x85\x63\xb9\xde\xbb\xf2\x41\xa4\xcb\x57\xef\xa3\x74\x4f\x79\x7c\xcd\xee\x7d\x4f\x4a\x08\x3c\x2e\x8d\x92\x2e\x41\x78\xc7\x12\x86\xf9\xb9\xe4\x22\xa8\x48\x94\xf4\x07\xfe\xce\xdb\xea\x82\xff\xdd\x73\x1c\xf0\xaf\x2b\xd9\x4e\x8f\x2b\x70\xc2\x9b\x46\xe0\x7f\xab\x40\x7c\xad\x40\x9c\x7a\xc7\x82\x38\x0e\x05\xfe\x35\x7b\xba\xf1\xee\xf9\x77\xef\x48\x03\xbf\x36\x7f\x83\x5b\x4f\x02\x9f\xe2\x0b\x85\x7f\x7f\xe2\xdf\x23\x9c\xf4\x71\x5e\xfe\x2c\x7b\xf2\x07\xe6\xbb\xff\x39\xfb\xfd\xc6\xdb\xea\x96\xb3\xf7\x95\xea\x27\x33\x72\x1b\xa1\xf8\x46\xa9\x72\x17\x41\x17\x24\xf5\x24\x6d\x39\x0f\xf8\x34\x7c\x70\xb3\x53\xba\x1f\xf0\x99\xd8\x98\x06\xf6\x65\xf5\xf3\x7e\xed\xf3\x0b\xb1\xca\xcd\x56\x64\x97\xab\x7e\xde\xad\x7d\xfe\x2c\x36\xe6\x98\xfd\x52\xfd\xbc\x57\xfb\xfc\x64\x73\xdd\x3f\x36\xd7\xfd\x69\x33\xf2\xb7\x9b\xdb\xfd\xfb\x66\xca\xff\xd8\xdc\xa9\x32\xd9\x48\xb9\x4a\x36\x96\xd6\xc9\x46\xca\x45\xb2\x91\xf2\x24\xd9\xd8\x2d\xbc\x46\x5a\xbd\x65\xc1\xe6\xe2\x51\x52\xde\x2b\x47\x23\xc3\xb6\x0e\x56\xae\x93\xef\x23\x63\xa4\xcc\xc8\xef\x51\xea\xf6\xb4\x4e\xa1\x02\x5f\x98\x6c\xbe\xd9\xf8\x8e\x7c\x46\x14\x76\xff\xb8\x48\xef\x91\x54\x12\x8e\x3e\x89\xea\xfb\x92\x23\x32\x41\xb1\xa4\x69\xe6\xb3\xbb\x13\xa5\x3d\x69\xe5\x6e\xf7\xa3\x84\xfc\xe3\xb5\xb4\x17\x4b\x84\x52\x8b\x91\x50\x5e\xc3\xf9\x47\x4b\xb6\xfe\xe1\xfc\x83\x7a\x41\x88\xf1\x06\xd9\xf2\x13\x25\x24\xcd\xf6\x2d\x06\xd6\x35\xa3\x69\x8b\x38\x8d\x41\x38\x0a\x75\x0c\x98\x46\x7f\x14\x69\xfb\x09\xeb\x36\xb2\x0f\x92\x90\xe8\x90\x28\xdc\x91\x2c\x52\x92\x26\x65\xe3\xa7\x74\x13\x70\x42\x64\x71\xd0\x96\xe3\xc9\x0b\x1f\x02\xb6\x85\xca\x6e\x6f\x45\x2f\xd9\xa6\xdd\x90\x69\x08\x09\x48\x0c\x28\xf0\x5f\x82\x74\xf9\x09\x6e\x9b\xe0\x5e\x26\xc7\x1b\x9f\xec\xad\x8e\x41\x7e\x00\x8e\x68\x68\x77\x8d\xf4\xa8\x0c\x11\xa7\xd4\xc3\x2e\x0f\xa0\x03\xf7\xfc\x04\x1d\x21\x45\x6a\x04\xdf\x58\x38\x2f\x3d\x61\x46\xdc\xe5\x8b\xf2\x88\x8c\xcb\x8c\x31\x0a\xc9\x8c\x5c\x85\x36\x0b\xec\x23\xe4\x8f\x72\xfb\x07\x65\x58\xd3\xb1\xd9\x30\x0c\xf8\x9d\x67\x7b\xb0\xb2\x43\x77\x53\xee\x2f\x32\x23\xb3\x10\xf6\x40\xd2\xf9\x7c\x0b\x9f\xbb\x9d\x0e\x48\xf4\x22\x9a\x0f\xf8\xa3\x54\x78\xbb\x54\x98\x10\xd9\x66\x5d\xfa\x60\x6f\xde\xa1\x6d\x22\x1f\x74\x3b\x9d\x79\x87\xb6\x88\x7c\xb0\x87\x4f\xa5\xd4\x3a\x7f\xc9\x97\xd7\xa6\x79\x6f\x23\x8c\x7e\x2d\xb2\x6d\x24\x15\x98\xe7\x61\x65\x40\xfc\x9b\x72\x7e\xf8\xa4\x32\x53\x9e\x86\x70\x1a\x56\xb6\x16\x47\xc9\x2f\xee\x4b\xde\x91\x57\x21\x26\xe4\xb7\x57\x06\x18\xc3\x33\xaa\x60\x9a\x95\x31\xc9\xbe\xa3\x55\x22\x1c\xcf\x19\xf2\x71\x2c\x4a\x2b\xc5\x5d\x05\xcc\xdd\x9e\xcf\x1d\x67\x2b\xbd\x7f\xda\xac\x5a\xc5\xb1\xf0\x32\xe0\x7b\x33\xd6\x97\x11\x7c\x0e\xe1\x54\x13\xd9\x72\x98\x53\x61\xf6\xeb\x64\xed\x0e\xa5\x73\xe9\xd8\x14\xd5\xb5\xad\xca\xa3\x0a\x21\xac\x60\xa5\xc7\x96\x95\xaa\x13\x83\xc9\x4a\xf8\xca\xbf\x60\x56\xcc\xe7\x9d\x43\x76\x47\x64\xb8\x4a\xa8\xe9\x0a\xed\x0b\xc0\xbb\x10\xfe\xcb\x13\xa9\x97\x47\x7d\x95\x32\xb4\x57\x39\xe4\x93\xe9\x04\xa7\x7c\x4f\xef\x69\xb2\x71\x91\x7a\xbe\x79\x99\xf9\x56\x9e\x18\xd2\xdd\xee\x9f\x26\xde\xf3\x84\xda\x1b\x1c\x8a\xd3\x82\x9b\xeb\x78\xba\xb9\x8e\xcb\x6a\x13\xd4\x10\x24\xc8\x61\x39\xe1\x7a\x15\x20\x1b\x68\x8b\xa7\x04\xf7\xae\x0c\x17\x27\xe4\x4d\x52\x15\x11\x1f\xca\xf3\xf5\x28\x24\xc7\xe4\x7c\x46\x06\x21\x04\x21\xf9\x9e\x90\x0e\xa5\xf0\x2e\x21\x27\x09\xee\x93\x00\x7e\xc9\x3e\x3f\xc5\x97\x70\x99\x90\xe5\xc1\x76\xfe\xfc\xd3\x8e\xf2\x3a\x80\xad\xce\x22\xc3\xf7\x0b\xa8\xec\x39\xc5\xfc\x1a\x60\x7a\x51\x6e\xc1\xab\xda\xec\x4b\x1d\x22\xd5\xd1\x38\xab\x02\x61\x48\x90\x4c\x63\xe9\x8b\x94\xe4\x35\xa0\xe2\xcb\xc7\xa4\xbc\x87\xe5\x7f\x2b\x42\xc7\x82\x57\x2d\x63\x20\x0f\xc1\x71\x60\x46\xde\x87\x90\x68\x38\x4b\x8c\x14\x1f\x02\x4e\xef\xd7\x09\x7c\x32\x75\x7d\xa4\x14\x7e\x84\x66\x71\xc3\x65\xb2\xa5\xcc\x3f\x25\x45\xba\x5a\xc3\x4f\xf4\x2a\x7d\xc1\xdd\xa3\x13\xcc\x14\x76\x8a\x93\xf7\x18\x33\x8b\xbf\xc2\xfd\x01\xce\x41\x2e\x6f\x2b\x4d\x86\x39\x3d\x01\x4d\xe3\x0a\xb7\x8b\x7b\xce\x64\x39\x8d\x38\x9a\x21\x48\xe5\xc7\xc4\xfe\x7b\xad\xe1\x4b\x48\x9c\x61\x38\xd6\x42\x19\x79\x94\x6e\x2d\x45\x6c\x46\x5e\x84\xab\x75\x95\xdb\x24\x13\xa2\x74\x01\xaf\x88\x84\x63\x72\x7e\x49\x9c\x38\x1c\x0b\x19\x88\x81\x83\x3e\x84\xc4\x52\xb5\x85\xee\x0c\x33\xd6\xc4\x09\xe5\x55\xe8\x87\x7a\x19\x42\x64\x10\x93\x64\xc5\xd7\x24\xfb\xca\x03\x8d\x69\x9d\xca\x9f\x3b\x46\x80\xd8\xcf\x4a\x04\x22\xbc\x11\xca\x81\xbb\x94\xbd\x88\x33\x52\x51\x32\x75\x20\x32\x1c\x94\xeb\x05\x9d\x43\xdc\x2c\xea\x3b\xfd\x6c\x0f\xa5\x69\x40\x3c\xa7\x24\xe2\xbf\x26\xa9\x7e\xd4\xb6\xc7\xe7\xb6\xe7\xf3\xf4\x69\x50\x7a\x16\x45\x4f\xcb\x5e\x01\x2c\x2c\x90\x7d\xe0\xc5\x28\x0f\x70\x90\x05\x64\xdb\xd3\x1a\xd3\xc7\x6b\x4c\x1f\xaf\x5d\x51\x38\xa7\x2e\x43\x63\xa8\xa0\x3c\x0e\x00\x7f\xda\xe3\xcd\x18\x13\x82\xc9\x62\x04\xcd\xde\x67\x49\x46\xf3\x94\xd6\x58\x51\x98\x56\x14\x62\x45\xa1\x1b\x80\x66\x84\xb3\xd0\x1d\x50\x53\x9e\x71\x57\x40\xc0\xc2\x5a\xa5\x1d\xe0\xae\x0f\x3c\xab\x74\x89\x86\xc8\xf5\x21\x72\x03\x88\xdc\x01\x44\x86\x06\x4d\x33\x48\x43\x86\x42\x32\x0a\x4b\xec\xbf\xd2\x87\x83\xac\x0f\x07\xcb\x7d\x68\xba\x40\x60\x03\x13\xbc\x32\x97\x33\xe1\x06\x10\x30\x61\xc8\x62\x62\xa9\x27\x43\x5c\x05\x87\x6c\x45\x6f\x6a\x5c\xdd\x8a\xde\xcc\x12\x0c\xd8\xde\x2c\x17\x14\x8c\xe0\x75\x58\x14\xab\x25\x66\x5e\x09\x8a\x95\x4b\xac\x5c\x62\xe5\x72\xa9\x47\xb3\x60\x99\x94\x16\xa2\xcc\x80\xd3\x95\x83\xd9\x85\x10\x86\x20\x96\x68\x29\xf5\xe9\xb3\x25\x5d\xe7\xcb\x10\x26\x55\x2d\xe6\x65\x15\x66\xe2\xe7\x9b\xf4\x85\xb5\x5a\xd3\xa9\x7c\xb8\x0f\x84\x31\xfa\x83\x8f\xc6\x9a\xae\xc0\xbe\xaf\xc2\x7e\x43\x2d\x21\x32\x0d\xc1\x7f\x8d\xda\x31\x1d\xc2\xa5\x0f\x2f\x12\xe2\x9c\xb7\xcf\xff\xfc\xf3\xe2\x7e\x41\xe8\x6f\xad\xbe\x0b\x7f\xfe\xf9\xe7\x9f\xff\x63\x7b\xfe\x6f\x7f\xfe\x19\x5f\x38\x94\xc2\x1d\x79\xe3\xa3\xdf\xf5\x32\x5a\x7d\x18\x27\x78\xbb\x30\xda\x91\x59\x04\xa8\x75\x8b\xd4\x0d\xa1\xcf\x75\xc9\xee\xdc\x67\xd3\x18\x30\x76\xed\x8d\x30\xd2\x4d\x52\xda\x72\x16\x4e\x65\x52\x7f\xd9\x6c\xb2\x3d\xa9\xad\xe0\xf5\x25\xfc\x47\xcd\x22\xac\xaf\xe1\x9f\xaa\xdf\x1f\xd7\x0d\xe9\xea\xe7\x47\x75\x43\xfa\xd7\xb5\xd8\x5b\x59\xd5\x62\xef\xab\x03\xf6\x47\x19\xd3\xef\x09\xb1\xe2\x59\xf2\x89\x70\xe0\xcc\x27\x66\xd4\xac\x74\xb4\x69\x9d\xd2\x77\xdf\x52\x21\x1d\x1f\x8b\x91\xb8\x75\xe0\xad\x59\x48\xfc\xab\xec\xed\xf3\x1f\x09\x1f\x9b\xee\x9d\x0e\xe1\x99\x6f\x97\xbe\xb7\x43\x43\xc3\x88\xd6\x16\x68\xc9\x57\x87\xc3\x29\x5e\x2c\x79\x33\xf2\xd2\x30\x42\x77\x6f\xaf\x43\x5b\x0f\xbb\x8f\xf7\x0e\x1e\x19\x09\xa5\x0e\x3b\x7d\xd5\xee\xee\x1d\x74\x1e\x1f\x78\x8a\x3e\xc0\xa7\x87\xf3\x8e\x99\xa5\xf6\xf5\xc3\xdf\xb4\x99\x7e\xa2\x4d\x04\x7e\x45\xb3\x44\x3c\xd8\x3d\xd8\xdf\xb1\xc6\x8a\x7d\xfd\xf8\x60\xde\xa1\xd4\xbc\x9e\x67\xd1\xb9\xf7\xfc\x77\x8f\x48\x26\xda\x64\xf7\x60\xff\xb7\xa4\x45\x92\xd4\xbc\x49\x52\xf3\x86\xd2\x36\x21\xdd\xfd\xdd\xdf\x88\x62\x64\xff\x37\xd9\xda\xa1\x0f\xba\xfb\xbb\xa6\x86\x1d\xfa\x60\xdf\xfc\xdb\x05\x3e\xf5\x04\x53\x2d\xa2\x0e\xbb\x9d\xfe\xae\xd7\x7e\x4c\xc1\xdf\xf5\x92\xd6\x5e\xa7\xf3\x9b\x6e\x91\x9d\x43\xd1\xef\x78\xdd\xb2\xa9\xa3\x79\x65\xfe\xc8\x18\xf6\x60\x46\x74\x0c\x22\x46\x2e\x25\x4e\xdb\x30\xb0\x8c\x61\x07\x56\x6d\xd6\xd5\xb7\xea\xba\xb5\xad\xba\x9d\xda\x56\xdd\x6e\x2d\x33\xc3\x5e\x2d\x8f\xc3\x7e\xed\x38\xfa\x41\xf5\xf6\xc3\xc6\xc3\xda\xcd\x83\x8f\x6a\x89\x00\x1e\xd7\xae\xca\xea\x76\xea\x57\x5f\x75\xbb\xf5\xdd\xc2\xee\xce\x62\x41\x66\xe4\x93\x9f\x36\xba\xda\xea\x19\xf9\xec\x17\xbd\x71\x5a\x7a\xff\xa5\xf4\xde\x2b\xbd\xff\xb1\xe6\xbd\x2a\xf5\xaa\x9b\xbe\xdf\x85\x19\x79\x92\x57\x8c\xff\x6b\x39\xdf\x4a\x62\x41\xf0\x8a\x2a\x76\x65\x73\x98\x5a\x71\xef\x8f\xa8\x59\x86\x8a\x7d\x92\xfb\xe0\x95\x87\x72\xef\xa3\xb7\xa5\x9a\x4d\xbc\xdc\x7c\x3e\xd7\x7d\x7c\xde\xf1\x76\xbd\x2e\x3a\x44\x5d\xff\x5b\xd9\xd5\x54\x99\x11\x87\x9d\x54\x65\x1d\xc7\x64\xe5\x44\xaf\x07\x13\x49\x34\xc3\x54\x29\x36\xa8\x71\x49\xd4\x03\x31\xef\xf4\x65\x8b\x7c\xd3\xf6\x99\xb6\x88\x6e\x39\x0d\x87\x52\x0f\x77\xd9\x42\xbb\x7d\xb0\xc0\x09\xec\x00\x0f\x8d\x21\x00\x83\x98\xe2\x49\x8f\xc2\xcf\x55\xa2\x6d\x2b\x77\x19\x34\x9b\x5b\x65\x9f\x41\xe6\x41\xb0\x4e\x83\x92\x13\xac\xdc\x30\x33\xad\xac\xdf\xc0\xa8\xc8\x93\x18\x24\xec\xd1\x76\xfa\xd4\xed\x74\x68\x2b\x7b\xdb\xe9\x94\x29\x88\xf8\xff\x1f\xd9\xbd\xf0\xdc\x95\x9b\x87\x71\x0f\x5d\xc3\x89\xf7\xd5\x66\x75\x6a\xcd\xea\xd6\x9a\xb5\x53\x6b\xd6\x6e\xad\x59\x7b\xb5\x66\xed\xd7\x9a\x75\x50\x6b\xd6\xc3\x5a\xb3\x1e\xd5\x5b\xf5\xb8\x7e\x55\x5d\xb7\xb3\xd4\xcc\xb2\xdf\x7d\x58\x9a\x45\x44\xb0\x19\x99\xe1\xb0\xa3\xcc\xc6\xdb\x9a\xa4\x99\x51\xf8\xda\xe8\x6c\x28\xb0\xf1\xbd\xce\xc1\x8d\xaa\xd4\xdd\x3b\xe8\xe2\x6b\x51\x81\xcd\x95\x77\x23\x67\x55\xab\xdb\xe9\xfc\x26\x5b\x7b\xbf\xe9\x96\x70\x79\x8b\x08\xd7\xef\x77\xbd\xb2\x5b\xca\x2f\x53\xa3\x98\x21\x8e\x29\x26\x29\xdc\x73\xed\xc9\x76\xc0\x89\x42\xc1\xad\xca\x01\xd3\xa3\xd8\xe8\x85\xbb\xa8\x1e\x72\x5d\xc2\x16\x97\xd9\xfc\xd1\xc1\x9e\x40\x46\x7f\xd8\x7d\xdc\x3d\x28\xdf\x13\x33\xe6\x95\x25\xfc\x4d\x0c\xdd\x5d\x2b\x77\x4a\x2e\x3d\x5e\x8f\x09\xef\x4f\x34\x71\x4e\xae\xa2\x64\x3c\xc0\x1b\x7c\x7d\xd1\x10\x93\xa9\xbe\x73\xa8\x37\x23\xaf\x63\xd8\xd6\xc4\xf9\x5d\x45\x72\xd4\x78\x7d\xf2\xf1\xd1\x41\xa7\xdb\x18\x46\x6a\xc2\xb5\x43\x61\x5a\x33\xee\x6f\xca\x04\xbc\x23\xd7\x11\xdc\x1f\x1b\x41\xb3\xd5\xa1\x70\x92\x3d\x9c\x66\x0f\x5f\xb2\x87\x57\xe6\xe1\xb3\x31\xa9\xde\x08\x10\x1c\xe5\x64\xd9\xa7\xb0\x5d\x46\x1b\xa0\xdc\x92\x94\x6e\xa2\xbb\xea\xa6\x9a\x54\x04\x6c\xf0\x0a\xcd\xa0\x8f\x56\xb8\x7d\xab\x86\x4a\xa6\xd3\x44\xd7\xa5\xc0\x25\xd9\xea\xc2\x56\xa7\x9e\x1e\xd4\xbe\xee\xd6\xd3\x08\x5d\x92\xad\x0e\x42\xd7\x18\xd6\xbe\x37\xab\x33\xa1\x98\x97\x31\x97\xea\xfe\xc8\xf4\x41\xe2\xfa\x14\xfc\x2b\x4f\x82\x1f\x79\xca\x08\x72\x51\xf6\x59\x56\xd7\x89\x2c\xb7\x56\xea\xfb\xf3\xbf\x63\x87\x7c\x1a\x0b\x43\x4a\x10\x4d\xa6\x63\xa1\x45\x83\x0f\x06\xa1\x1c\x61\x08\x1e\x9e\x9e\x32\x56\xb6\xa7\x5c\xbf\x3f\xd3\xb6\xbf\x27\x78\x3f\xa8\x67\xca\xbe\xb7\x00\x71\x83\x2b\x81\x99\x32\x42\x25\x06\x65\x3f\xd6\xb4\xca\x60\xbf\x9b\x45\x4f\xc4\x70\x4b\x7e\xc4\xd0\xed\x1a\x2b\x2c\x06\xe4\xbb\x9d\x6c\xb9\x2b\x79\x49\x97\x99\xb3\x5b\x67\xce\x19\xdf\xb8\x1d\x73\x57\xed\x00\x6b\xce\xf2\xaf\x76\x20\x3f\xa3\xd7\x82\x9f\xa1\x41\x14\xa3\x41\x74\xd3\x2b\xb6\x01\x67\xe4\x6a\x0c\xdb\x46\x69\xe5\xa7\xb8\x1b\x98\xbd\x30\x26\xa4\x17\x40\x6c\x5f\xdc\x8c\x81\xe3\x66\x1f\xfe\x7a\x1f\x9b\xa9\xfd\x8d\x42\x82\xdb\x7e\x0a\xfc\xcf\xf6\xc3\x00\x23\xb1\x6a\x3b\x7f\xb7\xe5\x16\x1a\x2b\x92\x48\x86\x63\x46\xdd\xed\xfe\x64\xec\x99\xd6\x55\x9c\x44\xd7\x7c\xe3\xfe\xd1\xd1\xe6\xde\x38\x29\x57\x77\x35\x24\x47\xe3\xea\x64\x3c\xdd\x5c\xfc\x39\xdf\xec\x74\xdc\xfc\xf9\x7b\x45\xa3\xa8\x26\xd8\x29\x39\x1d\xab\x52\x10\x95\xf7\x33\xab\xbb\xcf\xc8\xfb\xb1\x8d\xb1\xc8\x6d\xb7\x3f\xff\xec\x5b\x0f\x90\xcb\x0f\x28\xa5\xae\xdf\xbf\xc4\x54\xf0\xca\xf5\xad\x03\x2d\x0b\x38\x55\xae\x8f\x31\x19\xd4\xbb\x24\xce\x03\x07\x8e\xf2\xf3\x47\x58\xc9\xf1\x18\x5e\x8c\xe1\x1d\x91\x70\xcf\x0f\x70\x2f\x37\xf1\x0c\x9e\xe0\xd4\x30\xfe\x82\xe2\x78\x7c\x8b\xcc\xbb\x92\x03\xb4\x44\x2a\x92\xdd\x5b\xca\x9c\x96\xad\x7d\x99\x6d\x66\xca\x57\x57\xc1\xd4\xac\x2a\x3e\xec\x78\x15\x73\xac\xf8\xb0\xeb\x95\x2f\xe9\x2f\x7f\xe9\x14\x5f\x0e\x2a\x1f\xf2\xa5\xf5\xc9\xb8\xb6\x96\x7e\x19\xd7\x16\xdb\x1f\xe3\xba\xe4\xf9\x3c\x2e\x0d\xde\x1b\xbe\x71\x63\xf2\x1d\xdf\x6c\x87\x7e\xa8\x7e\x7f\x58\xfb\xfc\x8a\x6f\xb4\x33\xcf\xaa\x9f\x0f\x6a\x9f\x5f\x97\xc6\xe1\xa3\x2e\xed\x04\x76\xd3\x6b\x4d\xa4\x67\xcc\x23\x54\x49\xa9\x6b\x0c\xc1\x4f\x21\x44\x98\xd0\x99\x56\xef\xf5\xfd\x58\xb5\x7b\xf4\x00\x8e\xc9\xb9\x1c\x10\x87\x8f\x85\xd2\x0d\xfc\xdb\x9e\x71\x25\x43\x39\x72\xe8\x05\x35\x9f\x93\x01\x41\x02\xaa\x06\xe5\x71\x19\x93\x4a\x88\x36\x4b\x95\x3f\xc0\xb0\x4e\x54\xc7\x39\x7c\xf4\x3a\xa9\xde\xbd\xa8\x48\xbd\xaf\x55\x22\x06\x03\xc8\xee\x9d\x88\x45\x75\xba\xfe\xac\x42\xfe\x31\x06\xe7\x4a\x89\xa1\x03\x0f\xfe\xc7\x77\x7e\xc3\xed\xfd\x2f\xde\x83\xd0\xd5\x22\xd6\x84\x48\x26\x69\x7e\xda\xf3\xc1\x9f\xf1\x83\x11\x38\x0e\xa5\x98\x74\xb8\xec\xaf\xa9\x62\x7d\x23\xea\xfb\xaf\x25\x67\x6d\x62\x7b\xb1\xee\xb2\x9d\x62\xc7\x21\x79\x70\x3b\x20\xce\xa5\x3f\xe6\xf2\xba\xd4\x63\x12\x7b\x0b\x5e\x9b\x09\x3a\x1b\xc0\x1d\x26\x73\x3b\xab\x74\xc3\xcb\x8a\xe4\x36\xba\x98\x2c\x07\x30\x9d\x0c\xe0\x0c\x70\x27\xe0\x28\x1f\x25\x2d\x6e\x75\x5b\x46\x33\xc5\xa7\xa5\xba\x54\xcb\xf1\xcc\x4f\x0a\x33\x72\x9d\xc3\xce\xda\xdd\x4e\x07\xa1\x9e\x2d\x8f\xde\x0b\xbe\x29\x22\x6c\x3e\x5f\x19\x00\x36\xcd\x71\xfb\x5a\x36\x7c\x2d\xdb\x51\xa2\xc7\xa1\x14\xed\x50\x0e\xa3\x86\x1f\xa9\x81\x50\xed\x8e\x43\x01\x3b\xc6\xd2\x37\x23\x71\x5e\x6c\xc8\x1b\x43\xde\xc6\x12\xc1\x15\x57\xba\x31\x51\xed\x1d\x24\xf1\x8c\x42\x32\x20\xce\x49\x94\xa8\x40\x60\x5b\x3c\xf3\xbb\xbc\xce\xbe\xdf\xdc\x5d\xba\x4c\x5c\x1b\x7d\xcc\x88\xbe\x31\xf1\xd3\x3a\x90\x18\xb1\xd4\x86\x78\x92\x51\xae\xc2\xd1\x95\x6e\x77\x1a\xd8\xcb\xd6\xed\x6d\xba\xf4\x66\x00\x4e\x12\x0b\xd5\x8e\xc5\x58\x04\xda\x01\x27\x94\xa1\x0e\xf9\x38\xff\xda\x9e\x44\x3f\xdb\x7f\x01\x32\x13\xfe\x75\xa8\xff\x02\x2a\x25\x24\x88\xc6\x91\x72\xc0\xf9\xb7\x20\x08\x2a\xe3\xfc\x0f\x96\x6f\xf1\xdb\xe1\x1e\xae\x6c\xce\xa8\x3d\xe4\x03\x31\xa8\x0c\x51\x2c\x82\x48\x0e\xb8\xba\x73\x28\x7c\xe5\xe4\x98\x93\x4b\x8c\x02\xa3\x14\x26\x03\xe2\xbc\xc0\xcd\x86\x86\x7f\xd7\xd0\x57\x61\xdc\x18\x73\x5f\x8c\x4b\x55\x3b\x2d\x1c\x94\x0a\x0f\x7d\x2e\x6b\xcd\xff\xf6\x20\xdd\x6a\x88\x1f\x48\x31\xeb\xdb\xbd\x0b\xe6\xb4\x3e\x87\xe4\x73\x4d\x21\xfe\x52\x1a\xc8\xb3\x84\x48\xd7\x3f\x71\xfd\x8f\x95\xe8\x86\xbf\xc9\x6b\x9f\x39\x59\x9a\xc6\xb9\x52\xf5\xc4\x6e\x2f\x77\xd2\xbd\x11\x5f\x9b\x1a\x71\x0f\x68\x1d\x83\xfa\x62\x3c\x6e\xc7\x63\x1e\x5f\xb5\xa3\x65\x16\xb5\xcd\xb4\x3c\x6a\xcf\x02\xc1\x26\x72\x07\x5c\x8e\x4c\xc7\x56\x08\x2e\x77\x97\xd3\x52\xbf\x40\xc9\x3a\x3a\x06\x48\x48\xa9\x77\x9f\x54\x67\xf6\xf7\x41\xed\xcc\xef\x8f\xea\x77\x51\x5a\x01\xc2\x91\x34\xac\x39\x6c\x07\x42\x1a\x66\xc8\xab\xb4\x3c\x70\x69\x44\xa1\xff\xb9\xc6\x05\x9f\x56\x08\xf3\x2b\xd3\x66\x07\xf0\xb6\x2c\x09\xc7\x83\x32\xfc\xdb\xcd\x1a\xd8\xef\x7c\xa3\x3b\xf8\x8f\xd5\x56\x8b\x2c\x6f\x08\xa6\x76\xc3\x96\x9e\xcf\xf1\xe4\x2c\x5a\x0f\x3b\x36\x71\x3d\xde\xb0\x94\x1b\x12\x95\xa8\xa7\xa0\xd4\x8e\x55\x0c\x55\xf1\x45\x49\xd7\x1f\xa5\x2e\x29\x5d\xf5\x45\x65\x1c\xe7\x47\xb0\xce\x17\x85\x8e\xdd\x45\x35\xd0\x43\x95\xab\xbf\x24\x12\xd3\x7b\x14\xee\xca\xa0\xba\x99\x3e\x30\xa2\x63\x9a\xe8\xb4\x8f\x55\x90\xf5\xf5\xdb\x41\x85\x19\x44\xb0\x34\x38\xd7\xe2\x6e\x10\xcd\x64\x3e\x3a\xbf\x57\x46\x27\x59\x59\x20\x99\xae\x01\xe7\xc1\x1a\x75\x22\x88\xc6\x8d\x20\x1a\xb7\x79\xa2\xa3\x42\xf8\xfe\xa2\x8c\x1e\x6e\x9c\xfb\x56\x7e\xcd\xc8\xcb\x01\x6c\x61\xb4\x4c\xce\xa0\xb8\x41\xbc\x56\x30\x56\x27\x64\x19\x4b\xb7\x82\xc5\xf9\x7f\xfe\xef\x4c\xd6\x55\x18\x3d\x08\x36\x6a\x78\x51\xb0\x51\x7f\x0c\x97\x3b\x76\x12\x25\xb1\xc0\x99\xb6\xac\xf8\x0c\xd7\x80\x8f\x05\xbf\x11\xcb\xe0\x7e\xb0\x51\x7f\x8c\x83\x8d\x36\xd5\x38\xd8\x38\xe7\x06\xc1\xc6\x19\x7b\xb3\x4c\xaa\x3f\x4e\x56\xb4\x69\xfb\x7f\x23\xb3\x04\x37\x75\x66\x91\x7f\x93\x51\x0c\x86\x5f\x63\x94\xc9\xe6\xee\xbc\xda\xcc\x28\xd3\xcd\x63\x35\x0a\x36\x46\xb4\xcc\x36\x33\xc2\xdd\x66\xe4\xb7\xc1\x46\xfb\xf6\xba\x56\x77\xfd\xfb\x51\xf0\xbf\xd6\x67\x5c\x33\xe7\x1e\x96\xfd\x00\x41\xdd\xb1\xb2\x53\xf7\xab\x9c\xae\x63\xc7\x01\xd7\xa2\xa2\x03\xd6\x94\xfa\xc2\x5b\x10\xe4\xeb\x02\x1e\x1d\x9c\x0e\x61\x18\x92\x0e\x1a\xeb\x53\xba\x4a\x35\x0d\xf8\x58\x18\x25\xec\xb2\x31\x89\xa4\xbe\xca\x50\x13\xc5\x34\x94\xe1\x54\x34\xb3\x10\xed\x2b\xcc\x7e\xb4\x6a\x56\x4c\x95\xb8\x69\x23\x50\x63\xd0\x1e\x8e\xc5\x6d\xba\x6c\x5b\x86\xfd\x79\x93\x17\x79\x79\x93\x2f\xf1\x4a\x45\x33\x67\xad\xb6\xc1\xe5\x68\x2c\xda\x63\x31\xd4\xe6\xd7\xee\x6d\x23\x48\x54\x1c\xa9\xf6\x34\x0a\x2d\x62\xd4\x3e\x2e\x32\x11\x5b\x90\x62\x49\x35\x5d\x56\x27\x25\xef\xba\x6f\xc6\x10\xb2\xfb\x6b\x69\x14\xd3\xb3\x1b\x38\x4b\x95\x99\x5f\xd8\x61\x73\xde\x70\x99\x18\xed\xb5\xca\x45\xce\x0b\xe1\xab\xd2\xfb\x8c\x9b\x9c\xf7\x5c\x05\x57\x4e\x95\xa5\x9c\xa3\xa9\x0a\xc7\x4e\x95\xaf\x9c\xf7\x3c\x2b\xbc\x9f\xd7\x95\x48\xe1\x54\x1d\x0c\xce\x9b\x64\x9c\xc1\x3d\xcc\xf1\x25\xa3\x24\xd6\x4e\xd5\xf3\xe0\x9c\x88\xa9\x16\x13\x5f\x28\xa7\xea\xce\x77\x3e\x06\x3a\x2a\x5e\xe7\x5e\x7d\xe7\x43\x74\x93\xc2\x57\x39\xda\x79\x26\x02\xfb\xa1\xb4\x51\xa7\xe8\x72\xff\x4b\x64\xd6\x75\xac\xf0\xf5\x3f\xcd\x0a\x68\x10\xfd\x35\x2f\x5c\xd8\x01\x3d\xbe\xc1\xac\x1e\x95\x29\xf2\xad\x3a\xc9\x42\x05\xce\x84\xdf\xda\xf3\x77\x0e\xd4\x43\x65\xbf\x07\x15\x07\xda\x9b\x3e\x36\xf2\xac\xce\xf9\x93\x68\xc0\xc7\x0d\x63\xe2\x34\xe2\x2b\xd3\x8a\xd4\x7a\x1a\x84\xf1\x74\xcc\xef\x1c\xb3\x00\x45\xc1\xf5\xaa\x49\x83\x45\xdb\x83\x90\x8f\xa3\x51\xa3\xfc\x23\xed\xb1\x62\xba\x2f\x97\x0a\x6c\x02\xb2\xf5\x00\xf5\xb9\x5a\x2c\x2d\xc1\x38\x8a\x45\x63\x92\x2d\x71\x66\x54\x6e\x03\xf2\xfc\xa6\xbc\x9a\xdc\x3a\xab\xa7\x96\xc1\x6c\x73\x41\x67\x78\x83\x01\x5c\x07\x80\xd1\x2e\x37\x15\x60\x34\xf9\x1b\x86\x4e\x1e\xca\x82\x12\x94\x53\x15\xc0\xa9\x6e\xef\x35\x8c\x90\xf9\x9e\xc4\x3a\x1c\xde\x65\x6d\xab\xcd\xdb\x19\x79\x62\xc6\xb4\x63\x0a\xe3\x53\x37\x1b\xee\x35\x74\x0e\xa3\x48\xaf\xee\x81\xc9\xb8\xbd\xd3\xa8\xaf\xb0\x71\x12\x04\x22\x8e\xcd\xb2\xbe\xa1\x63\x9e\x72\x19\x58\x63\xb4\xba\x5e\x57\x50\x4e\x55\x38\xc9\x8d\xdb\xdb\x80\x7c\xab\xa0\x38\x11\xba\xf1\x8c\x6b\xf1\xe0\x34\x9c\x88\xd2\xa2\xbd\xbe\xc3\x79\x70\x3d\x50\xd1\xb4\xcc\x65\x19\xc7\x7b\x19\xb8\xe5\xba\x60\x1c\x4e\x1d\x70\x94\x08\x34\xe9\xe0\xa5\x17\x1d\x9a\xb3\xe4\x34\x8a\x43\xbc\x10\x13\x9c\x61\x78\xbb\x81\xbb\xb0\xa2\xcc\xbe\xfb\x0b\x7a\x0a\x52\x4a\x5e\xe5\xcd\x2b\xfb\xe5\x66\x1d\xee\xcd\x66\xad\xe2\xdd\x66\xbd\xe0\xc3\xf2\x24\x57\xd1\x2c\x5e\x9e\xdf\xaf\x36\xe3\x39\x0b\xca\xb1\x28\xdf\x35\x1e\x12\x3a\x26\xe7\x25\x6b\xd9\x01\xdc\xe3\x70\xc4\x20\xd4\x8e\x19\x3a\x74\xa0\xff\x1d\x5f\x81\x2a\xb1\xc5\x73\x83\xc5\xf4\x63\x11\x4a\xea\x9f\xb8\xfe\x71\x5f\x79\x7f\x13\xeb\x8c\xcc\xb6\x0d\x69\xd7\x76\x2f\xa5\x54\xc7\xb1\xb0\x37\x2d\x38\xd5\xf1\x7a\x5d\x6a\x2b\x06\x36\xa8\x22\xb0\x41\x95\x3d\x8d\xdf\x35\x6c\x19\xa3\xb3\xd9\x54\x7d\x87\x39\x9e\x79\x9e\xcf\x55\xbf\x78\xf7\x1f\x8e\xe7\x6c\xe1\x1f\x86\xdd\x65\x23\xc0\x5c\xff\x5b\xa5\xc2\x8f\x9b\x2b\x04\xc5\xde\x0b\x72\xcd\x6b\x4e\x5c\x1b\x53\x91\xd5\xd5\x59\xaa\xbd\x1a\x5c\x51\x8a\xe7\x9c\x91\x1f\x37\x70\x8d\x89\x94\xb1\xa9\x65\xcf\x71\x90\xba\x59\xab\x39\x57\x1a\xff\xe7\x4c\xab\x22\xf9\x8b\xeb\xff\xb0\x1b\x6a\x6e\x60\x03\x3f\xb8\xcb\xf7\xd0\xdd\xc0\xdd\xe0\xa0\xa2\xe2\xfd\x7f\x76\x99\xba\xdb\xae\x7e\xc7\x9b\x03\x9c\x4d\x96\x12\x2e\x67\x56\xd4\xaa\x95\xf6\xd0\x5f\x2c\x61\xfa\x57\x56\x0f\xf1\x5f\x10\xd1\xa5\xbd\x86\xcd\xd6\xd6\xcf\x55\x26\x4b\xae\x5c\xa6\xc1\xcd\x35\xd5\x72\x2a\xe4\x20\x94\xa3\x25\x6d\x4d\xdc\x4e\x71\x6f\xb8\x84\xfe\x59\x55\x32\x3e\x5f\xc1\x25\xc5\x38\x7c\xdf\xae\xbf\x33\x9d\xfa\x81\x4f\x84\xd7\xb0\xab\x1f\x6e\x46\xf8\xd1\x52\x87\xfc\x15\x8e\xa3\xc1\x40\x89\x38\xae\xa0\xe1\xaf\x96\x0c\xd7\x97\x41\xc5\xcf\x15\x59\x3f\xd7\x89\xdd\x4a\x8e\x7b\x65\x9f\x61\xda\x8c\x37\xdb\xf6\x09\x97\xe9\x71\x12\x6b\xa1\x1a\x27\x98\x2c\xd7\xd6\x54\x0a\x22\xc0\xc4\x25\xe5\x6d\x15\xc7\xb1\xf3\x0c\x77\xad\x56\x19\x4b\xc3\x48\x4d\x52\xbb\xbf\xa2\xab\x16\x6d\x0c\xa2\x71\x3b\x9e\x54\x9c\x94\xb6\xbf\x9c\xa5\x2e\x4a\x41\xbb\x9d\x3a\x63\x9b\x1e\x20\x55\xd8\xff\x5c\xc5\xb6\xdd\xbf\x52\x75\xe6\x75\x25\x92\xd9\x30\x50\x9f\x0f\x46\xc2\x81\xad\x4e\xa5\xc7\xd6\x87\x5d\xd8\x02\x99\xfa\xe4\xac\x8c\xc1\x48\x61\xb2\xbd\xbc\xd5\x91\x17\x29\x50\xea\xe9\x40\x9f\xe3\x82\x18\x2a\xe5\x20\xdd\x58\xce\xa2\x77\x13\x63\xa0\x5e\x0d\xe1\x75\x92\x46\xec\xe5\x0d\xff\x15\xe3\x4d\x09\x3e\x58\x32\xdd\x62\xa1\xcd\x7a\xba\x3c\x91\x06\x61\xcc\xfd\x31\xce\x24\xa2\xcb\x42\xa0\xca\x4e\x62\x0d\x3b\x89\x7f\x25\x3b\x7d\x12\x42\x15\x83\x7a\xb5\x66\x50\xb1\x8b\x9e\x05\x20\x33\x7e\xaa\x6e\xb6\x2d\x79\x1a\xd2\xe9\x33\xbb\x29\xa6\x4f\x79\xda\xfc\xd7\xc9\xfe\x32\xd5\xe1\x2f\xcf\x83\x0f\xb1\x11\x2b\x7f\xe4\xdd\x6c\xe4\x80\xcb\x8f\x69\x1a\x4e\xbe\x0d\xeb\xa6\xfc\x57\xa1\x62\x54\x66\xa4\x8d\x7e\x32\x2b\xf2\xbf\xa8\x01\x4f\x14\x97\xc1\xd5\x2f\x36\x40\xb9\xfc\xc3\xaa\x85\xe2\x3f\x59\x75\x12\x8e\x07\xc6\x5a\xf8\xf5\xda\x3f\xfe\x8b\x6b\xff\x12\x0b\xf5\xeb\xb5\x7f\xfa\xd7\xd5\xfe\x32\x4a\xc7\xf4\xd7\x6b\x7f\xfc\xaf\xab\xfd\x58\xdc\x84\x7f\xab\x72\xff\xc5\xbf\xae\xf2\xbf\xdb\x70\xff\xb2\xec\xfe\x40\x6b\x9c\x7f\x71\x7d\x05\xe5\x19\x5e\x59\x20\x23\x39\x0c\x47\x19\xfa\x0f\x39\x31\xd3\xf6\x5e\xb1\x01\xcc\x83\x6b\x43\xb9\x1c\x38\xe0\xfc\xdb\xf0\xe1\xf0\xe1\xf0\x71\xfe\x71\x18\x49\xdd\x1e\xf2\x49\x38\x36\xca\xe3\x24\x92\x51\x3c\xe5\x81\x28\x1a\xf8\xae\xa8\x4d\x96\x88\xbb\x58\x3e\xb0\xf1\xbe\xec\xba\xb4\xc7\x95\x98\x74\x83\xb3\x2c\xc0\x87\xe7\x01\x3e\x79\x40\x0d\xfa\x1d\xde\x70\xc0\x33\xab\xc1\x37\x58\xad\xf4\xca\xa8\x3d\x4a\xb4\x16\x2a\x2e\xc8\xfa\x88\x5f\xaf\x6f\x88\x33\x0c\xc5\x78\x10\x0b\x5d\xee\xf7\x17\xa1\x8a\x75\x63\xc0\xef\x1a\xd1\x10\x43\xf2\x66\x42\x5c\xe7\xa3\x70\x8b\x1e\xab\xcf\x83\xe5\xb2\x77\xe4\xe8\x06\x9c\xf7\x91\x1c\x18\x5d\x7a\x2b\x71\x83\x5b\xe0\x9a\x82\x7d\x7f\x92\xd8\xf7\x5d\x7b\x4f\x5d\xe5\x13\xd7\x89\xc2\x8f\x3b\xa5\x8f\xb6\x3a\x79\x53\x61\x22\x74\x69\xae\x74\x05\x3b\x1f\x22\x2d\xbc\xc6\xe9\x55\x18\x37\xcc\x42\x16\xca\x51\xc3\x3c\xf2\x1b\x9b\x0d\x71\x1c\x05\x7c\xdc\x88\x75\xa4\xf8\x48\x98\x96\xdd\x45\x89\x6a\xf8\xc6\x2e\xb6\x2a\x6e\xee\x49\xa9\x05\x32\xcd\x48\x38\x80\x17\x01\x58\x53\xf4\xb4\x7e\x4f\xdd\xca\x1d\xc9\xf7\xd6\x46\x79\x63\x2d\x94\x67\x18\xf4\xe7\xbf\x5d\x0e\xd6\xda\xf5\x6c\x6e\x29\x55\x4e\x75\x74\xb9\x0d\x02\x34\x70\xd8\xda\x4a\xf2\x6b\xe1\xab\xda\x04\x1f\xd4\x55\x87\x8f\xdc\xe6\x17\x58\x10\xe9\x06\xdd\xfa\x6d\xf2\x33\x32\xba\x31\x0d\xd8\x07\xee\xf2\xfa\x95\x95\xda\x9a\x9e\x41\x87\xba\x7c\xdb\x9e\x63\xfe\x0a\x78\x9d\xda\x9d\x0d\xa7\x7f\xbb\x86\xb5\x26\xbe\x99\x28\x55\xa6\x4a\xdf\xef\x38\x14\x2c\x7f\x8d\xb5\x50\x6d\x9f\xab\x76\x1e\xd8\x59\xe6\xb4\x71\x6a\x5f\x98\xa1\x0e\x06\xe9\x69\x4b\x0e\xef\x05\x4e\xf8\x1b\xb8\x0f\x2e\xf1\xa8\x95\xd5\x3a\xe0\x8e\xdc\x6c\xc3\xe9\x36\xa6\xed\x82\x5b\xb2\xbd\x0d\xd7\xdb\x60\x2f\xd3\xbd\xa0\xb4\xb6\x5f\x81\x18\x5f\x08\xb8\x25\x83\x6d\x38\xd2\x98\x6c\x48\xba\xc1\xb5\xf9\xb3\x4d\xeb\xd1\xb0\x15\xe8\x6b\x4d\x38\x86\x6a\x0d\xc0\x71\x2a\xf0\x0f\xd7\x0f\xc1\xdd\x4d\x39\x57\x49\x55\xc5\x78\x95\x0b\x17\xc9\x6f\x7c\xa3\x15\xe1\x3f\x6d\x1d\x8d\x46\x63\x61\x94\xab\xf6\x64\x90\xbd\x1c\xa3\x97\x37\x0f\x1a\x99\xf8\xed\xfd\xc6\x54\xb7\x77\x1b\x53\xbf\xbd\x5b\x0f\x4d\xf1\x23\xad\xa3\x89\x03\x4e\x77\x7a\xdb\x88\xa3\x71\x38\x68\xa8\x91\xcf\x49\x07\x1a\xf6\x3f\xb7\xbb\xb3\x4f\x8b\x61\x3a\x2b\xc9\xdc\x9a\x5b\xb2\xec\x62\x49\x49\xf1\x15\x97\x83\x2c\x44\xa2\x62\xc1\x8c\x85\xd2\x13\x2e\xf9\xa8\x18\xc0\xab\x7a\x69\xc9\x6f\x0a\x6d\xec\xe5\x36\x91\x14\x5e\x6c\xd3\x55\x3a\x75\x91\x6c\x6f\xc7\xab\x8e\x62\xaa\x49\xd6\xfa\x7a\x69\x75\x09\xe5\x38\x94\x25\x8f\xee\x72\x8b\xd6\xec\x46\xd6\x82\x3f\xa4\x98\x55\x84\x8a\x98\x35\xca\x01\x26\x46\x8d\xb4\xda\x64\x45\xa1\xfc\x52\x73\xd7\xd5\xf7\xa2\x9f\xd4\xbe\xd7\x4f\xbd\xfd\xa8\x7d\xaf\x87\x23\x7e\x2a\x73\xd3\x1f\x92\x0c\x55\xd5\x83\xf3\x36\xa8\xe4\x78\xaa\x4c\xd6\xf4\xe9\xcb\x36\x60\x3c\x62\xf0\x9a\xb6\x9c\x71\xe8\x3f\xf0\xa3\x48\xc7\x5a\xf1\x69\x7b\xcf\xed\xb8\x9d\x36\x1f\x4f\xaf\xb8\x7b\xd0\x1e\x84\xb1\x7e\x10\xc4\x71\x01\xe0\x4e\x42\xe9\x06\xc6\xae\xf9\x12\x98\xc1\xfc\xb2\x0d\xd2\xe2\xc0\x05\x90\xcf\x44\x1c\x4d\x44\x7b\xcf\x7d\xe8\x76\xb0\x64\xf9\x75\x51\xf8\x47\xad\xb0\x18\x4f\xda\x03\xae\xc5\x34\x0c\xae\x85\xc2\x82\xd5\x57\xb6\xd8\x93\xa0\x6e\x6a\x58\xab\xe2\x0d\x51\x6e\x80\x07\x44\xef\xcc\x1f\x49\x7b\x79\xea\xe1\x7b\x95\x3f\xe9\xa5\x74\xc4\xbc\x24\x7d\xf3\x97\xfe\xaa\x97\x41\xe9\xe5\x52\xdf\x7e\x0e\x4c\xfd\x67\x75\xc5\x24\x9d\x52\x66\xaa\xe6\xb2\xf1\x7d\x80\x5e\x99\x42\x44\xed\x78\x78\xd7\x43\x43\xe5\x6c\x6d\x7f\xeb\x45\xe5\xb3\xcc\x3f\x87\x43\xb2\x83\xbe\x39\x43\x52\x56\xb6\x56\xa6\xc8\x92\xb3\x6d\xd3\xdc\x1b\x49\xbf\x84\xc0\xcf\x11\xe0\x39\xe2\xf5\x58\x2b\xd3\x6f\x51\x47\x1e\x94\x72\xd9\xe4\x2f\x7d\xbc\x4f\x26\xd7\x6e\x6c\x1e\xff\xdf\x03\xf8\x23\x00\x19\x81\x8a\x40\x47\x20\x22\x48\x22\xe0\x11\x04\x11\xfb\x2a\x89\x73\xca\xe3\x6b\x87\x42\x14\xad\xcb\xd7\x15\x44\x24\x4f\xd9\x95\x66\xf6\xaa\x5f\x50\x85\x6c\xfd\x19\x97\xac\xe0\x18\x2a\xd7\xe6\xe1\xdd\x31\xe4\x83\xc2\x2b\xf0\xf2\x63\x61\x8a\xdc\xf3\xdb\xe2\x96\x19\x51\xba\x60\x8d\x33\x01\xaf\xd5\xaa\xdb\xac\xa2\x69\xac\xb9\x16\x0e\x68\x0a\xff\xf1\x5a\xb9\x92\xdf\x84\x23\xae\x23\xe5\x26\xb1\x50\x47\x23\x21\x75\x71\xb3\xd2\xa9\x0a\x07\xe8\xf3\x6b\x36\x57\x62\xbb\xe2\xf1\x55\x16\x95\xa5\xe9\xea\xb3\x6d\x3d\xe5\x06\x5a\x8d\xdf\x8a\xbb\xf9\x5c\xb9\x13\xa1\x79\xfa\x18\x5f\x85\x43\x8d\xcf\xdd\x43\xb3\x3e\x27\x5a\x47\x72\x3e\x97\xae\xe6\x6a\x24\x34\x9e\x07\x8f\x66\x72\x1c\xf1\xc1\x7c\x4e\x94\x3b\x55\x78\xf7\xf3\x33\xcb\x0b\x84\xa2\x72\x72\xa5\xc4\x10\x14\x33\x5d\x03\x92\x3d\x17\x44\xe3\x79\x22\x92\x10\xd9\x6c\x2a\xd7\xbf\xb3\xec\x72\x87\x3f\x02\xfb\x23\xc0\x1f\x89\xcb\xed\xcf\xc4\xe5\xfd\x7c\xd7\xc0\x4b\xb7\x29\xf4\xc2\x9e\x8b\x81\xe0\x99\xb7\x32\xfc\x0f\x6f\x72\x95\x80\x15\x6b\xba\x80\x81\xef\xd9\x9b\x5a\x1f\x7b\x78\xbf\x6b\xb0\x67\xfe\xdd\x33\x28\xc2\x28\xcd\xac\x3f\xc4\x87\xdd\x05\xf8\x11\x1b\x48\x88\x23\x16\x48\x18\xe3\xcb\xce\x02\x6e\xf0\xa1\xbd\xb3\x80\xed\x88\xdd\x44\x30\x89\xd8\x76\x04\x57\xeb\x58\xea\x9e\x3f\xf7\x26\x11\xf0\x17\x18\x75\xff\xda\x1b\x47\xc0\xdf\x98\xbf\xc1\x0f\x4f\x01\xdf\xf6\x3e\x62\xb6\x39\x9f\x7b\x69\x8e\x37\x7e\xe9\x39\x0e\x04\x37\xde\x19\xf0\x5d\x3c\xff\xfd\xca\x93\x10\xbc\x31\x58\xfc\xb1\x77\x06\xfe\x04\x93\xad\x3d\x47\x55\x05\x3f\xfa\x47\xde\x7d\x5a\x0c\x7f\x22\xd4\x13\xf3\xe7\x39\x66\x8d\x7b\x83\x05\xde\x61\x01\xff\xab\xd7\xc1\xeb\x0f\xb2\xf6\x8c\xd6\x53\xfe\x0c\x69\x46\x6a\x73\x42\x79\xc7\x9b\x46\x10\xdc\x1a\xe2\xf7\xbd\xaf\x98\xd2\xd5\xd6\xfa\xc1\x1b\x47\x78\x0d\x42\xc4\xee\xfd\x53\xf3\x03\xee\xa2\x5f\x48\x0c\xdb\x81\x76\x9a\xe0\xf5\x36\x62\x89\x84\xeb\x88\xdd\xf3\x2b\xec\x0a\x8e\x84\x63\xf2\xb9\x63\xf3\xe7\xc4\xfc\x39\x35\x7f\xbe\x98\x3f\xaf\x30\x1f\xdd\x11\xb6\xe4\x60\x01\x27\xf8\xb0\xb3\x80\xd3\x6c\x00\x9f\x47\xeb\xaf\x6e\x38\x28\x5f\xdd\xf0\x2d\x1b\xfb\xef\xf8\xf0\x68\x01\x4f\x33\xac\x97\xd1\x86\x3b\x1a\x89\x24\x1a\x05\xc5\x9b\x88\xad\x4c\x80\xb8\x7c\x33\xab\xa4\xf7\x5a\xdd\xdd\xbf\x56\xf9\x45\xb4\x4c\x15\xf7\x3f\x95\xef\xa7\x55\xc2\x4c\x2a\x82\x87\xa3\x28\x5d\xc0\xbb\x88\x3d\x93\xf0\x21\x62\x3f\x25\xbc\x8a\xd8\x87\xc8\x8c\xc7\x59\xc4\x5e\x29\x78\xbd\x9e\xc8\x7b\xfe\xc6\xd3\xe0\x87\xa6\xb1\x3f\x6d\x6b\x3f\xae\x1d\x16\xe5\xfa\x7d\x4c\x85\x18\xd9\xf4\x8c\x98\xb1\xe8\x78\x3d\xb8\xcd\xa2\x28\xf3\x0c\x8a\x1f\x23\x38\xb3\x63\xf9\x4c\xb2\x68\x65\x0a\x62\x08\x20\x82\xb0\xa0\xee\xad\xa7\x81\x9f\x79\x11\xf0\xae\x97\x00\x7f\xe8\xa9\x94\xd8\x27\x9e\x00\xff\xb3\xc7\xc1\x3f\xf1\x42\xf0\xcf\x3c\xcc\x82\xfe\x4a\x6d\xca\x82\xee\x0b\xd3\x56\x69\x4a\x7e\x34\x88\x8e\x8d\x62\x43\xe1\x6b\xb4\x3a\x27\xf3\x43\xf0\x31\x27\xf3\xcf\x88\xf9\x82\x84\x14\xc2\x4d\xd9\x24\x7f\x46\x30\x23\xb1\xcd\x06\x67\xf3\x74\x3e\x8b\xd8\x50\xc2\xcb\x68\xf3\x95\x24\x43\xc9\x66\xe4\x59\xb4\xe1\x24\xb9\x93\xc8\xa9\x8a\x02\x11\xc7\x62\xe0\x64\x6b\x6b\x2c\x48\xea\xd8\xcd\x76\x22\x4a\x5f\x52\xa3\xcb\x89\x93\xe9\x54\x2d\x95\xdb\x59\x52\x61\x5f\x46\xc4\xf9\x22\xaf\x65\x34\x93\x0d\x7d\x37\x15\x5e\xc3\x69\x49\xba\x30\xb3\x07\xfb\xf4\x8e\x84\x60\x73\xbd\x3c\xb9\x73\xe0\x6b\x44\xcc\x7b\x7c\x99\xa7\x88\xa9\x7f\xc8\x92\xcb\x2c\xbd\xb7\x0b\xd7\x50\x42\x2c\xc8\x2b\x85\xee\x62\x78\x11\xd9\x2a\x6c\xca\x83\xa3\xc8\x7c\x5b\xd1\x69\x7e\x84\x03\x46\xe1\x7d\xf4\x8b\x97\xae\x7c\xde\xc0\xf9\xb5\x9c\xf8\x06\xfc\x4b\x54\xbd\x8b\x52\xe6\x29\xa0\xd7\xa7\xa8\xe3\xe9\xe5\x80\xe9\x71\x1b\x5a\xce\x10\x98\x1e\xc6\x4a\x6f\xbb\xc5\x70\x70\x54\x10\x40\xb2\x84\x98\x0f\xa5\xb2\x68\x76\x64\x97\x3c\x94\x9c\xd4\xef\x23\xd0\xf3\xb9\xb0\x11\xea\x95\x6f\x98\x85\x2b\xfb\x66\x14\x21\x8a\xd7\xc2\x45\xec\x4b\x04\x3f\x7e\xb5\x87\x3e\x45\x9b\x66\x8c\x4d\xef\x15\x9a\x19\x73\x63\x13\x7b\xe1\x8c\x79\x9b\x2d\x0f\xbf\x47\xeb\x73\x9b\xfe\x88\xe0\x6d\x04\xb7\xe4\x53\x54\xca\x52\x86\x0a\x1b\xca\xc4\x3f\x22\x46\x7e\x0f\x50\xb0\x76\x56\xe6\x58\xb4\x89\x0e\x8d\xe9\x6b\x9a\xde\xcf\xf2\x25\x76\x8c\xe0\xa9\xe5\x24\xfb\xdd\xa2\x94\x21\xfb\xa9\x40\x85\x7f\x91\x6f\xde\x0e\x29\x66\x41\x33\x5f\x13\xa3\x9c\x62\x62\x45\x0e\xed\x6e\x9e\x88\x19\xeb\x3b\x25\x09\xe6\xec\x38\xec\xa4\xc9\xce\x04\x04\x5e\x82\xc9\xce\x12\x4c\x76\xa6\x4c\x9f\x68\xe0\x5e\xe2\xf2\x05\xed\x25\x8c\x08\x86\x88\x76\x68\x9f\xa4\x39\xe9\x5b\x5d\xd0\x4c\xb7\xba\xd0\xa5\x5e\xfa\x8e\xdb\x24\xf5\xad\x2e\x85\x04\x47\xed\xa7\x5a\xb5\x42\xac\xe8\x95\x1b\xa2\x42\xab\xe1\x96\x73\xbf\x99\xb9\xaa\xb1\xf5\x22\xfc\x6f\x66\x61\x1f\xdd\x32\x41\x85\x09\xed\x39\x87\x04\x6c\x2a\x77\x03\x82\xe4\x71\xcc\x37\x24\xb0\x81\x49\xb8\x3a\xdf\xb4\x08\x61\x1b\xaf\x47\x01\x1e\xb2\x27\x10\x84\x2c\x4c\x20\x5a\x09\xdc\xc1\x63\xbb\x36\x3e\xac\xd9\xdc\x7a\x70\xfe\x67\x7c\xeb\x47\x17\x0f\xec\x01\x2f\x89\x77\x4a\xb2\x96\xa4\x8c\x49\xcc\x1e\x66\xb3\x50\x87\x21\x5b\x95\x46\xf3\xf1\xa1\x4d\x65\xb9\x2a\x09\x26\xd7\x8d\x49\x14\xeb\xc6\xe3\x8d\x39\x30\xd3\x40\x80\x28\x24\x4e\xc7\x35\xf2\x72\x5d\x0a\xce\xe1\x38\xe2\xba\x96\x80\x93\x87\xa4\x2b\x76\x7f\xb3\x97\x78\x96\x73\x69\xc2\x30\x64\xdc\xac\xc8\x7f\x91\xa3\xbf\x31\x0c\x89\x6c\x1d\x74\x7e\x53\xbf\x1d\x74\x7e\xeb\x8a\x5d\xf3\x4c\x74\x9b\x53\xfc\x61\x90\x8b\x16\xde\xb6\x17\x57\x96\x2d\x5e\x5c\x59\x16\x30\x09\x11\x53\xeb\xf9\x22\xf8\x7b\xa2\xcd\xa6\x1d\x34\x2b\xbb\x72\x83\x65\xb9\x96\xac\x92\x6b\x89\x95\x6b\x36\x2b\x28\xba\xfe\xea\xd2\x2d\x81\x19\xe1\x60\xe5\x9f\xbd\x90\x1d\xc6\xe1\xfa\xeb\x97\x62\xcb\x4f\x56\xcd\x18\x84\x6c\x1c\xc2\xcd\x66\xf0\x1f\x39\xf8\x76\xb8\x94\x58\x3b\x15\xc8\xeb\xfb\x48\xa4\x7d\xb4\xb6\x7f\xe4\xca\xd9\xa2\x51\xfc\xe3\xc4\xa5\x30\x09\xd9\x76\x08\x57\xe1\x2f\x5e\x39\x36\x0d\xd9\x57\x05\xa3\x90\xc5\x09\xcc\x42\xf6\x1e\xee\x42\x76\x02\x5f\xd5\x32\x9f\xe7\xcb\x89\xf5\xfa\x5a\x3f\xbe\xbd\xbf\x20\xbf\x6f\x63\x90\x10\x5e\xba\x65\x50\x15\x4d\xdb\xed\xee\xef\x1e\x88\x83\xdf\x88\x68\x77\x1f\x3f\xec\x18\x5b\x2d\x4d\xa5\x40\x92\xc3\xdd\xf9\x7c\xeb\x26\x21\x82\xf6\x79\xbb\xeb\x71\xda\x22\xdb\xe6\x57\x7b\x3b\x21\x08\x5c\x44\xfb\x04\x86\x51\x55\x4b\xd3\x45\xaa\xd6\x24\xf5\x54\x1a\xbb\xdd\x43\xde\x47\x3a\x3c\x95\x69\x35\xa5\x9b\x2c\x1e\x1f\xf2\xf9\x7c\xe7\x31\x63\x8c\x37\x9b\x69\xa5\x19\xf4\xce\xc1\xc3\x47\x7b\x62\xbf\xee\x6f\xad\x60\xdc\xef\x3c\x7e\x78\x90\xc3\x14\x09\x39\x3a\x25\x98\x87\x0f\x1f\x1e\x88\x83\xba\x43\xbd\x82\xa6\xdb\xd9\x3d\x78\x94\xc3\x1c\xac\x44\xd3\xdd\xed\xec\x1d\x14\xf4\x3c\x5c\x8d\x68\xff\x60\xb7\x44\xf4\xa3\xd5\x40\x8f\x76\xbb\x07\x8f\x72\xa0\xc7\x2b\xab\xdb\xe9\x3c\x7e\xbc\xbf\x93\x03\x15\xb9\x40\x2a\xa8\x76\x76\xf7\x1f\x3d\x2c\x41\x75\x57\xe3\x3a\xd8\x39\xd8\x2f\xba\xa9\xbb\xb3\x1a\xd7\xa3\x47\xfb\xb6\x33\x6b\x2a\x64\x59\xe0\x61\xb4\x31\x0a\xbc\x6f\x9a\x24\x36\x9d\xe2\x62\x01\x33\x72\x13\x96\xfe\x04\x21\x19\x90\x37\x59\x92\xc9\x61\x42\xf6\x28\x8c\x13\xe2\xb4\x1d\x5a\x7a\xb9\x53\x7e\x89\xbf\x29\x85\xdb\x0d\x53\x65\xa7\x3c\x55\xae\xc3\x5f\xbf\x89\x2e\xd3\x29\x54\x7a\x05\x31\xe6\xfb\x33\x73\x86\x74\x40\xbb\x3c\xd3\xd5\xb6\x4a\x57\x66\x08\x86\xf7\x68\x11\xc1\x38\x75\xf3\xab\x40\x44\x7a\x19\xcd\x8c\xdc\x9a\xa5\x5a\x98\x89\xae\xed\x1d\x34\x47\x21\x9b\x24\x70\xb2\xc1\x90\x90\xbf\x11\x23\xd4\x5b\x68\x41\x9c\xae\x58\xbb\x6a\x99\x40\x2b\x5d\x5a\xfe\x63\x13\x77\xfa\x36\x89\x90\xe9\xc2\x53\x67\xb9\x5b\xbd\x55\x7d\xed\x95\xfa\x1a\x2a\xf5\x58\x9c\x5c\x5b\x38\xd7\x20\x0c\x43\x6a\xde\x75\xec\x4e\x67\x06\x3d\x09\xd7\xa4\xd6\x37\xe5\xbe\x59\x42\xea\xcc\x70\x12\xfe\x55\xf9\xae\x2d\xdf\xb2\xe5\x57\xc2\xb4\x53\x18\xc3\x2f\x17\x7f\xd1\xb6\xe2\x7b\x10\x92\x21\xf1\x8d\x3a\xd8\xc9\xfe\x4f\x8d\x86\x6a\xcf\x69\x7f\x55\x14\x9e\x87\x1b\x4c\x68\xa3\x24\x57\xf4\xe3\x6f\xe1\xdf\xba\x8b\x2e\xbf\x0a\xb1\x74\xd5\x1b\x86\x57\xd9\x93\xe5\xc8\x4a\x91\xc6\x4b\x3d\xca\x57\xba\x65\x33\xb0\x0e\xfa\x2d\xac\x83\x1a\x9a\xbe\xaf\x98\x33\x4c\x12\x43\x7d\x17\x02\xef\x0c\x06\x5e\x17\x7c\xaf\x63\x1a\x81\xc9\x1a\x16\x15\x85\x66\xa2\x09\x62\x36\x4b\xfc\x19\xc5\x8c\x31\x66\x05\x5b\x50\x78\xba\x0a\xf1\x8c\x7c\x47\xed\x7a\x19\xc7\x1b\x01\x57\x09\xa0\xe2\x63\x91\x70\x83\xe4\xfd\xb2\x11\x6c\x17\x21\xcc\x98\x53\x46\x62\x6c\xd5\x22\xab\xb6\x4e\x6d\x55\x2f\x16\x16\x15\x9a\xac\x97\xeb\x4c\x80\x5c\x4a\xb4\xbb\xf5\xfb\xd0\x40\xd8\xab\x8d\xde\x84\xeb\xaf\xe6\xc1\x54\x97\x89\xbb\x3d\x9f\x1b\xa3\x21\x7f\x23\xcc\x1b\xe1\xf2\x34\x45\x66\x9a\x4d\xd4\xe6\x12\x2d\xe7\x96\x2c\x90\xa5\xf7\xf8\x08\xcc\x24\x2a\x96\x52\x50\x0a\x54\xa1\xf3\x14\x94\x59\x8e\x4f\xee\x0e\x80\x97\x92\x4f\x1a\x6c\x01\x24\x69\xee\xcb\x88\x19\x5b\x25\x64\x09\x26\x29\x4d\xf0\x02\xd8\xc4\x15\xbd\x3a\x95\x35\x92\x22\x08\xf3\x1c\x9b\x48\x1d\xa7\x19\x81\x41\x8d\x2c\xf3\x3d\xcb\x1e\x9a\x52\x98\xb7\x20\x27\xca\xe0\xe3\x48\x14\x85\x77\x21\xfb\x0e\x1f\xc2\xd5\xf7\xef\xd4\xaf\xae\x4d\x2b\x31\x00\x37\x11\xdc\x44\x34\xbf\x19\x94\xe7\xa2\x58\x63\xe6\x4e\x8d\x99\x3b\xb5\x2b\x7a\x79\x92\xae\x77\xa6\x29\x09\xad\x4f\xa9\x1b\xf2\x26\x4c\x1d\x4b\x77\xe4\x83\x1d\x81\x80\x42\x54\x0f\x89\xc3\xba\xd3\x8c\xa8\xe6\x6b\x6d\x71\x2b\xa1\x09\x0a\x44\x11\x45\xed\xed\xd5\xaa\xf6\x69\x96\x83\xd9\x8b\x84\x70\x08\xb2\xe3\xc0\xc5\xd5\xa4\xd5\xbc\xa7\x59\xea\x51\xd3\x40\xed\xe2\xed\x45\x67\xe1\x1a\xf7\xd1\x4e\xea\x9d\x3a\x59\x6d\x57\x0d\x05\x8c\x12\x38\x0b\xed\x25\x2d\xaf\xd7\x60\x79\x0c\x01\x22\xf9\xb8\xae\x96\x7d\x18\x21\xc0\x57\xb5\xaa\x9a\x8f\x28\xae\x5f\x87\xe4\x48\x53\x7b\x08\xf8\xda\x68\xcd\x28\x35\x8f\x43\x63\xdb\xef\x2f\xe0\x6b\xa5\x7f\x2a\xfe\x85\xc6\xd2\xa4\x97\x6c\x46\xfc\x08\xbd\x8b\xb5\xcc\xc8\xb1\x20\x22\x4d\xb5\x01\x29\x94\xad\x5e\xc3\xeb\x90\x08\xdc\x98\x93\xa5\x60\x7d\x94\x14\x5f\x6d\x12\x69\x14\x0f\x98\x4a\x08\x8e\x43\xd3\xab\xdf\x37\x38\x3d\xac\x2f\xef\x8e\x7c\x0d\x33\x87\xde\x71\x88\xf7\x4d\xa5\xf7\x31\xff\x0c\x59\xee\xc9\x4a\x62\x07\x5e\x29\xeb\xd9\x12\x72\x10\x1f\x69\x07\xde\xdb\x9f\xc9\xd4\x48\xa7\x41\xe9\x4d\xac\xb9\xd2\x65\x90\x61\x28\x47\x42\x4d\x55\x28\x35\x7a\xbd\xf0\x65\x96\x15\x39\x46\xbf\xd9\x8b\xcc\x6f\xc6\xa5\x8c\x34\x7a\x7e\x63\x07\x4e\xd0\x9f\x76\x4b\xbe\x83\x33\x12\x52\x28\xae\x23\xf5\xe5\xf8\x9d\x03\x5f\x15\x7e\x39\xd2\xb6\x10\x66\x6a\xc8\xe1\x63\x41\x9e\xe5\x19\x15\x29\x85\x67\x69\x43\x30\xb1\x8b\xad\xee\x67\x48\xab\x54\x38\xf0\x22\x5a\x83\xeb\x35\x5e\x85\x04\x2f\x57\xae\x8c\x4c\x92\xaa\xec\xd7\x9e\xbd\x75\xd7\xd8\x3e\xa6\x17\x5f\x6c\x30\xca\x2e\x05\xbc\x0c\x31\x27\x8a\xb5\xcb\xde\xaf\xbf\x2a\xb2\xc8\x26\x4e\xac\x2d\x4d\xe1\xf3\x4a\xe7\x81\x90\x41\x34\x10\x5f\x8e\x5f\x3f\x8d\x26\xd3\x48\x0a\x4c\xd4\xbf\x80\x2f\x06\xf5\x25\x85\x27\x1b\xd6\x77\xdc\xc0\xf8\x68\xb3\x02\xa0\x9b\xf0\x47\x98\xc6\xe6\xb2\xff\x70\x60\x07\xd3\x35\x6e\xfd\x87\x03\xbb\xf8\xc4\x1c\xe8\xd8\x57\xcc\xc1\x33\x51\xf0\x29\x64\x9f\xe0\x6d\xb8\x92\xe5\xca\x3e\xa9\x84\x69\xa2\x28\xc9\xae\x40\xdb\xa6\xf7\xbc\x7c\x05\x1a\xea\xa7\x72\x3e\xe7\x90\x98\x85\xd7\xae\x20\x89\xcb\x21\x40\xc1\x6f\x84\x3d\xda\x76\x41\x31\x67\xd0\xdc\xc4\x22\x81\x11\xa2\x38\x7d\xcc\x2f\xc5\x02\x37\x75\x41\x59\xbd\xf4\xf7\xb0\x7a\x01\x94\xde\xe4\x82\xba\x25\x6f\x43\x7b\x73\x89\x4e\x0d\xd8\x3f\xc2\xf5\x6e\xc0\xdf\x8d\x14\x5c\x29\xa2\x26\x21\x7c\x4b\xc0\x86\x0f\xa0\xfb\x6e\x88\xde\xc0\xee\x02\xd4\x90\xad\xb9\x6b\x7f\x59\x41\x40\x3f\x9e\x4e\x1d\x62\x9c\x16\x17\x1e\xa8\x55\xd7\x80\x08\x4a\x3d\xfc\xb4\x93\x79\x14\x33\xcf\x5e\xb7\x76\x8d\x81\x74\xfd\x56\x17\x35\x3a\xd7\x7f\xd9\xea\x66\xf7\x19\x78\xd5\x52\xd2\xe5\x27\xad\x7a\x51\x95\x15\x2b\x6e\x13\xa1\xa0\xb1\x75\x0f\x17\x20\x86\xeb\x95\xc3\x7c\x5d\x54\x95\x7b\xf9\x32\x1f\x4b\x80\x3e\x96\x01\x6e\x2f\xd7\x17\x3f\xcc\xf1\x95\x2d\x7f\xd6\x00\x11\x2b\xae\x11\x2e\x6e\xee\xd3\xc5\x32\x67\xc1\x93\x8a\xc6\xb8\xa0\x90\x0c\xd7\x0c\xeb\xd6\x8c\x88\x21\xaa\x77\xee\xf6\x82\x02\x1f\xae\x1f\xfe\x64\x98\x79\x57\x82\x21\x4b\xd6\xec\xf9\x54\xe7\x41\x54\xf2\xcd\xa6\x9e\xd9\xa8\xe4\x99\xcd\xdc\xb0\xa6\xbf\x79\xc5\x05\xbb\xe8\x05\x8c\x70\x46\x52\x2f\x6c\xf4\x57\x5e\xd8\xa8\xec\x85\x35\x7a\x8f\xf5\xa0\x47\x43\xb6\x6c\x9d\x3c\x09\x29\x10\x15\xb1\x7b\xfe\xcd\xd3\x43\x08\x9e\x7b\x44\x46\xec\x3e\x78\xee\x5d\x27\x10\x7c\xc5\xfd\xd7\x4f\xde\x75\xb2\xa0\x6e\xf0\xdc\xbc\x90\x91\x1b\x7c\x35\xef\x64\xe4\xfa\x9f\x16\xb0\x86\x73\x95\xf9\x5a\x70\x2f\xb6\x56\x95\xfd\xd0\xf5\xab\x86\x22\x97\x7f\xa3\x99\xdb\x2d\x63\x65\x9f\x04\x43\xf3\x29\x78\x0e\x96\x6f\x53\xa6\xed\xfe\xbf\xdc\xbd\x89\x76\xdb\x38\xd6\x30\xf8\x2a\x0a\x3f\x4d\x1a\x28\x5f\x29\x92\xed\x24\x15\xa6\xf8\xeb\x38\xab\xe3\xd8\x59\x6c\xc7\x71\x5c\x9d\xcf\x07\x24\x41\x9b\x36\x45\x2a\x20\x28\x59\x4e\xf4\x2e\xf3\x2c\xf3\x64\x73\x70\x01\x2e\xa2\x48\xd9\x55\xdd\x5f\xcf\x77\xa6\x4f\x57\x4c\x11\x0b\xb1\x5c\xdc\x0d\x77\x31\x71\xa7\x7d\x54\xbb\xdb\x95\x6a\xa2\x54\x1f\x6f\x2c\xd7\x02\x35\x32\xa3\xc7\x95\xb5\x53\x35\x23\x2c\x00\x81\x5d\x9c\xac\x9c\x2d\x33\xb4\xe2\x84\xe8\xa4\x87\x28\xd4\xb5\x06\x4c\xa9\x60\x37\x2d\x87\xa1\x9a\x6f\x07\xf3\x01\x2c\x74\x3a\x06\x20\xdf\x3c\xe7\x1f\xd6\x3f\xb4\xc8\x87\x66\x79\x13\x4e\x86\x14\xe6\x09\x19\x52\x0a\x99\xea\xbe\x92\xf6\x62\x90\x67\xc4\xf8\xe6\x69\x01\xef\x5b\x08\xdf\x3c\xf8\x90\x19\xb2\x17\xb4\x42\xab\x58\x50\x70\x83\xb5\xca\xc2\xa0\x00\xe7\x34\x58\x2b\x63\x74\x66\xc4\x55\x4b\x35\xce\xb4\x44\xeb\x06\x98\x67\x10\xdf\xcd\x48\xb7\x51\xbe\x7d\x9d\x11\x24\x92\xc8\xc9\xa2\xa1\x21\x6d\xad\x7b\x9c\x91\x77\x92\x64\x3a\x03\xdf\x77\x9d\x8d\x2e\x0a\xd6\xb1\x35\xf9\x48\xee\xfa\x36\x57\x7d\xce\x48\x14\xe2\x48\xa3\x10\xc3\xbf\x47\x88\x63\xe9\xdd\x23\xc2\xd6\x21\x26\x26\xf9\x8e\x83\xf2\xdb\xd6\x49\x31\x71\xf7\x98\xdb\xf3\xbb\xd7\xf3\xbe\x33\x33\xab\x0a\x31\xda\xd6\xea\x3f\x0b\x0a\xd3\xa5\x11\xae\x6a\xda\xf3\xee\xbf\x34\x5e\xd2\xb2\xba\xcc\x81\x24\xef\x90\xfc\x19\x7f\x57\x2c\x5a\x1a\x14\x33\xae\x0b\x1d\xcb\x15\xfd\x6a\xc5\x15\x13\xc3\x28\xd4\x93\x95\xfa\x4f\x56\xfe\x2a\xfb\x98\x93\x28\xc8\x7b\xa0\x54\x2b\xcb\x81\xb7\x6f\xd8\xe9\x02\x84\xd9\xa4\x6e\xe0\xdc\x8a\xa6\xdc\x2e\x1d\x93\xc7\xc8\xfa\x67\x5c\x3c\x09\x93\x39\x06\x6e\x85\x93\xa3\x47\x26\x8d\x2a\x85\x48\x85\x15\x13\x7b\x2f\x23\xf9\xa3\xb5\xb0\xc0\x7b\x6b\x27\x01\x78\xdf\x6c\x0b\x2c\xf0\x36\xed\x6e\xa0\x50\xa3\xf5\xd3\x02\xef\xa9\x3d\x50\x48\x33\xa1\xaa\x92\x4c\xfa\xde\x5b\x55\x6f\x2f\x23\xea\xf9\x1b\x55\xb5\xd5\xd3\xa6\x6a\xa0\xdf\xba\x9f\xa8\x6a\x76\x9f\xd8\xeb\xab\x69\x92\x6b\x4b\xbb\xb9\x58\xe0\x87\x9e\x22\xd0\xbb\x01\xa4\xc5\x27\xf4\x12\xe3\xa7\xa7\x64\x9a\x97\xa8\x81\xea\x97\x7a\xac\x69\x31\x50\xdd\x0d\xd5\x9a\x23\x0a\x63\x45\x46\xce\x13\x78\x19\x92\x5b\x41\x61\x37\xa3\x70\x19\xfc\x9d\xcc\x9d\x8a\x53\x1d\x19\x10\x16\x14\x13\x99\x9b\xec\x9d\x93\x60\x1d\x63\x1c\x63\x2c\x4c\x0a\x17\x81\xb9\xad\x9d\x05\x4e\x14\xc3\x3c\x68\x57\x9e\x6e\x57\x95\xa7\x37\x41\xb3\x50\x68\x82\xd6\xc0\x75\xb0\x3e\x97\xf5\x4e\x60\x2c\x6e\x8e\x02\x63\x3f\x73\x1c\xb4\x26\xc9\x7e\xdd\x54\xd4\x31\x17\x48\x0b\x38\x5b\x3b\xd3\xb1\xd6\x23\x61\x18\xe3\x42\x0e\xb8\x5a\xc7\x6f\xe4\x12\x39\x53\x12\x39\xeb\xb3\x82\x07\xeb\xa9\x4f\x7a\xfd\xee\xc3\x87\xfa\x81\x19\xa6\x4c\xff\xf2\x15\x57\x1e\x06\x44\x35\xf5\x50\xbf\x93\x1b\x30\x9a\xd1\xdc\x2a\xca\xb5\x68\xfa\x21\x16\x55\x59\x5f\x2e\x29\x75\xaa\x99\x61\xfa\x1c\xf4\x6d\xf6\xcb\xe5\x15\x69\x49\xcb\x52\x68\x4f\x92\xd2\x31\x59\xfb\x66\xa2\xc1\xbf\x87\x37\x3f\xbe\x51\x08\x79\x98\xee\xc4\x8c\x3f\xab\xa9\x82\xf4\xfa\xbc\x0c\x48\xa6\x18\xa1\xe7\xab\x2b\xa4\x79\x33\x4c\xb4\x53\x94\x26\x4b\x23\x88\x9d\xa4\xaa\xcb\xda\x0b\x21\xe9\xb3\x22\x09\xcd\xcb\x80\x24\x7d\x1f\x2f\xbd\xda\xbf\xbb\x80\xf3\xa0\x29\x49\x72\x9d\x2b\x36\xf3\xad\xde\x3c\xa2\xd1\x25\x30\xe4\x90\x3d\xe4\x90\xc3\x80\x1c\x13\x45\xd1\xfe\x18\xd4\xb6\x5c\x3f\x2c\x2f\x80\x06\x8f\x19\x39\x0f\x30\xcd\x99\x5a\x04\x3d\x65\xd6\xf7\xab\x13\xfe\xf5\x2b\xc9\x97\x23\x54\xcb\x21\xca\xe5\x08\x57\x06\x18\x2c\xe7\xec\xd9\x0b\x21\xec\x33\x08\xfb\x2e\x84\x7d\x2f\xff\x58\xa8\x96\x25\xa0\x8b\xf5\xa3\x29\x8d\x5c\xf7\xd4\x3b\x97\x5c\x05\xb0\x0c\xd6\x68\x6b\xd6\xbc\x7c\x6a\x74\x7f\x63\xf9\x2e\x70\xf9\x94\x40\xdf\x90\xca\xf9\x2e\x98\x8c\x51\x5d\xe3\x2f\x16\xc4\xcb\xc9\x78\x3e\x8e\xd1\x34\xb1\x71\x35\x64\x91\xd9\x87\x29\x18\xf0\xaa\xb9\xbc\xf7\xc2\x62\x6e\x66\x1d\xf4\x14\xf7\x83\x46\x8d\xf3\xb9\xe6\xcd\x9e\x57\xa6\x8b\xe1\x0b\x68\xa1\x5f\x5f\xd6\xb6\xd5\x13\x34\x2d\x28\x7c\x08\x1a\x95\x19\x82\x18\x81\x47\xd2\x5a\x28\xca\x7d\xfd\xd6\xd6\x99\x0a\x4b\xf5\xc6\x6e\x2b\x6e\x74\x6d\x8c\xd4\x6a\x19\x24\x79\x1a\x38\x4c\xc2\xbb\x3b\x98\xc9\xd3\x80\xfc\xf4\x98\x12\x7b\x84\x4d\x98\x93\xc1\x6e\x40\xea\x6a\xb3\x59\x00\xe8\x54\x52\x72\xeb\x66\x6b\x46\x33\x93\x4a\x6d\x2c\x0b\x85\x98\xe2\xcb\xbd\x5b\x5b\x80\x77\x60\xc7\xe0\x3d\xb6\x77\x24\xf8\xcc\x96\xe0\xfb\xf6\x83\xe1\xc2\x28\xa8\x17\x14\x3e\xb6\x22\xde\x29\x79\x17\x80\xf5\xf6\xf5\xb1\xa5\xc8\x11\x5c\x04\x9a\x2f\x3e\x34\x64\x6f\x16\x10\x54\x9f\x59\x5c\x88\x44\x58\xb0\xa3\x68\xa2\x22\x82\x27\xc1\x9a\xdb\x2f\x22\x8c\xc9\xe4\x6d\xe0\x9c\xc5\xf0\x2a\x58\x6b\x8b\x7d\x1b\xc0\x8c\x9c\x98\x7f\xae\x38\xc4\x14\xc6\xc8\x88\xec\xf3\x95\x82\x99\x2c\xb2\x36\xbf\x5d\x23\xaf\xbe\x0a\x90\xdf\xfd\x2c\x40\xc0\x0e\x0e\x85\x34\xd1\x25\xb3\xb2\x5e\xa6\x57\x36\xce\x1a\x5d\x9d\x8b\x3b\x9e\xc2\xaf\xf9\x38\x1c\xf3\x24\x93\x1d\x7e\xe3\x71\xee\x73\xbf\x1e\x3f\xe0\x03\x97\xb3\x44\x5c\x77\xf4\xa2\x3d\xaf\x78\x66\xd5\xa4\xa5\x49\x00\x67\x78\x05\x73\xd4\xf7\x2e\xe9\x86\xd5\xb1\x36\xf4\x8f\x7d\x38\x0c\x88\x50\x60\x50\xbb\xf0\xb6\xbe\xc4\x3c\xb7\x70\x11\x3c\x9d\x24\x71\xca\x3b\x81\x48\xc6\x1d\x36\x09\xf1\x16\xa5\xcf\xea\xde\xd6\x07\x2c\x0a\x12\x31\xe6\x7e\x27\x13\x91\xa9\x83\x7e\x5d\x9a\xc4\xbe\x69\x3e\x88\x65\x74\x96\xb8\xd4\x2e\xea\xd4\x6e\xa9\xb5\x71\x98\x69\x17\x84\x7c\x2e\x6f\x15\xa0\x7c\x54\xdc\xef\x49\x42\x5e\x85\x7a\x8b\x0e\xee\xdf\xf3\xfa\x0e\x6f\x4d\x87\x9f\x0d\x58\x36\x6c\x66\x5e\x3f\xde\xb0\x1e\xad\x68\x5f\xb5\x69\x2d\x59\xc7\xe8\x50\x0a\x5f\xd6\x48\x8d\xbb\xfa\x5e\x11\x0f\xc7\x8b\xbf\xc5\x00\xce\xc9\x87\x40\xa7\x6e\xc7\x29\x1c\x84\x24\xc1\xe0\x39\x46\x18\x0e\x88\x16\x00\x28\x5c\x4b\x4a\xab\x79\x52\x29\xfc\x58\x1d\x58\xf5\xfa\x5b\x14\xd7\xdf\x0f\x86\xa5\x85\x17\x6a\xde\x35\x1f\x95\x27\x83\x34\x57\xda\xa8\xfe\xfc\x14\xb4\x67\x8b\xff\x11\x34\x9b\xf2\xa1\xd0\xac\x87\xf4\x3e\x70\xe6\x31\x7c\x0d\x9c\xcf\x31\xb1\x26\x5c\xa4\x61\x2a\xdf\x2a\xd8\x78\x7d\x33\x61\xb1\xbf\x13\x45\x16\xbc\x0f\x28\x7c\x5b\x73\x4a\xf7\x0b\x31\x3c\x76\xdb\x6a\xed\x13\x01\x3f\xbd\xa9\x5d\x63\xa2\x6a\x81\x65\x0e\xc9\x9f\x1a\x90\xd0\xf6\xf4\xfb\x4a\x30\xef\x3c\x4b\xe4\x98\x03\xe3\x98\x6e\x73\x46\x5e\x4a\x50\x62\x4c\x4c\x29\x1e\x05\xa6\xd5\x97\xc2\xbd\x43\x4b\x1d\xe7\x97\x9d\x72\xfd\x98\xdd\x6b\xbb\x08\xfc\x2f\x5c\x18\x07\x10\xf7\x77\x8d\x8e\x94\xaf\x36\x2d\xb6\xed\x16\x09\x39\xbb\x44\x4a\x7e\x84\x94\xfc\x18\x29\xf9\x21\x24\x8e\xe8\xef\x42\xa8\x8a\x75\xa2\x96\x7b\xa5\x8a\x5c\x9f\x26\x52\xf4\xbf\xdc\x99\x28\x32\x5b\x9b\x28\x92\xad\x4f\x14\xe9\xe5\xc5\x26\xd9\x25\xcc\x33\x92\x34\xa4\x8e\x94\x4b\xa9\x23\x43\xfc\xe1\x65\xa9\x4c\xc6\x08\x56\x18\xe1\x82\x8f\xae\x25\xd1\xe9\x81\x31\x11\xc2\xf7\x5a\x76\x49\x4e\x47\xbb\x24\x86\xa5\x0c\x93\x9c\x6a\x0b\xf7\xcc\x55\xe2\xcb\xf6\x02\x98\xeb\x1c\x0a\x62\x05\x89\x97\xa5\x16\x05\x6f\x75\x2f\xda\x2f\xf7\xf7\x88\xde\xdb\x2b\x3b\xee\xb3\x91\x65\xd9\xa2\xef\x5e\x01\x6e\xf5\xa7\xc0\x30\xec\xa2\xef\x5e\xd3\x91\xfa\xd7\xde\x55\xa8\xfd\x3a\x8f\x87\xb3\xa0\x6a\x3d\x90\x38\x75\x25\xc9\x5c\x0a\xcc\x6d\x76\x68\x2d\x95\x0c\xa5\x11\x41\xe3\x08\x3e\xaa\x75\xab\x0c\xe2\x32\x80\x79\x48\x14\x8d\x54\x83\xf8\xeb\x1f\xdc\x6a\x9c\xa8\xea\x67\x08\xbb\x49\xdd\xa6\xcb\x54\x62\xfb\xcb\x95\x6a\xb2\xf9\x1e\x11\xa6\x04\xd5\xb2\xae\x71\xbe\x08\xdd\x46\x26\x4d\xf7\xc8\x6c\x4c\xd8\xe8\x4d\x69\xdf\x1d\x5d\x10\x01\xf5\x03\x4e\xcd\x85\x91\xc9\x40\x68\x61\x32\x17\x05\x1c\x16\x2d\x2d\x1e\xce\x89\x84\x0f\x89\x56\xfb\x9c\x26\x20\xfb\xde\x2e\xcc\x08\x77\xb5\xeb\x57\xb1\x30\x89\x59\x18\x04\xbd\x9e\x3b\xef\xa1\x1f\xba\x31\x3d\x59\x50\x08\xdc\x75\xd8\x37\xfe\xc3\x19\x94\xbc\xe9\x32\x3a\xee\x08\x85\x88\x7a\x43\xed\xf5\xac\xa6\xef\xba\xeb\x4d\x99\xaa\xbd\xc9\x7a\x6f\xd2\xdc\xa5\x8b\x3e\xab\xf6\x8b\x91\x49\x13\xc5\x6a\x4a\x5c\xe2\xb4\x15\x31\xbd\x93\x64\x4e\x5c\x9c\x3f\x9c\x6a\x65\xa3\xdb\x7c\xad\x3f\xf8\x43\xe4\x86\x87\xe7\x78\x93\xd4\xe8\x0b\xa9\xc6\xc7\xfb\x6e\x75\x84\xc5\xab\xbe\x5b\x20\x6a\x5e\x91\xb0\x8d\x57\x60\x6e\x45\xa8\x8a\x72\xe6\x2a\xaf\x62\x80\x4c\x5f\xa6\xf1\x12\xf4\x0f\xc9\x9f\x59\x1f\xef\xcd\xfa\xec\x7b\x01\xb0\x18\x26\xc6\xcd\xbf\x98\x5b\x64\xb8\xe0\x39\x6c\xa9\x29\xeb\xeb\xfb\x33\x4f\x37\x5f\xd4\x1d\x26\xab\xfd\x3c\x7c\x58\x3c\xe6\x9d\x26\xd8\x69\xe8\x24\x26\xb3\xab\x8b\xc2\xb8\xfe\x0c\x03\x56\xfd\x18\x6e\x46\x82\xc6\xd4\x89\x44\x41\x11\x1f\xb2\xfc\xc1\x83\x21\xdf\xfa\x23\x1e\xcd\x48\xea\x82\xe8\x6d\x03\x53\x92\x47\xe4\x42\xbc\x31\x34\xbf\x31\x39\x7f\xbe\x54\xb9\x28\x55\xb8\x50\x1e\x92\x3f\xb9\x99\x45\xa1\x04\xa4\xe0\xbb\xed\xdc\x4b\xe4\x6a\x9b\x0c\x54\x94\x36\x6d\x79\x61\xa4\xb1\x4a\x33\x75\x66\x65\xd9\x77\xb5\x9d\x95\x0b\x7c\x43\xf1\xd6\x81\x0b\xbc\x87\x30\xa8\x4f\x49\xb7\xf5\xf3\x3a\x9d\x4d\x8c\x96\x46\xaa\xe6\xd8\x75\xde\xc3\x65\x3b\x09\x34\xa2\x6c\x3e\x92\xaf\x42\xa7\x79\x6e\x8c\x8b\x60\x2a\x3d\xb8\x20\x3a\xcf\xf9\xc3\x87\x17\x84\x1b\x2e\x05\x75\x6b\x6b\x16\x65\x4f\x02\xde\x1a\x9b\x75\xb9\x70\x9b\x44\x6e\xcd\xf4\xd0\x42\xf1\xa8\x07\x39\x46\x9f\x38\xae\x5d\xa3\xba\x2e\x39\x45\x79\x65\xe2\xc2\x8c\x7c\x90\x30\x04\x49\xe1\xad\x49\xe6\x9d\x39\x68\x69\x0e\xc2\xd1\x59\xe8\x32\x90\xf4\xd1\xe6\xaf\x01\xc5\xe3\x3b\x23\x87\x09\xcc\xc8\xd4\x05\xa1\x95\xbc\xcd\xfd\x65\xd8\x9f\xd6\xdc\xc7\xce\x57\xa1\xbe\x9e\x39\xf1\xa3\x4c\xd1\x9c\x47\x12\x4c\x9e\xa1\x3c\xcd\xf4\xa5\x4b\xb8\xe1\x2b\xb9\x84\x98\x93\xfe\x63\xad\x4a\x06\x4c\x7c\x78\x23\x91\x93\x2d\xcd\x2c\x46\xc3\x47\x5b\xbf\x91\x6c\x43\x6e\x90\xb8\x27\xe8\xa3\x98\xda\x83\x05\x85\xd9\x3a\x64\x95\x23\x87\x5c\x58\x7f\xc0\xfb\xac\xef\xfe\xfa\x55\x47\x08\xf9\x31\x66\xb0\x7c\xcf\x8d\xb6\x47\xea\x39\xf7\xda\xc8\x14\xa7\x1a\x3b\x1e\x08\x87\x83\x74\x76\x89\x54\x58\x9f\x29\x1a\xcf\xa3\x94\x6b\xac\xf4\x15\x25\xcb\xa2\x73\x73\x43\x0a\x52\xf1\xb4\x0b\x0a\x73\xb7\x49\xff\x78\x42\x62\xda\xbf\x4a\xc2\x18\xc9\x03\xdc\xb4\xc1\x84\x95\x2b\xc7\xd5\x5f\xa1\xc8\xbb\xde\xfd\x51\x6c\xcf\x5d\x32\x27\x33\x57\xef\x82\xde\x5b\x83\x41\xaf\x5b\x30\xe8\x72\x67\xb4\xd0\x64\x37\xc0\x54\x3e\x9d\x8d\xfe\xe6\xe3\xdf\xc6\x9c\xcc\xc8\x8d\xa1\x51\xbf\x91\x61\x0f\x35\x11\x3b\xf7\x1c\xf3\x20\x1f\xf2\xd0\x9e\x93\x6b\x8d\xe9\x67\xe4\xc2\x2d\xbc\x9d\x8f\x5c\xe7\x15\x1c\xbb\x8d\x57\x4c\x79\x38\xb2\x82\xef\x79\x5a\xc6\x11\xe3\x55\x4a\xca\x2b\x94\x54\x13\xec\x4b\x5b\x2a\x16\xe0\xbe\x54\xb5\x16\x4d\x64\x4e\x42\x3d\xd4\x7d\xc2\xe1\x27\x3b\x57\x9d\xa9\xe5\xe7\x7d\x76\x0e\xde\xd4\xde\x25\xbc\xef\x61\xdc\x16\x34\x21\x53\x42\x92\x1b\xd9\xa7\x8b\x65\x3e\x09\xcb\x9e\xaf\xeb\x32\x2b\x7a\xcc\x59\xa5\x8c\xaa\xc9\x4c\x6b\xfd\x55\x32\xda\x61\x73\x77\xac\xa7\x57\xf2\x40\xdb\xb5\x1a\x6c\x4b\xd5\xd0\x7e\xbb\xd5\x7a\x8f\xeb\x3d\xbd\xae\xf7\xb4\x55\xef\x69\xbf\x5e\xa3\x30\x52\x67\x4e\x3e\x19\x35\x55\x86\x29\x46\xf7\x09\x83\x9f\x6e\x64\x7b\x18\x60\xe4\x9c\x8e\x4e\xed\x19\xe9\x72\x0c\xeb\xa6\x5f\xb0\xbe\x1b\xd9\x88\xb8\x87\x03\x9d\xad\xe8\xc8\x85\x1d\x57\x57\x87\x12\xcf\x37\x4a\x12\x9f\x50\x6f\xa9\x56\x68\x01\x6e\x46\x21\x55\x9f\xf1\xf6\xf4\xd5\x54\x75\xb6\x2b\x81\xe7\x38\x72\x7c\xb9\x02\xea\xb5\x6b\xec\x26\xce\xda\x00\x19\xfd\x02\xc1\xfb\xa2\x6f\x2d\xae\xdc\x75\x0e\x6d\xde\x4b\x5b\x80\xf7\x5e\xd5\xff\x64\x4b\xf0\xb6\x6c\xae\x1a\xbd\x74\x9d\x2f\x02\xce\x5d\xe7\x51\xff\xbf\x1f\xc1\x9e\xeb\xbc\x10\x64\xf8\x68\x40\x61\xff\x9e\xf0\x5e\x09\xc0\xb7\x85\x86\x7e\xac\xdf\x1d\x71\x5b\xef\xdc\x0b\x1b\x11\xec\x41\x06\x12\x43\x21\x54\xb7\xa8\x0e\x30\xda\x53\x1b\xd7\x3d\x91\xa0\xa6\x66\xa1\x44\xec\x7d\xb1\x2d\x6b\x01\xf9\x6e\xf0\xbe\xfb\x42\xad\x63\xe1\xbc\x8d\x58\xd7\x1c\xa0\xd7\xe6\x00\xe5\x52\x52\x71\x80\xee\x0d\x5a\xe5\xb1\x60\xcf\x57\xc6\x97\xdd\x3d\xbc\x1c\x58\xda\xf3\x86\xbb\xc9\x42\x81\x52\x46\xa9\x99\x0b\xa5\x8d\x90\x9b\x0f\x11\xfd\xd3\xd7\x1c\x23\x77\x6f\xf5\x78\x34\x8d\xdf\x38\xbd\x9b\xee\x9a\x71\x92\x7b\x6b\x23\x52\xcc\x8c\xa8\x90\xd1\x05\x06\x63\x6a\x81\xd4\x05\x85\x0f\xeb\x25\xfa\x3c\x5f\x67\x6e\xe9\xb4\xeb\xb6\xa8\x7b\xf3\x10\x4c\x2e\x43\xc1\x9d\xed\xa1\xe4\xce\xba\x28\xba\xbb\x3b\x10\xa8\x5f\xef\xc0\x75\xb2\x0d\xeb\xbf\x1e\xe5\xaa\xb5\xd4\xe1\x2e\x71\x8b\x04\x7c\xab\x6a\x47\x9c\xbc\x42\xb6\xef\x8c\xbc\x55\x2c\xd2\x00\x37\x3a\xc2\x5b\x23\xbf\x21\xaf\x67\x54\x8b\x0f\x15\x3b\x11\x5a\x99\x23\xf2\xf0\xf6\xec\x57\x26\x09\x29\x86\x80\x44\x86\xa4\x75\xc3\xc3\x05\xb8\x92\x9a\x5c\xa5\x68\xc2\xd9\x96\x44\xa7\xc4\xc4\xef\x12\xb8\xd0\x2a\x56\x0d\x6b\x99\x76\x52\xb6\x16\xc8\xa8\xb9\x0a\xca\x5e\x04\x77\x7c\x14\x4b\x5d\x09\x97\x01\x69\x45\x54\x8a\xc7\x40\x54\x85\x6c\x52\xc5\x79\xe9\x9c\x78\x48\xb7\x45\x9d\xf0\x9c\x93\x28\x01\xb6\x1a\x5a\x33\xc4\xb7\x2b\x90\x12\x67\x24\x52\xb3\xc0\xb0\x58\xf4\xf9\xca\xb6\xf8\x6a\x04\x7b\x76\x04\x2e\xb3\xfd\xbe\xbb\x8c\x21\xd4\xc2\x4c\x9d\x19\x89\x5d\x90\xc0\x28\x74\x9d\x19\x91\xea\x39\x59\xe9\x69\x39\x9c\x84\xec\xb3\xcb\x51\x60\x87\x18\x55\x02\x7f\x84\x89\xed\x01\xeb\xda\x5d\xf5\xa1\xa9\x82\x5c\xa4\xcd\x58\x36\x23\xfb\x66\x03\xbf\x71\x10\x99\x3a\x1d\x07\x01\xca\x86\xd4\x2e\xcb\xbe\xe6\x65\x6f\x4c\x19\x94\x65\x59\x86\x65\x9f\x03\xc2\xab\xd4\xba\x72\x98\x85\x3e\x72\x42\x1d\xb9\x94\xec\x13\x09\x3f\x31\xab\x2d\x1a\xe7\x96\x11\xcf\x9e\xae\x6d\x71\xd4\xd0\xe2\xf7\xb5\x2d\x8e\x1b\x5a\x0c\xeb\xa7\xc3\x3d\xa9\x9f\x8e\x6d\x5c\xfa\xb1\x33\x23\x1e\xda\x41\x41\xa2\x16\x7f\x8c\x67\x65\xdc\x77\xe1\xd2\x19\xf7\x3d\x98\x38\xe5\x0a\x48\xbd\x02\x97\x14\xc6\x4e\x4a\x66\xe4\x83\x0b\xdd\xbe\x7b\x8d\xeb\x34\x71\xfc\x51\x85\x15\xc2\xf1\x8d\x29\x4c\xbe\x53\x6a\x4f\xea\x1b\x89\x5b\x74\x82\xcc\xf4\xa4\x40\xdb\x13\xe7\x86\x1c\xbb\xe0\xa2\xbd\x23\x53\xa0\x70\xe9\x4c\xaa\x39\xc6\xf5\x3c\x98\x3d\x75\x26\x38\x93\x72\x60\x3c\x1f\x58\x81\x1d\xa7\xce\x0d\xd9\x2f\x3b\x0b\x55\x67\xd3\xd5\xce\x76\xec\x69\xad\xab\xac\xd6\xd5\xb3\x3a\x96\x79\x53\x5f\xc7\xa1\x46\x33\x17\x55\xd5\x6a\x09\xb1\x68\x54\x76\x01\xa2\xcf\x5e\xd3\xd1\x8c\x7c\x2b\x7e\xd8\x33\xf2\xa5\xf8\x01\xde\x0f\x8d\xb3\xbf\x06\xe4\xc1\xb0\x82\x8d\x2f\x11\x79\x5d\x38\x5b\x8e\xe3\x90\x0b\xe7\x9c\x04\x6a\x68\x8a\x00\x3f\x7c\x78\xd1\x77\x47\x88\xa2\x3e\x28\xc1\xe5\xab\x20\x17\x48\x80\x29\xb5\xc7\xc9\xea\x40\x2e\xd4\x37\x2e\x8b\x43\xf1\x35\x20\x97\x6a\xde\x49\x02\x2c\x83\x2b\x4e\x2e\x8d\x62\x67\x41\xe1\xd4\x75\xe6\x31\xbc\x73\xab\x4a\x6c\x0c\x56\xf8\x8a\xcd\x3f\x06\x5f\x39\xbf\xb6\xe0\xd4\xa5\xf0\xb1\x4d\x58\x8d\x81\xb7\xa7\x51\xce\x23\x17\x2e\x5b\xb1\xe4\x71\x0b\x97\x93\xe6\x94\x21\x0b\xcb\xe4\x39\x35\xf4\x33\x30\xe9\x93\x57\xbf\xc7\xeb\xc1\x78\xcd\x87\x6b\xd1\x78\xcd\x87\xeb\xb7\x43\xc5\x97\x1b\x70\x9a\x77\x63\xf3\x62\x25\xf5\x1a\x4a\xb5\x86\x6f\x38\xd1\xde\x0b\x4c\x95\x53\x0a\xef\x5c\x52\x18\xb0\x1d\xae\xe5\xdd\x4c\x5e\xad\xaa\xd3\x0e\x86\xef\x70\x8d\x99\xc9\x17\xb1\xd6\xa4\x3c\xd5\x6e\x05\x0b\x0a\xb7\xae\x33\x23\x5f\xb4\x6a\xd0\x68\xb7\xdf\xbd\xb2\xbe\x53\xf4\x1d\x7a\xe5\x3a\xd7\x31\xbc\x6d\x25\xe8\xef\x25\x89\x1f\xa1\xd8\xff\xc6\xbd\xbf\x73\xa1\xd8\x88\xeb\xee\x2c\xda\x3a\x81\xf7\xdd\x4f\x18\x60\xa0\xac\xc9\xb5\x37\x17\x08\x47\xe4\x7e\x83\x07\xad\x60\x54\xa5\x96\x6f\x34\x92\x9a\x91\xb7\x2e\xc4\x98\x30\xfd\x09\xdf\x36\xc1\x48\x3e\xb7\xdf\x4e\x30\x32\x23\x07\x46\xce\xeb\xb3\xaf\x0b\x0a\x5f\xdc\xf6\xab\x97\x59\x08\x9b\xdb\xfa\x1b\x45\x33\x78\x32\xc0\xfd\x7b\xb1\xbe\xdd\x90\x6f\xe9\x71\xe1\xcd\xd4\xfa\xba\x4f\x06\x65\xf7\xaa\xfa\xa7\x56\x65\x7b\x6d\xfc\x93\xff\xbf\x24\xea\xa7\xf0\xde\x6d\xbf\x29\x1f\xfc\x11\x8f\xe6\xe4\xbd\x0b\xf1\xff\xf9\x3f\x43\xd8\x25\x42\x6d\xc3\xf0\x61\x3c\xda\x25\x12\x04\xb5\x25\xb5\x95\x80\xf5\x75\x8d\x16\xeb\xbd\x16\x73\x51\xf1\x0d\xdf\xd6\x7c\x6b\x97\xcc\xc8\x57\x17\xe2\xde\x98\x13\x49\xe1\x08\xf5\x53\x1a\xac\xe2\xb4\xbd\xff\x6f\xaa\x7f\x6b\x80\xa9\x3e\xf4\x26\x8a\xf4\xee\x3d\x2f\x60\x77\xc8\xb7\xb0\x91\x4c\xef\x07\xb9\xee\x96\x82\x40\x71\x4f\x27\x7a\x9e\x3a\x33\xf2\x42\xc0\x00\xd3\x4c\xa5\x8e\x64\xc0\xd4\xab\x93\x00\x4e\x5d\xc8\x52\x0a\xde\x9a\xa9\x9d\x4b\x20\x0a\x87\xb7\x5e\xf8\x4d\xb2\xf4\x92\xe8\x4b\x5a\xb1\xa0\x14\xfe\xfc\x9e\xfb\x15\xab\x5d\x49\xd2\x7b\x46\x67\x09\xd3\xf6\x5d\xd1\xf6\x17\x9f\x3e\x1e\x19\x03\x0c\x6d\x6e\x0d\xc1\x6a\xdf\x71\xfd\xe6\xbc\xc8\x98\xa2\xb3\xa4\x7c\x45\x03\xd7\x73\x62\x99\x5b\x9d\xd4\x82\x19\xf1\x52\xf8\x96\x01\x11\x8e\xa0\x7d\xf7\x5a\x5f\xb1\x95\x1e\x4c\x2c\x25\x02\xf3\x7d\xaa\xd7\xb9\xe7\x13\xbe\x64\xa7\xfa\xa5\xce\x6c\x82\xf1\x7f\x4e\x5d\xf5\xfe\xc4\xbc\x4f\xc6\x63\x1e\xcb\xfc\xed\xb1\xb9\x41\xf4\x2d\x9d\xda\xfc\x95\xab\xd3\x9d\x9f\xe2\x75\x98\x6f\xb2\x09\xa1\x07\x6c\x0a\x16\x9b\x4c\xa2\x50\x07\xc0\x7a\x74\x95\x26\x98\xa9\xf2\x75\x4d\x27\xf9\x36\x20\x73\x12\xa6\xb8\x22\xb7\x5a\x6f\xec\xb6\xae\x37\x3b\x56\xbc\xca\x31\x30\xe4\xfd\x4e\x60\x6a\x0b\x48\xed\xb8\x9f\x02\x3b\xb5\x31\x3b\xbe\xeb\xdb\x98\x56\xc6\xfd\x6c\x63\xd2\xfc\x3d\x25\x6b\x2f\x28\xa4\xad\xe0\x11\x84\x04\x21\x78\x83\x69\xef\x3b\x0a\x51\xea\x34\x8a\x27\x52\x84\x63\x42\x17\xe0\xa7\xc6\xa1\x68\x66\xc1\x93\xc1\xf6\xef\xfc\x31\x2e\x8a\x6f\x01\x06\x5c\xc0\x1f\x97\x16\x6c\x3d\x31\xcf\x63\x4b\x63\x76\xb5\x25\x16\x1e\x94\xef\x14\xa6\xeb\x0f\xd7\xd3\x15\x3f\x3b\x7c\x59\x71\x99\xfb\xf5\xeb\xe9\x42\x0d\xfb\x69\xef\x3e\x96\xb5\xff\x89\x94\x7d\x66\xf9\xba\x69\x0b\xf5\x63\x8c\xc4\x74\x34\xb4\x07\x45\x38\xe3\xbb\xec\x7f\xb7\x86\xb5\x61\x3e\x7e\xb6\x21\x6b\x23\x7d\x36\xc8\x5f\x15\x83\x1d\x6e\x16\xef\x8a\x01\x0f\x1f\x0f\xf3\x77\x05\x6d\x18\xfe\x5e\xbc\x2b\xe8\xc3\xe6\x70\x33\x7f\x57\xd0\x88\xcd\xed\xad\xfc\x5d\x41\x27\x36\x9f\x16\xef\x2a\x81\x1c\x06\xdb\x1b\xb2\xbe\x32\x5b\x5b\xdb\x1b\x68\x89\x31\x4e\xef\xe6\x52\x2e\x5b\xeb\x78\x6a\xf5\x36\x66\xa4\x8b\x67\x85\x6e\x28\xe6\x7a\x92\xb6\x92\xd9\xfa\xd2\x6e\xd5\x21\x40\xef\xc6\xe6\x33\x7b\xf3\xf7\x3a\x2c\xd4\x69\xee\xd6\xa0\x4e\x74\x87\xf5\xd0\x1b\x83\x7c\x69\xeb\x91\x34\xea\x51\x33\x06\xf5\x08\x19\xc3\xd5\x45\x5c\x59\x41\xa4\xaf\x17\xe9\x9d\xb7\x14\x33\x32\xd1\xab\x03\x99\x93\x30\x63\xea\x39\xdc\xfc\xc3\xc9\x7e\xfd\x3a\x46\xcf\xb4\xf2\xda\xf5\x27\xfb\x6a\x4b\x60\x13\x5b\x80\xbb\x65\xc7\x0b\xc3\xc4\x85\x8c\x64\x1b\x43\x0a\xd2\x91\x3d\x64\x58\x67\x69\xfb\x7d\xd7\x8c\x8c\xcd\xf7\xf0\x7c\x0a\x73\x19\x35\x4f\xb5\xf5\x92\xcb\x9a\xf5\x1c\x6c\xb2\xa0\x70\x63\x2a\xcd\xd3\x86\x4a\x24\xc1\xdd\xde\xa4\x8f\xb6\x7e\x29\xa1\xf2\xba\xe5\x4c\x01\x77\xc4\xf3\xb6\x33\x2f\x9d\x00\x49\xb3\xc7\x88\xa4\x1b\xc3\x15\x7f\x86\xcb\x14\x74\x05\x22\x9d\x9b\x54\x3d\x84\x8c\x6c\xfd\x26\x7b\x9b\xb4\x21\xc8\x75\x51\x7b\xae\xaa\x16\x72\xe9\x32\x60\xf0\xde\x8c\x4c\x53\xc4\xf0\x35\x08\x31\x25\xc3\xa2\xe4\x49\xad\x64\xb3\x28\x79\x5a\x2b\xd9\x2a\x4a\x7e\xaf\x95\x6c\x17\x25\xcf\x6a\x25\x8f\x8b\x92\x12\xb0\x4c\xd1\x13\x55\x54\x83\x30\x24\xdf\x3b\x6b\xc8\xf7\x31\x9a\x7f\xfd\x31\x18\xc5\xf6\xe0\x8f\x63\x64\xda\x46\x02\x79\xb6\xa3\x35\xad\xea\x67\x76\x4e\x76\xd4\x12\x94\x60\xaa\xe3\x86\xac\x61\x5d\x8e\x52\xc0\x64\x9b\x06\xc8\x3e\xb9\xf9\xd3\xe7\x92\xd9\x7e\x9d\xae\x73\x24\x52\x64\xe8\xb7\x78\xe3\x09\xdf\xfe\x4d\x60\xa0\x29\xb9\xa1\x44\xbd\xb3\xd6\x8f\xde\x90\xd7\xea\xa3\x5f\x8a\x4f\xfd\x28\x9e\x44\x31\x90\x17\xe5\xe7\xaf\xda\xf0\x3d\x92\x55\x43\xaf\x48\xaa\xb8\xbf\x63\xdd\x5e\x2d\xc9\x99\x7e\xec\x49\xfa\xe8\x09\xdf\x46\x20\x7f\x99\xb6\x5e\x58\xa7\x48\xa1\x25\x64\x8a\x37\x52\x2d\x83\x90\x70\xe4\x34\xd4\x43\x4f\x4d\x2e\xa3\x68\x1f\x71\x95\x16\x66\xc5\x17\x24\x83\xf2\x12\x51\x3c\xe7\x65\x65\x59\xf1\x3c\x95\x60\x5a\x71\x4a\x47\x1c\x1d\x36\xce\xd7\xec\xe9\x9c\xbc\x4c\xf1\xb2\xed\x3a\x45\xdb\xd3\xe3\x14\x8b\x29\x0c\xd0\x9e\xbb\xa9\x65\x3d\x29\x55\x71\x28\x72\x02\xb2\x6d\xd7\x3b\x37\xbd\x42\xb9\x19\xf8\x13\x37\xc3\x3c\x09\x53\x65\x50\xa8\xc8\xb6\xfe\x7a\x37\x83\x4a\xf3\xcd\xfb\x36\x1f\x2c\x35\x1b\x96\xcd\xce\x53\x18\x0e\x75\x10\x85\x65\xf4\x81\x45\x9b\x95\x92\xc1\x52\xc9\xa0\x52\x52\xeb\xae\x52\xb2\xb5\x54\xb2\x55\x29\xd9\x5e\x2a\xd9\xae\x94\x3c\x5e\x2a\x79\x5c\x29\x79\xb2\x54\xf2\xa4\x52\xf2\x74\xa9\xe4\x69\xa5\xe4\xf7\xa5\x92\xdf\x2b\x25\xcf\x96\x4a\x9e\xe9\x92\x7a\x98\x7f\x9c\x90\xf1\xb4\x5c\x50\xd8\x6f\x87\x77\x64\xaa\x23\x56\xf2\x7b\x3f\xd9\x95\x2d\x80\x5d\xdb\x79\x89\xc2\xeb\x37\x9a\x80\xc5\xc0\x04\xaa\x90\x6f\xd5\xe3\x8e\xd6\xb3\x7c\x40\x21\x69\x37\x5d\x1b\x2f\xf2\xd8\x3e\x44\x03\x07\x76\xa2\x1e\x62\x0a\x53\x7b\x4e\xf6\x53\x40\x7f\x63\xb4\xef\x23\x69\x0a\x4f\x37\xf9\x63\x84\x70\x4e\x21\x55\x15\x91\xf5\xb7\x2c\xc8\x18\xc1\x48\x55\x94\x2a\xfe\xfb\x90\x93\x0f\xe9\x72\x0b\xaa\xf8\xf1\x1d\xa9\xb8\x71\x5d\xaa\x7a\xd9\xb3\x1f\x20\x3d\x3f\x6d\xc5\x40\x88\x38\x7a\xb1\x42\x9e\x0b\x0a\xef\xd2\x3b\x9c\x89\x8c\xf1\x6b\x25\x3e\xcd\xc7\xb4\x5d\x01\xe3\xeb\xd4\x1a\x27\xe8\x6a\xa3\x64\x09\x07\x05\x05\xcf\x41\xf9\x21\x71\x76\x33\xe2\x33\x92\xa5\x84\x69\x23\x8c\xe2\xb7\x57\x5e\x34\x98\x95\xcb\xf2\x95\xe3\xc5\xca\x99\x88\xb2\xf5\x65\x9a\x91\xd3\x54\xfb\x7c\x54\xd7\xca\xd3\x0b\xa4\x57\xbb\x58\x23\x56\x59\xa3\xeb\xd8\x61\xad\x91\x77\xab\xfb\x98\xa9\x91\x70\xd5\xb5\x54\x5d\x32\x70\xaf\x95\x5c\xfa\x59\x71\x37\x47\xb6\x07\xee\xa9\x8d\x01\x9d\xcf\xd6\x46\xdc\xbd\xb0\x39\xb8\x97\xaa\x8b\x44\xb5\x3e\x33\x41\x47\x85\x83\xc1\x2b\xc2\xf4\xf5\x8f\x8c\x45\x18\xb7\x22\x48\x10\x3e\x1e\x0c\xf2\xc8\xb2\xe9\x21\xbf\xe0\x37\x16\x04\x26\x00\xc5\x94\x45\x19\x2f\xe3\x64\x54\x63\xc5\x9e\xe9\x5b\xe5\x53\xe1\x54\x63\xcc\xde\x15\x56\x37\xcf\xc9\xf7\x97\x42\xea\xe6\x09\xfe\xfe\x7e\x3c\xdd\x96\xd8\xb6\x87\xc6\x94\xfc\x30\x75\xda\xe3\x87\x60\xc0\x91\x53\x13\x70\x44\xc9\xcc\xf9\x6a\x14\x52\x75\xf1\xa2\x14\xbf\xf3\x57\xb5\x00\x25\x2b\xe1\x48\x4a\xe9\xff\x24\x21\x9f\x04\x8e\xf4\xba\x0c\x18\x02\x27\x8d\x34\xac\x45\xb7\x60\x81\xf8\x5e\xcd\xf8\xb9\x9f\x80\x84\xd2\x32\xff\x30\xd5\x1a\xdf\xdb\xd4\x21\x3c\x71\x82\xb0\x1e\x05\x3b\x26\x3b\x31\xe1\x09\x79\xc5\x24\xef\xc7\xc9\x8c\xe8\x1b\x62\x0a\xaf\xd2\xaa\xce\xdd\x04\x92\x7f\xa9\x66\x9b\x08\xad\x73\x7f\x9b\xde\x15\x3b\x33\x77\x42\x32\x31\x79\x46\x26\x3c\xd2\xc8\x84\x77\x1a\x19\x37\xb1\xd1\x4c\x92\x29\x31\x5e\x3d\x7d\x06\x1c\x6d\x08\x19\x26\xae\x41\x6f\x1a\x66\xbc\x6a\x32\xf3\x97\x9b\xbf\xd2\xfc\x35\xc8\xe3\x85\x50\xe2\xfd\x0d\x39\x53\x67\xd7\xb2\xe0\xc1\xd0\x40\xba\x12\xdb\xdf\xa4\x8e\x3a\x6e\x96\xa5\xce\x9b\xfa\xf7\xd4\xd6\x89\xe2\x0d\xa2\xbb\xb6\x5f\x08\x75\xec\xf0\xe5\x02\x0e\x9a\xd4\x3b\xe7\x0a\xa1\xc4\x14\x7c\x54\xae\xea\xc0\x39\xe8\xe6\xa6\x93\x2c\x94\xd7\xa1\xcf\xf1\x7e\xb5\xbc\x84\x51\x9c\xa7\xc2\x8a\x78\x2b\x62\x74\xb3\x0a\x01\x5a\x2f\x59\xfc\x0f\xd9\x71\x79\x27\x8c\x31\xef\xd2\x84\xa5\xd2\xd2\x08\x11\xb5\xc9\xcd\xe8\x10\xaf\xae\x7d\x40\x53\xbc\x63\x6d\x8d\xae\xd3\xf7\xb8\x9f\xd1\xe0\x94\x9d\xe6\x1f\xde\xcd\x48\x40\xde\xa6\xb0\xd6\xeb\x69\x9f\xbc\x49\x41\x2d\x8e\x50\x6b\x83\x81\xc0\xb3\x65\x5c\xc4\xf1\x3a\xfd\x12\x27\xdf\x65\x44\xf6\xdd\x33\x7c\xe0\xf8\xa0\xb0\x2c\x3e\xcc\xc8\x41\x0a\xea\x11\x84\xfa\x8d\x90\xf7\xa5\x95\x08\x1c\xe3\x2f\xe4\xcc\x15\xeb\xf6\xa2\x9d\xa8\xca\x56\x49\x69\x4e\x5e\x28\x56\x63\xb8\xf9\x9b\x00\x5e\x33\xaa\x70\x99\x42\xef\xcc\x19\x6e\xfe\xa6\xc6\xb7\xd5\x1b\xd2\x0d\x25\x9e\x65\x7d\x36\xa1\xea\x87\x00\x4f\x49\x8d\x5a\x67\xbe\x09\x8c\x2a\xf1\x91\x39\x28\x1b\x32\x18\x6e\x2a\xd1\xab\x94\x07\x98\x91\x07\x14\x31\xd8\x98\x91\x2f\x6a\xa6\xec\xab\x16\x09\x90\x40\xd4\x38\x27\xbe\xf1\xf4\x37\x51\xc7\x58\x7c\x03\x11\xf3\x8f\x66\xea\xbe\x12\xbc\x6e\x85\xef\xd4\x3a\x2f\x4e\x37\x0a\x21\x69\xdb\x8e\x9d\xe1\x63\x10\x0e\xc6\xb9\x35\xc1\x66\x1a\x22\x92\x6c\xe5\xf5\x50\x9e\x68\xaf\xb7\x99\xd7\x43\xf1\x63\x4d\xc5\xe1\x12\xd3\x29\x01\xb7\x62\x2b\xe7\x3e\xd5\x7c\x14\x40\x9c\x99\xc7\x15\xb6\xb2\x6c\x33\x5c\xdf\x66\x60\xc7\xce\xa6\x9a\xdf\xe6\xba\xd1\x98\x4a\xeb\x96\x00\x57\x60\x08\xc2\x79\xda\x5c\xa9\x8c\xd2\xb2\xa6\x16\x92\xd5\x35\x12\xd8\x8f\x54\x81\x52\x0c\x3c\xd5\x36\xab\xef\xef\xa8\xbb\x55\xa9\xfb\xb5\xfd\x04\xcc\xc9\x5e\x9a\x47\x39\x2b\xe4\x1f\x0e\x92\x8e\xa4\x8d\x1d\xc5\xb8\x8c\xe8\x5c\xf9\xad\x01\x75\xf5\x1c\x14\x02\xf0\x4b\xcf\x5b\x07\x1b\x47\xcd\x2d\x7f\x34\xb6\xac\x0e\x5d\xd4\x5a\x66\xb9\x99\x49\x83\xe2\x27\x0f\x81\xcb\x97\xcc\x43\x0e\x5a\x3c\x65\x74\x0a\x84\x45\xc5\x9b\x39\x1e\x9d\xab\x33\xbc\x03\x5c\xfd\xb9\xa6\xd4\x3e\x27\xf8\xb8\x43\x01\x5f\x2c\xb4\x40\x39\x09\x40\x63\x78\x3c\xf0\xcf\xdb\x7d\x46\xf6\x49\x06\x3f\xd9\x44\xb1\x73\x13\xa6\xfd\x22\x6b\x12\x4d\xa5\x06\xee\xc4\xa6\x9a\xb8\x5e\x85\x21\xf4\x86\xea\x57\xf9\x5e\x6a\x12\x5a\x83\x78\xdd\x85\x28\x0d\x24\x6a\x02\x50\x5e\xbe\x23\x17\xb4\xea\x8f\xc8\x9b\x6c\x9e\x2b\x1e\xc6\x17\x18\x55\xbc\xb0\xcc\x7e\x5e\x22\x0a\x22\x94\x20\x8f\xe5\x98\xff\x85\x11\xf5\x12\x1f\x70\xb0\x43\x1c\x77\xec\x28\xd6\x1e\x59\xf6\x1e\x32\xfe\x62\x43\x7b\x86\xb2\x56\x26\xbf\xdf\x1d\x09\xed\xda\xc1\xf1\x22\x54\x6b\x13\x3c\x67\x25\x5f\x53\xd6\x67\xa2\x16\x5e\x0e\xb7\xee\x56\x6d\xc9\x55\x25\xc5\x37\x28\xda\x5a\x29\x28\xfc\xc7\x58\x1e\x08\xa0\xc8\x64\x54\xf4\xa3\x13\x9b\xef\xc8\x7c\xf2\x4b\x04\x37\x2f\x46\x0e\x9d\x2e\x8c\x2b\x7e\x6b\x0f\x3a\xbd\x78\xc5\xb4\x7e\x3f\x04\xbd\x76\x42\x2f\xce\x05\xc2\x05\x1d\x61\x23\x2d\x61\x09\x04\xbc\xa5\xcf\x10\x0a\x09\x86\xfc\xf2\x1c\xaf\xbc\x30\xd6\x3b\x7b\x65\x7b\x5a\x0a\x54\x12\x00\x82\xa9\x12\xfb\x12\x25\xf6\xa9\x77\x09\x20\x00\x2f\x0a\xe9\x57\xbb\xbd\xab\xb5\x09\xd0\x69\xc9\xc5\x28\x03\xed\x12\xd5\x1f\x83\xd1\xc0\x46\x52\x66\xac\xe5\x13\x67\x4e\x04\x84\x10\xb4\xdd\x9e\xc5\xa3\x19\x89\x23\x98\x91\x14\x9e\x0c\x00\xa3\x7e\xdb\x33\xf2\x2d\xc5\x37\x9b\xdb\xfa\xcd\xa2\x64\x2e\xf5\x3c\xae\xed\xa4\xef\xaa\x51\x27\x18\x89\xbf\xc8\x66\x85\xc3\x0b\xf4\x37\x2b\xc3\x5e\xf1\xcb\xc9\x4f\xbf\x5c\xf6\x5b\xac\x2d\xb6\x62\x87\x91\x2f\x28\x62\x73\xcc\x48\x3c\x7a\x9f\xda\x9f\x52\x70\x35\xc0\xad\x8c\x2b\xd0\xe3\x0a\x8a\x48\x60\x51\xbb\x2e\xa8\xce\x99\xce\xf0\x03\x39\x07\x4a\x9b\xb8\xcb\x33\x13\x67\x91\x47\xce\x1b\x01\x59\xe4\x1c\x08\x60\x51\xeb\x85\xd7\x91\x2d\xfa\xec\x08\xcd\xf5\xfb\x2e\x05\xcf\x16\x18\xb9\x4c\xe8\xa0\x67\xe0\xbe\xb5\x85\x8e\x5c\x26\xfa\x4c\x8d\xd6\x8b\x9c\xb7\x02\x92\xc8\x79\x25\x20\x8c\x9a\x0e\xfd\x9c\x24\x11\x0c\x07\x43\xdc\xe0\x5f\xbf\xf0\xe7\x93\x67\x5a\x2f\x97\x4b\xc9\x18\x7d\x0b\x4b\xb6\xb7\x30\x3a\xad\xa9\xb7\xfd\x18\x7f\x8d\xe4\xc6\xd0\x96\x78\xcd\xe7\x45\x3a\x7a\x6d\x45\x9b\x26\xe8\xa8\x27\xca\x35\x8f\x17\x14\x82\xa8\x5d\xc3\xa9\xba\x7d\x82\x9f\x1f\xcd\x48\xa8\x00\xc9\x8b\xb4\x87\x8c\x01\xa5\x30\xca\x61\xd1\x8d\xd6\x1a\x62\x72\xf4\x28\xe1\xda\x56\xa3\x29\x0a\x3e\x3a\xc9\x7d\x4d\xc0\x04\xb4\x7d\x2e\xaa\xa8\x4e\x0d\x9d\x99\x28\x59\x3a\x91\x84\xa4\x7f\x14\x0d\xe2\x6a\xa4\x2c\xed\x74\xc1\xa2\x22\x72\x6a\x1a\xad\x8f\x50\x59\x4d\xae\x61\x0a\xf1\xa2\x31\x6a\x15\x7d\x74\xc4\x7f\x25\xbe\x24\xce\x8c\x04\x11\x78\x3a\x01\x67\x18\x90\xa4\xb4\x3e\xc9\x67\x75\x43\xd2\x08\x18\x02\x42\x9f\x1d\xf5\x48\xb2\xc1\x30\x5e\x3d\xb0\xbe\x47\xf3\x74\x19\x7d\x17\x92\xe6\x38\x65\x88\x7b\x75\x2d\xaf\x52\x67\x4a\x5c\xb5\xf4\x3a\xf8\x89\x1a\xd5\xf3\xc2\xcf\xab\x79\x5d\x99\x5a\xa6\xe7\x99\xd9\x88\x24\x24\x18\x99\x0c\x3f\xac\xa5\xb0\xe7\x95\x40\x31\x1c\x23\x32\xd4\x5b\x17\x8b\x9c\xa1\x78\xa6\x97\x39\x01\xed\xc0\xde\x6a\x2e\xd0\xe1\xce\x4f\x76\x80\xa7\x8c\x02\x3b\xb3\x63\x60\x9b\x4a\xfa\x61\x92\x82\xeb\x9a\xf7\x6e\xa0\x5e\x71\x49\xc1\x7b\x63\x0b\x70\x27\xfa\xfd\xa2\x9e\x6b\x42\x83\xe4\xef\x45\x94\xb7\x8a\xa9\x2b\x9e\x0b\x51\xf2\xf3\xfa\x2c\x6d\x0e\x74\xda\x3c\x3a\xc2\x15\xe3\x7d\xef\x0d\xf0\xbe\xeb\x62\xc0\xa7\x2c\xd2\x16\x7b\x14\x62\x35\x39\x55\x1f\x55\xa4\xab\xf5\x27\xc8\xc9\xf2\x08\x7e\xaf\xb7\x78\xf6\x7b\x53\x03\x76\x90\x37\xd8\xac\x34\x08\x48\x54\xd6\x38\x53\xfd\x06\xea\x69\x13\xce\x89\x80\x41\x35\x9c\x4b\x6b\x4d\xec\x73\x38\x28\x16\x40\xb5\xd1\xe6\x50\x0b\x0a\x6f\x84\xb6\xc4\x38\x03\x25\xb2\x45\xce\x52\xd8\xbd\x98\xab\x0a\x7f\x27\x86\x5c\x64\x62\xc8\xf9\xa9\x62\x1e\x0e\x1a\x42\x55\x99\x7f\xbe\x85\x30\x80\x86\xe4\x2b\x95\xc8\xe7\x5e\xd8\x64\x3a\xfc\x32\x23\xf1\x06\xa2\x11\xec\xc9\x8f\xa0\x1b\x50\x8c\x86\x7e\x85\xdf\xce\x43\x6b\x99\x78\x50\xd3\xa8\x88\x07\x75\x20\x28\xbc\x4b\x49\x57\x12\xeb\xab\x48\xe2\x8b\x8e\x9f\x09\x34\x6a\xe8\xe8\x5c\xe9\x18\xa4\xbc\x1b\xad\xb5\x29\x67\xdc\x9e\x24\xe0\x9e\xd9\x31\xca\xc0\xe3\xc8\xc4\x58\xba\xbc\xb3\x19\xc1\xe8\xac\x28\x08\xab\x13\xa3\xb3\xf5\xda\xe3\x08\xfb\x99\xd4\x9a\xcb\x46\xa7\x66\xc3\x43\x33\xc2\x1c\xdc\x4f\xae\x9e\x65\x9f\x9d\xa2\xb8\x9d\xad\x72\x5c\x73\x22\x23\x38\x4d\x51\x14\xa8\x71\x5e\xb2\x9f\xf6\xdd\xb3\xe7\xb1\x93\xa1\x22\x62\x29\x84\xaf\x2e\x43\x73\x52\x52\xa1\xab\x12\x7e\xa6\xf6\x8c\x74\x23\xc8\x40\xf6\x53\x54\x75\xe2\x4f\x45\x25\xdd\xcf\x15\x3e\xd9\xe4\xbe\x41\x9b\x75\x1c\xa2\xfb\x19\x87\x88\x03\x66\xff\x5f\x0c\x95\x9d\x96\x43\x65\xa7\x15\x7e\xbc\x6d\xa8\x9e\x33\x8d\xf4\x50\x49\xa6\x07\x97\xa6\xe0\xa1\xc9\x93\xfa\x2a\xae\xb9\xfd\x21\x45\x25\x54\xd3\x77\xd9\xf2\x77\xb3\xe5\xef\x6e\xd9\xf5\x26\x97\x11\x4c\xa3\x4a\x9b\xcb\x08\x0e\xd2\x72\x38\xd8\x5a\x2f\xf8\x65\x04\x7e\x6d\xc5\xb7\x97\xba\x63\x27\xfa\x9b\xb1\x66\x5f\x4e\x2a\x6c\xe4\x4a\xb5\xcb\x08\xba\xb5\x5a\x4f\x96\x6b\x1d\x2f\x75\x76\x5c\x54\x7b\xba\x5a\xad\xe8\xac\xac\xf5\xbb\xad\x9d\x71\x57\xf6\xfb\x9c\xc8\xfe\x54\x89\x6d\xf8\xe7\xba\x55\x7d\xb6\x87\x6b\x80\xf3\xc7\xd5\x29\xa5\x04\x94\x13\x96\xd8\xfc\x3d\x92\xaf\x8e\xd6\xc0\x0b\xed\xdf\xa6\x97\x52\xff\x36\x25\x71\x51\x32\x8d\xa0\x41\xc5\x2f\xc0\x68\x60\x57\xa1\xca\x73\x92\xbe\xa7\xf6\x88\xa3\x6f\xb1\xfb\xd9\x16\x4e\xd2\x67\x5a\xd5\x5f\xdc\x22\x25\x0e\xf1\xaa\xf0\xa4\xa1\x46\x4d\x58\x89\x4a\x9e\x3a\xbd\x9e\xb9\x92\xc8\x0f\xf0\xf2\x87\x8a\x7b\x08\x0f\x57\xc8\xbb\xa1\xda\x06\x6a\x45\xeb\x8d\xb5\xf5\xc7\xd1\xba\x22\x5a\xe7\x3a\x55\x75\x52\xd1\x6a\xb1\x19\xf9\x9c\x02\x3a\xbb\x88\x3e\x7b\x5c\x04\x41\xae\x59\x69\x0f\xec\x1b\x44\x58\x5d\x0a\xec\xb1\x3d\xc7\xe7\xc7\x14\xdc\x0f\x76\x9c\x11\xeb\x65\x92\x45\x7e\x27\x4e\x64\x27\xcd\xdc\x71\x28\x51\x77\xa9\x70\x2a\xe4\xa9\x93\x3b\x61\x8a\xe5\x73\x2e\x3b\x98\x44\xa0\x6f\xe5\x8e\x47\x59\x35\xda\x72\x6e\xfe\xfe\xc1\x0e\x93\x8a\x1d\x73\x6e\x03\xff\x29\x83\x37\xc8\xb3\x05\xa9\x0e\xb8\x08\xaf\xf0\x04\x9e\x18\x83\xf1\x1f\x68\x30\x8e\x2f\x2a\x8e\x10\xcf\xcc\x21\xdf\x7a\xe0\xa8\x5d\x51\x28\xa4\xdf\x1d\xed\x26\x76\xe9\x10\x20\x37\xaa\x29\xa0\xad\x0d\xaf\x72\xaa\xcb\x31\x79\x4a\x0e\x2e\x4e\x09\xab\x9a\x01\x6b\xff\x87\xc4\x8c\x73\x4e\x0e\x5d\xe3\xde\xe2\x5e\x2b\x96\xe9\x98\xe2\xc0\x6f\xd3\x06\x57\x8b\x86\x9c\x9e\x48\x4a\xcb\xac\x9e\x98\x0f\xff\xb1\x7d\x43\x76\x53\x13\x27\xc4\xc3\xb8\xb1\x02\xc1\xc2\xdb\xb5\x71\x0e\x3a\xd9\x67\xa3\x2b\xa3\x80\x39\x39\x51\x4b\x86\xb3\xd7\x63\x7c\x8f\x6b\xb9\xe2\xc8\xb1\xf5\xc0\x08\xda\x23\xd5\x6c\x37\x51\x52\x6d\xc3\x08\x91\x2d\xe0\x0c\x48\xa6\x8f\xa2\xb1\x56\x5c\x19\xf3\x8c\x7c\x4c\x91\x4f\xaf\x8d\x54\xf4\xdd\x0f\x0b\x58\xb6\x50\x3f\x71\x69\xc5\x60\x45\x73\xce\x0d\xe0\xe9\xad\x82\xe7\x9e\x06\x43\x8c\xd6\xde\xf1\xc3\x74\x12\xb1\x79\x87\x05\x81\x0e\xbb\x84\x99\xca\xd3\xb5\xb0\x08\x2d\x10\x5e\xc0\xa8\xb7\xea\x42\xb1\xa7\x61\xb4\x84\xce\x2f\x39\x74\xa2\xff\xce\x14\xd5\xe0\xd7\x74\x35\x56\x47\x65\xd4\x6b\x9c\x54\x55\x8d\x57\xab\x8e\x63\x2b\x7d\xa8\x2d\x51\xeb\x3c\xd1\x38\xba\x38\x98\x51\xd2\xe0\x0b\xa2\x84\x10\x51\x56\xec\x4f\x57\x5c\x99\x54\x57\x2e\x2e\xf9\x63\x48\x96\x9c\x03\x87\x43\x3b\x2b\x7d\x72\xf4\x52\x25\x18\xfe\x7c\xc5\x89\x06\xaf\x6b\x14\x28\x2c\xad\xcf\x0b\xbd\x3e\x49\x93\x4f\x5f\xee\xbd\x50\xcc\x17\x4d\xb6\xa2\xf5\x51\xd0\x5e\xbd\xde\x7f\x7d\xfc\x7a\x39\x10\xda\x3c\xaa\x78\x19\xe8\xab\x3b\xe3\x62\x70\x13\xfd\xb5\x8b\xb4\xbe\xeb\xb7\xdc\xa5\xcd\x22\x10\x30\x8f\xf4\x8d\xc6\xf5\x5f\xe9\xb6\x21\x6e\xd6\xca\x25\xdd\x49\x42\xf0\x9e\x0e\xdd\xc8\x5b\x57\xe0\x42\x47\x21\x73\x0f\xb5\x73\xc5\x51\xd4\x68\x7f\x7c\xc4\x74\x52\x87\xdc\x0f\xf7\xca\xfe\x2a\x48\x4c\x81\xcd\xed\x18\xdc\x13\x7d\x2f\x7c\x1c\xb5\x5a\x1f\xae\xe6\x3f\xf7\xb2\xfc\x9e\xbe\x06\x91\x51\x52\xd3\x92\x86\x49\x7d\x9b\xe3\x4c\x6b\x4f\x16\x14\x5e\x47\xce\x21\xf9\x73\x08\x9b\x30\xf8\x4e\xe1\xac\x4d\x21\xb0\x42\xb6\x36\xeb\x07\x60\x6e\xcf\xc8\x71\xd4\xac\x2c\xde\xe3\x70\x14\xa9\xe9\xbe\x8e\xe8\x02\xe2\x9a\x0f\xf0\xca\x79\xec\xda\xc6\xc1\x4f\xc3\xb6\xfb\x1e\x91\xde\x5c\x1f\xf3\x39\xb9\x46\x2e\x0e\x76\x56\xa7\x9e\x53\x88\xf7\x8a\xb6\x1b\xe6\xbc\xef\xfa\x74\xd5\xb7\x57\x73\x9a\xde\x32\xe5\xc8\x1b\x57\xbe\xa6\x09\xdf\x9c\xdc\x44\x68\x24\xd0\x95\xe4\x58\x09\x33\xde\xa8\x24\x59\xbc\x4a\xb2\x2c\x6a\xef\x26\x25\xc5\xdb\x2e\x0e\xfb\xd2\x69\x0d\x91\x51\x61\xc8\xb7\x78\xda\x7d\xee\x9a\x41\xd2\xf7\x28\x6a\x27\xb8\x5b\xeb\x14\xd0\x93\x2e\xcc\x3d\xe9\x3c\x87\xad\x78\xd2\x25\x14\xbc\xef\x94\xda\x0d\x48\x20\x5c\x60\x30\xcf\xe6\xa3\x5e\xf5\xfa\x43\xff\xf1\x68\x8d\xbd\x55\xfb\xee\xaf\xa0\xd0\xe1\x9d\x28\x74\x7b\x75\xd7\xd0\x8d\x7b\x15\xc7\x56\x49\x61\x05\xdb\xba\x07\x36\x5a\x9e\xe8\x36\x76\x95\x1c\xa8\x32\x2f\x23\xdc\xd0\xc4\x1c\xfb\x1d\x33\x4d\x14\xa4\x22\x0a\x3c\x27\x0a\x28\x89\x57\x75\xfb\x59\x83\xa3\x9e\x1a\xdd\x10\xc1\xef\x24\x05\x09\x19\xbc\x66\x15\xf4\xb9\xae\x45\xb9\x47\xcb\xac\x4d\xa6\x5d\xe9\xde\xae\xcd\xd9\xcc\x0e\xed\x18\xd8\x17\x5b\x82\xfb\xcd\xe6\xe0\x76\x35\xa6\x78\x65\x4c\x3d\x12\x11\x5e\x84\x31\x8b\xd6\x65\x0d\x16\xc6\xb2\xe2\x85\x68\xcf\xf1\xa1\xcd\x53\x52\xf5\x99\x23\x93\xf4\xbb\x55\x83\xba\x6b\x0b\x30\xa9\x88\xe1\x8d\x19\x07\xf3\x7d\xc1\xd3\xb4\xdd\x3c\x45\x6b\x20\xd6\x1b\xa4\x08\xce\xfc\x79\x93\x39\x4a\xca\xa5\x8c\x6a\x56\x27\xb9\x41\x8a\x1f\xa6\xcc\x8d\xfe\xa5\x0c\xcf\x67\xda\x1a\x67\xc2\xb5\xf1\x87\x20\x27\x09\x79\xa3\x44\x94\x3c\x8f\x4c\x6e\x79\x72\x20\x74\xd2\x19\x3d\xb9\x32\xd9\x4c\xca\xc9\x0b\xa1\x33\x39\x8b\x3b\x6c\x2f\x7e\xb2\x0f\xb6\x04\xf6\xd1\xce\x80\x7d\xb2\x39\xb0\x67\x36\x03\x17\xd5\x67\xe7\x7a\x49\x0f\xcc\x92\x5e\x24\x27\x5c\xa4\x61\x12\x97\x8b\xea\x66\x61\xe4\xbf\x42\xe3\x9e\xa5\x57\x5f\x52\x2e\x2a\xaf\x04\x8b\xbd\xcb\x6a\x46\x9d\x69\xb8\xdc\xcf\xb4\xd2\x71\xca\x71\xae\xda\xc4\xe5\x65\x94\x1b\xdf\xc8\x50\x4d\xf1\x20\xb7\xae\x89\x83\xf0\xc2\x82\x57\x62\xa9\xfd\xbb\x38\x48\x70\x51\x74\xa5\x28\x4b\x31\x4c\xdd\x99\xea\xf3\xad\x49\x6d\x7d\x1e\xdd\xc3\x1d\x27\xe7\x0e\xb4\x5b\xfc\xc7\x00\x62\x78\x19\x2d\xd3\x65\xa1\xe8\xb2\x36\x06\xdf\x8b\xd6\xdd\x80\x69\xfe\xff\x3c\x82\x82\xbf\x3e\x63\xf0\x45\xf1\xd7\x39\x82\x70\x8f\xec\x9f\x2e\xfa\xbd\x2c\x0c\xda\xa3\xb0\x1f\xb5\xc7\x15\x7c\xa6\xa3\x2a\x3d\x59\xbd\xa9\x7c\x62\xb0\xc5\x94\xec\xba\x70\xa4\x0e\xb9\xfb\xd8\x70\xf6\x1c\x24\xd5\x81\xae\xea\x58\xe1\x31\x32\x65\xde\xcc\xf6\xc0\x3b\xb5\x5f\x71\xe2\xd1\x8a\x34\x33\xd4\xe4\xc9\x83\xc4\x99\x92\xb3\x08\x8e\x11\x75\x0c\x4c\xaf\x0a\x33\x68\xb2\x51\x77\x37\x35\xdd\x7d\x52\xdd\x81\x37\xd0\xb7\x40\x1a\xe9\x1d\x70\x60\xab\x26\xa9\x79\xc3\x53\xfb\xa5\x66\x0e\x0b\x01\xe0\x8b\x76\x51\xcd\x3d\x54\x6b\xfa\x03\xf4\x95\x76\xe6\xe4\x2a\x02\x13\x0b\x3d\x59\xa8\x21\x0e\xf5\xd0\xc2\xd5\xa1\x9d\xda\xef\x39\x51\xe4\x69\x68\x87\xe5\xa8\x3e\x57\x47\x35\xb0\xc3\x06\x04\xea\x9d\xda\x3f\x38\x09\x69\x3e\x3c\xdc\xcd\xd7\x98\x5e\xf7\x5a\x8b\x71\x57\xaa\x78\x59\xba\x0c\x9a\x3b\x7a\xc1\x49\x40\x97\xe7\xf9\x86\x93\xb7\xea\x6d\xa3\xdb\x7d\xde\xee\x6c\x99\x79\xdf\x6e\x76\xb3\x8f\x4b\x36\x6c\xb8\x24\xed\xed\x25\xa4\x5a\xd6\x12\x09\x40\x56\xa2\x59\xac\xda\x1e\x97\x83\xb9\x4a\x1a\xe9\xe7\x8c\xec\x19\x49\xa2\x20\x9c\x81\x86\x49\xcd\x71\xb8\x8f\xd5\x67\x66\x39\x4c\x06\x4d\x30\x89\xb7\x73\x05\x14\x6a\x32\xe8\x6a\x10\xd4\x9d\x78\x03\xdd\x89\x01\x41\x77\x75\x9f\x07\xb6\xdb\x0c\x74\x8f\x6d\x57\x1d\xeb\x7c\x38\xde\x59\x4b\x07\x67\xa6\x03\xb6\xc4\xa9\xa5\x1a\xd8\x4c\x5b\x03\x66\xe9\x6a\xeb\xa1\x9d\x36\x43\xd7\xa6\x9d\x3a\x37\xe4\xa2\xe8\xa2\x9b\xcf\xa1\xa1\x93\xae\xe9\xa4\x18\xc2\x0a\x48\xb8\x2b\x8c\xce\xef\xf5\x2a\xf3\x95\x2a\xf5\x10\x01\x5e\x5c\xaf\xb2\x59\xe7\x61\xbd\xeb\x4a\x95\x16\x29\xed\xc7\x32\xeb\xf6\x21\x5a\x9f\xf6\x71\x66\x73\xb8\xb5\x25\x64\x3a\x97\x57\x06\x3b\x9a\xe2\xec\x46\xcd\xee\x79\xee\xc3\x87\xc4\xb2\x34\xef\xa5\x95\x81\x6e\x9e\x88\xa1\xcf\x60\x37\x42\xed\x08\xb5\x4f\x17\x70\xda\x8a\x92\xaf\x65\x7e\x71\x38\xd2\x51\x7a\xed\x3c\x93\x83\x89\xa1\xfc\x6e\xf9\xe3\x52\xcc\x2b\x4d\x7d\xde\x90\xb5\x8c\x2e\x3c\x66\xd8\x86\x22\x45\xd4\x62\x01\x1f\xdb\x50\xb8\x0e\x58\xeb\x58\x26\xa7\x9e\x54\xf3\x92\x3a\x58\xe1\x03\x99\x47\x2a\x8c\x1d\xf5\xc8\x40\x3a\xef\x22\xbc\x61\xce\xaf\xe6\x2a\x19\x1a\xc5\x73\x89\xee\xeb\xb1\xaa\x13\x2f\xdd\xbd\x69\xdb\x0b\x1d\xa8\x18\x4e\x23\x1d\xb2\xa5\x9a\xfc\x80\xc2\x61\xeb\x1a\xb5\x84\x96\x7f\x10\x97\xfe\xf3\x26\x09\xd6\x72\x7a\x03\xd1\xcf\xf2\xa8\x91\xb4\x5c\x33\xbc\xd9\x78\x9e\xc7\x51\xe3\x7d\xf6\xf0\xe1\x72\x64\xb9\xa2\x4e\xec\xc8\xc5\x82\xc4\x64\x4a\x3e\x44\x70\xba\xe2\x1f\xf9\x52\xd3\xe8\x72\xa2\x7a\xc7\x1f\x3e\xd4\x91\xd3\xfa\x6c\x14\xf7\x5d\x3b\xa6\x0b\x25\x4b\x66\x14\xd4\x3a\x10\x4c\xf7\x7d\x4c\xfb\xdd\x51\x37\xb1\x31\xee\xc0\xc7\x08\xba\x89\x89\x1a\xfc\xd0\xd2\xa8\x52\xed\xfe\x13\x60\x52\xcb\xd6\x27\xd1\xbd\x6c\xb2\x2f\x15\xe3\xc4\x14\xec\xde\xda\x1c\x0e\xed\x04\x8e\x6c\x06\xc7\xb6\x07\x5f\xec\x0c\x76\x35\x2c\xdf\x46\x7f\x21\x93\x9b\x24\x45\xa0\x61\x1e\x18\x55\x33\x72\xd7\x6b\xd4\x1d\x1f\x22\x10\xfd\x1d\x10\xfd\x0c\x44\xff\x16\x44\x7f\x06\xf9\x6d\x12\x26\x56\x8c\x96\x72\xcd\x17\x99\xe6\xdb\x33\xa8\xc7\xfd\x1d\xdc\xd1\x0c\xcd\xe8\x6f\xd1\x8a\x7e\xf6\xbc\x2a\x3a\xbf\xc2\x75\x3f\xa3\xe0\xe9\xad\x2a\x99\x4a\x3d\xdc\xe6\xe4\x94\x33\x72\x1b\xa1\x3f\xcd\x79\x02\xa7\x19\x1c\x84\x04\x1f\xaf\x18\xcc\x43\x62\x05\x2c\x4a\xb9\xa5\x35\xeb\xf0\x36\x5a\x13\xa5\xa3\x31\x41\x7e\xf1\x8d\xc3\x44\x91\x15\x3c\x95\x6b\xef\x93\x67\xe4\xad\x1a\x0d\x91\x8e\x68\xbc\xc4\xbc\xad\x04\x1c\xc5\x49\xaa\x65\x51\x8b\x22\x20\xee\xcf\x80\xe0\xe5\xe9\x19\x25\x68\xdf\x43\xbf\xa3\x9d\x49\xee\x4e\xfe\xa6\x32\x7f\x6f\x4d\xaa\xbc\xc6\x95\xd6\xee\x0a\x67\x06\x33\x68\x44\x80\xb9\x01\x4b\xe2\x70\x41\x62\xf0\xe8\x28\x1f\x59\x91\x8a\xa6\xd8\x86\xef\x0a\x09\x16\x01\x45\x17\x70\xb0\x66\x3f\x1a\x13\xc0\xb8\x06\xbd\xe6\xc9\x1c\x51\x64\x5d\x28\x29\x6f\x46\xae\xe0\x44\x7d\xf3\x85\xb8\xcf\x3f\x6f\x04\xc9\xe3\xc2\x53\x38\x28\x42\x47\x53\xfc\xa1\x23\x44\xe3\x7d\xcb\x6d\x04\x2b\x31\xa2\x73\x48\x99\x63\x3e\x53\xaa\xdb\x14\x91\xa6\xa9\x82\xb3\x4a\x34\x6c\xf3\xbb\x0c\x7d\x6d\x5e\xe8\x48\xd7\xe6\x87\xf1\x23\x30\xf2\x9f\x1a\x9c\x12\xe5\xc2\xf8\x42\x0d\xaf\x96\x34\x31\xf9\x57\x77\x4e\x9f\x34\x8d\xa0\x31\x93\xac\x93\x10\xcf\xa0\xfc\x02\x87\x9f\x6a\x1c\x5e\x87\x36\x13\x5e\x56\x50\x88\xf5\x9e\x12\x89\x50\x56\x6e\xaa\x12\x13\x67\x4a\xce\x39\x3a\x3e\x7c\xf7\xe1\xad\x05\xd7\x12\x65\x77\x04\xec\x37\xe5\xca\xa8\x99\xe1\xbb\x33\x7c\xcb\xfd\x50\x5f\x67\x9f\x88\xe5\x34\xb0\x71\x69\x44\x1a\x43\xe6\xc8\xb5\xa7\x4c\x00\x3a\x13\x65\xf9\x39\x0b\xd7\xf8\xf3\xe7\x37\x68\x82\x82\x7b\xad\x50\x70\x02\xc2\x25\xe3\x80\xc2\x24\x20\xa7\xd4\xa4\xac\x0c\x5b\x06\x6e\x60\x28\xe6\x33\x0b\x75\x1d\x02\xc2\x2a\x1c\xa9\xe7\xdc\xd7\x42\x83\x08\x42\x68\xc3\xa0\x53\x72\xa2\xc0\x7d\x47\xc2\x83\xa1\xfa\xb7\xf2\x7f\x4c\x35\x65\x3e\x54\xf9\x78\x15\x5c\xf5\x6a\xaf\x0e\xf0\x0c\x4f\x3b\xbe\xd4\x42\x23\x85\x37\x91\x43\xb2\xc4\x41\x65\xd8\x15\x7c\xe2\x70\xa0\xe6\x71\x05\x2f\x13\xb4\x9c\x50\x8f\x57\x09\x1c\x98\xc7\x1f\x1c\x42\xfd\xf4\x9e\xc3\x99\x7e\x7a\xc1\xe1\xad\x29\x7e\xc5\xe1\x95\x79\xd4\x51\x17\x1b\x66\xa6\xf9\x98\x05\xfd\x4e\x9b\xcc\x26\x10\x25\x36\xb1\x53\x68\x19\x93\xa1\xb4\x79\x10\x39\x3f\x04\x7c\x8e\x4c\x64\xc7\x2f\xda\x76\x61\x6b\x01\x2f\xf4\xd3\xe6\x02\x7e\xe8\xa7\x27\x0b\xf8\x14\xdd\x27\xc9\xd5\x55\x8b\x89\xf2\x18\xb8\xf3\x92\xe9\xa8\xb7\x33\xf2\x29\xd2\x26\x4a\x6e\xa2\x73\xfb\x5a\x13\x91\xf8\x19\x36\xb2\x20\x48\x30\xf6\x9b\x92\x5a\x47\x8a\xa2\xdb\x8a\xfa\x7b\x4d\xad\x2e\x6a\xe9\x0a\xf2\x96\x49\x43\x88\x25\x6c\x9e\x47\x50\xaa\x76\x12\xd4\xc2\x45\xed\xe8\x4e\x8c\x2e\xe8\x5f\x8b\xf5\x14\x36\xc5\x7a\xaa\xd8\x6f\xd4\x7c\xac\x57\x12\x7f\x74\xae\x13\xec\x27\xd0\xb3\xb7\x96\x06\xee\xd7\x7c\x6e\xcc\xc0\x21\x73\x6e\x39\xc9\x97\xee\x52\xca\x89\xfd\xe8\x51\x94\x78\x2c\xba\x4c\x52\x69\x3f\x1b\x3c\xdb\x7a\x64\x55\x95\x1a\x11\x9c\x6b\x67\xf1\xb1\xf3\x53\xdf\xe5\x9d\xe2\xcd\x9c\x2c\x15\xde\x51\x02\xee\x89\x3d\xac\x80\x61\x77\x15\x4b\x4e\x57\x5f\xf9\xab\xaf\xa2\xd5\x57\xe9\xea\x2b\x77\xf5\x55\xb0\xfa\x2a\x5c\x7d\xd5\x80\xbd\x1b\x48\x31\x5b\x7d\x95\xad\xbe\x6a\x48\x77\xdb\xc0\xc6\x89\x35\x9c\x9d\x92\x68\x7d\x70\x9f\xd8\x21\xb8\xcf\xec\x00\x3c\xd7\xf6\xc0\xbb\xb6\x39\x78\xb1\x9d\x81\xf7\xc3\x96\xe0\xcd\xec\x14\xbc\xb9\xcd\xf0\x36\x14\xbc\x77\x76\x02\xde\xa9\x1d\x81\x77\x66\xc7\xe0\x75\xed\x29\x78\x03\x7b\x0c\xde\xd0\xee\x82\x7b\x64\xbb\x8b\xfa\xff\x96\xaf\x63\xf3\x9d\x7b\x30\x04\xf7\x00\x2f\xfd\xc8\x8c\x5c\x24\x18\xa6\x50\x3d\x5e\xaa\x47\x8f\x52\xc2\x29\x09\x29\x99\x25\x54\xf3\xcd\x24\xa3\x84\x51\x12\x26\xe5\x7f\x01\x25\x1e\x25\x92\x92\x9f\xde\x8d\x9d\x2c\x34\x97\xfc\x43\x38\xb7\xb1\x02\x91\xf7\xad\x08\xa1\x94\x44\xc4\x06\xb1\x6c\x6b\xe3\xac\x48\x77\x04\x5f\xd7\x59\xdd\x1a\x09\x4d\xda\xbb\x44\xc2\x2e\x29\xa5\xb3\x6f\x51\x3b\x43\x97\x28\x22\x76\xea\x9a\xd8\x46\xb1\xef\x7c\x8b\x88\xe5\x45\x2c\x4d\x3f\xb0\x31\xb7\x28\x08\x3f\x77\xed\x72\xaf\x95\x94\x28\x7d\xe7\x5b\x4c\x2c\x3f\x9c\x5a\x14\xb8\xfe\x91\x4e\x58\x6c\x51\xc8\x7c\xe7\x6b\x0c\xcc\x77\x66\x44\xfa\x70\x0a\x88\xcd\xb9\x79\xca\x7c\x62\xed\x27\xcc\x0f\xe3\x8b\x7e\xbf\x6f\xd1\xef\x3a\x28\x8e\xe7\x3b\x42\x40\xe2\xb7\xc4\x96\x49\xbe\x4c\x26\x5c\xbc\x64\x29\x27\x74\x01\xa1\xff\x17\xae\xd6\xf4\xbd\x5a\xae\x84\x58\xbe\x8b\x60\x7e\x1d\x57\x7c\x64\xc5\x65\x5a\xa0\x27\xe5\x66\x52\x26\x6a\x5a\xae\x7f\xcf\x70\x4c\xa9\x6e\x18\x5a\x14\x22\xdf\x61\x02\x7c\xbf\x7d\xe1\x23\x1f\x62\x30\x3d\x08\xb4\x5a\x9b\xfa\x8e\x27\xa0\xeb\x37\x6c\x71\xec\xc4\x23\x2b\x60\xbd\x71\x18\x67\xa9\x65\xab\xc7\x49\x94\xa5\x56\x89\x88\x02\x5f\x2d\xf2\x09\xe2\xa2\xd8\x27\x96\x2b\xe3\x8e\x2b\xe3\x5e\x92\xc9\x28\x8c\x79\x2f\x8c\x83\xa4\xe3\x26\xc2\xe7\xa2\x37\xe8\x8c\x45\x6f\xd8\x19\xbb\xbd\x21\xb2\x0b\x53\x1f\xac\x31\x13\x17\x61\xdc\x8b\x78\x20\x2d\xb0\x7a\x5b\x82\x8f\xd5\x1e\xe9\x3d\x4c\xb1\x73\xd5\x6d\xc0\x50\xe7\x8e\x9f\x18\x8b\xde\x26\xd6\x39\x55\x5b\xaf\xd8\xb7\xc4\x98\x0b\x8e\x35\x18\xc9\x50\x46\x0a\x84\x2e\xf5\xba\x64\x91\x45\x61\xa2\x9f\x99\x45\xe1\xc2\xd7\xb6\x84\xad\x4b\x74\xcc\xf3\x60\x77\xad\x55\x7e\x04\xa6\x0a\x39\x24\x7f\xe6\xf8\xda\x02\x7c\x4a\xd5\xe3\x77\x34\x4d\xf2\xd7\x26\x10\x8a\xab\x19\x2b\x4c\x00\x11\xed\x07\x0d\xc6\x2a\xc5\xb9\xf0\x49\x86\x59\x4d\x46\xfa\x98\xb1\x7e\x77\x44\xd0\x27\xa4\x48\x3d\x17\x3b\x26\xc1\xc1\x4c\x12\x8c\x2d\x9a\x48\x18\x4b\x22\x37\xac\x8e\x3a\x29\x94\x62\xca\xe6\xc6\x3a\x58\x43\x34\xd5\x10\x14\xf3\x9b\x54\xbf\x5a\xfb\xda\x58\x92\x7c\x20\x3a\x83\x56\x86\x1f\xab\xf4\xa4\x3f\xb0\x61\x7a\x5b\x7a\xaf\xdf\x61\xe8\xf8\xc6\x13\x78\x48\xf2\xf8\x4e\xfd\x74\x12\x85\x92\x3c\xfa\x67\xba\xf1\xe8\x42\x89\x9b\x37\x66\x8f\x99\xb8\xe0\xd2\xa2\x70\xad\x37\x56\xfa\x16\x85\x1d\xf3\x7c\x69\x51\x38\x32\xcf\x8a\xef\x3c\xf6\xdb\xef\xdf\x63\x74\xfb\xe8\xb3\x21\xa5\xa3\x0a\x38\xef\xc8\xfb\xc0\x73\x2e\xa2\x34\x02\x6c\x7e\x6e\x3a\x35\x80\xb5\xf0\xea\x43\x81\xac\x9d\x7f\xf0\xce\x2f\x59\x14\x4e\x18\x29\x46\xda\xf6\x3d\x75\x38\xdb\x3f\xb7\xa0\xf0\x5a\xaf\x4a\xa4\x70\xc5\xd9\xd2\xaa\x70\x28\x04\xa6\xf6\x0c\x11\xa2\x9a\x21\x42\x49\x15\xa3\xf3\x3c\x3f\x30\x66\x88\xb3\xcf\x31\x7e\x87\x11\x71\x2b\x39\x61\x50\x99\x23\xe0\x9c\x9c\x82\x96\x22\x28\x5c\xad\x3d\x1c\xf5\x94\x95\x71\xe1\x0d\xe5\x3f\xc7\x3b\x20\x5f\x7b\x25\xf4\x39\xcd\x53\x6b\xbd\x34\x3b\xce\x5c\x3c\xfd\xe7\xbe\x23\x19\xec\xf9\x6d\xee\x77\x10\x3b\xbb\x84\x70\x67\x46\xce\x7c\x13\x9b\x55\xc2\x27\x49\x2a\x09\x6f\x68\x35\x50\x7b\x2b\x2e\xf8\x54\xe0\x82\x98\x62\xb4\x76\x17\xf3\x76\x84\x4a\xc4\x41\xc7\x67\xb7\xc2\xb8\xbd\xf6\xf5\xce\x29\xdc\x37\x49\xd2\x50\x73\xcf\x28\x90\x84\x9e\xa5\x61\x8e\x45\xe1\x45\xdc\x0b\x25\x1f\xa7\x3d\x74\x34\xef\x44\x61\x2a\x7b\x3a\xa4\xbf\x7a\x5d\x02\xe0\x44\x21\x55\xb7\xb7\x5d\x82\xa0\x2c\x40\x62\xd6\x1b\x0e\xb0\x74\xb3\xe3\xf7\x82\x88\xdf\x74\x56\x3a\xce\x9b\xfd\x50\x22\x2b\x0c\xfe\x78\x81\x76\x8c\xef\xd5\x49\xf0\xfc\x26\x41\x44\x64\xe4\x67\xd7\x7e\x86\xb9\xdb\x50\x12\x3b\xf6\x75\xbc\x15\x5b\x41\x9a\x45\x81\x60\x90\xce\xa7\xb4\xdf\x1d\xe9\x37\xf6\x1b\xa6\x7d\x07\xbe\xe0\x37\x4e\x33\xb5\x36\x47\x7d\x97\x57\xaa\x20\xb5\x6e\x39\x06\x3e\x8b\x2f\xb8\xa8\x1c\x84\x36\xd8\xe7\x73\xde\x4b\x23\x96\x5e\x36\x1c\x80\x42\xcd\xa0\x48\x7f\x31\x84\xf8\xdf\x3d\x04\x97\x47\x51\xcb\x18\x0e\xb2\xe2\xfb\xcb\xaa\xd2\xe2\xf2\x66\xa4\xe5\x57\xc7\xda\xf8\x1c\x92\xcf\xd9\xaa\xc9\x7e\xe9\x1d\x1d\xa2\x0e\x7d\x60\x32\x8d\xb9\x8a\x4f\xd3\xe0\x56\x49\x71\x78\x6f\xbc\x72\xcb\x30\x86\x6c\xf3\x8c\xa2\x30\xbe\x5e\x99\xcb\x7e\x18\x5f\x6b\x84\x42\x30\x19\x18\x5c\x10\x81\xde\x72\x39\x16\x7d\x59\xf4\x82\x87\xb1\x53\x40\xe2\x10\xbb\xc1\x99\xbd\x65\xfa\x9c\xb0\xf7\xb4\x84\x1e\xc3\xc0\xe9\x88\xff\xe8\x81\xa2\xd1\xd6\xbe\xbf\x26\x1d\x71\x91\x27\x68\xd4\xee\xe5\xa0\x6d\x8c\xcb\xe5\x91\xd5\xe5\xd1\x27\xab\xca\x9c\xe4\xcb\xb1\x0c\x13\x92\xdf\xc8\x9e\x51\x51\x19\xf6\x25\x4b\xb9\xe8\xa5\x3c\xe2\x9e\x62\x5f\xc2\x38\x94\x21\x8b\x8a\xd2\xde\x38\xb9\xed\xdd\x51\x65\xc6\xdd\xeb\x50\xde\x51\xcb\x6c\x97\x97\x44\x4a\x66\xb4\xfe\xeb\xb1\xeb\x0d\xfc\x82\xee\x64\x3e\x11\x1b\xff\x70\xac\x7f\x6c\xc4\x1b\xff\xb0\xfe\x81\x5b\x72\x17\x65\xd1\x04\xe5\x90\x91\x73\xa2\x55\xd7\x30\xf6\x89\xf5\x06\x41\xb0\xe3\xce\x3b\xf2\x32\x4c\x3b\x11\x73\x79\x54\xf9\x8a\xb5\x91\xf3\xcf\x0b\xe0\xd4\x6e\x58\x22\xf5\x99\x94\x7b\x49\xec\x33\x31\x5f\x5d\x51\xd5\xc7\x87\x44\x76\x70\xc1\xcd\x79\xf8\xae\x10\xb8\xf7\xeb\x17\x46\xb2\xc6\x48\x3a\xcc\x59\x8f\x7e\x86\x83\x1c\xff\xcc\x49\x57\xe1\x1f\x86\x86\x4d\xd2\xf9\x2a\x08\xc6\x9d\xc2\xab\x97\xd1\x99\x24\x52\xb1\x26\x78\xbc\x2c\x7b\xe9\x67\x6a\x81\x74\x6a\xe3\x1f\x47\x7a\xb4\x83\x62\xd9\x67\x97\xa1\xe4\xbd\x74\xc2\x3c\x6e\x81\x15\x27\x33\xc1\x26\x95\xa9\x48\x3d\xfc\x25\xa8\x3a\xad\x63\xe1\xb1\xdb\xdb\x32\x50\x9f\x48\x60\xb0\x4b\x12\x1d\x8b\x47\x8c\x66\xe4\xb2\xa8\x56\x62\x78\x33\x84\xfc\x9c\xcc\xc8\x9e\x0f\x98\x84\x35\x2b\xce\x89\x3e\x14\x1f\xfc\xf6\x8b\x06\xcc\xd1\xab\xce\xc9\x34\x81\xa9\x36\x00\xf5\xab\x96\x42\xfa\xf8\x68\x0f\xab\xd8\xe4\x0c\x8b\xab\xf7\x3c\xd5\x29\x4c\xa2\xde\x63\x33\xa0\x5d\xd9\x46\x07\x5d\xb2\xef\xe3\xa9\xc4\x64\x8a\x2e\x5e\x13\x85\x78\x57\xb3\x07\x31\x64\x28\xe5\xd1\xaa\xdd\xbf\x7b\x8b\x5c\x2e\xc3\x0a\x0e\x22\x31\xa6\x9a\x3c\x5f\xee\x70\x46\x3e\xf8\x18\xe0\x4a\x11\x59\x50\x58\x2f\x2b\x34\xab\x1f\x99\x02\x27\xbd\xa3\x1a\xa6\xd2\x4e\x90\x64\xb1\x8f\x66\xe9\x9e\xb8\x43\xfc\x7c\x1f\x18\xf1\xf3\x54\x49\x40\xc4\xf2\x2e\xb9\x77\x8d\x87\xfb\x9d\x91\xa8\xe2\x49\xa6\x78\xcc\x8f\x86\x6b\xd2\xc7\x01\x0e\xfd\xd2\x38\xd5\xf0\xa1\x50\x34\xfe\x4e\x51\xa3\x75\x62\xd8\xd4\xf9\x44\xf1\x22\xb7\x7e\xbb\xfc\x9c\xf3\x04\x6a\xa5\x63\x36\x45\xf2\x5c\x62\xa0\x8f\x25\x20\x49\x05\x9e\x0a\x46\xb5\xee\xbd\xe7\x25\xb1\x14\x49\x54\xfc\x54\x03\x70\x93\x9b\xb2\xed\x3b\xcd\xcc\xfa\x66\x66\x58\x86\x0c\xc6\x72\x07\xbd\x7c\x9a\xa7\x7e\x99\x9f\x92\x52\xf8\xc4\xf4\xa5\x8f\x04\x91\x51\x83\xfe\xab\xe7\x65\xa5\x17\x3f\xf4\x50\xa9\x75\x77\x5d\x9f\xa7\x9e\x08\x27\xc8\xfc\x94\xe7\x29\x36\xc8\x45\x83\xf7\x2b\x7f\xbd\x17\x67\xfb\xaa\x99\x5c\x4c\xd5\xef\xab\x2a\x48\xcb\x2a\x1c\x3b\x2f\xf9\x6f\x83\x65\x99\x77\xad\xa0\x28\xf6\x2d\xb0\xa4\x60\x71\x3a\x61\x02\x95\xd5\x06\x1f\x04\x49\xac\xb1\xf3\x25\x17\x61\xf9\xda\xcb\x44\x8a\x78\x79\x92\x84\xb1\xd6\x74\xeb\x02\x83\x70\x11\x77\xc4\xdc\x2c\x7e\x3e\x14\x8d\x81\xf1\xf6\x0b\x07\xa3\x67\xfd\xd6\xbf\x67\x74\xe3\x37\x1a\x66\x0b\x0b\x36\x0a\x07\xbe\xf3\x0f\x1e\x4f\x9d\xaa\x5e\xf6\x1f\xf0\x59\x03\x62\xa8\x6a\x7c\xf1\x9d\xdf\xe1\x85\xef\x0c\xb7\xe0\x07\x0a\xc1\x52\xb3\xb6\xd7\x12\xba\x12\x9d\xe6\xe1\xd3\x3d\x54\x07\xc3\x42\x75\xf0\xbe\xe9\x24\xe8\x58\x53\xc6\x5c\xfb\xab\xaa\x91\x26\x60\x5d\xf3\xf9\xcb\xc4\xe7\x16\x60\xbc\x79\x3c\x9d\xc6\x59\xd1\x2f\x3c\x0b\xbb\x41\xd5\xbb\x30\x09\x4a\xff\xbf\x6f\x7e\xe1\xff\xe7\x09\x9d\x0a\x3b\x9e\x6a\x1d\xd0\x98\x45\xea\x50\x8a\x29\xce\x53\x7f\x9c\x82\x9c\xb6\xc6\x1c\xf3\xce\xb5\xe4\x7c\xad\xa3\xeb\x5c\x61\xb2\x57\xb6\x0f\x9e\xf3\x4d\x49\xdb\x90\x38\x27\x4c\x1f\x84\xcc\xc4\x53\x76\x7d\x0c\xad\xe5\x29\xb4\x1d\x3a\x3f\x7c\xc2\x29\x04\xce\x05\xf1\x70\xc9\x4c\x36\x96\x6f\x0c\x50\x16\x31\xd9\x6f\x2c\xcb\xf6\xfa\xdd\x91\x75\xc9\x52\xc3\x40\x5a\x36\xfe\x48\x33\xcf\xe3\x69\x55\x87\x52\x62\x5a\x91\xcc\x3a\x71\xd2\xbb\xc8\xa4\xe4\x22\x6d\xe1\xd7\x77\x35\x6b\xc8\x3c\xf5\xbd\x1a\xb5\xf1\x92\xa8\x63\x6d\x88\x42\xbb\x12\xc6\xbd\x59\xe8\xcb\x4b\x0b\xe4\xc8\xda\x1a\x0c\x26\x37\x96\x6d\x6d\xe2\xdf\x06\x89\xa1\xf1\xf3\xea\xcc\xf2\x58\xf6\x52\x29\xb8\xf4\x2e\x9b\xda\xa9\xaf\x22\x12\xe9\x99\x5b\xc2\x65\x0c\xf4\xd9\x6f\x4e\x7f\x8a\xc7\x21\x48\x44\x81\x17\x70\x1b\x31\x39\x98\x47\x6a\x6e\xc0\xea\x4c\xbf\xf0\x2b\x0e\xd3\x8d\xdb\x93\xa7\x79\xfb\xe2\x53\x93\x0d\xee\x81\xe3\x64\x79\xa3\xf7\x4c\xd5\x7b\x1e\x3b\xe7\x84\x41\x58\x71\x40\x34\x06\x2a\xdd\x51\xe6\xda\x33\xf2\xd6\x87\x07\xc8\x5b\xf7\x59\x41\x69\x32\x77\x41\x21\xf3\x48\x4b\x7e\xe6\x2f\x3e\x1d\xa9\xde\x87\xd4\xc6\x9a\xd2\x23\x5f\x59\x03\x1a\xac\x2c\x52\xcf\x95\x71\xb9\x50\xab\xcc\xda\x44\x84\x63\x26\xe6\x96\x3a\xe9\x24\xa0\x90\x34\x70\x61\x8a\xd1\x93\xa3\xfa\x4e\x78\x49\xd4\x63\x99\x4c\x3a\xb5\xaf\x29\xe2\xb1\xd9\xb4\x7d\x8d\x5b\x37\xb9\x8b\x7d\x54\x72\x83\x67\xb0\xd7\x1d\xd2\x50\x2f\x59\x91\x21\x8c\x17\x4f\x65\x26\x25\x6f\x03\x33\x12\x4f\x8b\xbe\x14\x7c\x28\xce\x7b\x89\xfd\x2e\x17\xe3\x25\x52\x96\x8e\x01\x2a\xe8\xf0\xfe\x45\xdf\x6a\xe6\x7f\x91\x00\x20\x87\x3a\x36\xb0\xed\xb2\x94\x23\x86\x46\x5c\xfc\x95\x91\x03\x9f\x96\x7d\x1f\xf8\xe5\xe8\x4c\x92\x0d\x3e\xbd\xa7\x4e\x36\x9b\x36\x98\xae\xe6\xda\x26\x4a\x47\x45\x94\x3c\x6b\x45\x99\xaa\x86\xec\x8b\x64\xe2\x27\x33\x7d\xf8\xb5\xea\x13\x91\x12\x9f\x62\xc8\x83\xca\x20\x85\x21\x1c\x6c\xba\x8e\xc5\x28\xd9\x88\xe0\x49\xc7\x0f\xdd\xce\xd8\xdd\xec\x8c\x45\xa3\x66\xc0\xe3\x9a\x88\xad\x65\x23\x4e\xd5\x97\x15\x8b\x20\x1b\xc0\x7c\x52\x01\x34\xb5\x47\x38\x81\x82\xb0\x7b\xd3\x7b\x92\xb8\x64\xea\xfc\x0e\xe1\xd4\xd9\x1e\x40\x30\x55\x44\xcb\x9d\x3a\x5b\xbf\x43\x3a\xbd\x67\x5a\xf6\xdc\xf0\xa9\xc8\xcb\x7e\xa1\x53\xa2\x16\x58\xe4\x34\x23\x92\x56\xb3\xb3\x47\xd3\x95\xec\xec\x39\xd5\x60\xe7\x68\x3e\xe0\x46\xa8\xa1\x75\xc7\xc8\xbc\x7a\x53\x6d\x5b\xbb\x8f\x9e\x17\x93\x00\x34\x6d\xd0\x51\x41\xdb\xc8\x68\x3a\xcd\xf5\x45\xef\x24\x86\xcd\xcd\xd0\x76\x59\x8c\x12\x85\x7d\xf4\x0e\x4b\x7d\xc9\x3e\x09\xe0\x34\xfb\x2b\x3d\x72\xec\xad\x89\xb4\xdc\x81\x9f\xeb\xf9\x22\x5b\x70\xb3\x6c\xc3\xcd\xe1\xb4\x58\x55\xdf\x23\x61\x81\x89\xdd\xa5\xf7\x49\xf1\x3e\x28\xdf\x2b\x41\x68\x12\x40\x62\xb0\x39\x9f\x22\x36\xcf\x50\x3d\x9a\xaf\x46\xde\x2c\x99\x56\x10\xbb\xcc\x7b\x88\xbc\x02\xb1\xff\xf0\x09\x43\x87\x95\x12\xb9\x1b\x67\x64\xbd\xbc\xde\x54\x23\x77\x56\x41\xee\xc9\x7a\xe4\x9e\x4c\xe9\x48\x7d\x61\x48\xed\xc4\x20\x77\xd7\x43\x4d\x57\x8a\xdf\x55\xdc\x0a\x32\x87\x5e\x96\x5a\x90\x72\xb5\xa7\x14\xa6\x1e\x49\xb1\xd1\xbf\x91\x0c\x08\xc4\x02\x31\x6d\x26\x05\x0b\x0a\x7e\x3b\xd7\x63\xe0\xd7\x9b\x42\xe6\x3c\x40\x59\x5b\x42\xdc\xf7\xf6\xa8\x92\xbc\x3f\x05\xb9\x59\xab\xa7\xa4\x64\xc5\xbc\x64\x6b\x58\x17\x8c\xc4\xd5\x20\xe2\xa2\xb3\x13\x9b\x82\xf5\x3a\x46\xbd\x8f\xe6\xfa\xb5\x64\x86\x56\x42\x02\x3c\xaf\xea\x35\x27\x46\xa5\xd0\x2c\xe1\xef\x72\x42\xdd\x76\x4e\x88\x35\x70\x42\x75\xfe\x27\x9a\xa2\x28\x0c\xb8\x0c\x15\xed\x2f\x70\x25\x43\xdc\x9f\x12\xed\x2b\xf1\xb0\x73\xcd\xe7\x9d\x20\x11\xc5\xa4\x73\x7d\x83\xd1\xf7\xff\x9b\xba\xfb\x97\xe8\x9c\xeb\x2d\x2b\xb9\xcb\x6f\x56\xde\x1a\xf6\x82\x70\x87\x64\x4e\x4c\x15\xc6\x8b\x9d\x4c\xe1\xbf\xea\x2a\x2b\x3e\xc3\x4b\xc6\x93\x88\x4b\xde\x1b\xf3\x38\xeb\x58\x1b\x84\x64\x7d\xb6\xf5\xeb\x57\xd6\x77\x5f\xd3\x87\x0f\xd5\xd1\xb3\xd2\xcb\x64\xa6\x68\x9d\x62\xa0\x3d\x92\xe0\xb9\xa1\x10\xe8\xc7\xca\x85\x86\x5c\xa5\x80\xaa\xd7\x52\x1d\x92\x4d\x15\x8e\xd3\x8a\xc1\x9c\x2e\xab\x95\x95\x0b\x0a\xd3\xa9\xf3\xb3\x6b\x3f\x59\x40\xf7\x0e\xe2\xdb\x48\x64\x4b\xc9\xd0\x6e\x2a\x5f\x27\xed\x9d\x30\x32\xf6\x88\xe8\x7b\x5f\x56\xf4\x41\x71\x4e\xa6\x2b\xb7\x94\x53\x93\x73\xeb\xb2\x81\x10\x6a\xa4\x1f\x2b\xb4\x5f\x26\x96\x6e\x4d\x02\x7a\x2d\xef\x48\x25\x1b\xf7\xbd\x2f\x8b\x42\xc8\xfb\x24\x75\xc8\x04\xb1\xac\x2b\x5e\x95\xa4\x15\xab\xa8\xb6\x16\x27\x1d\x0a\xb0\x24\x73\xdf\xc5\x3e\xbf\xc1\x7c\x44\x43\x9a\xaf\x45\xe5\x06\x43\xf0\x88\xe9\x05\x6c\x11\x7e\x97\xb7\x58\x2d\xd9\xd4\xdc\xe7\xa2\x62\x43\xf4\xb6\xd7\x2c\x71\x09\xa2\x87\xc6\xa6\xd0\xee\x58\x1b\xda\x5a\x0d\xad\x88\x44\x05\x0b\x4e\xa6\xed\x46\x4f\xee\xfe\xaf\x5f\xa2\xef\xbe\x1e\x29\xc0\x96\x8e\xa0\x0a\x31\x62\x4a\xb1\x3d\xd4\x3b\x6a\x1a\x8e\x16\x9c\xd1\x5f\x22\xe4\xd2\x10\x72\xaf\x20\xdb\xf2\xfe\xed\xa5\x6e\xbb\x6e\x2b\x70\x85\x3a\xab\xe7\x0d\x4f\x16\x9e\xaa\xcb\xf2\x54\x5d\xea\x53\xf5\x2f\xec\x52\xc9\x19\xd4\x13\xe1\x2a\x36\x80\x23\x7d\x9b\x4e\x91\x18\x5e\x78\x2b\x4c\x41\x85\x7a\x86\x53\x3a\x9a\x78\xc4\xa3\xb6\x61\x07\xd4\x2f\xa6\x7f\x05\x53\x3a\x1a\x7b\x5a\xd6\xe6\xd0\x16\x2e\x52\xc3\x70\x46\x29\xb5\x5f\xbb\x8b\xc2\x06\xa0\x04\x17\x13\x2a\xc0\x02\xcb\x8d\x12\xef\xba\x54\xdf\x1a\x7c\x3f\x1c\x0c\xfe\xaf\x52\x29\xd5\x82\x62\x3a\x4b\xbf\x7a\x22\xbc\xb8\x94\x25\xda\xe9\xa2\x58\x2a\x35\xbe\xb1\x67\xe4\x72\x8a\x5e\x08\xee\x0b\x5a\x5e\xdc\x03\x03\x6f\x41\xe1\x62\x0d\x0d\x7e\xa7\x79\x48\xa6\x6f\xf9\xbb\xfa\x9a\x7f\x47\x7b\x12\x9f\x00\xfa\x47\xbd\xd1\x91\xf6\x5e\xe3\x8d\x85\xf7\x63\xbd\x72\xd9\x63\xc2\xef\x54\xc9\x6f\xbd\xb0\x77\xc9\x99\x5f\x65\xe6\x2f\xab\x00\xd6\x51\x40\x26\x99\x9b\x76\x2a\x75\xf1\x45\xde\xe0\x86\xbc\xf2\x61\x00\x9e\x46\x21\xfb\x0c\x93\x57\x9a\x93\xf8\xc6\xd8\x5b\x2a\x32\x81\xf5\x86\x8d\xf5\x44\x9f\x5d\x8e\x2c\xb4\x14\xee\x10\xcd\x11\x50\xcb\xd6\x2f\x72\x71\xcf\xf3\x97\xb2\x63\xce\xc8\x64\xaa\xf5\xc8\x8c\x52\x98\x93\x5b\x1f\x72\x81\xd1\xb7\x40\xf4\xbf\xc0\x29\xcb\xdf\x97\x97\x7b\x20\xfa\x47\xf0\xa1\x28\xd0\x37\x6e\x20\xfa\xc7\xb0\xcb\x72\x72\xb6\xb2\x3e\x06\x62\xf4\x6c\xbd\x51\x39\x14\x9e\x0f\xc5\x9f\xa2\x52\x9b\x5d\xe2\xc6\xe7\xc5\x32\x2f\x96\x53\xf8\xe9\x9d\xdb\x0f\x06\x08\xa2\xd5\xcf\x9c\xb6\xf1\x74\xb9\x20\x5d\x5e\x94\xac\x18\xc8\x6c\x69\xaa\x62\xee\x3b\x36\x81\xd9\x0f\xe2\x85\x21\x93\xf1\x68\x9d\xa5\xc1\x56\x55\xca\x7e\x99\x44\x11\x9b\xa4\xbc\xc3\xa2\xc8\x28\xc8\x2d\xfa\xdd\x5e\x63\x39\xb0\xd4\x5c\x5b\x69\x2e\x37\xce\x27\x18\xfa\x30\x27\xbb\x3e\x24\x10\x2a\xe6\x49\x1a\xdc\x3b\xd3\x5a\xb9\xcb\xa1\x45\x61\x3e\x5d\xb2\xc8\x9a\x4d\x4b\x8b\xac\x38\x91\xb9\xa6\xde\xf4\x78\xa3\x1b\x22\x92\x49\xb5\x65\x87\xd6\xe8\x5d\xca\x71\xf4\x26\x51\x64\x76\xe7\x9e\x22\xee\x5d\x9a\x72\xc1\xfc\x30\xf9\x97\xd4\xe4\x02\xb1\x60\x8c\xe8\x4f\xfe\x27\x55\xe3\x0b\x0a\x47\x53\x63\xf9\x7b\x3c\x35\xc1\x2b\x5f\xe3\xc3\x70\xb0\x80\x33\x7c\xfa\x7d\x01\x57\xf8\xb0\xbd\x80\x97\xd3\x56\x9f\xe2\x8a\xd0\x3c\xf8\xc3\xc1\x58\xe6\x3a\x8e\xb9\x92\x5f\xcc\xb2\xbe\x93\x24\xd3\x28\xce\x73\x62\x48\x1c\x01\xa1\x23\x21\x70\x38\xb8\x8e\xb9\xd0\xca\x28\xa4\x8e\x09\x57\x2c\x30\xc7\xf2\xf3\xd8\xf1\x40\x38\x09\x48\x27\x04\xee\x04\x90\x39\x2e\x30\x27\x55\x12\xf6\xf9\x74\xad\x9b\x59\x27\x20\x2f\xa7\xe8\x78\xf2\x4d\x62\x76\x22\xf4\x96\x3f\x85\x39\xf9\x9a\x62\xf0\x43\x1d\xaa\x71\x6f\xda\x66\x90\x67\x32\xb3\xd5\x52\x6c\x0e\xb7\xb7\x07\xb9\x75\x70\x25\x32\x40\x2d\xd8\xc0\x76\x3d\xbd\x59\x2d\xc2\xc4\x93\x9a\xeb\xe4\xa0\x9e\xd4\xac\x6e\xdc\xb7\x89\x79\x45\xda\xe8\xc1\x04\x23\xaf\x73\x67\x4a\xce\xa7\x30\x1c\x02\x46\xee\x95\x40\x32\xa7\xc1\xcd\x5d\xd4\x33\x73\xc6\xb5\x30\x07\x68\xbe\x39\x7a\x6a\xc7\xbd\x95\x61\x3c\x31\x45\x4f\xf1\xef\xd0\x8e\x37\x86\x8b\x05\xd9\x51\x84\x77\x6f\x9a\x07\x37\x2e\x22\x1f\x3f\xed\x65\xc5\xbb\xcc\x29\x23\x20\xc7\x14\x62\x87\xc4\xf7\x1a\x9c\xfe\xd2\xc0\x6e\x1e\xe4\xa0\x7d\x90\x83\xf6\x41\x66\x3a\x01\x48\x11\xa0\x39\xd6\x2f\x61\x69\xf9\xe2\xaa\xfa\x43\x2e\x2f\x6d\x06\x92\xa2\x7d\xea\x2e\xc9\xe1\xe8\x43\x2b\xa7\x88\x01\x56\xfe\x78\x3a\x12\xf6\x8c\x7c\x98\x2a\x31\xcb\xc5\x84\x7f\x30\x23\x1f\x13\x10\x1a\x73\xf8\xfa\x9d\xd1\x0d\xee\xe2\x99\xdb\x5a\xc0\xe9\xf4\x4e\x6b\xd9\x5f\xbf\x8c\x7b\xa0\x71\xda\x59\x8a\x53\xbb\xa0\xf0\x6e\xa9\x0b\x89\xe9\x90\x8c\x35\xc3\x05\x39\xf2\x14\xe0\x1c\x79\xea\xa0\x8e\x2c\xbc\xaa\x1f\x27\xb1\xbc\x54\x02\x16\x64\xed\xf7\x37\x45\xfc\xe3\xb8\x08\xc9\x2b\xe8\xda\xb0\xd0\x0f\xe2\x7e\xf7\xe1\x43\x35\xd4\x19\xc9\xd0\xe8\x84\xd3\x91\xb0\x2d\x6b\xa1\x19\x5d\x1c\xf0\x15\x58\x1d\xae\x30\x39\x2a\xc1\xf0\x95\x00\xab\x33\x4e\xb2\x94\x27\xe8\xfd\x83\xba\x2c\x2c\xb8\x05\xab\x63\xe4\xf7\xe5\x9c\xca\x65\x38\x39\x76\x8b\x9d\xb6\x85\x92\xb3\xac\xe2\x0e\xd9\x45\x8b\xb4\x73\x62\xc6\x86\xa3\x03\xf5\x43\x60\xa0\x79\x0c\xa9\xcd\x7e\xfd\xda\xc4\xb0\xc0\x6e\xd9\xde\x3c\x74\x5c\x2e\x67\x9c\xc7\xd6\x82\xd0\x9c\xf7\x3f\x27\x98\x65\x42\xf1\x10\xa7\x53\x68\xcd\x34\x17\x02\xfa\xdd\x97\x83\x6d\x54\xb9\xf9\x4c\xf2\x8e\xcb\xbc\x6b\x6b\x83\xb0\x3e\x53\xff\xb8\x1b\x31\x6d\x94\x76\x55\xd5\x40\x24\xb1\xb4\x36\x92\x0d\x12\x6e\x10\x6f\xc3\xc4\xbd\xf3\x7d\xb0\xca\xb5\x84\x14\x1d\xec\xf3\x14\xd0\x8a\x49\xd8\x9d\x96\x74\xe2\x4c\x81\xd2\x67\x8c\xec\xce\x69\x45\x24\xfa\xb8\x96\x74\x2e\xb1\x96\xa7\xb9\xdd\xc1\xbb\x69\x9e\x15\xcd\x74\x72\x38\x6d\x75\x92\xdd\x47\x51\x06\xc3\x83\xa9\x9f\x1f\xa6\x20\xe1\x94\xb6\x5d\x71\x5d\x65\xa9\x0c\x83\x79\x71\xb5\x54\xd7\x38\x57\x6c\xd8\x38\xbf\xae\xb0\xb0\xab\x8e\x19\xf8\xcd\x9f\xf5\x5c\x7a\x7b\x1c\x8e\x3d\xbc\x95\x3c\xca\x94\xd8\x73\x80\xc2\xcf\x71\xa6\xe4\x9c\xaf\x8a\x2b\xb4\x8e\x2f\x33\x0b\xac\x37\x22\xb4\xc0\x3a\x62\xd2\xfa\xbe\x12\x0e\xa8\xda\xcb\xdd\xed\xd1\x4b\x05\x7b\xa9\xe1\xb5\xa5\xc1\x14\x15\xd7\x0f\x49\x2d\xf7\x82\xd4\xd8\x55\x05\x22\xb8\x62\x2c\x8c\xcd\x1d\x73\x09\x1a\x99\x44\xc8\xb8\x9a\xd2\x8a\xe1\xc8\xc7\xfa\x06\x9e\x20\x86\x1a\x2c\xe0\x76\x6a\x02\x9e\xbe\xd2\x5c\x97\xab\xfa\x7b\xab\x9f\x27\x16\x85\x37\xed\xe0\xf2\xb3\x6b\x3f\xa9\x66\x12\xc7\xa8\x23\x6b\xab\x3f\xae\x57\xff\x6c\x6e\x6e\xa5\x48\xe2\x0b\x8b\xae\xc9\x3d\xbe\x12\xf4\xc5\xa4\xaf\x8b\xfb\xdd\xd1\xdb\xc4\x4e\x39\xd5\xee\x8e\x0a\x3f\xf3\x22\xe1\x63\xbb\xe1\x47\x9e\xa2\xaa\x92\x9d\x8a\x58\x5e\x11\xf7\xd0\x4b\xe2\x29\x17\xb2\x93\x4a\x11\xea\x91\x4d\xf5\xfd\xf6\x7b\xc3\xf5\xcf\x39\x78\x82\x52\x78\x31\x6d\x73\x14\xae\x83\xba\x0c\xc7\x7c\x12\x7a\xd7\x55\xf0\xfe\x5c\xe8\x00\xd3\xcc\xbd\xe2\x9e\xac\xda\x14\x8d\xac\xd7\xb1\x6f\xd9\xd6\x51\xae\xe5\x5c\x86\x82\xcb\x24\x13\x4d\xfa\xe2\x6c\xd2\xd3\x8e\x03\xe6\x46\xa7\x38\x53\x0a\x43\xcc\xc9\x1b\x75\x20\x07\xb0\xc6\x74\x98\xc5\x17\x11\xef\x99\xcb\x81\x53\xf3\xdd\x77\xc6\x3a\x42\x01\x9a\x1b\x65\xc2\xd2\x0b\x3d\x23\x07\xd8\x9f\x5a\x20\x8a\xac\x70\xe5\x60\x86\x01\x91\x39\x3e\x17\x7d\x76\x5d\x8d\xf3\x6a\x0d\xd0\x0e\x2b\x4f\x5b\xa1\xdd\x4b\xb0\xda\xce\x9d\xd5\xd4\x79\x38\xf3\xc8\xa6\xe6\xcd\xa7\x21\x9f\xd5\xa7\x9a\xf3\xd6\x95\x6b\x34\x25\xcf\xdf\x63\x5d\x7a\x77\x2e\x8c\xea\xa9\x5c\x9a\x15\x51\x32\x89\x56\xbf\x50\xea\xac\xec\xd5\x7d\x54\xf2\x9a\xe4\x7f\x77\x27\x87\xff\xe6\x9d\x1c\xfe\xfd\x9d\xfc\x71\xbf\x9d\xfc\xb1\x76\x27\xff\xfe\xde\x0d\xff\xe5\xbd\x53\x27\xb4\x05\x9a\xf4\xf6\x91\xb8\x1d\x3d\x69\x6f\xd9\x36\xcd\x95\x42\x37\x96\x65\xcf\xc8\x3c\x81\xdf\x41\x22\xe3\xb5\x30\x48\x4a\x8e\x0c\xcf\x77\xad\xfe\xb9\xc2\xbb\x01\xf5\xb4\xa3\xfe\xb9\x2d\x68\x37\x32\x3b\xf1\x82\xc2\x8f\x69\x53\xfa\x00\xe3\xb4\x55\x9a\x45\x34\x98\x63\x8e\x3b\xee\x45\x2f\x60\x3e\xf7\x57\xcd\x33\x37\xd1\x3e\xbc\xc5\x9c\x55\xf2\x1b\xb9\xce\x96\x75\xb9\xbc\xd1\x90\x55\x57\x59\xbe\xac\x7e\x1e\x2f\xc7\x1d\x0f\xfe\xe6\x90\x4f\xaa\x86\xcb\xe5\xbc\x1b\x6f\x53\x44\xc9\x0a\x7d\x9a\xb6\x26\xef\x6d\x33\xb9\xd6\x21\xa7\x1c\x1d\x72\x0a\x23\xb7\xba\x68\x03\xbb\x4b\x88\xbc\xc3\x7f\x20\x37\x84\x44\x57\x00\xd9\x77\x57\x39\xc5\xf5\xbe\x00\x7f\xcf\xd2\xbf\x62\xd7\x2f\x8c\x5d\xbf\x30\x76\xfd\xc7\x3e\x32\x05\x85\xbd\x3e\x3a\x76\xd4\xec\xf5\x95\x14\xa2\xed\xba\x97\xbd\x63\xee\x6f\xd7\x2d\xda\xed\xba\x7f\x4c\xd1\xb9\x86\xe7\xfb\xf1\x7e\xda\x7e\xbc\x2a\x36\xa8\x6c\xa0\x3f\x57\x7e\xe9\x13\x6a\x60\xb4\x05\xe7\xd7\xe9\x7d\x3c\xf4\x56\x12\xea\xac\x2c\xa2\x59\x38\xd9\x77\x47\x7f\xce\xc8\xdb\x69\xce\x17\x7f\xae\xe8\xae\x76\xf2\x88\xb4\xfa\x2a\xce\xee\xa0\xab\xe4\x57\x81\xc9\x64\x0a\x04\xf3\x7e\x8a\x4e\x31\xa8\x6c\x6b\xee\xe7\x43\x52\x06\xb7\xad\x5c\x12\x9a\x73\xbf\xcc\x8c\xea\x75\xac\xe7\x0c\x2f\xbd\x09\x5b\x67\xa5\x6d\x63\xf1\xdf\xde\x8c\x89\x18\xf9\x9a\x65\x0b\x66\xc5\x92\x7d\x9b\xb6\x07\x6e\x6c\xf0\x71\xac\x0e\xa7\xc2\x30\x7b\x3e\xbc\xf4\x60\x46\xbe\xea\xb9\xd7\xb3\x25\x19\x5f\xc7\x3a\x87\xcc\x7c\x35\x82\xb8\xeb\x58\x63\xd9\x7b\x6c\x81\xe8\xae\x18\x61\xac\x4e\x6c\x97\xc4\x5d\x30\x3e\x42\x23\xab\xb3\x74\x55\x6d\xd1\x9a\xf9\xec\xf5\xb4\xd9\x00\xad\xc2\x90\x15\xbb\x72\x60\x12\x39\x76\x34\xcd\xc6\x0d\xc7\xcd\x29\x37\x2b\x37\x8f\x4f\x2b\x36\x4c\x5a\x89\xfd\x22\xab\x68\x84\x87\x88\xea\x61\x99\xa0\x6a\x61\xb4\x40\xd8\x66\x21\x0b\x1a\xdb\xb4\x85\x55\x2b\x8c\x5e\xc0\xb9\x8f\x22\x65\x4d\x37\xb8\x20\xe6\x38\xc9\xae\x61\xed\x79\xd7\x59\xab\x7c\x36\x77\xf9\x88\x47\x4f\xdc\x0a\xb7\xf2\x49\x68\x7a\xb8\x53\xc2\x24\x64\xdd\xfb\x1c\x52\x85\x9f\x3a\xd6\x46\xdc\x35\xbd\xf1\x6e\xcd\xd9\x05\x59\x02\xf4\x7d\xe7\x96\x6d\x7d\xc1\x2c\x9d\x8d\xf6\x4f\xe3\xa8\xb7\xd9\x59\xb5\x81\x38\x61\x44\x76\x57\x66\x1e\x2f\x33\x0e\x4b\x6d\x0d\x50\x68\x6d\xfa\xd2\x35\x22\x2a\x99\x0b\xaa\xc0\x70\xd9\x9e\x2d\xc0\xeb\x1a\x2d\x4e\xd2\xbd\x23\x1d\x0c\xeb\x33\x9e\x87\xf5\xf3\x2a\x11\xd9\x9b\x34\x01\xda\xca\x4a\xf3\x17\x49\x94\x8d\x75\xb2\x0a\x63\xf0\x5f\x31\xad\xe8\x58\x1b\xb2\x0a\xbc\xab\x68\x43\x94\x28\x06\xef\x96\xc5\x94\x30\x9d\x5b\xc0\x33\xd7\x72\xd9\xaa\xf1\x4e\x67\x09\x86\x8a\xad\xcf\x59\xa2\x95\x83\x7c\xdf\x91\xff\xcf\x8c\xb6\x32\xb0\x1c\x55\x68\x1f\x1f\xaf\xf9\x80\xdc\xbd\xba\xc6\x83\xeb\x3f\xb1\xb8\x39\xc0\xad\x5e\x37\xde\x75\x8e\x93\x1c\x1a\x17\x14\xc2\xee\x1d\xfa\x9a\x8a\x88\x59\x39\x70\x01\x49\xba\xf0\xce\x07\x23\x3d\x82\x12\x4c\x7a\xd1\x45\x6f\x1b\x8d\x42\x9f\x98\x30\x3d\xfb\x1e\xdc\x78\x14\x6e\x3c\xe2\x75\x29\xc4\x14\x8a\x66\xaf\x4c\x2a\x95\xb2\xe5\xd6\x52\xcb\xf3\xa5\x96\xb2\xd2\xf2\x35\x1a\xcd\x37\x7e\x6e\x6f\xa9\x91\x68\x58\x14\xbd\x51\xa6\xf1\xd0\x34\x5e\xd9\x29\x75\x6c\xff\x9f\xff\xdb\x5a\x71\x6f\x5a\xda\x8b\x3a\x9a\x33\xb8\xa3\xa3\x4d\x0a\x7a\x4b\x36\x1b\x37\x1e\x61\xdd\x76\xe1\xc1\x63\x11\x57\x5c\xe7\x92\xe8\xf0\x9d\xde\xe5\x5a\x12\x0a\x78\xf4\xdf\x24\x89\x7f\xa9\x71\xed\x60\x8d\x2e\x7d\x14\xf6\x25\x4f\x25\x89\x9d\x98\x8e\x2c\x9f\x49\xd6\xb3\x36\x62\x3b\x86\x47\xff\xfd\xcf\xf4\x37\x72\xc5\xa6\x4c\x5f\xfb\xd8\xbf\x54\xa1\xad\x98\xd8\x7f\x3e\xba\x94\xe3\xa8\x68\x2a\x1c\x81\x86\x59\x18\x1f\x3d\x50\xc8\xdd\x13\xa0\xbb\xba\x10\x6c\x3c\x3e\xe7\x7e\x88\x21\x45\xf2\xf0\x5c\xe0\x76\xdb\x7c\xab\x73\xa7\x6a\xf1\xcf\xf8\xd7\x3f\xc5\xaf\x7f\xc6\xda\xb7\x3a\xed\x6a\x0f\x5a\x7e\x23\x99\xe0\xcc\xa2\x10\x75\xd7\xe6\xf8\x9a\x93\x9d\x14\xb6\x60\xf8\x18\xbe\x0a\xe2\x76\x75\xc6\x58\x34\x82\xc8\xfe\x67\x90\xa3\x58\x7f\x7e\xe3\xf2\xfc\xa6\x5d\x73\x80\xb3\xfc\x00\x4b\x3c\xc0\xfc\xde\xd8\x11\x3e\x78\x84\xa9\xa5\xfe\x37\xa0\xc9\xff\x91\x71\x37\x0d\xf1\xdf\x8d\x30\xff\x03\x0b\x5e\x90\xe8\xa5\xc9\xfc\x6d\xd4\xe9\x77\x1b\xfd\x86\x74\xb0\x5d\xde\x67\x8f\x01\x73\xd3\x75\xc1\x53\x7f\x06\x80\xae\xa3\x1f\x20\x54\xbf\xf6\x30\x63\x1d\x7b\x85\xf1\xc2\xba\xa3\x73\x62\x7d\xe0\xb3\x3c\xe3\x84\x42\x67\xaf\xd1\x1d\x0a\xc3\x01\x5b\xaf\xfd\x50\x96\x65\x6f\x39\x31\xd1\x09\xab\xd1\xdf\x5a\xee\xbf\x73\x01\x6b\x4e\xc2\x2e\x64\x7d\xf7\x33\x64\x7d\x76\x0a\x59\x3f\x55\xf3\x16\x5d\xf0\x80\x55\x90\x6b\x11\x2d\x28\xee\x1a\x3d\x64\x81\x52\x8f\xa7\x98\x0a\xf5\x84\xc2\x94\x44\x5d\xb0\x5e\xe6\xb9\xcc\xf3\xaa\xb3\xa2\xea\x91\xae\x7a\xbc\xb4\xb4\x05\xe9\x98\x93\x6f\x53\xe0\x90\xe8\x08\x57\x59\x17\xa5\x44\x35\xc6\x2b\x45\xf4\x34\xda\x9b\x76\x1d\x2e\xa0\xdb\x75\x32\x01\xe3\x46\xe4\x12\x0b\x12\x08\x54\x73\x98\xb8\x1b\x97\xdd\x7b\x1a\x7b\x4f\x5a\x2b\x7a\x0c\xc5\xc8\x1d\xc1\x3b\xf3\x24\xeb\xa4\x99\x79\x98\xb1\x58\x76\x64\xd2\xd1\xa9\xe8\x97\x58\xf2\x91\x45\x81\x6d\xdb\xeb\x0d\x6a\x4f\x18\x39\xe0\x64\x46\x2e\xf5\x5c\xab\x76\x90\x2f\x93\x38\x08\xc5\x58\xd3\x1a\xf7\x87\x7d\xc0\xc9\x71\x42\xc1\x7b\x62\x5b\xaf\xf5\xd7\xf2\x7d\xc7\x64\x3d\x6b\x98\xe3\x26\xbd\x84\x31\xca\x4c\x79\x14\x18\x6d\x53\xe9\x1e\x61\x8e\xd5\x06\x1a\xcd\x9f\xfb\x26\x60\x21\x5a\x56\xb4\x7e\x05\xdd\x30\x36\x88\xf5\xd0\x04\x57\xd3\x2e\xe4\x5a\x30\x9e\x6b\x94\x7e\xf9\xd8\xa2\x70\xb3\x66\x9c\xff\x3b\xe3\x12\xac\xde\xf7\x98\x74\x19\xab\xf4\xe4\xa2\x8b\x4c\x48\x6a\x81\xe8\xb3\xd3\xba\xe8\xa9\xcb\x91\x2b\xc2\x1a\xee\xe7\x86\x8b\x1a\xec\x02\xb7\xd7\x37\xbd\x60\x1c\x2f\x54\x91\xb8\x3e\xfc\x45\xa7\xfa\xe5\x78\xfd\xb2\x02\x5d\x27\x46\xe3\x49\x29\x9c\x7a\x44\xd0\xc6\xb0\xf6\x4b\xf3\x5c\xaf\x07\x58\x27\xe6\xad\xc4\x2e\x30\x60\xbf\x8b\xae\x3b\x95\x41\xe9\x89\x5b\xb4\xf1\x0a\xeb\xdf\xd0\xff\x2b\x1e\x71\xad\xf0\x56\xab\x2a\x56\xd4\xb0\xa5\x5e\xe7\xa3\xa7\x36\xe8\x9a\x52\x38\xf4\x48\x3c\xc2\xdb\xf1\x49\x17\x04\x3c\x18\x52\x6a\xef\xc8\x42\x2d\x2a\x17\x14\xae\xbb\x0d\x91\x11\xcd\x1a\xca\x9a\xea\x87\x57\x82\x37\x62\xe0\x0f\x13\xbe\xb5\xcd\xec\x90\xcd\x17\xda\x0e\x77\xad\x81\xad\x7b\xb2\x30\x86\xb5\x78\xe5\x4a\x29\x06\x22\x18\x77\x57\x3d\xbb\xcb\x29\x36\x74\x74\xae\xb6\x5c\x01\xd9\x4d\x37\x8f\xa7\xa0\x5e\x50\x34\x76\x5e\x60\x68\x1d\xe3\xee\x9c\x43\x55\x6e\x40\xb5\xaa\x65\x91\xad\x5a\x96\x9d\x6e\x35\x61\xcb\xd1\x1a\x29\x03\x2d\xfa\x64\x1e\x03\xf6\xc4\x83\x03\x5e\xd7\x65\x88\xe2\x72\xa0\x12\x11\x33\xf3\xc9\x3b\x46\x6e\x3d\xd4\x86\x2d\x19\x3a\xb9\xcc\xbf\xe0\x1d\xfc\xb7\x37\x09\xa3\x28\x99\x99\x1f\x66\xa4\x06\x0d\x20\x9e\x94\xc9\x64\xc9\x5d\x4d\x5f\x6d\xc7\x86\x05\x5f\xb4\x7c\xee\x3b\xde\x2d\x2c\x28\x1c\xaf\xaa\x90\xc2\x80\xe8\x4c\x20\x15\x65\x79\x8b\x31\x64\x81\xb8\xcc\x3d\xea\x91\x02\xbe\x81\x5a\xbc\x55\xe5\xf5\xbd\xba\x68\x8c\xe2\x81\xbd\xc6\x7d\xef\x0a\x14\x0c\x15\xf7\x02\xaf\xff\x37\xd3\xc1\xcf\x68\x7c\x80\x17\xba\x7d\xd7\x5f\xb4\x52\xc4\xb3\xae\x31\x3f\xbb\xd2\xe4\xc7\xb5\x28\xbc\xbc\x97\x0a\xa9\xc2\x87\x8a\x64\xd6\xe4\x07\xaf\xa4\xc3\x4d\x94\x11\xb1\xee\x52\x8c\x8a\x19\xb9\xea\x36\xf1\xa6\x4b\x37\x75\xbd\xe1\xe0\x6e\xb7\x37\x51\xc8\x7a\xe7\xcd\xfc\xa4\x68\x0d\x52\xf1\xb9\x48\x81\x60\x62\xe4\x7c\xd5\xf7\xf0\xf4\x0e\xa6\xb0\xf4\x89\x84\x5a\x58\x8a\xc2\xbc\xf7\x14\x99\xea\xff\x34\xb9\xf8\xcc\xc9\x59\xf7\x7f\x8a\x56\xac\x74\xbe\x4c\x28\x64\xb9\x89\x2f\xbb\x60\xbd\x7b\x65\x99\x98\x6f\x7e\xf1\x4e\x53\xf5\x0e\x93\x58\x74\x8e\xa5\x9f\x69\x51\xac\x98\x82\xa5\x42\x76\x5a\x16\x6a\x15\xa4\xbf\xdc\xb8\x52\xae\x75\x95\x7e\xc7\x9d\x9b\xef\xb2\x93\xb2\x2c\x67\xb5\x75\xc1\x71\x75\x40\x92\xe3\x6b\x85\x97\xcc\xce\x14\xa5\xb9\x82\xd9\x82\x65\x73\x9b\xf3\x04\xde\x79\xe6\x76\x84\x82\xd4\xf9\x85\x40\x28\x22\xc8\x35\x11\x7c\xdd\x05\x09\x0f\x06\x05\x11\x5c\x50\xd8\x33\xec\xdd\xa6\x45\x61\x5f\x3f\x7b\x89\xaf\x40\xe8\x83\xfe\x35\x51\xfb\x04\xbb\xa6\x9a\xb1\xa4\x81\x53\xfd\x3b\x66\x53\x8b\xc2\xbb\xae\xf3\xf3\xc6\x2e\x93\x48\x80\x9b\xd8\x46\xe7\x6d\x2d\xe0\xa3\x2e\xd5\x6f\xad\x05\x1c\xe6\xb5\x8b\x60\xcc\x58\x72\x94\xff\x5a\xc0\x49\x51\xa3\xc8\x40\x85\x35\xf2\x5f\x0b\xb8\x2d\x6a\x98\xdc\x38\x58\xae\x9f\x17\xf0\xaa\xdb\x1e\xad\xad\x11\xf4\xbb\x75\xb0\x7f\xd7\xad\x81\xfc\xc7\x6e\x4e\x24\x0d\x3b\x60\x0c\x39\x97\xed\x37\x4f\xba\xb5\xd4\xa9\xb7\xdd\x5a\x6a\x8f\x8f\xdd\x3a\xbc\x1f\x76\x17\x0b\x7d\x0d\x35\xb2\x3a\xa5\x4f\xef\x82\xc2\xdb\x3b\xb9\xed\xa5\xd8\x15\x1b\x33\xf2\xca\x20\xe0\x55\x17\xec\x4a\xcc\x88\x5b\x46\x44\xff\x06\xc3\xf5\x18\x9f\xa2\x9a\x87\x91\x06\x8c\x37\x48\xe8\xdf\x75\xe1\xa4\x0b\xb7\x5d\x38\xec\x82\x5a\xf1\x3c\x3c\xe1\x44\x24\x63\x2e\x2f\x79\x96\xf6\xc3\xe4\x91\x9f\x78\xa9\xde\xfc\x30\xbe\xd0\x0f\x63\x16\xb3\x0b\x2e\x1e\xe9\xad\xd9\xe5\xd1\xc4\x5a\x7c\xa7\x70\xb0\x1e\x87\x2f\xf9\x27\x18\x59\x82\xf9\x3e\xba\xfe\x59\xdb\xe8\x74\x97\x7b\xf8\x98\x48\x46\x62\xf5\x96\x16\x3e\x7b\x24\xee\x7b\xa7\x75\xbc\x6d\x0c\x9f\x3a\x93\x8a\x58\x71\xe0\x55\x2d\xa3\x3f\x77\x9d\x50\x10\x4b\x60\x90\x96\x2f\xdd\xf6\x24\xf7\x9f\x3c\xb0\x70\x39\x55\x1f\x18\xff\x0a\x3e\x77\x89\x95\xca\x79\xc4\xd3\x4b\xce\x65\x61\x5d\x15\x25\xcc\x47\xcb\x2a\x41\x3c\x0c\xa0\x5d\x98\xe4\x71\x21\x12\x61\x8a\xe2\x8c\x58\x6f\x58\x18\x71\x5f\xd1\x61\xd5\xa6\xf3\xf2\xe8\xa8\x13\x88\x64\xac\x73\x45\x51\xe3\x05\xaa\x23\xb1\x1e\xc6\xe4\xa7\xf7\xca\xbe\x02\xef\xb3\x7d\xce\xc0\x3b\xb4\x1b\x19\xcb\xee\x48\x91\x11\x4d\x6c\xd9\xc2\x56\x3f\xb6\x81\xd9\x73\xf2\x35\x02\xeb\xbf\x2c\x20\xb1\x4e\x51\xc7\x9e\x80\x7e\x37\xb2\x14\x3f\x71\x8c\x6e\x91\xef\x23\xc5\x56\x64\xb0\xab\x48\xc3\x7c\x54\x06\xa6\xb4\xcb\x68\x95\x71\xdf\xf5\x14\x7f\xd9\x67\x19\x26\x03\x00\x6f\xdb\xee\x4a\xf2\x43\x50\xf0\x9e\xd9\xfb\x11\xf8\x6e\xc3\xc8\x14\x1f\x72\x48\xfe\x7c\xaf\x97\x1e\x39\x80\x9d\x0a\xc8\x58\x8b\xc5\x82\x3e\x67\x89\xf3\xf3\x80\x85\xb1\xfd\x33\x8c\x43\x69\xff\x10\xe4\x30\xa4\x64\xa0\x3e\x12\xf7\x5f\x47\xe3\x51\xde\x6f\xc7\x98\x4f\x05\x89\x20\xc8\xa3\x77\xc2\xb8\x23\x29\xfe\x11\x23\x0c\x84\x65\x39\x0e\x1f\x4d\xc8\x13\x6a\xc7\x44\xfc\xc9\xbf\x83\xfc\x93\x7f\xa7\xb6\x7a\x74\xd4\xe3\x82\x60\x97\xc0\x12\x6a\xe3\x93\xc3\x92\x05\x51\x6c\x10\x7d\xfe\xff\x06\x00\x00\xff\xff\xed\x2b\x91\x4f\xe5\xb1\x01\x00"), + compressedContent: []byte("\x1f\x8b\x08\x00\x00\x00\x00\x00\x02\xff\xdc\xbd\x0b\x7b\xdb\xb8\xae\x28\xfa\x57\x1c\xed\x6c\x2f\x72\x0c\xab\x76\x5e\x6d\xe5\x70\xf9\xa6\xaf\x69\x3b\x7d\x27\xed\x74\x9a\xc9\xe9\xa1\x64\x3a\x51\xe3\x50\x2e\x45\xc5\x49\x63\xef\xbf\x71\x7f\xd0\xfd\x63\xf7\x23\xa8\x07\x25\x3f\xa6\xb3\xf7\xda\xe7\x9c\x7b\xd7\x9a\x2f\x95\x25\x10\x04\x49\x10\x04\x40\x10\xdc\x1a\x67\x32\xd2\x71\x22\x89\xa4\x77\x5e\x96\x8a\x56\xaa\x55\x1c\x69\x6f\x50\x7c\x68\x29\x22\x41\x81\xa6\x77\x4a\xe8\x4c\xc9\x96\xf6\x39\x93\xa0\xfd\x31\x53\xa0\x17\x25\xd8\x84\x54\x20\x8a\xec\x80\x86\x12\xb5\x2a\x3f\xb8\xb5\x15\xe8\x88\x02\x49\x17\x0b\x5a\xa1\x1a\x11\xe1\xa0\xda\x05\x51\xa1\xd2\xcb\xa8\x36\x62\x17\x44\x83\xc5\xef\x56\xa0\x49\xe6\x54\xb0\x07\x59\x55\x81\x58\xc6\xf6\x77\xeb\xcc\x88\x80\xb2\x56\xb7\xda\x88\x70\xa7\xda\x7d\xe0\x55\xb5\xd9\x32\xc2\x7f\x01\x25\x9c\x64\xe0\xd2\xe2\x12\x23\x48\xe4\x10\x73\x00\x51\x45\x0c\x5f\xc6\xf9\xdf\x43\x5f\x44\x38\x34\x28\x74\x49\xcc\x48\xe2\x90\x78\x1f\x92\x8a\xc4\x68\x19\xed\xff\x32\xaa\x13\x12\xc1\x32\xdd\x2e\xe1\x9c\xc4\x0e\xe1\x0f\x20\xae\x08\x4f\x96\x31\xff\xef\x6c\x4b\x4c\x12\x58\xd9\x1a\xb7\x39\x09\x19\x3b\xcd\x79\x08\xe3\xaa\x39\xf1\x32\xf2\xff\xc3\x5a\x38\x26\x31\xac\x6b\xa3\xdb\xc8\x59\x43\xcc\xed\x30\xc6\xa4\xcf\x87\xd2\x1f\x13\xf3\x3e\x30\xf5\x10\xed\x94\xb8\xb5\x25\xa0\x22\x72\xb7\x5e\x06\x44\x59\x8a\x08\xa7\xe0\x4d\x51\x10\xaa\x26\xef\x35\x8b\x42\xe6\x16\x26\x99\x53\xfe\xba\x2a\x0f\x55\x3f\xee\x2f\x63\x00\xde\xc0\x41\xb8\x83\x66\xec\xa2\x81\x6a\x8c\x0e\x56\x21\x82\x68\x19\x15\x89\x1c\x6c\x61\x1d\x1b\x54\x6c\x70\x7f\x35\x3e\x48\x56\x62\x24\x89\x83\x34\x6d\x22\x85\x8a\xe1\x1e\xac\x43\x0b\xf1\x3a\xc4\x24\xa6\x8b\x6b\xae\x5a\x31\x1b\x91\x8a\x55\xec\xb0\x8f\x13\x45\xcc\x37\xc1\x8e\x94\xe2\xb7\x44\x52\xc8\x58\x6f\x90\x1d\xca\x41\xd6\xe9\x50\x71\x9a\x9d\x31\x4d\x54\x27\xa3\x83\x62\x6d\x59\x50\xd8\x66\x93\x1a\xa6\x0a\x8f\xae\xf0\x08\xd6\x1b\x88\x43\xd9\x6e\x2b\x3f\x1c\x88\x4e\x87\xea\x53\x71\xc6\x94\xcf\x41\x31\xf3\xaa\x5c\x58\x27\x42\x9e\xeb\x0b\x26\xe0\xab\x59\xb6\xe8\x82\xc2\x15\x23\xcd\x0a\x8a\x89\x78\x2a\xcf\x16\x14\x36\x35\xa4\x40\x08\x59\x4e\x8b\xa0\xc0\x59\x6f\xc0\x0f\xc5\x80\x77\x3a\x34\x3b\xe5\x67\x4c\x9f\xf2\xb3\x82\x82\xec\x54\x9e\x31\x05\xd9\x82\xc2\xfa\x66\xa9\x02\x6b\xd1\x53\xba\xd3\x2f\xfa\x4a\x57\x7d\xa5\x4e\xb3\x12\xaf\x38\xd5\x67\x4c\x82\xf8\x79\x7a\x0d\x32\x81\xc8\x14\x33\x33\x53\x9f\x66\x67\xa0\xca\xae\x57\x3f\x89\xa9\xdb\x1f\xf4\x0e\x99\x18\x88\x6e\xb7\x44\x24\x1a\x88\xe8\xe0\xef\xb4\x75\x45\x4b\x25\x31\x6d\xad\xb1\xc5\x7f\x79\x54\x50\x1a\x75\x38\x98\xd1\x29\x31\x67\x2b\x31\x97\xdc\x93\x4e\xe2\x48\x60\x0b\xfe\x82\x02\x55\x51\x20\xbb\x02\x78\x41\x47\x87\x64\x25\x75\x87\xd9\xb0\x78\x0c\x32\x4a\x21\x62\xbd\x41\x74\x28\x06\x51\xa7\x43\xf9\x69\x64\xc6\x37\x3a\x1b\x18\x9c\xf6\x4b\x56\x7c\xe9\x08\xc3\x53\x51\x39\xf6\x7c\x05\x33\x39\xa3\xb8\xe6\x53\x94\xc8\x34\x99\x08\x7f\x92\x9c\x13\xd9\xf1\x82\x96\xd7\xb9\x20\x94\x82\x5a\xd0\x4a\x33\xbd\x20\x05\xbc\x77\x18\x4b\x2d\x94\xe4\x93\xf4\x9f\x5e\x25\x3e\xa6\x66\x1d\xd0\x17\x2a\x99\xb5\x9e\x2a\x95\x28\xe2\x5d\x68\x3d\x4d\x83\x7b\xf7\xce\x63\x7d\x91\x85\x7e\x94\x5c\xdd\x13\x93\xab\x7b\x51\xa2\xc4\xbd\x70\x92\x84\xf7\xfa\x7e\xcf\xef\xdd\xbb\x88\xa5\x4e\xef\x79\x1d\xd9\xf1\xfc\xab\x91\xe7\x48\xa4\xf3\x06\x8b\x80\x60\xa7\x67\x90\xb1\x4b\xec\xe6\x1e\x08\x3a\xc8\xda\x6d\xa2\x99\xf0\xa7\xc9\x94\x50\x3a\x30\xdf\xb4\xcf\x41\xfb\x21\x7e\x77\x86\xb3\xc4\x7a\x59\x2d\x25\xf1\x98\xf4\x7b\xbd\x43\x4d\x0b\x76\xf2\xa7\x59\x7a\x41\xbe\x62\xbd\x14\xb6\x7a\x83\x78\x4c\x24\x63\x4c\xe5\x10\xf6\x8d\x97\x84\xdf\x44\xa4\xbd\x2d\xa6\x6f\xa7\x22\x19\xb7\xe4\x7c\x2e\xb3\xc9\xc4\x08\xc9\xf2\xa9\x28\xe2\x15\x15\x7b\xac\x04\x6f\xb7\xa7\x64\x9f\xc2\x56\x7f\x50\xb4\x2d\x6b\xc5\xb2\x25\xfd\xed\xc3\x5e\xbb\x4d\x24\x0b\xb5\x91\x65\xca\xfc\x6b\x08\x91\x34\x1e\x93\xad\x4b\x22\x71\x66\x9a\x3f\xba\xd3\x37\xcd\xcb\xa9\xea\x0f\x0a\xf2\x50\xe4\x1e\xb1\x09\x39\xa7\x70\xcc\x56\x0f\xf8\xd6\x79\xce\xb8\xd5\xe8\x9e\x14\x8c\xbb\xb2\x75\x45\xf7\x60\x4f\x0c\x7b\x81\x3c\x54\xc3\x6e\x3f\xe8\x9b\xbe\xd8\x92\xfe\x76\xfe\x9d\x68\x76\x42\xa4\x91\xb4\x3e\xa7\x74\x3e\xcf\x7f\x87\xa0\xfc\x90\xd2\xa1\x0e\xcc\xaf\x08\x94\x1f\x51\x6c\xf7\x40\xfa\x21\xca\xe9\x76\x7b\xab\x5e\x76\x20\x19\x96\x33\x12\xbb\x1c\x42\x3d\x9f\x1b\x6c\xc3\x7e\xa0\xfc\xd0\xd4\xdf\xb3\x0b\xcc\xd3\x35\xcd\xb4\x8d\xa2\x87\xbd\x05\x85\x2f\x6b\x45\x7b\x0e\xd4\x5f\x3f\x3d\x7a\x87\x27\xc5\x44\x5f\x0b\xc1\x0a\x10\x0a\xdf\x96\xc9\xc9\xbf\x96\x72\xf0\xb0\x37\xbc\xd6\x81\x1a\x8e\x74\x30\xd1\x0b\x0a\x8f\x59\xaf\x1a\x8a\xaf\x2e\xea\x3b\x1e\x48\x08\x03\xb5\xa8\xd8\xf7\x65\x5d\x16\x15\x10\x10\x05\xda\x81\x7a\x65\xb1\x14\xd3\xe6\x6e\x81\x3d\xae\x91\xcb\xa8\x5d\x22\x4e\xf5\x59\xf5\x52\xd9\x97\xca\xbc\x2c\x65\xab\x29\xfd\x86\x4d\xc8\x73\x87\x53\x9e\x5b\xc4\x86\x4f\x8c\xf5\x2a\xcf\x1d\xb6\x2e\xf9\xa4\xa3\x72\xd6\x08\x8b\x57\x6a\x60\x85\xfc\x0b\x3b\xc8\xf9\x08\x0f\x1c\x49\x6d\xb8\xc1\xbe\xa5\x82\x09\x3f\xac\x40\x8b\xf1\x47\x7a\x3e\xb3\xbb\xed\xa0\xb7\xa8\x08\x7a\x51\xeb\xaf\xed\xa0\x0f\x65\x9f\x19\xf8\xb7\x6c\x42\x5e\x38\xf4\x7f\x30\x62\xaa\xa8\x56\xb1\xcf\xa0\x99\xcc\x65\xef\x40\x77\xbb\x03\xaa\x4c\xc5\xa7\xba\xbe\x70\x95\xc5\x3f\xd5\x8b\x9f\x9e\x39\x64\x2b\x2b\x3d\xa4\xcf\x9d\x92\x06\xee\xc7\x46\x15\xe8\xf4\x6c\x80\x73\x40\x1b\xed\xc4\x70\x3c\x68\xa6\x4d\x2f\x58\x74\xb8\x3a\xa1\x48\xe3\x95\x38\xfb\x60\x74\x5c\x0a\x4f\x18\xd1\x0d\xcc\x46\xac\x95\x42\xc5\xc5\xdd\x6e\x8b\x7a\x05\x80\xdd\x4c\x33\x5b\xcd\x6d\x55\x0d\x88\x7a\x55\x99\xa9\x2a\x5a\xaa\xc7\x28\xd4\x45\x4d\x7c\xa9\xa6\x76\x3b\x5b\x55\x1d\x64\x2c\xf3\x43\xca\x6d\xa5\x37\xf5\x4a\x21\xab\x57\xcc\x4d\xc5\x62\x45\xc5\x46\x13\x2f\xaa\x8e\x56\x57\xdd\x6e\xf3\xf5\xf5\x03\x67\xdc\x0f\x69\x64\xa9\xb8\x5e\xa6\x02\x78\x9d\x92\xa8\x31\xfb\x35\x54\x46\xcf\x07\x62\x98\xc2\x4f\x13\xa5\xd7\x89\x18\x94\xe6\x28\xca\x17\xf8\x1f\xfc\x5a\x93\x47\x3f\x89\x8d\xcd\x0c\xa4\xcb\x97\x8c\xb1\x89\x1e\xf6\x02\xf3\x70\xad\x51\x26\x63\x05\xeb\x04\x95\xec\x18\x1d\x0c\x9e\xad\x95\x86\xb2\xbb\x41\x4f\x90\xbf\x60\xe9\xd7\xeb\x4b\xdf\xdb\x54\xfa\x9e\x9a\xf7\xf0\xf3\x6b\xae\x2f\xfc\x69\x32\x5b\xaf\xab\xfc\xbb\x5c\x85\xe7\xdf\x99\x2c\x5a\xde\x33\x4b\xed\x70\x4a\xfa\x7d\x1a\xf4\x0e\x55\xbb\x2d\x0f\x7b\xf3\xb9\x32\xab\x67\xef\x50\x0e\x55\x47\x06\xb9\xb6\x89\x95\x71\xcd\xe5\x0e\x45\x11\xf4\x9e\xe1\x9b\x48\xc4\x13\xf8\x68\x9f\xc7\x93\x24\x51\xf0\xc8\xfe\x50\x49\x26\x47\xf0\xdd\xfe\x98\x24\xe7\x83\x75\xcd\x69\xb7\x37\x35\x76\x3e\xdf\xf4\x75\x8b\x31\xa3\x5c\x19\x7a\xde\xb1\x4d\x63\x35\xf8\x5b\x1f\x7f\x4e\x97\xb6\xab\x02\x67\xca\x8f\x2e\xb8\x7a\x9c\x8c\xc4\x91\x26\x19\x1d\xf0\xc3\xfd\xfd\x9d\x87\x07\xf3\xf9\xfe\xc1\x6e\xff\xe1\x21\x1f\x12\x57\xe3\x06\xa3\x82\x07\xee\xab\x8e\x3a\xcd\x3a\x7d\xfc\xc2\x76\xe8\xa2\x54\xa1\xbe\x25\xb1\x24\x9e\x47\x37\x1a\x36\xa7\x67\x50\xd3\x8d\xad\x0d\x52\x92\x66\x54\x9c\x68\x89\xc2\xac\xd3\x81\xa8\x4e\x65\x34\x9f\x13\xde\xb1\x05\x0c\x85\x20\x09\xa7\x46\x14\xe0\xcc\xe6\x25\x59\xda\x21\x6b\xf0\xb7\xec\xa2\x82\x26\x6d\x69\xd2\x3f\x4d\x93\x2e\x69\xb2\xd6\x90\x59\xcb\x16\x95\x36\x8e\xa3\xff\x1b\xfb\x19\x5a\x8c\x49\x95\xd3\x91\x31\x34\xaa\x78\x9d\x0e\x41\x07\xb6\x8e\x8c\xf1\x7f\xb2\xfd\x83\xdd\x9d\x5e\xbb\xbd\x7f\x7f\x77\x6f\xf7\x9f\x8c\x0f\xf5\x69\xb7\x2b\xce\x3a\x59\x90\xd5\x29\x80\xdf\xd7\xf1\x9e\xf2\xd3\xe9\x24\x36\x52\x6b\x41\xe1\x8f\xf5\x50\xd8\xa7\x08\x24\x25\xfb\x49\x6b\xe9\x27\xb8\xd6\x2e\xc4\x77\xb9\x01\x65\xd6\xe2\xac\xce\x0b\x9a\xa2\x62\x4e\x04\xcb\x9a\xcd\xcd\x86\xea\xb4\xdb\xd5\x67\x1d\x11\x54\xfa\x71\x6f\x51\x28\xca\x79\xbf\x2b\xc9\xfe\x65\x64\x6c\xfd\x3c\x1d\xfd\x45\x49\x10\x05\x2d\xd7\xe9\xe7\x5b\xff\xa1\xfc\x58\x8e\xc4\xcd\xdb\xb1\xed\x5d\xb1\x0e\xd4\x08\xc2\x06\x6c\xb6\x16\xb6\xd0\x73\x0e\xcb\x16\x1a\xed\x7b\xc2\x53\xfd\xa2\x44\xc0\xca\x6f\xdd\x02\x7c\x41\x81\x2f\xe3\xb4\x5d\x55\xaa\x4e\xf1\x98\xe8\xc3\x7e\xa1\xed\x7d\x76\x14\xbb\x1e\xa0\x1a\xd2\xed\x1f\x12\xe1\xd2\x8a\xd6\x59\xa1\x7d\x08\x0a\xa2\xc3\x74\x5d\xe7\xc0\x91\x8a\xd6\x35\xc7\xa8\x7a\x3d\x18\x15\xba\xde\x3a\x51\x69\xc0\xfa\x20\x2a\xb0\xca\xd3\xba\x04\xb7\x0b\xe3\x40\xc2\x79\xa1\x3a\x8e\x37\x55\xbd\x87\x4a\xf7\x45\x20\x17\x39\xa1\xe1\xda\x7e\xc7\x9f\xa7\xea\xcc\x8c\x4e\xba\x61\x9e\xe4\x70\xa0\x11\x72\x22\x57\x2b\x77\x4d\x60\x10\x67\xeb\xf5\xb3\x65\x60\xc8\xce\x36\x69\x55\xab\x0a\x00\xc7\x22\xd9\xca\x22\x8e\x2f\xb3\x51\x08\x22\x2c\xc6\xd7\x14\x73\x9c\x96\x4b\x05\x21\xc1\xa2\xc9\xda\xa2\x8e\x6b\x72\x45\x61\x88\xcf\x56\xad\x3e\x5a\xdd\x16\x85\xae\xcd\xab\x97\xc7\x6f\xdf\xf8\x53\xae\x52\x81\x9a\x59\xc4\x75\x74\xe1\x38\xb3\xaf\x34\x99\x91\x0b\x0d\xde\xc9\x45\x9c\xb6\xe2\xb4\x25\x13\xdd\xba\xe6\x93\x78\xd4\x32\x25\xb7\x5a\x5e\x47\xfa\x57\x22\x4d\xf9\xb9\x00\x83\xc0\x28\x47\x23\xc3\x05\xd7\xd2\x61\xb3\xeb\xbc\xf6\x74\x16\x23\x7e\x7f\x9b\xde\x45\x3c\x15\xad\xdd\x20\x77\x10\x84\x49\x32\x11\xdc\xf1\x0f\xa8\xe1\xcc\x28\x8b\xc1\x85\x24\x1e\x6f\x3d\x7a\xfb\xf6\x95\x67\xb4\x3e\x2c\xb5\x53\x94\x92\xd9\x55\x28\x54\x65\xa5\xab\x21\x82\xcb\xd6\x8b\x37\x27\x06\x3c\x20\xea\x90\x75\x77\xfa\x7b\xf7\xf7\x1e\xec\x1e\xec\xdd\x9f\xcf\xab\xe7\x43\xa6\xe6\x73\xd2\x9b\x2b\x6a\x34\x11\xda\x6e\x93\xad\x38\x7d\x16\xcb\x58\x9b\xae\x98\xcf\xd5\xbf\xf7\x69\x13\x1d\x92\x64\x69\xd8\x6b\xd0\xb0\x86\xf0\x67\xaf\xde\x1e\x9d\x54\x94\x1f\x14\xa5\x9a\x76\x63\x51\x4a\xb5\x62\x99\x6a\x2e\x23\xf3\xf2\x18\x81\xf0\x4b\xc7\xf3\x0a\x94\xc7\x27\x1f\x5e\xbc\xf9\xb5\xc2\xf9\x30\x28\x64\x5b\xee\x74\x31\x05\xa4\x1f\x59\x78\xf3\xb2\x82\xdd\x2f\x60\x9d\x96\xdc\x2f\xde\xa1\x96\xe4\xc7\xa9\xd5\x96\x14\x1d\x6e\x4b\xeb\xba\x80\x0f\x45\xdd\xaf\x5e\x1c\x3b\xad\x79\xf0\xd7\x25\xaf\x64\x5e\x54\xb6\x8e\x3e\x7c\x38\xfa\xa3\x2a\xdc\xef\x05\x85\xfc\x1c\xad\x74\x28\xa9\xca\x8d\x34\x9f\x6f\x15\x26\x7a\x21\x5e\x73\xa4\x6f\x1f\xbd\x7c\xfa\xf8\xa4\x35\x8b\xf5\x45\x8b\xb7\xc6\xb1\x98\x8c\x5a\x92\x5f\x89\x51\xeb\x7f\x7a\x1d\xdd\xf1\xfe\x27\x56\x68\xa5\xf0\x75\x4e\xd4\xa9\xae\x5c\x9c\xb1\x20\x82\x0e\x45\x80\x8c\x3e\xd5\x66\x06\xa1\xd5\x63\x49\xec\x07\x86\x3c\x81\x2b\x5c\xb3\x8d\x0d\x42\xaa\xd6\xc5\x63\xa2\xca\x55\x46\xd7\xc0\x5a\xaf\xde\xbe\xf9\xf5\xe9\x87\x16\x47\x5c\xad\x37\x42\x8c\x5a\xb8\x18\xb4\x90\xd8\x56\x98\xe9\x56\x22\x27\xb7\xad\x54\x88\x96\xd7\x29\xd0\x74\xbc\x96\x90\x5a\xc5\x22\xc5\x0a\x7e\xa2\x25\xe7\xcd\x96\xec\x04\x7f\xd9\xc5\x7f\xd1\x40\xdb\xd3\x65\x77\x66\xc0\x99\x5d\xe2\x32\x3b\x30\xd8\xec\x0b\x9e\xbe\x9d\xc9\x77\x2a\x99\x0a\xa5\x6f\x49\x46\xe9\x9d\x43\x6d\x76\x66\x95\x05\x24\x95\xba\x22\x66\xaa\x21\xcb\xe9\xe5\xec\x05\xf9\x4a\xec\x2f\xa8\x94\xd7\x99\x26\x2f\x34\xa9\x1a\xb4\x1b\x54\xc6\xaf\xf4\xc7\x90\x30\xe9\x9f\x43\xcc\x7a\x83\xf8\x30\x29\x57\xe4\x4e\x27\x27\x20\x39\x8d\xcf\xf2\xc1\xa9\x57\x2f\x06\x11\x8b\x88\xa9\xcc\xa9\x29\x2a\x6a\xd9\x0b\x2a\xf2\x1b\x3d\x8d\xaf\x2f\xb0\xa4\x11\x0d\x22\x2f\xb1\x5f\xd2\x35\x66\x9f\x21\x34\x54\x0d\x42\x3f\x1c\x84\x2c\xf4\xc3\x9c\x98\xd0\xfa\x74\xe2\x31\x69\x90\x32\x66\x2f\x0c\x42\x18\x97\xc4\x5c\x69\x72\x8b\x2d\x1f\xd3\xb2\xe9\x41\x43\x38\x5b\x17\x51\xfe\xb5\xe7\xcc\x70\x69\x5a\x55\xf9\x6d\xb6\x37\xbb\xe6\x57\x6e\x0e\xdc\xd9\x1e\xb6\x02\x1c\xf7\x06\xf2\x1e\x8c\xea\x03\x78\xae\xcd\xb2\x83\x03\x88\xfb\x09\x91\xcf\x9d\xfe\x34\x56\x82\xe3\xd3\xbe\x72\xb7\x50\x67\x24\x11\x50\x92\xb1\x62\x43\xd5\x6e\x3c\x55\xa5\x2f\xea\x9a\x45\xb9\x44\x3d\xbd\x99\x8a\x48\xc7\xf2\xdc\x2c\x4a\xb8\x18\x55\x7e\x79\x59\x7a\xec\x96\x3d\xd9\xd2\xdf\x36\x2b\x40\xe9\xc2\xdd\xea\x0f\x96\xd6\xa9\x5e\x50\xef\x7a\xe9\x73\x83\xc7\xe7\x83\x7c\x19\xcb\xd7\xa5\x7c\x69\xc8\x65\x7d\x4d\xe4\x6e\xf5\x9a\xe2\xda\x8f\x10\x47\x54\x88\xe1\x5c\xa6\x16\x13\x36\x07\x9b\xca\xd2\x7f\x5c\x0a\xce\x12\xc3\x08\x31\x8c\xda\xed\x65\x28\x87\x56\x81\x50\x62\x15\xd4\x6e\x05\x35\x46\xa8\x71\xbb\x7d\x6e\xa0\xce\x41\xf9\xe7\xd5\x34\x28\xa1\x2e\x10\xea\x62\x15\xae\x72\x71\x71\x10\x38\xec\x77\xbe\x5e\x6b\xde\xaa\x54\xee\x6a\x10\x1c\xf5\x79\x20\x0e\x35\x6e\x64\x1a\xe6\x33\x15\xe3\xa6\xda\xa9\x38\x5b\xe7\xfd\x9f\xad\x55\x44\x51\xe1\xb1\xab\x6f\x3c\xbe\x25\x0a\x8c\x00\x04\x49\x3b\x9e\xe7\x2a\xc6\xb7\x2e\x07\x4a\xc4\x79\xb3\xc9\xbc\xb3\x1b\x99\x3a\xd7\x83\x2f\x25\x33\x68\x2b\x74\x47\x0e\xba\xbb\xed\xa0\x07\xdc\x28\xcd\xe5\xe7\xe3\xfa\xe7\x7e\xe3\xf3\x49\xfd\xf3\x0e\x84\x81\x84\x28\x30\x55\x58\x2d\xfd\xe9\x06\x2d\x7d\x17\xa1\x47\xa8\xf8\xc3\x97\x0d\x80\x7b\x0e\x20\xb6\xe2\x9b\x74\x7d\xf2\x8f\x91\x08\x89\xae\x67\x10\xc1\x37\xd9\xe9\xe4\xa6\x02\xf6\xe0\x45\x70\x7a\xb6\x28\x24\xe4\x67\x03\x0b\xb2\x6a\xc1\x57\x77\xc6\x9f\x48\xe2\x4e\x73\x49\x8e\x24\x79\x6c\x00\x28\x75\xe7\xf9\xcb\x9c\x40\xe9\x5f\x58\x03\x49\x51\x40\xc4\xd8\xe4\x57\xb5\x96\xb8\x63\xd1\x40\xff\xd2\x7e\x05\x5b\x0d\x56\x61\x9b\xf7\x46\xb2\xad\x3e\x3c\x97\xc6\x32\x2b\x2b\xc5\x0a\x8c\x9c\x78\x2e\x73\x4f\x36\x85\xad\x37\xb9\xbf\xdb\x94\xe8\x0d\x24\x7b\x2e\xfd\xf4\x22\x1e\x6b\x42\x07\x74\xcb\x8d\x0a\xc1\x1d\x1d\xe5\x8f\x73\x8b\x59\x9a\xf9\xe4\x6f\x1b\x16\xef\xd9\x7d\xb1\xbe\xf9\xa7\x84\x3b\x37\xb6\xe7\x39\x8a\x1f\x39\xa0\xca\x3f\x67\xe6\x67\x8c\x22\xd6\x4c\x1e\xdb\x20\x83\x10\x3f\x84\xc4\xa0\x33\xcb\x4d\x01\xb9\x10\x93\x54\x18\x6a\x31\x78\xa4\xdc\x67\xf0\xc7\x7e\x84\x55\x87\xb5\x9e\x30\x78\xa4\xe9\x42\x74\x41\xc4\x63\xb2\x6f\xa9\xc9\xc9\x53\xfe\x45\x7d\x0e\xe6\x15\x8f\xb1\xe2\x8b\xa2\xc9\x14\x2b\x6d\x19\x1a\x0c\x77\xa1\x13\xb2\x17\xf4\x8d\x29\x68\x40\x21\x0e\x94\x7f\xbe\x80\xa2\xec\x68\xb1\x58\x10\x49\x07\xd8\xdb\x8b\xc5\x06\x6b\xee\x85\x19\x28\x01\xd2\x8f\x9e\x98\x3f\x0f\xcd\x9f\xbd\x6a\x41\x58\x8e\xb9\xa1\x77\x8b\x45\x6d\x07\xef\x45\xc3\x90\xb3\x6b\xd7\x8c\x8c\x24\x48\x50\x43\xe5\x8f\x27\xfc\x3c\x0d\xae\x93\x78\xd4\xea\xd1\x01\xae\x62\xf3\xf9\x94\xe4\x6e\xd1\x84\xdd\x2d\x20\x66\x24\x62\x9a\xe0\x52\x66\x56\x62\xc6\x49\x08\xb1\x59\x14\x57\xd8\xfe\x20\x50\x4a\x09\xa3\x01\xbd\x95\x85\x77\xea\xad\x11\x4f\x83\xcc\xe7\xed\x36\x21\x9a\xe9\xf9\xfc\x6e\x41\x4f\xc5\x19\xcb\x7c\x4e\xd0\x4c\x02\x03\xb1\x02\xa1\x60\x77\xe7\x68\x51\x5b\x12\x17\x90\x31\xe9\x47\xc0\x8d\x8e\x0c\x46\xcf\x11\xa8\xe7\x8c\xcb\xed\x29\xff\x82\x3d\x96\x64\x46\x9e\xca\xb2\xa3\x5a\x6e\xc8\x12\x7e\x91\x70\xb7\x1d\xec\x43\x18\xb8\xcc\x60\xf7\x6e\xa4\xcf\x6b\xee\x64\x7f\x7b\x78\x4b\x38\x08\x14\x6e\x41\xd4\x6e\x27\xc3\x1b\x8c\xe9\x53\x7e\x0c\xca\xff\x66\xde\xde\xe2\x8b\x68\xa8\x7c\x33\xd4\xe6\x95\x19\x06\x90\x7e\x48\xe9\x82\xb8\xfe\x35\xbd\x20\x09\x84\xce\x00\x85\xb6\xa9\x66\x4c\x04\x48\xd3\xad\x63\x12\x1b\x5d\x01\x14\x85\x5f\x25\x49\x20\xf2\x43\xc8\x48\x4c\x4b\x1c\xf5\xb7\xc0\x87\x77\xd3\x44\xe9\x34\xe0\x8b\xe0\x2e\xdf\xdd\x92\xec\x6e\x81\x03\xf8\xe1\x67\x65\x82\xf2\xcf\x49\x53\x24\xac\x59\x2f\x66\xe4\x95\x04\xe9\x5f\x40\x2e\xb6\x55\x9d\xe5\x3e\x6d\x8e\x06\x43\x61\x7e\x19\x28\x98\x18\x81\x5e\xc9\xb6\x1f\x4d\x89\x7e\x65\xbe\x9b\x36\x3c\xd9\x28\xca\x65\x20\x21\x69\xf8\x70\x7e\x2d\x17\x23\x64\x21\xc8\x8a\x9d\x4e\x64\xcb\x67\x92\x6c\xf5\x40\x41\x86\x0b\x1d\x05\xf3\xbb\x0f\xba\xfc\x2d\xe9\xcb\x7c\x3d\xbd\xdb\x0e\xbc\xf1\x8d\x07\x3c\xc8\x4e\xc5\xd9\x7c\x7e\x17\x07\x9f\xe1\x5b\xf0\xb9\x16\xb5\xf6\xcc\x99\xb7\xb9\x96\xa4\x4a\x2d\xa9\x1f\xd8\x09\xa0\xfc\x4b\xe0\x8c\x70\x96\x41\xc2\x04\xcc\x88\x1c\xbe\x95\xa7\xfc\xcc\x17\x81\xfd\x77\x5c\xd3\xf3\xaa\xad\xc4\x64\xa0\x70\xbb\xea\x3b\x35\xa2\x73\x6a\xe4\x46\xb9\x04\x1b\x1d\xb1\xda\x8e\x32\x13\x84\xe8\xd3\xec\xcc\x54\xc3\x21\x63\x24\x43\x67\x33\x75\xe8\x06\x39\xcc\xfc\x98\xbd\x20\x1c\x32\x3f\xa6\x41\xe6\x7f\xcb\x7f\x7c\xa3\x90\xd1\xd2\x99\x50\x19\x12\xca\xbf\x1a\x44\x7e\x68\x4c\x02\x3f\xa4\xd8\x56\xc3\x9c\xa6\xb5\x79\xc5\x83\x9a\xdb\x02\xc9\xc8\xfb\xc4\x4f\x40\xc3\xdd\x34\x50\xbe\x84\xef\x81\x58\xd8\x65\x8a\x43\x52\x75\xde\x6b\x6c\xee\x5b\x79\x2a\xcf\xda\xed\x29\xd9\x75\xfa\xf5\x7d\x9d\xeb\x10\x12\x10\x92\xdd\x89\xe0\xa3\x04\x15\x28\xe0\xc1\x23\xb9\x80\x4f\xe5\x1a\xf8\x71\xad\x96\x53\x0b\x5b\x79\x54\x4e\x78\x0d\x11\x3b\x3d\x83\x84\x21\x66\x5f\x19\x69\xa7\x59\x0f\x1a\xd3\xc3\x0e\x46\x2a\xf4\x49\x7c\x25\x92\xcc\x91\xd9\xc5\x6a\x4d\xe9\x02\x74\x39\x18\xce\xe7\x68\x22\xb8\x2a\x8a\x29\xf4\x07\x15\x50\xb6\xce\x90\xc5\xb6\x5d\x7e\xb4\xc6\xef\x3f\x50\xc5\xa6\x25\xad\x54\xc0\x08\x32\x96\x10\x85\x36\xa1\x35\x4f\x0a\xfd\x91\x63\x58\x14\x3f\x23\x55\xa0\x5c\xbc\xa0\x70\x97\x66\x61\x1a\xa9\x38\x14\x35\xb1\x17\x15\xab\xfa\x02\x32\xb9\x1a\x84\x48\xb3\x04\x44\xb9\xc3\x9e\x52\xc7\xb5\x4c\x0f\x7b\xf3\x79\x84\x1b\x03\xe8\xcb\xef\xd3\x85\x9d\xb5\xdf\xe5\x60\x8d\xe4\x59\x65\xd0\xe0\x5e\x28\x2d\xd4\xac\x77\x92\x79\x99\x1c\x89\x71\x2c\xc5\xa8\xb2\xcd\x47\x49\x94\x5d\x09\xa9\x87\xc5\x43\x70\xe7\xec\xf8\xff\x56\x2a\x47\x7c\x3a\x15\x72\xf4\xf8\x22\x9e\x8c\x4c\x87\xaf\x5a\x60\x05\x13\xbe\x4c\x46\xa2\x5a\x36\xa6\x5c\x09\xa9\xdf\x24\x23\xe1\x2b\x31\x9d\xf0\x48\x58\x04\xdb\x8a\x48\x77\xc9\x5d\x50\x10\x14\xee\x6a\xf2\xe6\xf7\x95\xba\xac\x69\xc9\x1f\x35\x7e\x74\xdd\xa2\x7f\xb1\x09\xd6\x73\xc6\xfc\xae\x90\x21\x7c\x20\x3a\x2c\xf3\xc3\xf9\xbc\x07\xf9\x5e\x56\x56\x6d\xb1\x75\xaa\x5d\x2a\x14\xb2\x51\x10\xc1\x28\x18\x29\x8c\x7f\x0c\x34\x8c\x03\x0e\x61\x20\x50\x43\x20\xf9\x8a\x0f\x52\xfd\x77\x10\xf8\x73\x24\xee\xfc\x14\x89\x76\x67\x46\x6d\xd2\xd2\xbf\x05\x12\x97\x94\x30\xe8\x77\x88\xc2\xca\x69\x6d\x80\xb4\x6a\x94\xd9\x37\xcb\x0f\x5c\x05\x0a\x2e\x0b\xcd\x62\xb1\x46\x70\x68\x45\x4e\x25\xa8\xb3\x15\x7a\x97\xd5\x1b\x73\xa6\x15\x6a\x83\x31\x64\x71\x80\x5e\x85\xa5\x08\x7b\x5e\xa0\x3b\x5d\xb1\x0d\x0a\x61\x89\x07\xc4\x2a\x4c\x55\x38\x34\xe2\xe2\x8a\x91\x8d\x1b\x00\x0e\x3a\xc8\x56\x21\x74\xc3\xa4\x17\x3f\xb1\x41\x50\x43\x08\x7c\x15\xca\x7a\xe4\xf4\xe2\xa7\xb6\x10\x1a\x68\x21\x5a\x85\xb8\x19\x4b\xbd\xf8\xc9\x6d\x86\x25\xe4\x90\xac\x42\xbf\x1c\x5c\xbd\xf8\xe9\xcd\x88\x15\x55\x40\xbc\xaa\x92\x55\xc1\xd6\x8b\xf5\x91\x1b\x46\x3f\xe1\x3d\xcf\xd1\x81\x28\x44\x1b\x66\x8a\xc7\xfb\x2e\x30\x24\x1b\x61\x77\x6a\xb0\xf1\x46\xd8\x5d\x17\x76\xb0\x6e\x1e\x20\xe8\x9e\x01\x55\x90\x04\x77\x63\x2c\xa1\x17\xb5\xa9\x3a\x56\x95\x2c\xf5\xcc\x5a\x34\xd5\x9e\x31\xa8\xbc\xa9\x17\xc8\x35\x73\xd4\x74\x02\x9a\x6b\xdb\xc3\x19\xe1\x0a\x8c\xc2\x41\x34\x93\x20\xd9\x44\xe0\xfe\x62\x42\x8d\xc0\x11\xfe\xb6\x11\xcd\xc3\x5b\x12\x0a\x90\x87\xbb\xc3\x54\x05\x13\x05\xa9\x30\xaa\xaf\xf0\x39\x0d\x66\x64\x2c\x72\x3f\xf1\x82\xd2\x20\x8f\x4f\x03\x51\xec\xe6\x29\x48\xd7\xf5\x43\xeb\x2b\x91\x76\x39\x36\x22\xd1\x8c\xd9\xda\x1e\x8b\x5e\x05\x06\x34\x7a\x45\x81\x3f\x0a\x94\xcf\x1f\x01\xbf\x36\xff\x5e\xd7\xba\x02\xe5\xa2\xa3\x0b\xde\x2d\x9c\xb0\xb2\xd2\x69\xc4\x41\x30\xed\x6f\x43\xc6\xb4\x2f\x31\x04\x20\x19\x98\xc1\xdb\x62\x4c\x0c\x89\x66\x0a\x55\x57\x62\xfe\x61\x66\xf5\x32\x83\xc5\x18\x13\xed\xb6\x17\x4d\x78\x9a\x9a\x1f\xd9\xf0\x5a\x11\x6d\x4f\x2b\xa0\x0a\xc9\x69\x60\xbf\xbe\xe1\x57\xa2\x84\x50\x16\x42\x21\xc4\x62\x39\x0c\xee\x5a\xd5\xf4\x6e\x26\x4f\xd5\xd9\xc0\xfc\x61\x62\x28\x3a\x5e\xcb\xeb\xe8\xc0\x39\xaf\xb6\xad\xea\xee\xaf\xed\xc2\x02\x2f\xb7\x08\x0c\x84\x7f\x89\x11\x9e\x97\x4c\xfa\x57\x18\x7f\x4c\x0b\xef\x41\x09\xf6\x4e\xfa\x91\x12\x5c\x8b\x13\x71\x83\x4b\xb8\x8d\xb6\x8b\xc7\x64\x0f\xc1\x1c\xef\xae\xf4\x2f\xd1\x84\xfc\x36\x30\x9f\x84\xbf\x3d\xa0\x4b\x7b\x00\xd9\x30\x63\xa7\x19\x08\xff\xdb\x59\x50\xec\x44\x1b\x05\xd9\x28\x0d\x97\x03\x1b\xf7\x71\xf7\x2d\xc8\x60\x1a\xa8\xc2\xc1\x43\x22\xb6\xad\x88\x00\x63\x23\x8b\xc9\xd5\x57\x71\x2d\xa4\xfe\x6a\x54\x8c\xaf\x4a\x8c\x19\x87\x68\x11\x8f\xc9\xae\x4b\xf5\x95\x22\xc6\x80\xbd\x20\xd2\x3f\xa7\xa0\x40\xfa\x23\x0a\xd1\xa0\x74\xe0\x0f\xcb\x66\x3d\x9d\x08\xa3\xee\xbc\x39\x26\xd2\x1f\x03\x6e\x64\x35\xbf\xe1\xf6\xd6\xe0\xbb\x6c\xb7\x3d\x6e\xe6\x8b\x1f\xb5\xdb\x91\xcf\x47\xa3\xa7\x86\x90\x57\x71\xaa\x85\x14\x8a\x78\xd1\x24\x8e\x2e\x3d\xf8\x2e\x49\x44\x29\x18\x12\xf2\x9a\x4b\xe7\x62\x82\x46\xf5\x8a\x6d\x83\xdf\x24\x89\x60\x5b\x91\xbe\x69\xc4\x30\x39\x8d\xcf\x02\xf3\x07\x37\x02\x4a\x45\x33\x72\x7c\xda\x6a\xc9\xb9\x6e\xcc\x2f\xed\x86\xac\x0c\x8c\x48\x32\x03\x31\x5c\xe9\x4b\x60\xd2\x4f\xf5\xed\x44\xac\x8c\x48\x5d\x10\x09\x19\x0d\xf2\xc9\x5f\xc7\xe0\xda\x7e\xd2\x0c\xc8\xb3\x14\xb9\x08\x9f\xcc\x34\xa8\xcc\x41\x5d\x85\xf2\x88\x33\x88\x98\x31\xf5\x0c\xeb\x70\x74\x03\x45\xf6\xaf\xff\xdd\xdf\x66\x8c\x71\x34\xec\xfc\xef\x8c\x0f\xa2\x44\xea\x58\x66\x62\x21\x7d\x25\xae\x92\x6b\x51\xef\x68\x61\x56\xa0\xa8\x72\x68\xc4\x60\xa6\xb2\x73\xee\xa7\xb0\x29\xc6\xfe\x77\xd0\xec\x1a\x45\x07\xc8\x62\x0b\x44\x53\xa7\xd7\x20\x33\x62\x4c\x51\x50\x4c\xfb\x1c\x38\xcb\x86\xd9\xe1\xee\x50\xf9\x3c\x30\x42\x24\x50\xa0\x59\xdf\x4c\x51\xe5\x87\xc1\x2e\x63\x59\xbb\x8d\x32\x25\x62\x44\xb7\xdb\xa6\x0b\x93\xe9\x3b\x95\x4c\xf9\x39\xb7\xcb\x0d\x90\x9d\x25\xf0\x6b\x6a\x40\xa7\x0a\x19\xf7\x89\x18\xf3\x6c\xa2\x09\x85\x98\x0e\x04\x8b\xfc\x6f\x03\x1b\xdc\xbb\x1c\xb5\x2e\x28\x67\x82\x70\x3a\x40\x1f\x58\xc5\x44\xa5\x35\x92\x74\xbb\x03\x03\x73\x9a\x9c\x19\x30\x63\x47\x4c\x17\x11\xe1\xe8\x25\x29\xd6\x6e\xff\x3b\x93\x30\x5e\x10\x05\x9c\x82\x5c\xe6\x5b\x01\x11\x84\xaa\xdd\xbe\x9b\xf2\x34\x8d\xaf\x45\x30\x31\x75\x1e\xee\x18\xed\xc1\x08\xb6\xc8\xba\xe0\xd6\x8f\x85\x05\x2b\x54\x3d\x64\x11\xe4\x9d\xdd\x55\xdc\x57\xaa\xba\x96\xe3\x9c\x58\x9f\x81\x18\x4a\x3f\x15\xfa\x48\x6b\x15\x87\x99\x16\xc4\x1e\x31\xcb\xeb\x75\x5e\xd3\x45\xc9\x9f\x7b\x7f\xaf\x0e\xc8\x98\xf0\xc7\x28\x6d\x92\xa5\xfa\xde\x1c\x93\x0c\x56\xd7\x69\x3f\x55\xf5\x5e\xf3\x49\x26\x4a\x51\x7f\x21\xa2\x4b\x31\xca\x7f\xa2\xb3\x8d\xb1\xcc\xcc\x09\x74\xc3\xd1\xc5\x42\xab\xdb\xbb\x59\x2c\x47\xc9\x6c\x85\xd8\xd0\x9e\xdd\x15\x78\x8b\xa2\xd2\xb7\xa6\x59\xb9\xa9\x79\xb7\x00\x2f\x1f\x18\x0f\xee\xce\x85\x0e\x1c\xd5\x26\x54\x6c\xab\x67\x54\x93\x2a\x94\xc2\xd9\xb9\xaa\x2d\x01\xa7\x65\x94\xf9\x79\x2e\x3b\xa0\x47\xdd\x13\xce\x53\xe5\x9a\x70\x77\xdb\x81\x02\x15\x68\x48\x03\x01\x3a\xd7\xe3\x21\x2b\x14\xfa\xd2\x51\x52\x05\x13\x39\x5b\x2f\xaa\x76\xde\x03\x63\x2f\x0b\xc1\x24\x8d\x9a\x60\xb4\x09\x33\x19\xb3\x2d\xc6\xac\x28\xe8\x6f\x61\x8f\xed\xe0\x0b\xd7\xdb\x31\x35\x6b\x67\x0f\x04\x6e\x88\xb2\xd5\x7e\x1c\x23\x53\x7f\xf2\x30\x93\x59\x5e\xcb\x23\x69\xb9\x25\x27\x7d\x63\x28\x49\x7f\x04\x22\x10\x30\x0e\xcc\x3a\x10\x06\xd2\x0f\x17\x0b\x23\x18\x38\xeb\x2f\x72\xdf\x13\xcf\x3d\x4f\xfb\xb5\xdd\xe0\x09\x24\xa6\x72\x88\x59\x54\xee\x2b\xb2\x98\x31\x56\x4a\xf8\x71\xbb\x1d\x9b\x99\x3a\x66\xd1\x69\x6c\x98\xc3\xc8\x76\xd3\x01\x63\xb7\xad\x44\xe1\x42\x7c\x49\x07\xe6\x41\x99\x15\xd9\x2a\x46\x8d\xb1\xf3\x2f\x41\xf9\x97\x10\x9a\xf1\xc3\x72\xbd\xc3\xb0\x8c\x2e\xc3\xfe\xea\x83\x80\x90\x96\xa1\x23\x05\xb1\xa9\x59\x9b\x61\xc2\x94\xff\x0d\x46\x6c\xab\x0f\xd7\xa6\x3a\x5c\xac\xaf\xcd\x62\x3d\x62\x5b\x3d\x58\x5a\xb1\xd3\x61\xca\x4e\x53\xb8\x36\x2b\x76\x9a\x87\x6f\x9b\x15\xfb\x9a\x5d\xfb\x97\xe5\xca\xb6\xcd\x54\x8e\x6a\x7b\x3d\xaa\xc9\x70\xc2\x4e\x27\xb0\x6d\x50\x4d\x2c\xaa\x6d\x83\x6a\x9b\x6d\xfb\x97\x45\x13\x47\xed\x76\x9a\x37\x67\x8b\xb1\x49\xfe\x38\x6c\x72\x43\x40\xc8\x68\xdd\xb4\x67\xbd\x81\x3e\xac\xce\x18\xd8\x9d\x3c\x79\xaa\xcf\x0c\x27\x9e\xea\xb3\x15\xdb\x78\x24\x85\x09\x0d\x52\xc6\xd8\x84\xce\xe7\x58\xcf\x0e\x08\x98\xd8\x2e\x36\xfd\x7e\x0d\xdb\x86\xa5\x3b\xfd\xa5\xbd\x6f\x1c\x04\xe9\x73\xdc\x57\xe4\xf9\x18\xec\xa2\x1b\x9b\x2f\x6d\xa3\x23\xba\x59\x39\x43\xe0\xa6\x19\x66\xb4\x04\x71\x59\x40\xec\x06\xb8\x7f\x7c\x81\xf5\x5c\xac\x9d\x26\x21\xbb\x35\x5c\x32\x02\x65\x54\x8f\x30\xa7\x67\x0f\x79\x62\x10\x32\xe5\xc7\xd5\x86\xab\xdb\x82\x02\x72\xdf\x72\x8f\xeb\x40\x76\xa8\xc9\xf2\x25\x7d\x50\x6e\x28\x9b\xb5\x2d\xdf\xcd\x1d\x12\xc2\xdd\xda\xa9\x53\x39\x37\xc6\x68\x21\x17\x68\xe0\x50\xec\x9c\x39\x56\x0d\x05\xa3\xb0\xd4\xaa\xd0\x0f\x49\x8d\x5a\xb3\x85\x4b\xab\x51\x4f\x8a\xa7\xdd\xf2\x69\x0f\x9f\x86\x36\x50\x64\x48\x12\x26\x4f\xb3\x33\xca\x18\x23\x36\xcc\x99\xb6\xdb\xb9\xfc\xce\x4b\x14\xf2\xdb\xca\xa0\x5c\xe7\xd1\xed\x36\x21\x11\x4b\xa8\x51\x4e\x48\xc2\x38\xf5\xb7\x71\x1b\x3a\xf2\x39\x24\xf9\x71\x2b\x22\x98\xb0\xfb\x2d\x56\xaf\xaf\xfd\xd6\xc3\x5c\x01\xd3\x43\xcf\x2b\x54\x29\x6d\x2a\xd8\xb5\x6f\xad\x2c\x45\x5b\xcd\x88\xa5\x31\x24\x85\x78\x0d\x96\x4f\xfa\x9c\x66\x67\x06\x8d\x59\x29\x82\xbc\x93\x8b\xa3\x69\xa6\x46\xc8\x4c\x67\x37\x09\xc2\x6e\x8b\xf3\x88\x19\xec\xbd\x1a\xd1\xb1\x11\x88\xb1\x7b\xb6\xb3\x3a\xc4\xed\xc8\xf0\x42\x72\x0b\x94\xdc\x02\x24\xcb\x0a\x41\xa7\x18\x2f\xa6\x99\x3a\x94\x43\x1c\xd4\x03\x10\x70\x77\x1d\x28\x88\x03\x3c\xdc\x10\xc8\x43\x95\xf3\xc1\x7d\xfb\x49\x82\x08\xf8\xa2\x52\x8b\x23\x26\x0f\xd5\x10\x2d\x57\xd6\x1b\x24\x87\xd1\x20\x29\x82\x41\x62\x96\x9d\x26\x67\x83\x73\x45\x62\xe0\xa7\xc9\x19\x68\xe8\x74\x6c\xec\x6a\x8c\xce\x28\x87\x4b\x2f\xd5\xea\x03\x39\xc0\xd9\xdd\xa2\xf0\x45\x5b\x05\xdc\x34\x63\x5c\x0a\x68\x08\x59\x5c\x3c\xa6\xac\x07\x13\xd6\x83\x11\x13\x83\xf4\x70\xdc\x6e\x4f\x0e\xc3\x7c\x83\xf5\x1a\xb6\x19\xb9\x66\xc9\x69\x7a\x46\x7d\x0e\x57\x8c\x3c\x65\xf1\xe9\x04\x7f\x5c\xb0\x6b\x3f\x84\x29\x7b\xea\x87\x46\xb0\x6f\x6f\x31\x76\x65\x4b\x9d\xc3\x0c\x6e\xe1\x06\x2e\xe1\x08\x8e\x4d\xe1\x4e\xff\x0c\x4e\x4c\xc1\x4e\x1f\x17\x81\xe3\x76\x9b\xcc\xd8\xb1\x1f\xc2\x2d\xbb\x32\x6c\x7a\xce\x8e\x0d\x7f\xc1\x49\xbb\x4d\x2e\xd9\x89\x1f\xc2\x11\x33\x1a\x32\xb9\x61\x27\xf8\xe1\xa8\xdd\xbe\xa5\xe7\x8a\x5c\xc0\x25\x64\xd0\xe9\x8c\x28\x1c\x2b\x4c\x36\xb1\x0d\x53\x98\x18\x95\x6c\xd4\x61\x17\xd6\x53\x78\x52\x7c\x99\x59\xc8\x51\x87\xcd\xec\x97\xb4\xc3\x76\x60\xd2\x61\x3b\x56\xbf\x8c\xc7\xe4\x88\x8e\x3a\x9d\x02\xd7\x55\x81\xab\xac\x69\xe4\xe2\x4d\x3b\xac\x5f\x2f\x7d\x4b\xcb\xba\x2e\xca\xba\x72\xe8\x73\x45\x66\x30\x2d\xa8\x5d\xa6\xa1\x3f\x28\x36\x97\xb7\x8e\xe7\xf3\xf3\x2d\xc6\x6e\x68\xa8\x04\xbf\x1c\x34\x71\x36\xa9\x6b\xd4\x71\xb9\xbe\x8e\x9d\x85\xd5\x64\xb1\x3d\x2e\x2d\x65\x8b\x3a\x30\xe9\x74\x16\xb8\x2d\x90\x1e\x8e\x07\x45\x7b\x9c\x41\xb7\xe3\xbc\x5c\xd0\x1e\xaf\xac\x78\xe5\x29\x7c\x61\x5f\xe6\xf3\xd3\xb3\x41\x4e\xaf\xc3\x2b\x4f\xfd\x10\x72\x85\xea\x0b\xc5\x1a\x49\xef\xb0\x98\x52\xf3\x79\xef\x30\x2a\x9f\xbf\x14\x12\xf4\x81\x99\x39\xb3\x20\x83\x9b\x20\x82\xdb\xe0\x4b\xbe\xe1\x73\xa4\x98\xf7\x55\x4c\xae\x7e\x3f\x78\xf4\xca\x49\x6a\x73\xac\x56\x6d\x4d\xe3\xf9\x43\xd3\xc3\x51\xb1\x76\xe4\x87\xc2\xee\x54\x90\xc1\x51\x10\xb1\xbb\x28\xe8\xc1\x8f\x40\x80\x79\x91\x96\xde\xdb\x5c\xcf\x30\xe5\x59\x84\x66\x94\xb1\x53\x23\x3f\xa2\x77\x0d\x0c\x0b\x0a\x91\x1f\xb1\x9d\x7c\x87\xbb\xa6\xb8\x44\xfe\x0f\x10\x90\x40\xe4\x2b\x03\xa5\x58\x66\xd1\x46\x7e\xea\xa7\xec\x6e\x16\x24\x16\xc3\xa2\xa0\xbe\x73\xa4\x0a\x57\x66\x15\x9c\xb2\xbc\x12\x95\xed\xe2\x65\x70\x01\xb7\xa4\x15\x84\x44\x75\x42\x04\x70\xff\x07\x44\x90\xe5\x8b\xfb\x54\x11\x05\x0f\x21\x33\x1d\x1c\xc1\x91\x11\x4d\x8b\x93\x3a\x0d\x36\x0c\xe1\x4e\xb1\x12\xb6\xf0\xa0\x63\xa7\xdc\x45\x41\xdf\xe9\x37\xe5\xae\x9d\x4f\x1d\xa9\xb4\xe5\x6c\x9b\x37\x3c\xa6\x56\xd8\x19\x25\x75\x60\xc3\xf9\x62\x5f\x59\xa6\x32\x6b\x2b\xcf\xd9\x2a\x84\x94\xc5\x56\x79\x36\x43\x90\x0e\x9f\x1a\x7a\xb4\x7f\x09\xb1\x9f\x42\x42\x83\x07\xf8\x96\xc4\xbe\x66\x0a\x62\x3f\x63\x09\xf4\x0e\x89\x91\x6f\xa9\x3f\xa3\xa5\x9a\x68\xab\x0f\xa1\x97\x57\x4f\x83\x87\xcb\x05\x89\xa9\x2b\x35\xcb\x4a\xea\x1f\xf9\x29\x53\x16\xd5\x66\x44\x34\x70\x71\x50\xd8\x22\xa6\x55\x9d\x0e\x6e\x96\x12\x6c\x16\xfd\x67\xc9\x80\x19\x72\xf1\x84\x69\xdb\xa6\x3d\xd4\xbf\x4a\xe1\x3d\x62\x3a\x57\x2a\x47\x56\xa9\x1c\x55\x6a\xa2\xa9\x78\x64\x3b\xb0\xd3\x87\x08\xd4\x0a\xd7\x90\x9d\x23\xd7\x4c\xfb\x62\x50\x28\xa9\xd1\x45\x3c\x19\xbd\x49\x46\x22\x2d\x97\x9f\x2b\xd6\x1b\x5c\x1d\x5e\x17\x0b\xd9\x55\xb1\xf6\x5c\x18\xcb\x9f\x4d\x86\xd7\xa7\x57\x67\x81\xf9\x83\x12\xbe\xd3\xe1\x1d\x62\x27\x3e\x4e\x05\x7e\xc8\xc6\xed\xf6\xf8\x90\x4d\xdb\x6d\x92\x31\x49\xb6\x4f\xaf\xce\xe0\x22\x1f\xdb\x29\x94\x7d\xd0\xe8\x81\xb2\x0b\x06\x9c\x4d\x17\x65\x7f\x14\xb6\x19\xf4\x40\xf9\x21\xb8\x89\x55\xbe\xa8\xa5\x4d\x0b\x74\xd5\x15\x2a\xb2\x0c\x88\xc3\x6c\xf0\xcd\x3c\x6b\x37\x30\xf1\x9b\x5a\xa5\x28\x2b\x57\x51\x6e\xda\xca\x1a\x44\x23\x72\x64\x69\x1f\xbe\xd4\x83\x57\x3a\x89\x98\x74\xb6\xff\x40\xb3\x6d\x64\x58\x3a\xd0\x2b\xc6\x6b\x3e\x27\xab\x5e\x5b\x2f\x53\x73\x6c\x07\xa2\xdd\xd6\x5b\x8c\xc9\x76\xbb\xb1\xad\xa8\x41\x3a\x47\x98\x71\xb7\x3c\x05\xe5\x67\x8d\x58\xfa\xdc\x89\xe6\x67\xe6\x3b\x85\xe6\x66\xbb\x2c\x90\x3e\xe1\x9a\x93\x1e\xc8\x52\xe7\x71\xa0\x4b\xb5\xde\x76\xad\x9f\x36\x95\xf9\x55\xa4\x0f\x57\xbd\xf4\xbf\x31\xe5\xa7\xc1\xaa\x4f\xec\xee\x5b\x60\x9a\x30\x0d\x94\x9f\x2d\x8a\xaa\x0f\x02\xf7\xfc\x54\x9a\xa7\x61\xd1\x7e\x8c\xa1\x8b\x85\x07\xc3\xf6\x88\x74\xd8\xfe\x54\xfb\xd7\x95\xca\x27\x8b\x70\xd0\x4a\x61\x22\x88\x8f\xa2\xba\x57\x2b\x28\x98\x29\x3a\x10\xe5\x5a\x95\xd7\x14\xcb\x54\x28\xfd\x48\x8c\x13\x25\xc8\xb6\x22\x19\xc6\x4b\xfa\x19\x05\xde\xac\xe7\xa1\x31\x61\xb6\xf2\x1a\x68\xe5\x44\x70\x37\x88\x1d\xb2\x4d\x3f\x5b\x01\xae\xfd\x23\xd7\x58\x69\xf5\xb6\xcc\x02\xa4\xd0\xaf\xb6\xb6\x70\xe4\xa7\xcc\xce\x02\x7f\x56\x0e\xd9\x83\x55\xec\x5a\x78\x49\x6c\x47\xd6\xbf\xc4\x63\xd7\xdd\xa0\x59\xe9\x1e\x7e\x92\x6f\x95\x3f\x53\xfc\x1c\xfd\xc4\x65\x2e\x1c\xb7\x7f\x0a\xf5\xf9\x54\x9c\xf9\x47\x83\xdf\xa4\xb1\x2c\x19\x63\x99\x1f\x0d\x33\x3f\x0d\x4c\x7f\xf9\x3f\xb0\xbb\x9c\x48\xa6\x05\xd1\xfe\xad\x3d\xb4\x5f\x36\xa0\xca\x5c\xc1\xb4\x7f\x93\x07\x26\x64\x6e\x60\x42\xbe\xce\x67\xa7\xdc\x68\xba\x91\x7f\x04\x09\xdb\x41\x47\x44\x34\x4c\x6c\x5d\x49\x5e\xd7\xa0\x31\x6c\x09\xd4\x86\x3a\xf2\xd5\x19\x5d\x88\x76\x1b\x77\xfe\x85\x13\x18\x63\xf3\x2a\xd4\x8f\x77\x28\x3f\x25\x92\x0e\x46\xd6\xb3\x19\x4c\x49\xbf\x47\x17\x0b\x92\x61\xba\x10\x86\x53\x94\x48\x26\xca\xf6\x39\xa1\x9a\x8f\x55\x1e\x01\x69\x93\x4b\x19\x96\x3f\xb9\x9d\x8a\x82\x35\x7e\x97\x44\xfa\x5a\xdc\xe8\xc7\x89\xd4\x42\xda\xe3\x7f\xfd\xad\x35\xa0\x9e\x57\x75\x52\x91\x68\x80\x17\x2e\xbc\x14\x9a\xc7\x3b\x9d\xd3\x9d\x8a\xbd\x20\x33\x12\x2b\xc8\x7c\xc9\xaf\x04\x64\x3e\x5a\x88\xb8\x23\x52\x9d\xb8\x97\xbe\xe6\xe7\x6f\xf8\x95\xf0\x75\xf2\x2a\x99\x09\xf5\x98\xa7\x82\x50\x88\xd8\x67\xb4\x2c\xaa\x0e\x04\x51\x79\x7f\xb0\xae\x88\xbd\x20\x8f\x15\x49\x4e\xc5\x19\x85\xa8\xec\xcf\x5b\xf2\x07\x1e\x53\x85\xa8\x16\x4b\xa1\x40\x82\x76\x36\x69\x31\xd4\x10\xf3\x78\x3c\x31\x7f\x1e\x9a\x3f\x4e\xb0\x22\x9e\x66\x2f\x22\xec\x47\x21\x64\x2c\xc2\xee\x01\xce\x1e\x2b\x27\x52\xe5\x55\x2d\xde\xa2\x74\x93\x0b\x9c\x68\xec\xc2\x28\xaa\xca\x8c\xd8\x17\x45\xcc\xda\x65\x56\x0f\x63\xf2\x2d\xaa\x8d\xf8\xaf\xb5\x2d\x74\x4b\xa6\xa8\x93\x29\xd6\x92\x29\x40\x3a\xe1\x0c\x37\xe8\x1a\xbf\xb1\x47\x00\x90\xec\xc8\x4c\x2d\x1d\xeb\x89\x80\xc4\x3c\x86\xc9\xe8\x16\x62\xd3\x84\x64\x7d\x13\xbe\x4b\x96\xd9\x30\x06\xc6\xf1\xcc\x3f\xfb\x43\x12\xcf\x14\xf5\x28\xf9\x4c\x89\xf2\x23\x9e\xb7\x2e\x36\xeb\x4e\x62\x5a\x97\x40\x0c\x86\xad\x21\x66\x1a\xbe\x4b\xd6\x83\x08\x9d\x2a\xd1\x41\xbb\x4d\x0a\x22\x18\x1e\x87\x3e\xa0\xb6\xf9\xf0\x52\xad\x0c\x9c\x51\xe2\x7b\x26\x52\x7d\x24\xe3\x2b\xdc\x01\x78\xa6\xf8\x95\x18\xae\x7c\x5b\x8b\xfb\x71\xe2\x9d\x24\xf4\xc5\xee\xbd\x83\x1e\x75\x22\x6e\x5e\x29\x62\x3d\xb1\x44\xe7\x27\x60\xdc\xe8\x68\x4e\xe8\x5d\x86\xda\x49\x36\xec\x05\xe4\xa5\x22\x9c\x02\xee\xb4\xf6\xcb\x49\xd6\x38\x89\xc7\x24\xa8\x21\x41\x18\x14\x3f\xa8\xac\xf4\x8d\xba\xd6\xb3\x3f\x2d\x92\x8c\xed\xb8\x51\xf4\x6f\x54\xb5\x81\xfe\x54\x98\xae\x99\x24\x11\xb6\xc8\xbf\x30\x8b\xb0\xcf\xe7\xf3\x29\xe9\xd3\xc5\xda\x78\xc6\x24\x81\x2f\xa2\x16\xf2\x45\xef\x54\xbb\x7d\x11\xa7\x3a\x51\xb7\xfe\x79\x42\x14\x05\x49\x6c\x9a\x06\x6c\xe9\xf3\xb5\xbb\xc0\xab\xb1\x15\xa8\x8c\x21\x72\xac\xb9\x16\xe8\x33\xf7\xc0\xc1\x0b\x9f\xd5\xda\x14\x0a\x9b\x91\xe6\x3a\xc0\x3a\xbc\x77\x4d\x77\xbe\xeb\x9d\x5f\xc0\x8a\x1d\x93\xa0\x1e\x50\x0c\x2f\x56\xb3\x95\xdd\x2d\x18\xda\x7f\x82\xcf\xca\xdd\xf7\xaf\x07\x9a\x7c\x95\xa4\x11\x50\xe7\xe6\x36\xa5\x77\x8f\x25\xc9\x30\x00\xac\x4a\x70\xba\xbc\x03\xa4\xea\x3b\x40\x78\x5a\xda\x21\x54\xaf\xd9\xfb\xb1\x21\x77\xab\x62\x28\xf2\x33\x3c\xee\x29\x26\x45\x87\x97\x1a\x77\xf1\x83\x23\xed\xee\xc5\xbf\xcd\x79\x7d\x45\xf4\xac\xa2\x77\x2f\x95\x3b\x2e\x36\xd0\xbd\x08\x52\xf3\xcf\x85\xce\x37\x69\x1f\xdd\xbe\x18\x99\xb9\xa2\x88\x1c\x1e\x49\x62\x64\x1a\x0d\x8e\x25\x19\xe1\x86\x9f\x9d\xc4\x18\xb5\xab\xea\x51\xbb\x55\xa0\xdc\xdb\xa6\x68\x29\x56\xab\x53\x75\x46\x28\x3c\xde\x14\xb7\xab\xd9\x72\xc0\xc9\x0b\xe5\xa7\x91\x4a\x26\x13\x84\x84\xc7\x8b\x66\xe0\x63\xbd\x65\x18\xea\xa8\x09\x75\xce\x0c\xe8\x0d\xf1\x1e\xeb\xc9\xcd\x6b\x7d\x25\xc6\xc6\x0c\x2b\x7e\x9e\x24\x53\xa6\xf3\x46\x18\xdc\x9f\x14\xfb\xab\x04\x33\xa5\xc6\x1b\x31\xd5\xe1\x87\x95\xd7\x2f\x61\xbd\x41\xd4\x6e\x27\x87\xdc\x2e\xa2\xb1\xd1\x66\xaa\x43\xfa\xc6\xbc\x67\xf2\x34\xe9\x74\x70\x23\xec\x54\x75\x3a\x67\xed\x36\xe9\xf7\x18\x8b\x87\x44\x77\x3a\x20\x58\x9f\x06\x44\x74\x3a\x80\x69\x1c\x18\x23\x07\xbb\x7b\x0f\x1e\xb4\x63\x3a\x6c\x94\x0b\xfa\xd5\xfe\xf7\x4b\x12\x0d\x55\xd0\xed\xe7\x51\x58\xf0\x63\x43\x54\x98\x3a\x2c\xcd\xa2\x7a\x15\xba\x4e\x29\x1d\x4a\xa2\xfd\x34\x0b\x53\x6d\x0c\x93\x1d\x4a\x87\xaa\xb3\x13\x74\xfb\x81\x24\xfa\x54\x9d\xd1\xa1\xf7\xa7\x44\x77\xed\xa9\x3a\x1b\x76\x77\x02\xd5\xe9\x9b\xaf\xdd\xfe\x82\xc2\x93\x4d\x61\x69\xf5\x7a\x8c\x76\xb3\xa0\xf0\xab\x5a\x99\x05\x61\x20\x2b\x2b\x4c\x16\x8a\x9c\xae\xa7\x3e\xb0\xfb\xd7\xfa\x70\xef\xc1\x7c\xbe\x7f\xbf\xca\xa0\x26\x2b\xad\x8a\xc2\x33\xb5\x31\xbd\x45\x6f\x50\xf5\xcb\x40\x55\xca\x69\x83\xd8\xee\xde\x03\xdc\x9e\x3b\xec\xcd\xe7\xf2\x90\x65\xb9\x27\x4e\x30\xf9\x8b\xe8\x64\x8b\x32\x26\x47\xd9\x71\x78\xad\x36\xa4\x76\xe8\xad\x6c\x9b\x58\xd5\xb6\xbd\x07\xff\x14\xf3\xb9\xf8\xe7\xfe\x7d\x1a\x8f\xc9\xc1\xbe\xfd\x75\xbf\x87\xfa\xa1\x38\x7c\x78\x7f\x3e\xef\xf7\x76\x0e\x45\x4e\x8e\x66\xfd\x83\x5f\x74\x47\x74\x1f\xdc\xb7\x7e\xbd\xf2\xc5\xfe\xfe\xa0\xfe\x62\xef\x41\x45\xb4\xc4\x70\xc0\xc1\x5f\x31\x7f\xe6\xe4\x4d\x40\x86\xe6\x87\xbd\x61\x31\x03\x02\xde\x91\x95\xdf\x3b\xca\x9d\x33\x49\x63\x1a\x74\x3a\x74\x60\x98\x3e\x19\x12\xc1\xfa\xa0\x6d\x3a\x97\x25\xa6\x4f\x68\xbb\x6d\x60\x17\x25\x9b\xf3\x9c\xc3\x6d\xfa\x9c\x5a\xef\xba\x11\x81\x0d\x41\x69\xe3\x3a\x24\x93\x62\xd6\xfa\xfc\xfa\xd5\x73\xad\xa7\x1f\xac\x1a\x62\x46\x0e\x4e\xc6\x44\x33\x4e\x8d\xb5\xbc\xbc\x07\x3d\x55\xc9\xb9\x12\x69\xea\xd5\x24\x4a\xd1\xc6\xc7\xc9\xd5\x34\xd3\x3c\x9c\x88\x76\xfb\xb1\x99\x2f\x9c\xdc\x45\x51\x60\x94\x01\x3e\x12\x23\x88\x46\x81\xf4\x75\xa2\xf9\xc4\xae\x06\x2b\x82\x0c\x3c\xa1\x54\xa2\xbc\x5a\x5c\x1e\x39\x96\xe4\x68\xbc\xb6\x84\xb6\xea\xd1\x72\x99\xe3\xf5\x65\x0c\x41\x8d\x02\xab\xcc\xbc\x15\x47\x27\x46\x1c\x77\xfd\xd3\x69\x22\x53\xf1\xf1\xc3\x2b\x08\x8f\x83\xbb\xe8\x22\x90\x7e\xaa\xb9\xce\x52\x88\x5e\x95\xcf\x27\xe2\x46\x2f\x20\xfa\xb1\xe2\x88\xcb\x76\x62\x13\x94\x54\x59\xd8\xaa\xa9\x20\xf3\x1c\x2f\xde\x9f\xea\x4f\xe9\x51\x58\x9d\x6e\x06\x38\x44\xd6\x28\x31\x26\x5c\xc1\x84\x5e\xd0\xf2\xe8\xa0\x77\x98\xa0\xde\x16\xe5\x12\x2b\x96\xe7\xa4\x07\x89\xd1\xa0\xdd\x57\x3b\x9d\x84\x82\x62\xb7\xe4\xcd\xd8\x4d\xfe\x5d\xad\x11\x97\x9a\x9c\x18\xab\x76\xc8\x3b\x1e\x60\x56\x05\x1e\x70\xba\xc0\x63\xac\x65\xe8\x19\x91\x66\x79\x3d\x9a\x4c\x3e\xe4\xbd\xf2\x5c\xf0\x91\x50\x29\xa1\x14\x22\xb7\xb7\xec\x91\x2b\xdc\x9b\xb4\xfd\x73\xb8\xd3\xeb\xcd\xe7\xbb\xbd\xde\x21\x2b\x5e\xd1\x52\x2c\x1a\xd5\x9c\x55\x85\x4d\x5f\xc2\xb1\x24\x37\x63\xb3\x4e\x0f\x14\x53\x44\x37\xb4\x86\x23\x1b\xfb\x17\x90\xb5\x85\x67\xe4\x76\x6c\x13\x8a\x99\xe5\x93\x48\xc8\xfc\x08\x37\x5f\x17\x74\xa0\xd5\xed\x9d\xf4\x93\xa9\x90\x24\xf3\xa3\xd7\x90\xf9\x23\x0e\x5b\xbd\xe5\xec\x13\xc8\x5b\x97\x63\x62\x00\x0c\x9a\xad\xf5\xd9\x6a\xa2\x1f\x03\xed\x87\x03\x9b\x35\x0e\x83\x48\xf2\x99\x66\xbb\xc8\xcc\x10\x9b\xdd\xcc\x0f\x8d\xa5\x5d\x92\x7b\x3b\x45\xc1\xa7\xfc\x10\xa4\x3f\x8b\xf5\xc5\x63\x25\x46\x42\xea\x98\x4f\x52\x63\x03\x8d\xcc\x2c\x55\x7e\xb4\x4f\x8d\xc5\xec\xe7\x33\xc0\x14\xd9\xf7\xb9\x6d\x58\x91\x5e\x20\xf3\x23\x5e\x45\x61\xa4\x42\x8e\xc8\xd3\x31\x11\x74\x48\x56\xd0\xe3\xe5\xe6\x73\xd7\x50\xe0\xd9\xc3\xee\xc2\x0f\x69\x80\x4f\xae\x12\xe2\xf3\x30\x51\x9a\xd0\x45\x53\xdb\xa9\x87\x9a\xf6\x20\x0c\xb4\x1f\x02\xaf\x4d\x01\xc9\x8c\x68\xa8\x9c\x6f\x33\xf2\x65\x5c\xe6\xa7\x47\xba\x3f\xaa\x35\x69\x6d\xbc\x73\x6f\x20\xfd\xe8\x6d\xbb\x4d\x74\x87\x79\x57\x9e\x99\xdf\x91\xc8\x7f\xc6\x9e\x1d\xc7\x8a\x7d\x3f\x88\xf3\xa7\x37\x53\xa4\x6a\x79\x24\x8f\xb4\xd1\xac\x1f\xad\xd7\xf9\x65\x36\x99\xa0\xc1\x77\x95\x97\xdc\x9c\x52\x16\xf2\x5d\xc4\x9e\x99\x99\x36\xd4\xa4\x48\xe1\x03\x09\xeb\xf6\x07\xbc\xd3\x39\x94\xed\x36\x86\xc3\x8a\x1b\x11\x91\x88\xd2\x76\x3b\xd9\x72\x21\x07\x15\xc2\xb8\x8c\xe0\xea\xf6\x61\x9c\x87\xab\xc4\x66\x7a\xc7\x85\x9f\x9f\x89\xd3\xf8\x6c\x30\x3e\xed\x76\xe3\x33\x16\x1a\xc5\x39\x44\xb5\x39\x2b\xd2\xf8\x7d\x0b\x41\x9c\xf6\xce\x40\x58\x11\x01\x1c\x3e\xe0\xa9\x7d\x1b\x8c\x52\x54\x5a\xce\xe6\xea\x15\xd3\x90\x27\x18\xd4\xee\xb2\x62\xb3\x65\xe5\x1e\xa4\x5e\x99\xef\xae\x30\x80\x1a\xba\x66\x3c\x26\x51\xa7\xf3\x4f\x96\x95\x5a\x88\xe3\x78\xe1\xea\x1c\xb5\xf3\x22\x8c\xa3\xbb\x0b\x45\xba\x68\x65\x1a\xa9\xca\x14\x4f\x25\xe4\xa9\x3a\x1b\xe8\xd3\x6e\x17\xc3\x59\x2f\x35\x11\xd8\xd8\x32\xcf\x3f\x36\x57\x42\x05\xbe\x54\xc5\xce\x19\x44\xf0\xa1\x54\xf5\x29\x7c\xdf\xac\x09\xe9\x62\x4c\xdd\xb1\xac\x8d\xec\x40\x96\x32\x39\x2a\x86\x55\xd0\x7c\xff\xcc\x6a\x20\x65\x00\xab\x3d\xbc\xc3\x21\x97\xd7\x94\xd6\x11\x97\xde\xfd\x06\x3c\xa5\xb0\x72\x60\xde\xad\xb5\x80\x65\x7b\x53\x8a\xba\x8d\x19\xf0\xfe\xc7\x86\x92\xea\xf0\x50\x2e\xe8\xe0\xf3\xda\x7a\xd5\x3f\xff\x29\x37\x64\x3a\xfe\x27\x7e\x1e\xd4\x12\x2c\x8a\x75\xc7\x21\xcb\xf3\x5e\x2f\xa4\x16\xea\x9a\x4f\x5c\x2b\xe8\xb1\x24\x62\xe3\x69\xaf\xb2\x90\xa2\x8d\xf3\xb8\xbf\x39\xd1\xed\xad\x19\xf9\xa6\xc1\xfb\x53\xb6\x5a\xad\x96\x07\x33\xf2\x18\x7f\x79\x20\xdd\xfd\x90\xdf\xdd\x12\xb7\xe4\xab\x5e\xdb\xc0\x8e\x51\xf7\x7b\x46\x92\x95\x85\xff\x70\x0b\x3f\xbc\x7f\xc8\x88\x64\x9f\xf1\xa8\x55\xbb\x2d\x0f\x59\x7f\x67\xa7\x82\x95\xba\x82\x2d\xc1\x0e\xd9\xc3\x5e\xbb\x7d\xb0\x7f\xc8\x1c\x7f\xa8\x5a\x0d\xb9\x7f\xbf\xdd\xde\x7b\x50\x83\xd4\x0e\xa4\x25\x66\x3e\xc7\x7a\xe6\x73\x44\xe2\xdc\x85\xa1\x6b\xd9\x05\xaa\x0b\x28\x6a\xef\x7d\xee\xdc\xf0\xb0\xa6\x44\xe4\xbc\xf7\x3c\xb4\x69\x50\xf1\xd5\xec\x2d\xc4\x9a\x5d\xc1\x58\x33\x52\xf3\x54\x38\x87\x8d\x95\x1f\x61\x7e\xe1\x11\x64\xeb\xd8\xec\x96\xc4\x1a\xa4\xbf\x3d\xd4\x41\x86\xb1\xd3\xdc\x8c\xb0\xfb\x31\x03\xfc\xc7\x22\xb6\xe6\xc7\x9a\x73\x7d\x36\xaa\xb6\xbb\x83\x3b\x64\xdb\xf5\xac\xb8\x46\xf3\x32\x64\x48\xe0\xec\x16\xdd\xeb\x21\x68\x3f\x82\x5b\x32\x46\xcc\xa0\x7d\x81\x39\x91\x33\x50\x8c\x83\x66\x02\xcf\x7f\x84\xab\x34\xc7\x16\x16\x5a\x6b\x07\xce\x48\xa2\xc1\x66\x18\x46\xc3\x03\x3e\x1b\x2e\x82\x74\x25\x2a\xc9\x24\xfc\x04\x3a\xe9\x62\x9a\x68\xd6\x87\x91\x66\x3b\x70\xad\x59\x0f\xb6\xf5\x5a\xd9\xb1\xa0\x70\xb5\x52\xf7\x2d\x73\x40\xc0\x85\xde\x74\x1e\xb8\x4c\xf3\x4b\x61\xba\x01\xb0\xe7\x02\x9e\x6f\x00\xec\xbb\x80\xb3\x35\xa4\xe5\x27\xfe\xe0\x76\xcd\xf7\x9d\xfc\xfb\x8d\x66\xbf\xc2\xe5\x5f\x20\x39\xd2\xcc\xd4\xbb\x80\x63\xcd\x94\x84\x13\xcd\xde\xc0\x53\xcd\x66\x12\xbe\xac\x1e\x90\x8e\xe7\x2d\xe0\x9b\x5e\xef\x91\xfc\x03\x24\x7c\xb2\x79\x66\xe1\xf1\x5a\xb8\x0f\x64\x46\x7e\x07\x9b\x27\x86\xc2\x57\xcd\x36\x32\xed\x96\x6e\xa6\x71\x16\x98\x4f\xd7\x32\x2c\xe6\xf9\x2f\x52\x3a\xbb\x0c\x0a\x2f\x35\xfb\x01\xaf\xfe\x02\x79\xbf\x48\x9d\x5d\xaa\xe4\x79\x0d\x12\x32\xa6\xba\x7d\xac\x21\xd1\x58\x6e\x20\x99\x00\xc5\x32\xd0\x8c\x9b\x0a\xde\xe8\xf5\x33\xf7\x95\x9d\x39\x9f\x4d\x03\x9f\x6f\x80\x7b\x69\xe0\x66\xe4\x8d\x86\x1e\xfc\xae\x88\xa2\xdd\x3e\xb5\xb9\xbe\x3f\xd7\x87\xa0\x08\xee\x75\x4c\xea\x9e\x93\xd1\xbb\x96\x00\x54\x0d\x55\xd0\xef\xed\xec\xfd\x42\x54\x17\x3f\xd0\x4e\xad\x60\x9f\x76\x31\x59\x64\xe7\x60\x7f\x7f\xf7\x60\x01\x2f\xd6\xcc\xe4\xaf\x1a\x12\x9d\x4f\xac\xb7\x7f\x87\x1c\x74\x6d\x36\x69\xfa\x4a\xa4\x51\xd1\x64\xbe\xde\xf7\x29\x0d\xec\xab\x8e\x3c\xed\x57\xef\x77\x28\x45\x75\x07\x3e\xac\xeb\x36\xef\x4f\xf9\xa7\x24\x5e\xe7\x8b\x26\xb2\xd3\xa7\x1d\xe2\xd1\x96\xd7\xf9\x4d\x91\x4f\x3a\x4f\x64\x02\x9f\x56\xb6\x68\x46\x7e\x98\xee\xfe\x4c\x17\xf0\x63\x19\xb9\x0c\x72\xbe\x58\x91\x81\xc8\x3d\x02\x25\x91\xf7\x96\xbc\xb0\x6f\x8b\x7c\x9c\x7d\x9b\xcc\xa1\x0a\xab\x2d\xd3\x3d\x80\x74\xae\x00\x21\x7f\x28\x62\x16\x00\x6e\x57\x2a\x65\x56\xca\x19\x39\xd6\xa0\xb5\xe9\x70\x62\xb4\x26\xa3\x6b\x23\xfb\x65\x43\xcf\xf7\x3a\x3a\xf0\x4e\xff\x81\xd9\xca\xfe\x71\xe6\x59\x8e\xe7\x86\x21\xcb\x23\x22\xad\x72\x23\xbe\x88\x36\x08\x21\x62\xde\xa9\xed\x2b\x9f\xd3\x8e\x77\xe6\xb9\x78\xa3\x4d\x58\x76\x82\xe2\x94\x0e\x37\xed\x4a\xfc\x10\xa7\x4c\xe2\x87\xc5\xa9\xb0\x98\x11\xe5\x87\x43\xef\xe4\x42\xb4\x5e\xa6\x89\xf4\x9f\x88\x28\x19\x09\x3f\x91\xe2\xed\xb8\xc5\x75\xeb\x5b\x9a\x48\xaf\x63\xd5\x0f\x0f\x5e\x60\x33\x03\x6f\x09\xd4\xa3\x1d\xaf\x35\xe6\xf1\x04\x73\xb2\xb5\xf4\x85\x68\x8d\x93\xc9\x24\x99\xd9\x8c\x52\x5f\x34\xf9\x5d\x91\x84\x1a\xa8\x19\xbf\x4d\x03\x6f\xd0\x50\x6c\x8c\x32\x83\x0d\x8a\x61\x46\x9e\x6b\xf8\xa0\x31\xfa\x66\x21\x19\x67\x82\x25\x78\xfb\x4a\xc6\x94\xd3\xc4\x5c\x0b\xf5\x3e\x70\xd9\x8a\xa5\x4e\x5a\x7c\x45\x0b\x30\xb5\x9d\x4c\x5a\xd3\x24\x4d\xe3\x30\x9e\xc4\x3a\x16\xa9\xd7\xb1\x8d\x5e\xdf\xbe\x2d\xaf\xda\xfe\x8d\x70\xe0\x13\xcc\x36\x9f\x0f\x7c\xcc\xb0\xfc\x3b\x95\x84\x13\x71\x65\x2b\x31\x4d\xc6\x4d\xd6\x75\x58\x3b\x5e\x60\x9a\x89\x1a\x5c\xb0\x5c\xf6\x3c\xbe\x16\xd2\x62\x40\x38\x8f\x76\xc8\x6f\x8a\xcc\xc8\x53\x0d\x7b\x80\x5d\x97\xbf\x8e\x8c\xe8\x7a\xa2\x37\x1c\xfe\x75\x17\x2d\x88\x02\x0d\x23\x3c\x28\x0d\xbf\xe2\x81\xec\x67\x9a\xbd\x87\xd7\x6b\x45\xda\x77\xa2\xe8\xbd\xef\xd6\x88\x7c\xaf\xd9\x33\x4d\x66\xe4\xb5\x86\x1d\xd8\xdd\xa1\x14\x3e\x6a\x76\x43\x9e\x18\x61\xf7\x5e\xc3\xaf\xe6\x3f\x0a\x8f\x34\x8b\xe1\xfb\xfa\x85\x1a\x8f\x3e\x43\xbc\x56\x19\xb7\x75\xbd\xd3\xec\x08\x7e\xd3\xec\x23\xfc\xbe\x7a\xed\x2a\xb2\xc9\xc2\x1f\x6b\xab\x2a\x6e\x5a\x18\x62\xf6\x6e\x90\x82\x3d\x03\x25\xd8\x36\x68\xb1\xda\x51\x3d\x28\x0c\xf6\x19\x51\x02\x76\x77\x40\x5a\x3f\x56\x08\xda\xce\xaf\xbc\x2b\xb5\xcf\x17\x45\x06\x3c\x51\xad\x66\x2f\x50\x64\xd8\x55\x05\x8d\x74\xf1\x57\xf5\x3c\xd3\x44\xdd\xdb\xdd\x29\xe5\x4c\xe9\xf7\xae\x08\xf0\xf9\x40\xb2\x19\xd1\x02\x25\x5d\x81\x39\x5b\xc6\x8c\x49\x03\x45\x81\x79\x77\xe7\x17\xe5\x0b\x10\xec\xb7\x7c\xc4\x76\x77\x40\x77\xfb\x94\x82\x64\x72\x68\x78\xd0\x3f\xa7\x81\xf2\xcf\xc1\x60\x17\x06\xbb\x29\x3d\x28\xcf\x6f\x3f\xd1\xf0\xbb\x81\x1a\xd3\x8e\x86\x19\xf9\x03\x43\xe7\x7f\x79\xaf\x29\x42\x56\x59\xf5\x5c\xc8\x9c\x0b\xf0\x33\x05\x2e\xd8\x53\x88\xc4\x86\x9d\x98\x7c\xd1\x56\x87\xbd\xaa\xdd\x99\x80\xad\x3e\xdc\x9d\x07\x02\x44\xa0\xef\xed\xee\xcc\x7b\x30\x0e\xb2\xdc\xc5\xc2\x59\xae\x59\xdd\x92\x47\xd8\x26\x74\xc0\x0c\x8c\x6a\xa9\x98\xea\x9a\x46\x32\x0d\xc2\x8e\x16\x07\x41\x21\x63\x19\x9e\x58\x5e\xd9\x61\xbd\x43\x59\x9e\x22\xfd\xf7\xdd\x1d\x10\x0c\xf1\x6a\x90\x5d\xed\xec\xef\x5d\x93\x48\x98\x9a\xba\xda\xd4\x20\xe1\x33\x54\xe1\x1e\x1f\xb5\xe1\x66\xb1\x82\x47\xb7\xa4\xbf\xbd\x80\xb1\x60\xa1\x84\x50\xb0\x54\x42\x2a\x36\x2b\x70\x93\xfa\xf7\x15\x0b\x57\xc1\xd9\x8d\x00\xad\x7e\x23\x30\x6b\xa7\x94\x57\xc5\xed\x66\x8b\x05\x8c\x04\xe3\x1a\xae\x05\xdb\x7c\x16\xff\x8e\x1f\x04\x1c\xc2\x28\x50\xc0\xb3\x40\x40\x98\x05\x1a\xc2\xdb\x40\x42\x74\x12\x60\x5f\x6e\x0b\xa6\x25\x5c\x89\xcd\xf3\xf2\x42\x30\x29\x61\x2a\xd6\x0a\x82\xc3\xfe\x50\x05\xb7\xe4\xc2\xf0\xde\x95\x3d\xa6\x68\xd8\xe6\x5c\x30\x2e\x61\xb6\xb1\x9c\xe7\xd9\x82\x3d\xc8\x6f\x52\xb9\x15\x6b\x8e\x4f\xf5\x30\x4e\xa6\xa6\xd6\x80\x60\x7b\xbb\x78\x58\x61\x6f\x9f\x31\x3d\xec\x07\x3d\xc8\x98\x18\x64\x55\x68\x53\xa7\x53\xc5\xdf\x36\x12\xb4\x63\x50\x64\xbe\x4d\x55\x9e\xe6\x3a\xd2\x03\xc5\xfa\xbd\x5f\x54\x87\x3b\xdb\x31\x19\x63\x62\x78\xa4\x83\x4b\x4d\x6c\x4d\x5d\x15\x28\xba\x80\x9b\x75\x73\x22\x1e\x93\xc8\x54\x32\x9f\xcf\xc8\xb6\x00\xef\xff\xf2\x20\xa3\x4e\x1d\x96\xa2\x19\x39\x17\xe0\x05\xe6\x1b\x52\x93\xaf\xe3\x1c\xd7\xf1\x3a\x70\xc4\x38\x9e\xfb\xbc\x15\x64\x46\xa6\x02\xa2\x4e\x1f\xb3\xf5\xe4\xe2\x86\x57\xa6\xe3\x91\x1e\x70\x56\xfa\x5c\x2f\x35\x19\x93\x6b\x81\xba\xec\x4c\xd8\x68\x62\x5e\x9c\x6e\x59\x2c\x01\x65\x70\xa4\xcb\xaf\x14\x2e\xc5\xca\xd5\xc8\xb6\x4e\x34\x1b\x94\xe5\x0d\xba\xe7\x81\xf5\x40\x65\xa6\x41\x19\xcb\xaa\x7c\x5a\xd7\xe4\xc6\xd2\x32\x35\x9c\x2a\x28\x62\x44\xca\x32\x97\xa0\x1c\xcc\x60\x2a\x92\x59\xc0\x91\x58\x61\x30\x58\x4a\x74\x93\x12\x91\x53\x32\xf4\xc0\xaa\x7e\xc2\xa6\x19\x15\x15\x25\x37\xe4\xd2\x54\x71\xa9\x6d\x7f\x8a\x4e\x1f\x34\x35\xf4\x20\x35\x02\x1d\xb6\x75\x50\xdb\x33\x86\x94\xe3\x95\x22\x28\xd2\x4e\x7e\xd8\x9c\x10\x9d\x13\xf2\x6f\x45\x12\x5c\x63\x32\xdd\x69\xa6\x2b\x42\x6e\xc9\x91\x4b\x88\xee\xf4\x31\x19\x1a\x92\xa1\xdd\xad\x8e\x1c\xf0\x28\xbf\x94\xee\x44\x30\x21\xe1\xa9\x58\xad\x4f\x9f\x08\xc0\x6b\xb6\x82\x7b\xf7\x3c\x90\x74\x38\x23\xc7\x66\x92\x61\x15\xf7\x41\x52\x1a\x54\x30\x69\x0d\xa8\x6f\x81\x1e\x20\x90\x51\xf7\xbf\x2c\xcf\xc8\xc1\x80\xf6\x16\xf0\x4d\xb0\x23\x09\x52\xb2\x6f\xc2\x4c\xc6\xc7\x6b\x99\x45\x54\x09\x62\x04\x72\xb1\xb0\xc7\x4f\x78\xf1\xde\x72\x77\xc2\xb8\x7d\x9f\xd8\xd1\x4a\x10\x36\x71\x60\x2d\x84\x93\x34\x25\x83\x19\x86\x9c\xcd\x30\xa2\x0b\x2f\x53\xf0\x39\xec\xf7\x7a\x87\x7a\x88\x66\x92\x21\xe3\x85\x36\x2a\x6a\x70\x43\x1e\x0b\xeb\x35\xe9\xf4\x51\x09\xad\xba\x76\x19\x95\x5a\xf3\x55\x35\x5f\xd7\x2f\x4e\xf8\x2a\xd6\x6f\xb5\x97\xf5\xf7\x2c\x17\xbd\xac\x71\x91\x7b\xd5\xcb\x2d\xf9\x2a\x60\x7d\x1c\x90\x06\x7b\x09\x58\xe9\x5c\xa1\xf0\x4a\xb0\xa7\x12\xde\x88\x75\x41\x23\x33\xf2\x4a\xac\xda\x61\xfb\x26\x88\xc2\xa8\x1b\x8b\xe6\x79\x8d\x7c\x8d\xc1\x67\xab\x51\xa8\x9f\x41\x3d\xcb\xef\xfd\xa5\x0b\x33\x85\x6d\x15\x9f\x05\xfb\x20\xe1\xc5\xda\x45\xe1\xab\x24\x88\xf1\xb3\xb0\x6d\xa4\xf6\x96\x81\x0d\x9e\xa6\x37\x2b\xab\xef\x2d\x80\x28\x36\x23\x2f\x05\xbc\xc8\x51\x01\xf6\xeb\x73\x41\x12\x4d\xe1\x9b\x20\x9f\x29\xe4\x56\xa9\xd8\x50\x01\x32\xf7\x82\xc2\x07\xb9\xde\xbb\xf2\x46\xe4\xcb\xd7\xe0\xad\xf4\x4f\x78\x7a\xc9\xee\xc2\x40\x4a\x88\x02\x2e\x8d\x92\x2e\x41\x04\x1f\x24\x8c\xcb\x73\xc9\x55\x50\x91\x70\xf4\x07\xfe\x2a\xd8\xea\x43\xf8\x2d\xf0\x3c\x08\x2f\x6b\xd9\x4e\x3f\xd4\xe0\x44\x30\x4d\x20\xfc\x52\x83\xf8\x54\x83\x38\x09\x3e\x08\xe2\x79\x14\xf8\xa7\xe2\xe9\x3a\xb8\xe3\xdf\x82\x23\x0d\xfc\xd2\xfc\x8d\x6e\x02\x09\x7c\x8a\x2f\x14\xfe\xfd\x81\x7f\x8f\x70\xd2\xa7\x65\xf9\xcf\xc5\x53\x38\x32\xdf\xc3\xf7\xc5\xef\x97\xc1\x56\xdf\xcd\xde\xe7\xd4\x4f\x66\xe4\x26\x41\xf1\x8d\x52\xe5\x36\x81\x3e\x48\x1a\x48\xda\xf1\xee\xf1\x69\x7c\xef\x7a\xc7\xb9\x1f\xf0\x89\xd8\x98\x06\xf6\xd7\xfa\xe7\xfd\xc6\xe7\x67\x62\x95\x9b\xad\xca\x2e\x57\xff\xbc\xdb\xf8\xfc\x5e\x6c\xcc\x31\xfb\xb1\xfe\x79\xaf\xf1\xf9\xd1\xe6\xba\xbf\x6f\xae\xfb\xdd\x66\xe4\xbf\x6d\x6e\xf7\xef\x9b\x29\xff\x63\x73\xa7\xca\x6c\x23\xe5\x2a\xdb\x58\x5a\x67\x1b\x29\x17\xd9\x46\xca\xb3\x6c\x63\xb7\xf0\x06\x69\xcd\x96\x45\x9b\x8b\x27\x99\xbb\x57\x8e\x46\x86\x6d\x1d\xac\x5c\x27\x5f\x27\xc6\x48\x99\x91\xdf\x93\xdc\xed\x69\x9d\x42\x15\xbe\x38\xdb\x7c\xb3\xf1\x2d\x79\x8f\x28\xec\xfe\x71\x95\xde\x23\xab\x25\x1c\x7d\x94\x34\xf7\x25\xcf\xc9\x15\x8a\x25\x4d\x0b\x9f\xdd\xad\x70\xf6\xa4\x95\xbf\x3d\x4c\x32\xf2\x8f\x17\xd2\x5e\x2c\x11\x4b\x2d\xce\x85\x0a\x5a\xde\x3f\x3a\xb2\xf3\x0f\xef\x1f\x34\x88\x62\x8c\x37\x28\x96\x9f\x24\x23\x79\xb6\x6f\x31\xb2\xae\x19\x4d\x3b\xc4\x6b\x8d\xe2\xf3\x58\xa7\x80\x69\xf4\xcf\x13\x6d\x3f\x61\xdd\x46\xf6\x41\x16\x13\x1d\x13\x85\x3b\x92\x55\x4a\xd2\xcc\x35\x7e\x9c\x9b\x80\x33\x22\xab\x83\xb6\x1c\x4f\x5e\x84\x10\xb1\x2d\x54\x76\x07\x2b\x7a\xc9\x36\xed\x9a\x4c\x63\xc8\x40\x62\x40\x41\xf8\x2b\x48\x9f\x1f\xe3\xb6\x09\xee\x65\x72\xbc\xf1\xc9\xde\xea\x18\x95\x07\xe0\x88\x86\x6e\xdf\x48\x8f\xda\x10\x71\x4a\x03\xec\xf2\x08\x7a\x70\xc7\x8f\xd1\x11\x52\xa5\x46\x08\x8d\x85\xf3\x6b\x20\xcc\x88\xfb\x7c\xe1\x8e\xc8\xc4\x65\x8c\xf3\x98\xcc\xc8\x45\x6c\xb3\xc0\x3e\x40\xfe\x70\xdb\x3f\x72\x61\x4d\xc7\x16\xc3\x30\xe2\xb7\x81\xed\xc1\xda\x0e\xdd\xb5\xdb\x5f\x64\x46\x66\x31\xec\x81\xa4\xf3\xf9\x16\x3e\xf7\x7b\x3d\x90\xe8\x45\x34\x1f\xf0\x87\x53\x78\xdb\x29\x4c\x88\xec\xb2\x3e\xbd\xb7\x37\xef\xd1\x2e\x91\xf7\xfa\xbd\xde\xbc\x47\x3b\x44\xde\xdb\xc3\x27\x27\xb5\xce\x5f\xf2\xe5\xa5\x69\xde\x6f\x09\x46\xbf\x56\xd9\x36\xb2\x1a\xcc\xd3\xb8\x36\x20\xe1\xb5\x9b\x1f\x3e\xab\xcd\x94\xc7\x31\x9c\xc4\xb5\xad\xc5\xf3\xec\x27\xf7\x25\x6f\xc9\xf3\x18\x13\xf2\xdb\x2b\x03\x8c\xe1\x99\xd4\x30\xcd\x5c\x4c\x72\xe8\x69\x95\x09\x2f\xf0\xc6\x7c\x92\x0a\x67\xa5\xb8\xad\x81\xf9\xdb\xf3\xb9\xe7\x6d\xe5\xf7\x4f\x9b\x55\xab\x3a\x16\xee\x02\xbe\x36\x63\xfd\x35\x81\xf7\x31\x9c\x68\x22\x3b\x1e\xf3\x6a\xcc\x7e\x99\xad\xdd\xa1\xf4\xbe\x7a\x36\x45\x75\x63\xab\xf2\xa8\x46\x08\xab\x58\xe9\xa1\x65\xa5\xfa\xc4\x60\xb2\x16\xbe\xf2\x2f\x98\x15\xf3\x79\xef\x90\xdd\x12\x19\xaf\x12\x6a\xba\x46\xfb\x02\xf0\x2e\x84\xff\xf2\x44\x1a\x94\x51\x5f\x4e\x86\xf6\x3a\x87\xbc\x33\x9d\xe0\xb9\xf7\xf4\x9e\x64\x1b\x17\xa9\xa7\x9b\x97\x99\x2f\xee\xc4\x90\xfe\xf6\xf0\x24\x0b\x9e\x66\xd4\xde\xe0\x50\x9d\x16\xdc\x5c\xc7\xe3\xcd\x75\x7c\xad\x37\x41\x8d\x41\x82\x1c\xbb\x09\xd7\xeb\x00\xc5\x40\x5b\x3c\x0e\xdc\x2b\x17\x2e\xcd\xc8\xcb\xac\x2e\x22\xde\xb8\xf3\xf5\x28\x26\x1f\xc8\xe9\x8c\x8c\x62\x88\x62\xf2\x2d\x23\x3d\x4a\xe1\x55\x46\x8e\x33\xdc\x27\x01\xfc\x52\x7c\x7e\x8c\x2f\xe1\x6b\x46\x96\x07\xdb\xfb\xf3\x4f\x3b\xca\xeb\x00\xb6\x7a\x8b\x02\xdf\x4f\xa0\xb2\xe7\x14\xcb\x6b\x80\xe9\x99\xdb\x82\xe7\x8d\xd9\x97\x3b\x44\xea\xa3\xf1\xb9\x0e\x84\x21\x41\x32\x8f\xa5\xaf\x52\x92\x37\x80\xaa\x2f\x6f\x33\x77\x0f\x2b\xfc\x52\x85\x8e\x45\xcf\x3b\xc6\x40\x1e\x83\xe7\xc1\x8c\xbc\x8e\x21\xd3\xf0\x39\x33\x52\x7c\x0c\x38\xbd\x5f\x64\xf0\xce\xd4\xf5\x96\x52\xf8\x1e\x9b\xc5\x0d\x97\xc9\x8e\x32\xff\x38\x8a\x74\xbd\x86\x1f\xe8\x55\xfa\x88\xbb\x47\xc7\x98\x29\xec\x04\x27\xef\x07\xcc\x2c\xfe\x1c\xf7\x07\x38\x07\xb9\xbc\xad\x74\x35\x2e\xe9\x89\x68\x1e\x57\xb8\x5d\xdd\x73\x26\xdd\x34\xe2\x68\x86\x20\x95\x6f\x33\xfb\xef\xa5\x86\x8f\x31\xf1\xc6\xf1\x44\x0b\x65\xe4\x51\xbe\xb5\x94\xb0\x19\x79\x16\xaf\xd6\x55\x6e\xb2\x42\x88\xd2\x05\x3c\x27\x12\x3e\x90\xd3\xaf\xc4\x4b\xe3\x89\x90\x91\x18\x79\xe8\x43\xc8\x2c\x55\x5b\xe8\xce\x30\x63\x4d\xbc\x58\x5e\xc4\x61\xac\x97\x21\x44\x01\x71\x95\xad\xf8\x9a\x15\x5f\x79\xa4\x31\xad\x93\xfb\xb9\x67\x04\x88\xfd\xac\x44\x24\xe2\x6b\xa1\x3c\xb8\xcd\xd9\x8b\x78\xe7\x2a\xc9\xa6\x1e\x24\x86\x83\x4a\xbd\xa0\x77\x88\x9b\x45\x43\x6f\x58\xec\xa1\xb4\x0d\x48\xe0\x39\x22\xfe\x53\x96\xeb\x47\x5d\x7b\x7c\x6e\x7b\x3e\xcf\x9f\x46\xce\xb3\xa8\x7a\x5a\x0e\x2a\x60\x61\x81\xec\x03\xaf\x46\x79\x84\x83\x2c\xa0\xd8\x9e\xd6\x98\x3e\x5e\x63\xfa\x78\xed\x8b\xca\x39\xf5\x35\x36\x86\x0a\xca\xe3\x08\xf0\xa7\x3d\xde\x8c\x31\x21\x98\x2c\x46\xd0\xe2\x7d\x91\x64\xb4\x4c\x69\x8d\x15\xc5\x79\x45\x31\x56\x14\xfb\x11\x68\x46\x38\x8b\xfd\x11\x35\xe5\x19\xf7\x05\x44\x2c\x6e\x54\xda\x03\xee\x87\xc0\x8b\x4a\x97\x68\x48\xfc\x10\x12\x3f\x82\xc4\x1f\x41\x62\x68\xd0\xb4\x80\x34\x64\x28\x24\xa3\xb2\xc4\xfe\x2b\x7d\x38\x2a\xfa\x70\xb4\xdc\x87\xa6\x0b\x04\x36\x30\xc3\x2b\x73\x39\x13\x7e\x04\x11\x13\x86\x2c\x26\x96\x7a\x32\xc6\x55\x70\xcc\x56\xf4\xa6\xc6\xd5\xad\xea\xcd\x22\xc1\x80\xed\x4d\xb7\xa0\x60\x04\xaf\xc3\xa2\x58\x2d\x31\xf3\x4a\x50\xac\x5c\x62\xe5\x12\x2b\x97\x4b\x3d\x5a\x04\xcb\xe4\xb4\x10\x65\x06\x9c\xae\x1c\xcc\x3e\xc4\x30\x06\xb1\x44\x8b\xd3\xa7\x4f\x96\x74\x9d\x8f\x63\xb8\xaa\x6b\x31\xbf\xd6\x61\xae\xc2\x72\x93\xbe\xb2\x56\x1b\x3a\x55\x08\x77\x91\x30\x46\x7f\xf4\xd6\x58\xd3\x35\xd8\xd7\x75\xd8\x2f\xa8\x25\x24\xa6\x21\xf8\xaf\x51\x3b\xa6\x63\xf8\x1a\xc2\xb3\x8c\x78\xa7\xdd\xd3\x3f\xff\x3c\xbb\x5b\x10\xfa\x4b\x67\xe8\xc3\x9f\x7f\xfe\xf9\xe7\xff\xd8\x9e\xff\xdb\x9f\x7f\xa6\x67\x1e\xa5\x70\x4b\x5e\x86\xe8\x77\xfd\x9a\xac\x3e\x8c\x13\xfd\xb6\x30\xda\x91\x59\x04\xa8\x75\x8b\x34\x0d\xa1\xf7\x4d\xc9\xee\xdd\x15\xd3\x18\x30\x76\xed\xa5\x30\xd2\x4d\x52\xda\xf1\x16\x5e\x6d\x52\x7f\xdc\x6c\xb2\x3d\x6a\xac\xe0\xcd\x25\xfc\x7b\xc3\x22\x6c\xae\xe1\xef\xea\xdf\x1f\x36\x0d\xe9\xfa\xe7\x07\x4d\x43\xfa\xe7\xb5\xd8\x1b\x59\xd7\x62\xef\xea\x03\xf6\x87\x8b\xe9\xf7\x8c\x58\xf1\x2c\xf9\x95\xf0\xe0\x73\x48\xcc\xa8\x59\xe9\x68\xd3\x3a\xe5\xef\xbe\xe4\x42\x3a\xfd\x20\xce\xc5\x8d\x07\xbf\x99\x85\x24\xbc\x28\xde\x3e\xfd\x9e\xf1\x89\xe9\xde\xe9\x18\x9e\x84\x76\xe9\xfb\x6d\x6c\x68\x38\xa7\x8d\x05\x5a\xf2\xd5\xe1\x70\x8a\x57\x4b\xde\x8c\xfc\x6a\x18\xa1\xbf\xb7\xd7\xa3\x9d\xfb\xfd\x87\x7b\x07\x0f\x8c\x84\x52\x87\xbd\xa1\xea\xf6\xf7\x0e\x7a\x0f\x0f\x02\x45\xef\xe1\xd3\xfd\x79\xcf\xcc\x52\xfb\xfa\xfe\x2f\xda\x4c\x3f\xd1\x25\x02\xbf\xa2\x59\x22\xee\xed\x1e\xec\xef\x58\x63\xc5\xbe\x7e\x78\x30\xef\x51\x6a\x5e\xcf\x8b\xe8\xdc\x3b\xfe\x7b\x40\x24\x13\x5d\xb2\x7b\xb0\xff\x4b\xd6\x21\x59\x6e\xde\x64\xb9\x79\x43\x69\x97\x90\xfe\xfe\xee\x2f\x44\x31\xb2\xff\x8b\xec\xec\xd0\x7b\xfd\xfd\x5d\x53\xc3\x0e\xbd\xb7\x6f\xfe\xed\x03\x9f\x06\x82\xa9\x0e\x51\x87\xfd\xde\x70\x37\xe8\x3e\xa4\x10\xee\x06\x59\x67\xaf\xd7\xfb\x45\x77\xc8\xce\xa1\x18\xf6\x82\xbe\x6b\xea\x68\x5e\x9b\x3f\x32\x85\x3d\x98\x11\x9d\x82\x48\x91\x4b\x89\xd7\x35\x0c\x2c\x53\xd8\x81\x55\x9b\x75\xcd\xad\xba\x7e\x63\xab\x6e\xa7\xb1\x55\xb7\xdb\xc8\xcc\xb0\xd7\xc8\xe3\xb0\xdf\x38\x8e\x7e\x50\xbf\xfd\xb0\x75\xbf\x71\xf3\xe0\x83\x46\x22\x80\x87\x8d\xab\xb2\xfa\xbd\xe6\xd5\x57\xfd\x7e\x73\xb7\xb0\xbf\xb3\x58\x90\x19\x79\x17\xe6\x8d\xae\xb7\x7a\x46\xde\x87\x55\x6f\x9c\x38\xef\x3f\x3a\xef\x03\xe7\xfd\xf7\x35\xef\x95\xd3\xab\x7e\xfe\x7e\x17\x66\xe4\x51\x59\x31\xfe\xaf\xe3\x7d\x71\xc4\x82\xe0\x35\x55\xec\xc2\xe6\x30\xb5\xe2\x3e\x3c\xa7\x66\x19\xaa\xf6\x49\xee\xa2\xe7\x01\xca\xbd\xb7\xc1\x96\x6a\xb7\xf1\x72\xf3\xf9\x5c\x0f\xf1\x79\x27\xd8\x0d\xfa\xe8\x10\xf5\xc3\x2f\xae\xab\xa9\x36\x23\x0e\x7b\xb9\xca\x3a\x49\xc9\xca\x89\xde\x0c\x26\x92\x68\x86\x29\x27\x36\xa8\xf5\x95\xa8\x7b\x62\xde\x1b\xca\x0e\xf9\xa2\xed\x33\xed\x10\xdd\xf1\x5a\x1e\xa5\x01\xee\xb2\xc5\x76\xfb\x60\x81\x13\xd8\x03\x1e\x1b\x43\x00\x46\x29\xc5\x93\x1e\x95\x9f\xcb\xa1\x6d\xab\x74\x19\xb4\xdb\x5b\xae\xcf\xa0\xf0\x20\x58\xa7\x81\xe3\x04\x73\x1b\x66\xa6\x95\xf5\x1b\x18\x15\xf9\x2a\x05\x09\x7b\xb4\x9b\x3f\xf5\x7b\x3d\xda\x29\xde\xf6\x7a\x2e\x05\x09\xff\xff\x23\xbb\x57\x9e\x3b\xb7\x79\x18\xf7\xd0\x37\x9c\x78\x57\x6f\x56\xaf\xd1\xac\x7e\xa3\x59\x3b\x8d\x66\xed\x36\x9a\xb5\xd7\x68\xd6\x7e\xa3\x59\x07\x8d\x66\xdd\x6f\x34\xeb\x41\xb3\x55\x0f\x9b\x57\xd5\xf5\x7b\x4b\xcd\x74\xfd\xee\x63\x67\x16\x11\xc1\x66\x64\x86\xc3\x8e\x32\x1b\x6f\x6b\x92\x66\x46\xe1\x6b\xa3\xb3\xa1\xc0\xc6\xf7\xba\x04\x37\xaa\x52\x7f\xef\xa0\x8f\xaf\x45\x0d\xb6\x54\xde\x8d\x9c\x55\x9d\x7e\xaf\xf7\x8b\xec\xec\xfd\xa2\x3b\xc2\xe7\x1d\x22\xfc\x70\xd8\x0f\x5c\xb7\x54\xe8\x52\xa3\x98\x21\x8e\x29\x26\x29\xdc\x71\x1d\xc8\x6e\xc4\x89\x42\xc1\xad\xdc\x80\xe9\xf3\xd4\xe8\x85\xbb\xa8\x1e\x72\xed\x60\x4b\x5d\x36\x7f\x70\xb0\x27\x90\xd1\xef\xf7\x1f\xf6\x0f\xdc\x7b\x62\x26\xbc\xb6\x84\xbf\x4c\xa1\xbf\x6b\xe5\x8e\xe3\xd2\xe3\xcd\x98\xf0\xe1\x95\x26\xde\xf1\x45\x92\x4d\x46\x78\x83\x6f\x28\x5a\xe2\x6a\xaa\x6f\x3d\x1a\xcc\xc8\x8b\x14\xb6\x35\xf1\x7e\x57\x89\x3c\x6f\xbd\x38\x7e\xfb\xe0\xa0\xd7\x6f\x8d\x13\x75\xc5\xb5\x47\x61\xda\x30\xee\xaf\x5d\x02\x5e\x91\xcb\x04\xee\x3e\x18\x41\xb3\xd5\xa3\x70\x5c\x3c\x9c\x14\x0f\x1f\x8b\x87\xe7\xe6\xe1\xbd\x31\xa9\x5e\x0a\x10\x1c\xe5\xa4\xeb\x53\xd8\x76\xd1\x46\x28\xb7\x24\xa5\x9b\xe8\xae\xbb\xa9\xae\x6a\x02\x36\x7a\x8e\x66\xd0\x5b\x2b\xdc\xbe\xd4\x43\x25\xf3\x69\xa2\x9b\x52\xe0\x2b\xd9\xea\xc3\x56\xaf\x99\x1e\xd4\xbe\xee\x37\xd3\x08\x7d\x25\x5b\x3d\x84\x6e\x30\xac\x7d\x6f\x56\x67\x42\x31\x2f\x63\x29\xd5\xc3\x73\xd3\x07\x99\x1f\x52\x08\x2f\x02\x09\x61\x12\x28\x23\xc8\x85\xeb\xb3\xac\xaf\x13\x45\x6e\xad\xdc\xf7\x17\x7e\xc3\x0e\x79\x37\x11\x86\x94\x28\xb9\x9a\x4e\x84\x16\x2d\x3e\x1a\xc5\xf2\x1c\x43\xf0\xf0\xf4\x94\xb1\xb2\x03\xe5\x87\xc3\x99\xb6\xfd\x7d\x85\xf7\x83\x06\xa6\xec\x6b\x0b\x90\xb6\xb8\x12\x98\x29\x23\x56\x62\xe4\xfa\xb1\xa6\x75\x06\xfb\xdd\x2c\x7a\x22\x85\x1b\xf2\x3d\x85\x7e\xdf\x58\x61\x29\x20\xdf\xed\x14\xcb\x9d\xe3\x25\x5d\x66\xce\x7e\x93\x39\x67\x7c\xe3\x76\xcc\x6d\xbd\x03\xac\x39\xcb\x3f\xd9\x81\x7c\x8f\x5e\x0b\xfe\x19\x0d\xa2\x14\x0d\xa2\xeb\x41\xb5\x0d\x38\x23\x17\x13\xd8\x36\x4a\x2b\x3f\xc1\xdd\xc0\xe2\x85\x31\x21\x83\x08\x52\xfb\xe2\x7a\x02\x1c\x37\xfb\xf0\xd7\xeb\xd4\x4c\xed\x2f\x14\x32\xdc\xf6\x53\x10\xbe\xb7\x1f\x46\x18\x89\xd5\xd8\xf9\xbb\x71\x5b\x68\xac\x48\x22\x19\x8e\x19\xf5\xb7\x87\x57\x93\xc0\xb4\xae\xe6\x24\xba\xe4\x1b\xf7\x8f\x8e\x36\xf7\xc6\xb1\x5b\xdd\xc5\x98\x1c\x4d\xea\x93\xf1\x64\x73\xf1\xa7\x7c\xb3\xd3\x71\xf3\xe7\x6f\x35\x8d\xa2\x9e\x60\xc7\x71\x3a\xd6\xa5\x20\x2a\xef\x9f\xad\xee\x3e\x23\xaf\x27\x36\xc6\xa2\xb4\xdd\xfe\xfc\x73\x68\x3d\x40\x3e\x3f\xa0\x94\xfa\xe1\xf0\x2b\xa6\x82\x57\x7e\x68\x1d\x68\x45\xc0\xa9\xf2\x43\x8c\xc9\xa0\xc1\x57\xe2\xdd\xf3\xe0\xa8\x3c\x7f\x84\x95\x7c\x98\xc0\xb3\x09\xbc\x22\x12\xee\xf8\x01\xee\xe5\x66\x81\xc1\x13\x9d\x18\xc6\x5f\x50\x1c\x8f\x2f\x89\x79\xe7\x38\x40\x1d\x52\x91\xec\xc1\x52\xe6\xb4\x62\xed\x2b\x6c\x33\x53\xbe\xbe\x0a\xe6\x66\x55\xf5\x61\x27\xa8\x99\x63\xd5\x87\xdd\xc0\xbd\xa4\xdf\xfd\xd2\xab\xbe\x1c\xd4\x3e\x94\x4b\xeb\xa3\x49\x63\x2d\xfd\x38\x69\x2c\xb6\xdf\x27\x4d\xc9\xf3\x7e\xe2\x0c\xde\x4b\xbe\x71\x63\xf2\x15\xdf\x6c\x87\xbe\xa9\x7f\xbf\xdf\xf8\xfc\x9c\x6f\xb4\x33\x3f\xd7\x3f\x1f\x34\x3e\xbf\x70\xc6\xe1\xad\x76\x76\x02\xfb\xf9\xb5\x26\x32\x30\xe6\x11\xaa\xa4\xd4\x37\x86\xe0\xbb\x18\x12\x4c\xe8\x4c\xeb\xf7\xfa\xbe\xad\xdb\x3d\x7a\x04\x1f\xc8\xa9\x1c\x11\x8f\x4f\x84\xd2\x2d\xfc\xdb\x9d\x71\x25\x63\x79\xee\xd1\x33\x6a\x3e\x67\x23\x82\x04\xd4\x0d\xca\x0f\x2e\x26\x95\x11\x6d\x96\xaa\x70\x84\x61\x9d\xa8\x8e\x73\x78\x1b\xf4\x72\xbd\x7b\x51\x93\x7a\x9f\xea\x44\x8c\x46\x50\xdc\x3b\x91\x8a\xfa\x74\xfd\x51\x87\xfc\x63\x02\xde\x85\x12\x63\x0f\xee\xfd\x8f\x6f\xfc\x9a\xdb\xfb\x5f\x82\x7b\xb1\xaf\x45\xaa\x09\x91\x4c\xd2\xf2\xb4\xe7\xbd\x3f\xd3\x7b\xe7\xe0\x79\x94\x62\xd2\x61\xd7\x5f\x53\xc7\xfa\x52\x34\xf7\x5f\x1d\x67\x6d\x66\x7b\xb1\xe9\xb2\x9d\x62\xc7\x21\x79\x70\x33\x22\xde\xd7\x70\xc2\xe5\xa5\xd3\x63\x12\x7b\x0b\x5e\x98\x09\x3a\x1b\xc1\x2d\x26\x73\xfb\x5c\xeb\x86\x5f\x6b\x92\xdb\xe8\x62\xd2\x0d\x60\x3a\x1e\xc1\x67\xc0\x9d\x80\xa3\x72\x94\xb4\xb8\xd1\x5d\x99\xcc\x14\x9f\x3a\x75\xa9\x8e\x17\x98\x9f\x14\x66\xe4\xb2\x84\x9d\x75\xfb\xbd\x1e\x42\x3d\x59\x1e\xbd\x67\x7c\x53\x44\xd8\x7c\xbe\x32\x00\x6c\x5a\xe2\x0e\xb5\x6c\x85\x5a\x76\x93\x4c\x4f\x62\x29\xba\xb1\x1c\x27\xad\x30\x51\x23\xa1\xba\x3d\x8f\x02\x76\x8c\xa5\x6f\x46\xd2\xb2\xd8\x98\xb7\xc6\xbc\x8b\x25\xa2\x0b\xae\x74\xeb\x4a\x75\x77\x90\xc4\xcf\x14\xb2\x11\xf1\x8e\x93\x4c\x45\x02\xdb\x12\x98\xdf\xee\x3a\xfb\x7a\x73\x77\x69\x97\xb8\x2e\xfa\x98\x11\x7d\xeb\x2a\xcc\xeb\x40\x62\xc4\x52\x1b\xd2\xab\x82\x72\x15\x9f\x5f\xe8\x6e\xaf\x85\xbd\x6c\xdd\xde\xa6\x4b\xaf\x47\xe0\x65\xa9\x50\xdd\x54\x4c\x44\xa4\x3d\xf0\x62\x19\xeb\x98\x4f\xca\xaf\xdd\xab\xe4\x47\xf7\x2f\x40\x66\x22\xbc\x8c\xf5\x5f\x40\xe5\x84\x44\xc9\x24\x51\x1e\x78\xff\x16\x45\x51\x6d\x9c\xff\xc1\xca\x2d\x7e\x3b\xdc\xe3\x95\xcd\x39\xef\x4e\x4c\x53\x6a\x43\x94\x8a\x28\x91\x23\xae\x6e\x3d\x0a\x9f\x38\xf9\xc0\xc9\x57\x8c\x02\xa3\x14\xae\x46\xc4\x7b\x86\x9b\x0d\xad\xf0\xb6\xa5\x2f\xe2\xb4\x35\xe1\xa1\x98\x38\x55\x7b\x1d\x1c\x94\x1a\x0f\xbd\x77\xb5\xe6\x7f\xbb\x97\x6f\x35\xa4\xf7\xa4\x98\x0d\xed\xde\x05\xf3\x3a\xef\x63\xf2\xbe\xa1\x10\x7f\x74\x06\xf2\x73\x46\xa4\x1f\x1e\xfb\xe1\xdb\x5a\x74\xc3\xdf\xe4\xb5\xf7\x9c\x2c\x4d\xe3\x52\xa9\x7a\x64\xb7\x97\x7b\xf9\xde\x48\xa8\x4d\x8d\xb8\x07\xb4\x8e\x41\x43\x31\x99\x74\xd3\x09\x4f\x2f\xba\xc9\x32\x8b\xda\x66\x5a\x1e\xb5\x67\x81\x60\x13\xb9\x23\x2e\xcf\x4d\xc7\xd6\x08\x76\xbb\xcb\xeb\xa8\x9f\xa0\x64\x1d\x1d\x23\x24\xc4\xe9\xdd\x47\xf5\x99\xfd\x6d\xd4\x38\xf3\xfb\xbd\xfe\x5d\x38\x2b\x40\x7c\x2e\x0d\x6b\x8e\xbb\x91\x90\x86\x19\xca\x2a\x2d\x0f\x7c\x35\xa2\x30\x7c\xdf\xe0\x82\x77\x2b\x84\xf9\x85\x69\xb3\x07\x78\x5b\x96\x84\x1f\x23\x17\xfe\xb7\xcd\x1a\xd8\xef\x7c\xa3\x3b\xf8\x8f\xd5\x56\x8b\x74\x37\x04\x73\xbb\x61\x4b\xcf\xe7\x78\x72\x16\xad\x87\x1d\x9b\xb8\x1e\x6f\x58\x2a\x0d\x89\x5a\xd4\x53\xe4\xb4\x63\x15\x43\xd5\x7c\x51\xd2\x0f\xcf\x73\x97\x94\xae\xfb\xa2\x0a\x8e\x0b\x13\x58\xe7\x8b\x42\xc7\xee\xa2\x1e\xe8\xa1\xdc\xea\xbf\x12\x89\xe9\x3d\x2a\x77\x65\x54\xeb\xe4\xdf\x46\x46\x74\x4c\x33\x9d\xf7\xb1\x8a\x8a\xbe\xfe\x7d\x54\x63\x06\x11\x2d\x0d\xce\xa5\xb8\x1d\x25\x33\x59\x8e\xce\x1f\xb5\xd1\xc9\x56\x16\xc8\xa6\x6b\xc0\x79\xb4\x46\x9d\x88\x92\x49\x2b\x4a\x26\x5d\x9e\xe9\xa4\x12\xbe\x3f\x29\xa3\xc7\x1b\xe7\xbe\x95\x5f\x33\xf2\x7a\x04\x5b\x18\x2d\x53\x32\x28\x6e\x10\xaf\x15\x8c\xf5\x09\xe9\x62\xe9\xd7\xb0\x78\xff\xcf\xff\x5d\xc8\xba\x1a\xa3\x47\xd1\x46\x0d\x2f\x89\x36\xea\x8f\xf1\x72\xc7\x5e\x25\x59\x2a\x70\xa6\x2d\x2b\x3e\xe3\x35\xe0\x13\xc1\xaf\xc5\x32\x78\x18\x6d\xd4\x1f\xd3\x68\xa3\x4d\x35\x89\x36\xce\xb9\x51\xb4\x71\xc6\x5e\x2f\x93\x1a\x4e\xb2\x15\x6d\xda\xfe\xdf\xc8\x2c\xf1\x75\x93\x59\xe4\xdf\x64\x14\x83\xe1\xe7\x18\xe5\x6a\x73\x77\x5e\x6c\x66\x94\xe9\xe6\xb1\x3a\x8f\x36\x46\xb4\xcc\x36\x33\xc2\xed\x66\xe4\x37\xd1\x46\xfb\xf6\xb2\x51\x77\xf3\xfb\x51\xf4\xbf\xd6\x67\xdc\x30\xe7\xee\xbb\x7e\x80\xa8\xe9\x58\xd9\x69\xfa\x55\x4e\xd6\xb1\xe3\x88\x6b\x51\xd3\x01\x1b\x4a\x7d\xe5\x2d\x88\xca\x75\x01\x8f\x0e\x4e\xc7\x30\x8e\x49\x0f\x8d\xf5\x29\x5d\xa5\x9a\x46\x7c\x22\x8c\x12\xf6\xb5\x75\x95\x48\x7d\x51\xa0\x26\x8a\x69\x70\xe1\x54\x32\xb3\x10\xdd\x0b\xcc\x7e\xb4\x6a\x56\x4c\x95\xb8\xee\x22\x50\x6b\xd4\x1d\x4f\xc4\x4d\xbe\x6c\x5b\x86\x7d\x72\x5d\x16\x79\x76\x5d\x2e\xf1\x4a\x25\x33\x6f\xad\xb6\xc1\xe5\xf9\x44\x74\x27\x62\xac\xcd\xaf\xdd\x9b\x56\x94\xa9\x34\x51\xdd\x69\x12\x5b\xc4\xa8\x7d\x9c\x15\x22\xb6\x22\xc5\x92\x6a\xba\xac\x49\x4a\xd9\x75\x5f\x8c\x21\x64\xf7\xd7\xf2\x28\xa6\x5f\xaf\xe1\x73\xae\xcc\xfc\xc4\x0e\x9b\xf7\x92\xcb\xcc\x68\xaf\x75\x2e\xf2\x9e\x89\x50\x39\xef\x0b\x6e\xf2\x5e\x73\x15\x5d\x78\x75\x96\xf2\x8e\xa6\x2a\x9e\x78\x75\xbe\xf2\x5e\xf3\xa2\xf0\x7e\x59\x57\x26\x85\x57\x77\x30\x78\x2f\xb3\x49\x01\x77\xbf\xc4\x97\x9d\x67\xa9\xf6\xea\x9e\x07\xef\x58\x4c\xb5\xb8\x0a\x85\xf2\xea\xee\x7c\xef\x6d\xa4\x93\xea\x75\xe9\xd5\xf7\xde\x24\xd7\x39\x7c\x9d\xa3\xbd\x27\x22\xb2\x1f\x9c\x8d\x3a\x45\x97\xfb\x5f\x22\xb3\xae\x63\x85\x1f\xff\x69\x56\x40\x83\xe8\xaf\x79\xe1\xcc\x0e\xe8\xa7\x6b\xcc\xea\x51\x9b\x22\x5f\xea\x93\x2c\x56\xe0\x5d\xf1\x1b\x7b\xfe\xce\x83\x66\xa8\xec\xb7\xa8\xe6\x40\x7b\x39\xc4\x46\x7e\x6e\x72\xfe\x55\x32\xe2\x93\xd6\x98\x8f\x44\x2b\xbd\x30\xad\xc8\xad\xa7\x51\x9c\x4e\x27\xfc\xd6\x33\x0b\x50\x12\x5d\xae\x9a\x34\x58\xb4\x3b\x8a\xf9\x24\x39\x6f\xb9\x3f\xf2\x1e\xab\xa6\xfb\x72\xa9\xc8\x26\x20\x5b\x0f\xd0\x9c\xab\xd5\xd2\x12\x4d\x92\x54\xb4\xae\x8a\x25\xce\x8c\xca\x4d\x44\xbe\x5c\xbb\xab\xc9\x8d\xb7\x7a\x6a\x19\xcc\x36\x17\x74\x81\x37\x1a\xc1\x65\x04\x18\xed\x72\x5d\x03\x46\x93\xbf\x65\xe8\xe4\xb1\xac\x28\x41\x39\x55\x03\x9c\xea\xee\x5e\xcb\x08\x99\x6f\x59\xaa\xe3\xf1\x6d\xd1\xb6\xc6\xbc\x9d\x91\xef\x66\x4c\x7b\xa6\x30\x3e\xf5\x8b\xe1\x5e\x43\xe7\x38\x49\xf4\xea\x1e\xb8\x9a\x74\x77\x5a\xcd\x15\x36\xcd\xa2\x48\xa4\xa9\x59\xd6\x37\x74\xcc\x63\x2e\x23\x6b\x8c\xd6\xd7\xeb\x1a\xca\xa9\x8a\xaf\x4a\xe3\xf6\x26\x22\xdf\x6a\x28\x8e\x85\x6e\x3d\xe1\x5a\xdc\x3b\x89\xaf\x84\xb3\x68\xaf\xef\x70\x1e\x5d\x8e\x54\x32\x75\xb9\xac\xe0\xf8\xa0\x00\xb7\x5c\x17\x4d\xe2\xa9\x07\x9e\x12\x91\x26\x3d\xbc\xf4\xa2\x47\x4b\x96\x9c\x26\x69\x8c\x17\x62\x82\x37\x8e\x6f\x36\x70\x17\x56\x54\xd8\x77\x7f\x41\x4f\x45\x8a\xe3\x55\xde\xbc\xb2\x7f\xdd\xac\xc3\xbd\xdc\xac\x55\xbc\xda\xac\x17\xbc\x59\x9e\xe4\x2a\x99\xa5\xcb\xf3\xfb\xf9\x66\x3c\x9f\x23\x37\x16\xe5\x9b\xc6\x43\x42\x1f\xc8\xa9\x63\x2d\x7b\x80\x7b\x1c\x9e\x18\xc5\xda\x33\x43\x87\x0e\xf4\xbf\xe3\x2b\x50\x0e\x5b\x3c\x35\x58\x4c\x3f\x56\xa1\xa4\xe1\xb1\x1f\x7e\x18\xaa\xe0\x6f\x62\x9d\x91\xdb\x6d\x43\xda\xa5\xdd\x4b\x71\xea\xf8\x20\xec\x4d\x0b\x5e\x7d\xbc\x5e\x38\x6d\xc5\xc0\x06\x55\x05\x36\x28\xd7\xd3\xf8\x4d\xc3\x96\x31\x3a\xdb\x6d\x35\xf4\x98\x17\x98\xe7\xf9\x5c\x0d\xab\x77\xff\xe1\x05\xde\x16\xfe\x61\xd8\x5d\x36\x02\xcc\x0f\xbf\xd4\x2a\x7c\xbb\xb9\x42\x50\xec\xb5\x20\x97\xbc\xe1\xc4\xb5\x31\x15\x45\x5d\xbd\xa5\xda\xeb\xc1\x15\x4e\x3c\xe7\x8c\xbc\xbb\x86\x4b\x4c\xa4\x8c\x4d\x75\x3d\xc7\x51\xee\x66\xad\xe7\x5c\x69\xfd\x9f\x33\xad\xaa\xe4\x2f\x7e\xf8\xdd\x6e\xa8\xf9\x91\x0d\xfc\xe0\x3e\xdf\x43\x77\x03\xf7\xa3\x83\x9a\x8a\xf7\xff\xd9\x65\xea\x66\xbb\xfe\x1d\x6f\x0e\xf0\x36\x59\x4a\xb8\x9c\x59\x51\xab\x56\xda\x43\x7f\xb1\x84\xe9\x9f\x59\x3d\xc4\x7f\x41\x44\x3b\x7b\x0d\x9b\xad\xad\x1f\xab\x4c\x96\x52\xb9\xcc\x83\x9b\x1b\xaa\xe5\x54\xc8\x51\x2c\xcf\x97\xb4\x35\x71\x33\xc5\xbd\x61\x07\xfd\x93\xba\x64\x7c\xba\x82\x4b\xaa\x71\x78\xbc\xdd\x7c\x67\x3a\xf5\x0d\xbf\x12\x41\xcb\xae\x7e\xb8\x19\x11\x26\x4b\x1d\xf2\x57\x38\x8e\x46\x23\x25\xd2\xb4\x86\x86\x3f\x5f\x32\x5c\x7f\x8d\x6a\x7e\xae\xc4\xfa\xb9\x8e\xed\x56\x72\x3a\x70\x7d\x86\x79\x33\x5e\x6d\xdb\x27\x5c\xa6\x27\x59\xaa\x85\x6a\x1d\x63\xb2\x5c\x5b\x93\x13\x44\x80\x89\x4b\xdc\x6d\x15\xcf\xb3\xf3\x0c\x77\xad\x56\x19\x4b\xe3\x44\x5d\xe5\x76\x7f\x4d\x57\xad\xda\x18\x25\x93\x6e\x7a\x55\x73\x52\xda\xfe\xf2\x96\xba\x28\x07\xed\xf7\x9a\x8c\x6d\x7a\x80\xd4\x61\xff\x73\x15\xdb\x76\xff\x4c\xd5\x85\xd7\x95\x48\x66\xc3\x40\x43\x3e\x3a\x17\x1e\x6c\xf5\x6a\x3d\xb6\x3e\xec\xc2\x16\x28\xd4\x27\x6f\x65\x0c\x46\x0e\x53\xec\xe5\xad\x8e\xbc\xc8\x81\x72\x4f\x07\xfa\x1c\x17\xc4\x50\x29\x47\xf9\xc6\x72\x11\xbd\x9b\x19\x03\xf5\x62\x0c\x2f\xb2\x3c\x62\xaf\x6c\xf8\xcf\x18\x6f\x4a\xf0\xd1\x92\xe9\x96\x0a\x6d\xd6\xd3\xe5\x89\x34\x8a\x53\x1e\x4e\x70\x26\x11\xed\x0a\x81\x3a\x3b\x89\x35\xec\x24\xfe\x95\xec\xf4\x4e\x08\x55\x0d\xea\xc5\x9a\x41\xc5\x2e\x7a\x12\x81\x2c\xf8\xa9\xbe\xd9\xb6\xe4\x69\xc8\xa7\xcf\xcd\x75\x35\x7d\xdc\x69\xf3\x5f\x27\xfb\xe3\x54\xc7\x3f\x3d\x0f\xde\xa4\x46\xac\xfc\x51\x76\xb3\x91\x03\x3e\xff\x40\xf3\x70\xf2\x6d\x58\x37\xe5\x3f\x09\x95\xa2\x32\x23\x6d\xf4\x93\x59\x91\xff\x45\x0d\x78\xa4\xb8\x8c\x2e\x7e\xb2\x01\xca\xe7\x6f\x56\x2d\x14\xff\xc9\xaa\xb3\x78\x32\x32\xd6\xc2\xcf\xd7\xfe\xf6\x5f\x5c\xfb\xc7\x54\xa8\x9f\xaf\xfd\xdd\xbf\xae\xf6\x5f\x93\x7c\x4c\x7f\xbe\xf6\x87\xff\xba\xda\x3f\x88\xeb\xf8\x6f\x55\x1e\x3e\xfb\xd7\x55\xfe\x77\x1b\x1e\x7e\x75\xdd\x1f\x68\x8d\xf3\x8f\x7e\xa8\xc0\x9d\xe1\xb5\x05\x32\x91\xe3\xf8\xbc\x40\xff\xbc\x24\x66\xda\xdd\xab\x36\x80\x79\x74\x69\x28\x97\x23\x0f\xbc\x7f\x1b\xdf\x1f\xdf\x1f\x3f\x2c\x3f\x8e\x13\xa9\xbb\x63\x7e\x15\x4f\x8c\xf2\x78\x95\xc8\x24\x9d\xf2\x48\x54\x0d\x7c\x53\xd5\x26\x1d\xe2\xce\x96\x0f\x6c\xbc\x76\x5d\x97\xf6\xb8\x12\x93\x7e\xf4\xb9\x08\xf0\xe1\x65\x80\x4f\x19\x50\x83\x7e\x87\x97\x1c\xf0\xcc\x6a\xf4\x05\x56\x2b\xbd\x32\xe9\x9e\x67\x5a\x0b\x95\x56\x64\x7d\xc2\xaf\x2f\xcc\xc8\xc4\x62\x32\x4a\x85\x76\xfb\xfd\x59\xac\x52\xdd\x1a\xf1\xdb\x56\x32\xc6\x90\xbc\x99\x10\x97\xe5\x28\x1c\xa1\xc7\xea\xed\x8a\xb2\xb7\xe4\xf8\x1a\xbc\xd7\x89\x1c\x19\x5d\x7a\x2b\xf3\xa3\x1b\xe0\x9a\x82\x7d\x7f\x9c\xd9\xf7\x7d\x7b\x4f\x5d\xed\x13\xd7\x99\xc2\x8f\x3b\xce\x47\x5b\x9d\xba\xae\x31\x11\xba\x34\x57\xba\x82\xbd\x37\x89\x16\x41\xeb\xe4\x22\x4e\x5b\x66\x21\x8b\xe5\x79\xcb\x3c\xf2\x6b\x9b\x0d\x71\x92\x44\x7c\xd2\x4a\x75\xa2\xf8\xb9\x30\x2d\xbb\x4d\x32\xd5\x0a\x8d\x5d\x6c\x55\xdc\xd2\x93\xd2\x08\x64\x9a\x91\x78\x04\xcf\x22\xb0\xa6\xe8\x49\xf3\x9e\xba\x95\x3b\x92\xaf\xad\x8d\xf2\xd2\x5a\x28\x4f\x30\xe8\x2f\xfc\x6d\x39\x58\x6b\x37\xb0\xb9\xa5\x94\x9b\xea\xe8\xe5\x36\x08\xd0\xc0\x61\x6b\x2b\x2b\xaf\x85\xaf\x6b\x13\x7c\xd4\x54\x1d\xde\x72\x9b\x5f\x60\x41\xa4\x1f\xf5\x9b\xb7\xc9\xcf\xc8\xed\xb5\x69\xc0\x3e\x70\x9f\x37\xaf\xac\xd4\xd6\xf4\x8c\x7a\xd4\xe7\xdb\xf6\x1c\xf3\x27\xc0\xeb\xd4\x6e\x6d\x38\xfd\x6f\x6b\x58\xeb\x2a\x34\x13\xa5\xce\x54\xf9\xfb\x1d\x8f\x82\xe5\xaf\x89\x16\xaa\x1b\x72\xd5\x2d\x03\x3b\x5d\x4e\x9b\xe4\xf6\x85\x19\xea\x68\x94\x9f\xb6\xe4\xf0\x5a\x98\x17\xd9\x35\xdc\x45\x5f\xf1\xa8\x95\xd5\x3a\xe0\x96\x6c\x6f\xc3\xd3\x6d\x4c\xdb\x05\x37\xe4\x6a\x1b\x8e\xb6\xc1\x5e\xa6\x7b\x46\x69\x63\xbf\x02\x31\x3e\x13\x70\x43\xae\xb7\xe1\x48\x63\xb2\x21\xe9\x47\x97\xe6\xcf\x36\x6d\x46\xc3\xd6\xa0\x2f\x35\xe1\x18\xaa\x35\x02\xcf\xab\xc1\xdf\x5f\x3f\x04\x97\xd7\x6e\xae\x92\xba\x8a\xf1\xb9\x14\x2e\x92\x5f\x87\x46\x2b\xc2\x7f\xba\xe2\x66\xca\xe5\xa8\x7b\x35\x2a\x5e\xe4\x71\x22\x45\xc0\xc8\x55\xd8\xdd\x6f\x4d\x75\x77\xb7\x35\x0d\xbb\xbb\xcd\xb0\x94\x30\xd1\x3a\xb9\xf2\xc0\xeb\x4f\x6f\x5a\x69\x32\x89\x47\x2d\x75\x1e\x72\xd2\x83\x96\xfd\xcf\xef\xef\xec\xd3\x6a\x88\x5e\x38\xf2\xb6\xe1\x92\x74\xdd\x2b\x39\x29\xa1\xe2\x72\x54\x84\x47\xd4\xac\x97\x89\x50\xfa\x8a\x4b\x7e\x5e\x0d\xde\x45\xb3\xb4\xe4\xd7\x95\x26\xf6\x6c\x9b\x48\x0a\xaf\xb7\xe9\x2a\x7d\xba\x4a\xb4\xb7\x13\xd4\x47\x30\xd7\x22\x1b\xfd\xbc\xb4\xb2\xc4\x72\x12\x4b\xc7\x9b\xbb\xdc\xa2\x35\x3b\x91\x8d\xc0\x0f\x29\x66\x35\x81\x22\x66\x2d\x37\xb8\xc4\xa8\x90\x56\x93\xac\x29\x93\x1f\x1b\xae\xba\xe6\x3e\xf4\xa3\xc6\xf7\xe6\x89\xb7\xef\x8d\xef\xcd\x50\xc4\x77\x2e\x27\xfd\x21\xc9\x58\xd5\xbd\x37\xbf\x45\xb5\xfc\x4e\xb5\x89\x9a\x3f\x3d\xda\x06\x8c\x45\x8c\x5e\xd0\x8e\x37\x89\xc3\x7b\x61\x92\xe8\x54\x2b\x3e\xed\xee\xf9\x07\xfe\x4e\x77\x14\xa7\xfa\x5e\x94\xa6\xd5\x07\xff\x2a\x96\x7e\x64\x6c\x99\x8f\x91\x19\xc4\x47\xdb\x20\x6d\x59\x5c\xf4\xf8\x4c\xa4\xc9\x95\xe8\xee\xf9\xf7\xfd\x1e\x96\x74\x5f\x57\x85\xbf\x37\x0a\x8b\xc9\x55\x77\xc4\xb5\x98\xc6\xd1\xa5\x50\x58\xb0\xfe\xca\x16\x7b\x14\x35\xcd\x0b\x6b\x49\xbc\x24\xca\x8f\xf0\x50\xe8\xad\xf9\x23\xe9\xa0\x4c\x37\x7c\xa7\xca\x27\xbd\x94\x82\x98\x3b\x12\xb7\x7c\x19\xae\x7a\x19\x39\x2f\x97\xfa\xf4\x7d\x64\xea\xff\xdc\x54\x46\xf2\xa9\x64\xa6\x68\x29\x0f\x5f\x47\xe8\x89\xa9\xc4\xd2\x4e\x80\xf7\x3b\xb4\x54\xc9\xce\xf6\xb7\x5e\xd4\x3e\xcb\xf2\x73\x3c\x26\x3b\xe8\x8f\x33\x24\x15\x65\x1b\x65\x4a\x0a\xdf\x6f\xdb\xd4\xf6\x46\xba\x2f\x21\x08\x4b\x04\x78\x76\x78\x3d\xd6\xda\xb4\x5b\x34\x91\x47\x4e\xfe\x9a\xf2\x65\x88\x77\xc8\x94\x1a\x8d\xcd\xdd\xff\x7b\x04\x7f\x44\x20\x13\x50\x09\xe8\x04\x44\x02\x59\x02\x3c\x81\x28\x61\x9f\x24\xf1\x4e\x78\x7a\xe9\x51\x48\x92\x75\x39\xba\xa2\x84\x94\x69\xba\xf2\x6c\x5e\xcd\x4b\xa9\x90\x9d\xdf\xe3\x32\x15\x7d\x80\xda\x55\x79\x78\x5f\x0c\x79\xa3\xf0\xda\xbb\xf2\x28\x98\x22\x77\xfc\xa6\xba\x59\x46\x38\x97\xaa\x71\x26\xe0\x85\x5a\x75\x83\x55\x32\x4d\x35\xd7\xc2\x03\x4d\xe1\x3f\x5e\x28\x5f\xf2\xeb\xf8\x9c\xeb\x44\xf9\x59\x2a\xd4\xd1\xb9\x90\xba\xba\x4d\xe9\x44\xc5\x23\xf4\xf3\xb5\xdb\x2b\xb1\x5d\xf0\xf4\xa2\x88\xc4\xd2\x74\xf5\x79\xb6\x81\xf2\x23\xad\x26\xbf\x89\xdb\xf9\x5c\xf9\x57\x42\xf3\xfc\x31\xbd\x88\xc7\x1a\x9f\xfb\x87\x66\x4d\xce\xb4\x4e\xe4\x7c\x2e\x7d\xcd\xd5\xb9\xd0\x78\x06\x3c\x99\xc9\x49\xc2\x47\xf3\x39\x51\xfe\x54\xe1\x7d\xcf\x4f\x2c\x2f\x10\x8a\x0a\xc9\x85\x12\x63\x50\xcc\x74\x0d\x48\xf6\x54\x10\x8d\x67\x88\x48\x46\x64\xbb\xad\xfc\xf0\xd6\xb2\xcb\x2d\xfe\x88\xec\x8f\x08\x7f\x64\x3e\xb7\x3f\x33\x9f\x0f\xcb\x9d\x82\x20\xdf\x9a\xd0\x0b\x7b\x16\x06\xa2\x27\xc1\xca\x90\x3f\xbc\xbd\x55\x02\x56\xac\xe9\x02\x46\x61\x60\x6f\x67\x7d\x18\xe0\x9d\xae\xd1\x9e\xf9\x77\xcf\xa0\x88\x93\x3c\x9b\xfe\x18\x1f\x76\x17\x10\x26\x6c\x24\x21\x4d\x58\x24\x61\x82\x2f\x7b\x0b\xb8\xc6\x87\xee\xce\x02\xb6\x13\x76\x9d\xc0\x55\xc2\xb6\x13\xb8\x58\xc7\x52\x77\xfc\x69\x70\x95\x00\x7f\x86\x91\xf6\x2f\x82\x49\x02\xfc\xa5\xf9\x1b\x7d\x0f\x14\xf0\xed\xe0\x2d\x66\x98\x0b\x79\x90\xe7\x75\xe3\x5f\x03\xcf\x83\xe8\x3a\xf8\x0c\x7c\x17\xcf\x7c\x3f\x0f\x24\x44\x2f\x0d\x96\x70\x12\x7c\x86\xf0\x0a\x13\xac\x3d\x45\xf5\x04\x3f\x86\x47\xc1\x5d\x5e\x0c\x7f\x22\xd4\x23\xf3\xe7\x29\x66\x8a\x7b\x89\x05\x5e\x61\x81\xf0\x53\xd0\xc3\x2b\x0f\x8a\xf6\x9c\xaf\xa7\xfc\x09\xd2\x8c\xd4\x96\x84\xf2\x5e\x30\x4d\x20\xba\x31\xc4\xef\x07\x9f\x30\x8d\xab\xad\xf5\x4d\x30\x49\xf0\xea\x83\x84\xdd\x85\x27\xe6\x07\xdc\x26\x3f\x91\x0c\xb6\x07\xdd\x3c\xa9\xeb\x4d\xc2\x32\x09\x97\x09\xbb\xe3\x17\xd8\x15\x1c\x09\xc7\x84\x73\x1f\xcc\x9f\x63\xf3\xe7\xc4\xfc\xf9\x68\xfe\x3c\xc7\x1c\x74\x47\xd8\x92\x83\x05\x1c\xe3\xc3\xce\x02\x4e\x8a\x01\x7c\x9a\xac\xbf\xae\xe1\xc0\xbd\xae\xe1\x4b\x31\xf6\xdf\xf0\xe1\xc1\x02\x1e\x17\x58\xbf\x26\x1b\xee\x65\x24\x92\x68\x14\x14\x2f\x13\xb6\x32\xe9\xe1\xf2\x6d\xac\x92\xde\x69\x75\x7b\xf7\x42\x95\x97\xcf\x32\x55\xdd\xf9\xe4\xde\x49\xab\x84\x99\x54\x04\x0f\x44\x51\xba\x80\x57\x09\x7b\x22\xe1\x4d\xc2\x7e\x48\x78\x9e\xb0\x37\x89\x19\x8f\xcf\x09\x7b\xae\xe0\xc5\x7a\x22\xef\xf8\xcb\x40\x43\x18\x9b\xc6\xfe\xb0\xad\x7d\xbb\x76\x58\x94\x1f\x0e\x31\xfd\x61\x62\x53\x32\x62\x96\xa2\x0f\xeb\xc1\x6d\xe6\x44\x59\x66\x4d\x7c\x9b\xc0\x67\x3b\x96\x4f\x24\x4b\x56\xa6\x1d\x86\x08\x12\x88\x2b\xea\x7e\x0b\x34\xf0\xcf\x41\x02\xbc\x1f\x64\xc0\xef\x07\x2a\x27\xf6\x51\x20\x20\x7c\x1f\x70\x08\x8f\x83\x18\xc2\xcf\x01\x66\x3e\x7f\xae\x36\x65\x3e\x0f\x85\x69\xab\x34\x25\xdf\x1a\x44\x1f\x8c\x42\x43\xe1\x53\xb2\x3a\x0f\xf3\x7d\x08\x31\x0f\xf3\x8f\x84\x85\x82\xc4\x14\xe2\x4d\x19\x24\x7f\x24\x30\x23\xa9\xcd\x00\x67\x73\x73\x3e\x49\xd8\x58\xc2\xaf\xc9\xe6\x6b\x48\xc6\x92\xcd\xc8\x93\x64\xc3\xe9\x71\x2f\x93\x53\x95\x44\x22\x4d\xc5\xc8\x2b\xd6\xd6\x54\x90\xdc\x99\x5b\xec\x3e\x38\x5f\x72\x43\xcb\x4b\xb3\xe9\x54\x2d\x95\xdb\x59\x52\x5d\x7f\x4d\x88\xf7\x51\x5e\xca\x64\x26\x5b\xfa\x76\x2a\x82\x96\xd7\x91\x74\x61\x66\x0f\xf6\xe9\x2d\x89\xc1\xe6\x77\x79\x74\xeb\xc1\xa7\x84\x98\xf7\xf8\xb2\x4c\x0b\xd3\xfc\x50\x24\x94\x59\x7a\x6f\x17\xae\xb1\x84\x54\x90\xe7\x0a\x5d\xc4\xf0\x2c\xb1\x55\xd8\x34\x07\x47\x89\xf9\xb6\xa2\xd3\xc2\x04\x07\x8c\xc2\xeb\xe4\x27\x2f\x5a\x79\xbf\x81\xf3\x1b\x79\xf0\x0d\xf8\xc7\xa4\x7e\xff\xa4\x2c\xd3\x3e\xaf\x4f\x4b\xc7\xf3\x0b\x01\xf3\x23\x36\xd4\xcd\x0a\x98\x1f\xc0\xca\x6f\xb8\xc5\x10\x70\x54\x10\x40\xb2\x8c\x98\x0f\x4e\x59\x34\x37\x8a\x8b\x1d\x1c\xc7\xf4\xeb\x04\xf4\x7c\x2e\x6c\x54\x7a\xed\x1b\x66\xde\x2a\xbe\x19\x45\x88\xe2\x55\x70\x09\xfb\x98\xc0\xf7\x9f\xed\xa1\x77\xc9\xa6\x19\x63\x53\x7a\xc5\x66\xc6\x5c\xdb\x64\x5e\x38\x63\x7e\x2b\x96\x87\xdf\x93\xf5\xf9\x4c\xbf\x27\xf0\x5b\x02\x37\xe4\x5d\xe2\x64\x26\x43\x85\x0d\x65\xe2\x1f\x09\x23\xbf\x47\x28\x58\x7b\x2b\xf3\x2a\xda\xe4\x86\xc6\xdc\x35\x4d\x1f\x16\x39\x12\x7b\x46\xf0\x34\xf2\x90\xfd\x6e\x51\xca\x98\xfd\x50\xa0\xe2\xbf\xc8\x31\x6f\x87\x14\x33\x9f\x99\xaf\x99\x51\x4e\x31\x99\x22\x87\x6e\xbf\x4c\xbe\x8c\xf5\x9d\x90\x0c\xf3\x74\x1c\xf6\xf2\x04\x67\x02\xa2\x20\xc3\x04\x67\x19\x26\x38\x53\xa6\x4f\x34\xf0\x20\xf3\xf9\x82\x0e\x32\x46\x04\x43\x44\x3b\x74\x48\xf2\x3c\xf4\x9d\x3e\x68\xa6\x3b\x7d\xe8\xd3\x20\x7f\xc7\x6d\x62\xfa\x4e\x9f\x42\x86\xa3\xf6\x43\xad\x5a\x21\x56\xf4\xca\x35\x51\xb1\xd5\x70\xdd\x7c\x6f\x66\xae\x6a\x6c\xbd\x88\xff\x9b\x59\x38\x44\x57\x4c\x54\x63\x42\x7b\xb6\x21\x03\x9b\xbe\xdd\x80\x20\x79\x1c\x73\x0c\x09\x6c\x60\x16\xaf\xce\x31\x2d\x62\xd8\xc6\x2b\x51\x80\xc7\xec\x11\x44\x31\x8b\x33\x48\x56\x02\xf7\xf0\xa8\xae\x8d\x09\x6b\xb7\xb7\xee\x9d\xfe\x99\xde\x84\xc9\xd9\x3d\x7b\xa8\x4b\xe2\x3d\x92\xac\x23\x29\x63\x12\x33\x86\xd9\xcc\xd3\x71\xcc\x56\xa5\xce\x7c\x78\x68\xd3\x57\xae\x4a\x7c\xc9\x75\xeb\x2a\x49\x75\xeb\xe1\xc6\xbc\x97\xf9\xe6\x7f\x12\x13\xaf\xe7\x1b\x79\xb9\x2e\xed\xe6\x78\x92\x70\xdd\x48\xba\xc9\x63\xd2\x17\xbb\xbf\xd8\x8b\x3b\xdd\xfc\x99\x30\x8e\x19\x37\x2b\xf2\x5f\xe4\xe5\x6f\x8d\x63\x22\x3b\x07\xbd\x5f\xd4\x2f\x07\xbd\x5f\xfa\x62\xd7\x3c\x13\xdd\xe5\x14\x7f\x18\xe4\xa2\x83\x37\xec\xa5\xb5\x65\x8b\x57\xd7\x94\x45\x4c\x42\xc2\xd4\x7a\xbe\x88\xfe\x9e\x68\xb3\xa9\x06\xcd\xca\xae\xfc\x68\x59\xae\x65\xab\xe4\x5a\x66\xe5\x9a\xcd\x04\x8a\xee\xbe\xa6\x74\xcb\x60\x46\x38\x58\xf9\x67\x2f\x61\x87\x49\xbc\xfe\xca\xa5\xd4\xf2\x93\x55\x33\x46\x31\x9b\xc4\x70\xbd\x19\xfc\x7b\x09\xbe\x1d\x2f\x25\xd3\xce\x05\xf2\xfa\x3e\x12\x79\x1f\xad\xed\x1f\xb9\x72\xb6\x68\x14\xff\x38\x71\x29\x5c\xc5\x6c\x3b\x86\x8b\xf8\x27\xaf\x19\x9b\xc6\xec\x93\x82\xf3\x98\xa5\x19\xcc\x62\xf6\x1a\x6e\x63\x76\x0c\x9f\xd4\x32\x9f\x97\xcb\x89\xf5\xf4\x5a\xdf\xbd\xbd\xb3\xa0\xbc\x63\x63\x94\x11\xee\xdc\x2c\xa8\xaa\xa6\xed\xf6\xf7\x77\x0f\xc4\xc1\x2f\x44\x74\xfb\x0f\xef\xf7\x8c\xad\x96\xa7\x4f\x20\xd9\xe1\xee\x7c\xbe\x75\x9d\x11\x41\x87\xbc\xdb\x0f\x38\xed\x90\x6d\xf3\xab\xbb\x9d\x11\x04\xae\x22\x7c\x22\xc3\xa8\xaa\xa3\xe9\x22\x57\x6b\xb2\x66\xfa\x8c\xdd\xfe\x21\x1f\x22\x1d\x81\x2a\xb4\x1a\xe7\xf6\x8a\x87\x87\x7c\x3e\xdf\x79\xc8\x18\xe3\xed\x76\x5e\x69\x01\xbd\x73\x70\xff\xc1\x9e\xd8\x6f\xfa\x58\x6b\x18\xf7\x7b\x0f\xef\x1f\x94\x30\x55\x12\x8e\x9e\x03\x73\xff\xfe\xfd\x03\x71\xd0\x74\xa2\xd7\xd0\xf4\x7b\xbb\x07\x0f\x4a\x98\x83\x95\x68\xfa\xbb\xbd\xbd\x83\x8a\x9e\xfb\xab\x11\xed\x1f\xec\x3a\x44\x3f\x58\x0d\xf4\x60\xb7\x7f\xf0\xa0\x04\x7a\xb8\xb2\xba\x9d\xde\xc3\x87\xfb\x3b\x25\x50\x95\xff\xa3\x86\x6a\x67\x77\xff\xc1\x7d\x07\xaa\xbf\x1a\xd7\xc1\xce\xc1\x7e\xd5\x4d\xfd\x9d\xd5\xb8\x1e\x3c\xd8\xb7\x9d\xd9\x50\x21\x5d\x81\x87\x11\xc6\x28\xf0\xbe\x68\x92\xd9\x14\x8a\x8b\x05\xcc\xc8\x75\xec\xfc\x89\x62\x32\x22\x2f\x8b\xc4\x92\xe3\x8c\xec\x51\x98\x64\xc4\xeb\x7a\xd4\x79\xb9\xe3\xbe\xc4\xdf\x94\xc2\xcd\x86\xa9\xb2\xe3\x4e\x95\xcb\xf8\xe7\x6f\x9f\x2b\x74\x0a\x95\x5f\x3b\x8c\x39\xfe\xcc\x9c\x21\x3d\xd0\x3e\x2f\x74\xb5\x2d\xe7\x9a\x0c\xc1\xf0\xee\x2c\x22\x18\xa7\x7e\x79\xfd\x87\xc8\x2f\xa0\x99\x91\x1b\xb3\x54\x0b\x33\xd1\xb5\xbd\x77\xe6\x28\x66\x57\x19\x1c\x6f\x30\x24\xe4\x2f\xc4\x08\xf5\x0e\x5a\x10\x27\x2b\xd6\xae\x46\xf6\xcf\x5a\x97\xba\x7f\x6c\xb2\xce\xd0\x26\x0e\x32\x5d\x78\xe2\x2d\x77\x6b\xb0\xaa\xaf\x03\xa7\xaf\xa1\x56\x8f\xc5\xc9\xb5\x85\xf3\x0d\xc2\x38\xa6\xe6\x5d\xcf\xee\x6e\x16\xd0\x57\xf1\x9a\x74\xfa\xa6\xdc\x17\x4b\x48\x93\x19\x8e\xe3\xbf\x2a\xdf\xb7\xe5\x3b\xb6\xfc\x4a\x98\x6e\x0e\x63\xf8\xe5\xec\x2f\xda\x56\x7d\x8f\x62\x32\x26\xa1\x51\x07\x7b\xc5\xff\xa9\xd1\x50\xed\xd9\xec\x4f\x8a\xc2\xd3\x78\x83\x09\x6d\x94\xe4\x9a\x7e\xfc\x25\xfe\x5b\xf7\xcf\x95\xd7\x1f\x3a\xd7\xbb\x61\x48\x95\x3d\x4d\x8e\xac\x94\x68\xbc\xc8\xc3\xbd\xc6\xad\x98\x81\x4d\xd0\x2f\x71\x13\xd4\xd0\xf4\x6d\xc5\x9c\x61\x92\x18\xea\xfb\x10\x05\x9f\x61\x14\xf4\x21\x0c\x7a\xa6\x11\x98\xa0\x61\x51\x53\x68\xae\x34\x41\xcc\x66\x89\xff\x4c\x31\x4b\x8c\x59\xc1\x16\x14\x1e\xaf\x42\x3c\x23\xdf\x50\xbb\x5e\xc6\xf1\x52\xc0\x45\x06\xa8\xf8\x58\x24\xdc\x20\x79\xbd\x6c\x04\xdb\x45\x08\xb3\xe4\xb8\x48\x8c\xad\x5a\x65\xd2\xd6\xb9\xad\x1a\xa4\xc2\xa2\x42\x93\xf5\xeb\x3a\x13\xa0\x94\x12\xdd\x7e\xf3\x0e\x34\x10\xf6\x3a\xa3\x97\xf1\xfa\xeb\x78\x30\xbd\x65\xe6\x6f\xcf\xe7\xc6\x68\x28\xdf\x08\xf3\x46\xf8\x3c\x4f\x8b\x99\x67\x10\xb5\xf9\x43\xdd\x7c\x92\x15\xb2\xfc\xee\x1e\x81\xd9\x43\xc5\x52\xda\x49\x81\x2a\x74\x99\x76\xb2\xc8\xeb\xc9\xfd\x11\x70\x27\xe1\xa4\xc1\x16\x41\x96\xe7\xbb\x4c\x98\xb1\x55\x62\x96\x61\x62\xd2\x0c\x2f\x7d\xcd\x7c\x31\x68\x52\xd9\x20\x29\x81\xb8\xcc\xab\x89\xd4\x71\x5a\x10\x18\x35\xc8\x32\xdf\x8b\x8c\xa1\x39\x85\x65\x0b\x4a\xa2\x0c\x3e\x8e\x44\x51\x78\x15\xb3\x6f\xf0\x26\x5e\x7d\xe7\x4e\xf3\xba\xda\xbc\x12\x03\x70\x9d\xc0\x75\x42\xcb\xdb\x40\x79\x29\x8a\x35\x66\xeb\xd4\x98\xad\x53\xfb\x62\x50\x26\xe6\x7a\x65\x9a\x92\xd1\xe6\x94\xba\x26\x2f\xe3\xdc\xb1\x74\x4b\xde\xd8\x11\x88\x28\x24\xcd\x30\x38\xac\x3b\xcf\x82\x6a\xbe\x36\x16\x37\x07\x4d\x54\x21\x4a\x28\x6a\x6f\xcf\x57\xb5\x4f\xb3\x12\xcc\x5e\x1e\x84\x43\x50\x1c\x01\xae\xae\x23\xad\xe7\x3a\x2d\xd2\x8d\x9a\x06\x6a\x1f\x6f\x2c\xfa\x1c\xaf\x71\x1f\xed\xe4\xde\xa9\xe3\xd5\x76\xd5\x58\xc0\x79\x06\x9f\x63\x7b\x31\xcb\x8b\x35\x58\x1e\x42\x84\x48\xde\xae\xab\x65\x1f\xce\x11\xe0\x93\x5a\x55\xcd\x5b\x14\xd7\x2f\x62\x72\xa4\xa9\x3d\xf8\x7b\x69\xb4\x66\x94\x9a\x1f\x62\x63\xdb\xef\x2f\xe0\x53\xad\x7f\x6a\xfe\x85\xd6\xd2\xa4\x97\x6c\x46\xc2\x04\xbd\x8b\x8d\x6c\xc8\xa9\x20\x22\x4f\xaf\x01\x39\x94\xad\x5e\xc3\x8b\x98\x08\xdc\x98\x93\x4e\x80\x3e\x4a\x8a\x4f\x36\x71\x34\x8a\x07\x4c\x1f\x04\x1f\x62\xd3\xab\xdf\x36\x38\x3d\xac\x2f\xef\x96\x7c\x8a\x0b\x87\xde\x87\x18\xef\x98\xca\xef\x60\xfe\x11\xb3\xd2\x93\x95\xa5\x1e\x3c\x57\xd6\xb3\x25\xe4\x28\x3d\xd2\x1e\xbc\xb6\x3f\xb3\xa9\x91\x4e\x23\xe7\x4d\xaa\xb9\xd2\x2e\xc8\x38\x96\xe7\x42\x4d\x55\x2c\x35\x7a\xbd\xf0\x65\x91\x09\x39\x45\xbf\xd9\xb3\xc2\x6f\xc6\xa5\x4c\x34\x7a\x7e\x53\x0f\x8e\xd1\x9f\x76\x43\xbe\x81\x77\x2e\xa4\x50\x5c\x27\xea\xe3\x87\x57\x1e\x7c\x52\xf8\xe5\x48\xdb\x42\x98\x9d\xa1\x84\x4f\x05\x79\x52\x66\x51\xa4\x14\x9e\xe4\x0d\xc1\x64\x2e\xb6\xba\x1f\x31\xad\x53\xe1\xc1\xb3\x64\x0d\xae\x17\x78\xfd\x11\xfc\xba\x72\x65\x64\x92\xd4\x65\xbf\x0e\xec\x4d\xbb\xc6\xf6\x31\xbd\xf8\x6c\x83\x51\xf6\x55\xc0\xaf\x31\xe6\x41\xb1\x76\xd9\xeb\xf5\xd7\x43\x56\x19\xc4\x89\xb5\xa5\x29\xbc\x5f\xe9\x3c\x10\x32\x4a\x46\xe2\xe3\x87\x17\x8f\x93\xab\x69\x22\x05\x26\xe7\x5f\xc0\x47\x83\xfa\x2b\x85\x47\x1b\xd6\x77\xdc\xc0\x78\x6b\x33\x01\xa0\x9b\xf0\x7b\x9c\xc7\xe3\xb2\xff\xf0\x60\x07\x53\x34\x6e\xfd\x87\x07\xbb\xf8\xc4\x3c\xe8\xd9\x57\xcc\xc3\x73\x50\xf0\x2e\x66\xef\xe0\xb7\x78\x25\xcb\xb9\x3e\xa9\x8c\x69\xa2\x28\x29\xae\x3d\xdb\xa6\x77\xdc\xbd\xf6\x0c\xf5\x53\x39\x9f\x73\xc8\xcc\xc2\x6b\x57\x90\xcc\xe7\x10\xa1\xe0\x37\xc2\x1e\x6d\xbb\xa8\x9a\x33\x68\x6e\x62\x91\xc8\x08\x51\x9c\x3e\xe6\x97\x62\x91\x9f\xbb\xa0\xac\x5e\xfa\x7b\x5c\xbf\xf4\x49\x6f\x72\x41\xdd\x90\xdf\x62\x7b\x5b\x89\xce\x0d\xd8\x3f\xe2\xf5\x6e\xc0\xdf\x8d\x14\x5c\x29\xa2\xae\x62\xf8\x92\x81\x0d\x1b\x40\xf7\xdd\x18\xbd\x81\xfd\x05\xa8\x31\x5b\x73\xbf\xfe\xb2\x82\x80\x7e\x3c\x9d\x3b\xc4\x38\xad\x2e\x39\x50\xab\xae\xfe\x10\x94\x06\xf8\x69\xa7\xf0\x28\x16\x9e\xbd\x7e\xe3\xea\x02\xe9\x87\x9d\x3e\x6a\x74\x7e\xf8\x6b\xa7\x5f\xdc\x61\x10\xd4\x4b\x49\x9f\x1f\x77\x9a\x45\x55\x51\xac\xba\x41\x84\x82\xc6\xd6\xdd\x5f\x80\x18\xaf\x57\x0e\xcb\x75\x51\xd5\xee\xe2\x2b\x7c\x2c\x11\xfa\x58\x46\xb8\xbd\xdc\x5c\xfc\x30\xaf\x57\xb1\xfc\x59\x03\x44\xac\xb8\x3a\xb8\xba\xad\x4f\x57\xcb\x9c\x05\xcf\x6a\x1a\xe3\x82\x42\x36\x5e\x33\xac\x5b\x33\x22\xc6\xa8\xde\xf9\xdb\x0b\x0a\x7c\xbc\x7e\xf8\xb3\x71\xe1\x5d\x89\xc6\x2c\x5b\xb3\xe7\x53\x9f\x07\x89\xe3\x9b\xcd\x3d\xb3\x89\xe3\x99\x2d\xdc\xb0\xa6\xbf\x79\xcd\x05\xbb\x18\x44\x8c\x70\x46\x72\x2f\x6c\xf2\x57\x5e\xd8\xc4\xf5\xc2\x1a\xbd\xc7\x7a\xd0\x93\x31\x5b\xb6\x4e\x1e\xc5\x14\x88\x4a\xd8\x1d\xff\x12\xe8\x31\x44\x4f\x03\x22\x13\x76\x17\x3d\x0d\x2e\x33\x88\x3e\xe1\xfe\xeb\xbb\xe0\x32\x5b\x50\x3f\x7a\x6a\x5e\xc8\xc4\x8f\x3e\x99\x77\x32\xf1\xc3\x77\x0b\x58\xc3\xb9\xca\x7c\xad\xb8\x17\x5b\xab\x5c\x3f\x74\xf3\x7a\xa1\xc4\xe7\x5f\x68\xe1\x76\x2b\x58\x39\x24\xd1\xd8\x7c\x8a\x9e\x82\xe5\xdb\x9c\x69\xfb\x79\xae\xe9\x11\xba\xdd\x03\x07\x4c\x55\xee\xe3\x4e\x1d\x0a\x0c\x65\xff\x2f\x77\x6f\xa2\xdd\x36\xae\x2d\x0a\xfe\x8a\xc2\xa7\x4e\x01\xe5\x2d\x45\xb2\x9d\xa4\xc2\x14\x9f\x96\x33\x3a\x4e\x9c\xc1\x53\x1c\xd7\xc9\xf5\x02\x49\xd0\xa6\x4d\x91\x0a\x08\x4a\x96\x13\xfd\x4b\x7f\x4b\x7f\x59\x2f\x6c\x80\x83\x28\x52\x76\xd5\x39\xf7\xf6\x5b\x7d\xd6\xa9\x98\x22\x06\x62\xd8\xd8\x13\xf6\x60\xf4\xb8\xb2\x76\xaa\x66\x84\x05\x20\xb0\x8b\x93\x95\xb3\x65\x86\x56\x9c\x10\x9d\xe8\x10\x85\xba\xd6\x20\x29\x15\xec\xa6\xe5\x30\x54\xf3\xed\x60\x0e\x80\x85\x4e\xc1\x00\xe4\x9b\xe7\xfc\x66\xfd\xa6\x45\x3e\x34\xc5\x9b\x70\x32\xa4\x30\x4f\xc8\x90\x52\xc8\x54\xf7\x95\x54\x17\x83\x3c\x0b\xc6\x37\x4f\x0b\x78\xdf\x42\xf8\xe6\xc1\xc7\xcc\x90\xbd\xa0\x15\x5a\xc5\x82\x82\x1b\xac\x55\x16\x06\x05\x38\xa7\xc1\x5a\x19\xa3\x33\x23\xae\x5a\xaa\x71\xa6\x25\x5a\x37\xc0\xdc\x82\xf8\x6e\x46\xba\x8d\xf2\xed\xeb\x8c\x20\x91\x44\x4e\x16\x8d\x0b\x69\x6b\xdd\xa3\x8c\xbc\x93\x24\xd3\x59\xf7\xbe\xeb\x0c\x74\x51\xb0\x8e\xad\xc9\x47\x72\xd7\xb7\xb9\xea\x73\x46\xa2\x10\x47\x1a\x85\x18\xf2\x3d\x42\x1c\x4b\xef\x1e\x11\xb6\x0e\x31\x19\xc9\x77\x1c\x94\xdf\xb6\x4e\x8a\x89\xbb\xc7\xdc\x9e\xdf\xbd\x9e\xf7\x9d\x99\x59\x55\x88\xd1\x9e\x56\xff\x59\x50\x98\x2e\x8d\x70\x55\xd3\x9e\x77\x7f\xdc\x78\x49\xcb\xea\x32\x07\x92\xbc\x03\xf2\x57\xfc\x5d\xb1\x68\x69\x50\xcc\xb8\x2e\x74\x2c\x57\xf4\xab\x15\x57\x4c\x0b\xa3\x50\x4f\x56\xea\x3f\x59\xf9\xab\xec\x63\x4e\xa2\x20\xef\x81\x52\xad\x2c\x07\xde\xbe\x61\xa7\x0b\x10\x66\x93\xba\x81\x73\x2b\x9a\xf2\xb9\x74\x4c\xee\x22\xeb\x5f\x71\xf1\x24\x4c\xb6\x18\xb8\x15\x4e\x8e\x1e\x99\x34\xaa\x14\x22\x15\x56\x4c\xec\xbd\x8c\xe4\x8f\xd6\xc2\x02\xef\xad\x9d\x04\xe0\x7d\xb3\x2d\xb0\xc0\xdb\xb4\xbb\x81\x42\x8d\xd6\x4f\x0b\xbc\xa7\xf6\x40\x21\xcd\x84\xaa\x4a\x32\xe9\x7b\x6f\x55\xbd\xbd\x8c\xa8\xe7\x6f\x54\xd5\x56\x4f\x9b\xaa\x81\x7e\xeb\x7e\xa6\xaa\xd9\x7d\xe2\xad\xaf\xa6\x46\xae\x2d\xed\xe6\x62\x81\x1f\x7a\x8a\x40\xef\x06\x90\x16\x9f\xd0\x4b\x8c\x9f\x9e\x92\x69\x5e\xa2\x06\xaa\x5f\xea\xb1\xa6\xc5\x40\x75\x37\x54\x6b\x8e\x28\x8c\x15\x19\x39\x4f\xe0\x65\x48\x6e\x05\x85\xdd\x8c\xc2\x65\xf0\x4f\xb2\x75\x2a\x4e\x75\x64\x40\x58\x50\x4c\x5e\x6e\x32\x76\x4e\x82\x75\x8c\x71\x8c\xf1\x2f\x29\x5c\x04\xe6\xb6\x76\x16\x38\x51\x0c\xf3\xa0\x5d\x79\xba\x5d\x55\x9e\xde\x04\xcd\x42\xa1\x09\x54\x03\xd7\xc1\xfa\xfc\xd5\x3b\x81\xb1\xb8\x39\x0c\x8c\xfd\xcc\x51\xd0\x9a\x18\xfb\x75\x53\x51\xc7\x5c\x20\x2d\xe0\x6c\xed\x4c\xc7\x5a\x8f\x84\xa1\x8b\x0b\x39\xe0\x6a\x1d\xbf\x91\x4b\xe4\x4c\x49\xe4\xac\xcf\x0a\x1e\xac\xa7\x3e\xe9\xf5\xbb\x0f\x1f\xea\x07\x66\x98\x32\xfd\xcb\x57\x5c\x79\x18\x10\xd5\xd4\x43\xfd\x4e\x6e\xc0\x68\x46\x73\xab\x28\xd7\xa2\xe9\x87\x58\x54\x65\x7d\xb9\xa4\xd4\xa9\x66\x83\xe9\x73\xd0\xb7\xd9\x2f\x97\x57\xa4\x25\x15\x4b\xa1\x3d\x49\x4a\x67\x64\xed\x8f\x89\x46\xfe\x1e\xde\xfc\xf8\x46\x21\xe4\x61\x8a\x13\x33\xfe\xac\xa6\x0a\xd2\xeb\xf3\x32\x20\x99\x62\x84\x9e\xaf\xae\x90\xe6\xcd\x30\xb9\x4e\x51\x9a\x2c\x8d\x20\x76\x92\xaa\x2e\x6b\x2f\x84\xa4\xcf\x8a\xc4\x33\x2f\x03\x92\xf4\x7d\xbc\xf4\x6a\xff\xee\x02\xce\x83\xa6\xc4\xc8\x75\xae\xd8\xcc\xb7\x7a\xf3\x88\x46\x97\xc0\x90\x43\xf6\x90\x43\x0e\x03\x72\x44\x14\x45\xfb\x73\x50\xdb\x72\xfd\xb0\xbc\x00\x1a\x3c\x66\xe4\x3c\xc0\xd4\x66\x6a\x11\xf4\x94\x59\xdf\xaf\x4e\xf8\xd7\xaf\x24\x5f\x8e\x50\x2d\x87\x28\x97\x23\x5c\x19\x60\xb0\x9c\xa7\x67\x2f\x84\xb0\xcf\x20\xec\xbb\x10\xf6\xbd\xfc\x63\xa1\x5a\x96\x80\x2e\xd6\x8f\xa6\x34\x72\xdd\x53\xef\x5c\x72\x15\xc0\x32\x58\xa3\xad\x59\xf3\xf2\xa9\xd1\xfd\x83\xe5\xbb\xc0\xe5\x53\x02\x7d\x43\xfa\xe6\xbb\x60\x32\x46\x75\x8d\xbf\x58\x10\x2f\x27\xe3\xf9\x38\x46\xd3\xc4\xc6\xd5\x90\x45\x36\x1f\xa6\x60\xc0\xab\xe6\xef\xde\x0b\x8b\xb9\x99\x75\xd0\x53\xfc\x10\x34\x6a\x9c\xcf\x35\x6f\xf6\xbc\x32\x5d\x0c\x59\x40\x0b\xfd\xfa\xb2\xb6\xad\x9e\x94\x69\x41\xe1\x63\xd0\xa8\xcc\x10\xc4\x08\x3c\x92\xd6\xc2\x4f\x7e\xd0\x6f\x6d\x9d\x9d\xb0\x54\x6f\xec\xb6\xe2\x46\xd7\xc6\xe8\xac\x96\x41\x92\xa7\x81\xc3\x24\xbc\xbb\x83\x99\x3c\x0d\xc8\x4f\x8f\x29\xb1\x47\xd8\x84\x39\x19\xec\x06\xa4\xae\x36\x9b\x05\x80\x8e\x24\x25\xb7\x6e\xb6\x66\x34\x33\xe9\xd3\xc6\xb2\x50\x88\x29\xbe\xdc\xbb\xb5\x05\x78\xfb\x76\x0c\xde\x63\x7b\x47\x82\xcf\x6c\x09\xbe\x6f\x3f\x18\x2e\x8c\x82\x7a\x41\xe1\x53\x2b\xe2\x9d\x92\x77\x01\x58\x6f\x5f\x1f\x59\x8a\x1c\xc1\x45\xa0\xf9\xe2\x03\x43\xf6\x66\x01\x41\xf5\x99\xc5\x85\x48\x84\x05\x3b\x8a\x26\x2a\x22\x78\x12\xac\xb9\xfd\x22\xc2\x98\x4c\xde\x06\xce\x59\x0c\xaf\x82\xb5\xb6\xd8\xb7\x01\xcc\xc8\x89\xf9\xe7\x8a\x43\x4c\x61\x8c\x8c\xc8\x07\xbe\x52\x30\x93\x45\xa6\xe6\xb7\x6b\xe4\xd5\x57\x01\xf2\xbb\x5f\x04\x08\xd8\xc1\xa1\x90\x26\xba\x64\x56\xd6\xcb\xf4\xca\xc6\x59\xa3\x7b\x73\x71\xc7\x53\xf8\x32\x1f\x85\x63\x9e\x64\xb2\xc3\x6f\x3c\xce\x7d\xee\xd7\x63\x06\x7c\xe4\x72\x96\x88\xeb\x8e\x5e\xb4\xe7\x15\x6f\xac\x9a\xb4\x34\x09\xe0\x0c\xaf\x60\x0e\xfb\xde\x25\xdd\xb0\x3a\xd6\x86\xfe\xf1\x01\x0e\x02\x22\x14\x18\xd4\x2e\xbc\xad\xe3\x98\xe7\x16\x2e\x82\xa7\x93\x24\x4e\x79\x27\x10\xc9\xb8\xc3\x26\x21\xde\xa2\xf4\x59\xdd\xc3\x7a\x9f\x45\x41\x22\xc6\xdc\xef\x64\x22\x32\x75\xd0\x97\x4b\x93\xd8\x37\xcd\x07\xb1\x8c\xc8\x12\x97\xda\x45\x9d\xce\x2d\xb5\x36\x0e\x32\xed\x82\x90\xcf\xe5\xad\x02\x94\x4f\x8a\xfb\x3d\x49\xc8\xab\x50\x6f\xd1\xfe\xfd\x7b\x5e\xdf\xe1\xad\xe9\xf0\x8b\x01\xcb\x86\xcd\xcc\xeb\xc7\x1b\xd6\xa3\x15\xed\xab\x36\xad\x25\xeb\x18\x1d\x4a\xe1\x78\x8d\xd4\xb8\xab\xef\x15\xf1\x70\xbc\xf8\x47\x0c\xe0\x9c\x7c\x0c\x74\xba\x76\x9c\xc2\x7e\x48\x12\x0c\x98\x63\x84\xe1\x80\x68\x01\x80\xc2\xb5\xa4\xb4\x9a\x1b\x95\xc2\x8f\xd5\x81\x55\xaf\xbf\x45\x71\xfd\xfd\x60\x58\x5a\x78\xa1\xe6\x5d\xf3\x51\x79\x02\x48\x73\xa5\x8d\xea\xcf\xcf\x41\x7b\x86\xf8\x1f\x41\xb3\x29\x1f\x0a\xcd\x7a\x48\xef\x03\x67\x1e\xc3\xd7\xc0\xf9\x12\x13\x6b\xc2\x45\x1a\xa6\xf2\xad\x82\x8d\xd7\xe8\x74\xb6\x13\x45\x16\xbc\x0f\x28\x7c\x5b\x73\x4a\x3f\x14\x62\x78\xec\xb6\xd5\xfa\x40\x04\xfc\xf4\xa6\x76\x8d\x89\xaa\x05\x93\x39\x20\x7f\x69\x40\x42\xdb\xd3\xef\x2b\x01\xbc\xf3\xcc\x90\x63\x0e\x8c\x63\x8a\xcd\x19\x79\x29\x41\x89\x31\x31\xa5\x78\x14\x98\x56\x5f\x0a\xf7\x0e\x2d\x75\x9c\x5f\x76\xca\xf5\x63\x76\xaf\xed\x22\xd8\xbf\x70\x61\x1c\x40\xdc\xdf\x35\x3a\x52\xbe\xda\xb4\xd8\xb6\x5b\x24\xe4\xec\x12\x29\xf9\x21\x52\xf2\x23\xa4\xe4\x07\x90\x38\xa2\xbf\x0b\xa1\x2a\xd6\xc9\x59\xee\x95\x1e\x72\x7d\x6a\x48\xd1\x3f\xbe\x33\x39\x64\xb6\x36\x39\x24\x5b\x9f\x1c\xd2\xcb\x8b\x4d\x82\x4b\x98\x67\x24\x69\x48\x17\x29\x97\xd2\x45\x86\xf8\xc3\xcb\x52\x99\x8c\x11\xac\x30\xaa\x05\x1f\x5d\x4b\xa2\x53\x02\x63\xf2\x83\xef\xb5\x8c\x92\x9c\x8e\x76\x49\x0c\x4b\x59\x25\x39\xd5\x16\xee\x99\xab\xc4\x97\xed\x05\x30\xd7\x39\x10\xc4\x0a\x12\x2f\x4b\x2d\x0a\xde\xea\x5e\xb4\x5f\xee\xef\x11\xbd\xb7\x57\x76\xdc\x67\x23\xcb\xb2\x45\xdf\xbd\x02\xdc\xea\xcf\x81\x61\xd8\x45\xdf\xbd\xa6\x23\xf5\xaf\xbd\xab\x50\xfb\x75\x1e\x03\x67\x41\xd5\x7a\x20\x71\xea\x4a\x92\xb9\x14\x98\xdb\xec\xc4\x5a\x2a\x19\x4a\x23\x82\xc6\x11\x7c\x52\xeb\x56\x19\xc4\x65\x00\xf3\x90\x28\x1a\xa9\x06\xf1\xf7\x3f\xb8\xd5\x38\x51\xd5\xcf\x10\x76\x93\xba\x4d\x97\xa9\xc4\x3e\x2c\x57\xaa\xc9\xe6\x7b\x44\x98\x12\x54\xcb\xba\xc6\xf9\x22\x74\x1b\x99\x34\xdd\x23\xb3\x31\x49\xa3\x37\xa5\x7d\x77\x74\x41\x04\xd4\x0f\x38\x35\x17\x46\x26\xeb\xa0\x85\x09\x5c\x14\x70\x58\xb4\xb4\x78\x38\x27\x12\x3e\x26\x5a\xed\x73\x9a\x80\xec\x7b\xbb\x30\x23\xdc\xd5\xae\x5f\xc5\xc2\x24\x66\x61\x10\xf4\x7a\xee\xbc\x87\xbe\xe7\xc6\xf4\x64\x41\x21\x70\xd7\x61\xdf\xf8\x4f\x67\x50\xf2\xa6\xcb\xe8\xb8\x23\x14\x22\xea\x0d\xb5\xa7\xb3\x9a\xbe\xeb\xae\x37\x65\xaa\xf6\x26\xeb\xbd\x49\x73\x97\x2e\xfa\xac\xda\x2f\x46\x23\x4d\x14\xab\x29\x71\x89\xd3\x56\xc4\xf4\x4e\x92\x39\x71\x71\xfe\x70\xaa\x95\x8d\x6e\xf3\xb5\xfe\xe0\x4f\x91\x1b\x1e\x9e\xe3\x4d\x52\xa3\x2f\xa4\x1a\x1f\xef\xbb\xd5\x11\x16\xaf\xfa\x6e\x81\xa8\x79\x45\xc2\x36\x5e\x81\xb9\x15\xa1\x2a\xca\x99\xab\xbc\x8a\x01\x32\x7d\x99\xc6\x4b\xd0\x3f\x20\x7f\x65\x7d\xbc\x37\xeb\xb3\xef\x05\xc0\x62\x68\x18\x37\xff\x62\x6e\x91\xe1\x82\xe7\xb0\xa5\xa6\xac\xaf\xef\xcf\x3c\xdd\x7c\x51\x77\x98\xac\xf6\xf3\xf0\x61\xf1\x98\x77\x9a\x60\xa7\xa1\x93\x98\x6c\xae\x2e\x0a\xe3\xfa\x33\x0c\x58\xf5\x63\xb8\x19\x09\x1a\x53\x27\x12\x05\x45\x7c\xc8\xf2\x07\x0f\x86\x7c\xeb\xcf\x78\x34\x23\xa9\x0b\xa2\xb7\x0d\x4c\x49\x1e\x91\x0b\xf1\xc6\xd0\xfc\xc6\x84\xfc\xf9\x52\xe5\xa2\x54\xe1\x42\x79\x40\xfe\xe2\x66\x16\x85\x12\x90\x82\xef\xb6\x73\x2f\x91\xab\x6d\x32\x50\x51\xda\xb4\xe5\x85\x91\xc6\x2a\xcd\xd4\xd9\x94\x65\xdf\xd5\x76\x56\x2e\xf0\x0d\xc5\x5b\x07\x2e\xf0\x1e\xc2\xa0\x3e\x25\xdd\xd6\xcf\xeb\x14\x36\x31\x5a\x1a\xa9\x9a\x63\xd7\x79\x0f\x97\xed\x24\xd0\x88\xb2\xf9\x48\xbe\x0a\x9d\xda\xb9\x31\x16\x82\xa9\xf4\xe0\x82\xe8\xdc\xe6\x0f\x1f\x5e\x10\x6e\xb8\x14\xd4\xad\xad\x59\x94\x3d\x09\x78\x6b\x6c\xd6\xe5\xc2\x6d\x12\xb9\x35\xd3\x43\x0b\xc5\xa3\x1e\xe4\x18\x7d\xe2\xb8\x76\x8d\xea\xba\xe4\x14\xe5\x95\x89\x0b\x33\xf2\x51\xc2\x10\x24\x85\xb7\x26\x81\x77\xe6\xa0\xa5\x39\x08\x47\x67\x9e\xcb\x40\xd2\x47\x9b\xbf\x06\x14\x8f\xef\x8c\x1c\x24\x30\x23\x53\x17\x84\x56\xf2\x36\xf7\x97\x61\x7f\x5a\x73\x1f\x3b\x5f\x85\xfa\x7a\xe6\xc4\x8f\x32\x45\x73\x1e\x49\x30\xb9\x85\xf2\xd4\xd2\x97\x2e\xe1\x86\xaf\xe4\x12\x62\x4e\xfa\x8f\xb5\x2a\x19\x30\xd9\xe1\x8d\x44\x4e\xb6\x34\xb3\x18\x0d\x1f\x6d\xfd\x4e\xb2\x0d\xb9\x41\xe2\x9e\xa0\x8f\x62\x6a\x0f\x16\x14\x66\xeb\x90\x55\x8e\x1c\x72\x61\xfd\x01\xef\xb3\xbe\xfb\xeb\x57\x1d\x21\xe4\xc7\x98\xc1\xf2\x3d\x37\xda\x1e\xa9\xe7\xdc\x6b\x23\x53\x9c\x6a\xec\x78\x20\x1c\x0e\xd2\xd9\x25\x52\x61\x7d\xa6\x68\x3c\x8f\x52\xae\xb1\xd2\x57\x94\x2c\x8b\xce\xcd\x0d\x29\x48\xc5\xd3\x2e\x28\xcc\xdd\x26\xfd\xe3\x09\x89\x69\xff\x2a\x09\x63\x24\x0f\x70\xd3\x06\x13\x56\xae\x1c\x57\x7f\x85\x22\xef\x7a\xf7\x47\xb1\x3d\x77\xc9\x9c\xcc\x5c\xbd\x0b\x7a\x6f\x0d\x06\xbd\x6e\xc1\xa0\xcb\x9d\xd1\x42\x93\xdd\x00\x53\xf9\x74\x36\xfa\x9b\x8f\x7f\x1f\x73\x32\x23\x37\x86\x46\xfd\x4e\x86\x3d\xd4\x44\xec\xdc\x73\xcc\x83\x7c\xc8\x43\x7b\x4e\xae\x35\xa6\x9f\x91\x0b\xb7\xf0\x76\x3e\x74\x9d\x57\x70\xe4\x36\x5e\x31\xe5\x21\xc8\x0a\xbe\xe7\x69\x19\x3b\x8c\x57\x29\x29\xaf\x50\x52\x4d\xb0\x2f\x6d\xa9\x58\x80\xfb\x52\xd5\x5a\x04\x91\x39\x09\xf5\x50\x3f\x10\x0e\x3f\xd9\xb9\xea\x4c\x2d\x3f\xef\xb3\x73\xf0\xa6\xf6\x2e\xe1\x7d\x0f\x63\xb5\xa0\x09\x99\x12\x92\xdc\xc8\x3e\x5d\x2c\xf3\x49\x58\xf6\x7c\x5d\x97\x59\xd1\x63\xce\x2a\x65\x54\x4d\x66\x5a\xeb\xaf\x92\xc5\x0e\x9b\xbb\x63\x3d\xbd\x92\x07\xda\xae\xd5\x60\x5b\xaa\x86\xf6\xdb\xad\xd6\x7b\x5c\xef\xe9\x75\xbd\xa7\xad\x7a\x4f\x1f\xea\x35\x0a\x23\x75\xe6\xe4\x93\x51\x53\x65\x98\x56\xf4\x03\x61\xf0\xd3\x8d\x6c\x0f\x83\x8a\x9c\xd3\xd1\xa9\x3d\x23\x5d\x8e\xa1\xdc\xf4\x0b\xd6\x77\x23\x1b\x11\xf7\x70\xa0\x33\x14\x1d\xba\xb0\xe3\xea\xea\x50\xe2\xf9\x46\x49\xe2\x33\xea\x2d\xd5\x0a\x2d\xc0\xcd\x28\xa4\xea\x33\xde\x9e\xbe\x9a\xaa\xce\x76\x25\xd8\x1c\x47\x8e\x2f\x57\x40\xbd\x76\x8d\xdd\xc4\x59\x1b\x20\xa3\x5f\x20\x78\xc7\xfa\xd6\xe2\xca\x5d\xe7\xd0\xe6\xbd\xb4\x05\x78\xef\x55\xfd\xcf\xb6\x04\x6f\xcb\xe6\xaa\xd1\x4b\xd7\x39\x16\x70\xee\x3a\x8f\xfa\xff\xf5\x08\xf6\x5c\xe7\x85\x20\xc3\x47\x03\x0a\x1f\xee\x09\xef\x95\xa0\x7b\x5b\x68\xe8\xc7\xfa\xdd\x11\xb7\xf5\xce\xbd\xb0\x11\xc1\xee\x67\x20\x31\x14\x42\x75\x8b\xea\x00\xa3\x3d\xb5\x71\xdd\x13\x09\x6a\x6a\x16\x4a\xc4\xde\xb1\x6d\x59\x0b\xc8\x77\x83\xf7\xdd\x17\x6a\x1d\x0b\xe7\x6d\xc4\xba\xe6\x00\xbd\x36\x07\x28\x97\x92\x8a\x03\x74\x6f\xd0\x2a\x8f\x05\x7b\xbe\x32\xbe\xec\xee\xe1\xe5\xc0\xd2\x9e\x2b\xdc\x4d\x16\x0a\x94\x32\x4a\xcd\x5c\x28\x6d\x84\xdc\x7c\x88\xe8\x9f\xbe\xe6\x18\xb9\x7b\xab\xc7\xa3\x69\xfc\xc6\xe9\xdd\x74\xd7\x8c\x93\xdc\x5b\x1b\x91\x62\x66\x44\x85\x8c\x2e\x30\x00\x53\x0b\xa4\x2e\x28\x7c\x5c\x2f\xd1\xe7\x39\x3a\x73\x4b\xa7\x5d\xb7\x45\xdd\x9b\x87\x5d\x72\x19\x0a\xee\x6c\x0f\x25\x77\xd6\x45\xd1\xdd\xdd\x81\x40\xfd\x7a\x07\xae\x93\x6d\x58\xff\xeb\x51\xae\x5a\x4b\x1d\xee\x12\xb7\x48\xba\xb7\xaa\x76\xc4\xc9\x2b\x64\xfb\xce\xc8\x5b\xc5\x22\x0d\x70\xa3\x23\xbc\x35\xf2\x1b\x72\x79\x46\xb5\x98\x50\xb1\x13\xa1\x95\x39\x22\x0f\x6f\xcf\x7e\x65\x12\x8f\x62\xd8\x47\x64\x48\x5a\x37\x3c\x5c\x80\x2b\xa9\xc9\x4f\x8a\x26\x9c\x6d\x89\x73\x4a\x4c\xfc\x2e\x81\x0b\xad\x62\xd5\xb0\x96\x69\x27\x65\x6b\x81\x8c\x9a\xab\xa0\xec\x45\x70\xc7\x47\xb1\xd4\x95\x70\x19\x90\x56\x44\xa5\x78\x0c\x44\x55\xc8\x26\x55\x9c\x97\xce\x89\x87\x74\x5b\xd4\x09\xcf\x39\x89\x12\x60\xab\xe1\x34\x43\x7c\xbb\x02\x29\x71\x46\x22\x35\x0b\x0c\x85\x45\x9f\xaf\x6c\x8b\xaf\x46\xb0\x67\x47\xe0\x32\xdb\xef\xbb\xcb\x18\x42\x2d\xcc\xd4\x99\x91\xd8\x05\x09\x8c\x42\xd7\x99\x11\xa9\x9e\x93\x95\x9e\x96\xc3\x49\xc8\x3e\xbb\x1c\x05\x76\x88\x51\x25\xf0\x47\x98\xd8\x1e\xb0\xae\xdd\x55\x1f\x9a\x2a\xc8\x45\xda\x8c\x65\x33\xf2\xc1\x6c\xe0\x37\x0e\x22\x53\xa7\x63\x3f\x40\xd9\x90\xda\x65\xd9\xd7\xbc\xec\x8d\x29\x83\xb2\x2c\xcb\xb0\xec\x4b\x40\x78\x95\x5a\x57\x0e\xb3\xd0\x47\x4e\xa8\x23\x97\x92\x0f\x44\xc2\x4f\xcc\x64\x8b\xc6\xb9\x65\x94\xb3\xa7\x6b\x5b\x1c\x36\xb4\xf8\x63\x6d\x8b\xa3\x86\x16\xc3\xfa\xe9\x70\x4f\xea\xa7\x63\x1b\x97\x7e\xec\xcc\x88\x87\x76\x50\x90\xa8\xc5\x1f\xe3\x59\x19\xf7\x5d\xb8\x74\xc6\x7d\x0f\x26\x4e\xb9\x02\x52\xaf\xc0\x25\x85\xb1\x93\x92\x19\xf9\xe8\x42\xb7\xef\x5e\xe3\x3a\x4d\x1c\x7f\x54\x61\x85\x70\x7c\x63\x0a\x93\xef\x94\xda\x93\xfa\x46\xe2\x16\x9d\x20\x33\x3d\x29\xd0\xf6\xc4\xb9\x21\x47\x2e\xb8\x68\xef\xc8\x14\x28\x5c\x3a\x93\x6a\x5e\x71\x3d\x0f\x66\x4f\x9d\x09\xce\xa4\x1c\x18\xcf\x07\x56\x60\xc7\xa9\x73\x43\x3e\x94\x9d\x85\xaa\xb3\xe9\x6a\x67\x3b\xf6\xb4\xd6\x55\x56\xeb\xea\x59\x1d\xcb\xbc\xa9\xaf\xe3\x50\xa3\x99\x8b\xaa\x6a\xb5\x84\x58\x34\x2a\xbb\x00\xd1\x67\xaf\xe9\x68\x46\xbe\x15\x3f\xec\x19\x39\x2e\x7e\x80\xf7\x43\xe3\xec\xaf\x01\x79\x30\xac\x60\xe3\x4b\x44\x5e\x17\xce\x96\xe3\x38\xe4\xc2\x39\x27\x81\x1a\x9a\x22\xc0\x0f\x1f\x5e\xf4\xdd\x11\xa2\xa8\x8f\x4a\x70\xf9\x2a\xc8\x05\x12\x60\x4a\xed\x71\xb2\x3a\x90\x0b\xf5\x8d\xcb\xe2\x50\x7c\x0d\xc8\xa5\x9a\x77\x92\x00\xcb\xe0\x8a\x93\x4b\xa3\xd8\x59\x50\x38\x75\x9d\x79\x0c\xef\xdc\xaa\x12\x1b\x03\x14\xbe\x62\xf3\x4f\xc1\x57\xce\xaf\x2d\x38\x75\x29\x7c\x6a\x13\x56\x63\xe0\xed\xa9\x93\xf3\x68\x85\xcb\x56\x2c\x79\xac\xc2\xe5\x44\x39\x65\x98\xc2\x32\x61\x4e\x0d\xfd\x0c\x4c\xca\xe4\xd5\xef\xf1\x7a\x00\x5e\xf3\xe1\x5a\x04\x5e\xf3\xe1\xfa\xed\x50\xf1\xe5\x06\x9c\xe6\xdd\xd8\xbc\x58\x49\xbd\x86\x52\xad\xe1\x1b\x4e\xb4\xf7\x02\x53\xe5\x94\xc2\x3b\x97\x14\x06\x6c\x07\x6b\x79\x37\x93\x4b\xab\xea\xb4\x83\xe1\x3b\x5c\x63\x66\x72\x2c\xd6\x9a\x94\xa7\xda\xad\x60\x41\xe1\xd6\x75\x66\xe4\x58\xab\x06\x8d\x76\xfb\xdd\x2b\xeb\x3b\x45\xdf\xa1\x57\xae\x73\x1d\xc3\xdb\x56\x82\xfe\x5e\x92\xf8\x11\x8a\xfd\x6f\xdc\xfb\x3b\x17\x8a\x8d\xb8\xee\xce\xa2\xad\x13\x78\xdf\xfd\x8c\x01\x06\xca\x9a\x5c\x7b\x73\x81\x70\x44\xee\x37\xb8\xdf\x0a\x46\x55\x6a\xf9\x46\x23\xa9\x19\x79\xeb\x42\x8c\x49\xd2\x9f\xf0\x6d\x13\x8c\xe4\x4b\xfb\xed\x04\xa6\x37\x33\x72\x5e\x9f\x7d\x5d\x50\x38\x76\xdb\xaf\x5e\x66\x21\x6c\x6e\xeb\x6f\x14\xcd\xe0\xc9\x00\xf7\xef\xc5\xfa\x76\x43\xbe\xa5\xc7\x85\x37\x53\xeb\xeb\x3e\x19\x94\xdd\xab\xea\x9f\x5b\x95\xed\xb5\xf1\x4f\xfe\xff\x92\x9c\x9f\xc2\x7b\xb7\xfd\xa6\x7c\xf0\x67\x3c\x9a\x93\xf7\x2e\xc4\xff\xfb\x7f\x0f\x61\x97\x08\xb5\x0d\xc3\x87\xf1\x68\x97\x48\x10\xd4\x96\xd4\x56\x02\xd6\xd7\x35\x5a\xac\xf7\x5a\xcc\x45\xc5\x37\x7c\x5b\xf3\xad\x5d\x32\x23\x5f\x5d\x88\x7b\x63\x4e\x24\x85\x43\xd4\x4f\x69\xb0\x8a\xd3\xf6\xfe\xbf\xa9\xfe\xad\x01\xa6\xf7\xd0\x9b\x28\xd2\xbb\xf7\xbc\x80\xdd\x21\xdf\xc2\x46\x32\xbd\x1f\xe4\xba\x5b\x0a\x02\xc5\x3d\x9d\xe8\x79\xea\xcc\xc8\x0b\x01\x03\x4c\x2d\x95\x3a\x92\x01\x53\xaf\x4e\x02\x38\x75\x21\x4b\x29\x78\x6b\xa6\x76\x2e\x81\x28\x1c\xde\x7a\xe1\x37\xc9\xd2\x4b\xa2\x2f\x69\xc5\x82\x52\xf8\xeb\x7b\xee\x57\xac\x76\x25\x49\xef\x19\x9d\x25\x4c\xdb\x77\x45\xdb\x5f\x7c\xfe\x74\x68\x0c\x30\xb4\xb9\x35\x04\xab\x7d\xc7\xf5\x9b\xf3\x22\x4b\x8a\xce\x8c\xf2\x15\x0d\x5c\xcf\x89\x65\x6e\x75\x52\x0b\x66\xc4\x4b\xe1\x5b\x06\x44\x38\x82\xf6\xdd\x6b\x7d\xc5\x56\x7a\x30\xb1\x94\x08\xcc\xf1\xa9\x5e\xe7\x9e\x4f\xf8\x92\x9d\xea\x97\x3a\x9b\x09\xc6\xff\x39\x75\xd5\xfb\x13\xf3\x3e\x19\x8f\x79\x2c\xf3\xb7\x47\xe6\x06\xd1\xb7\x74\x3a\xf3\x57\xae\x4e\x71\x7e\x8a\xd7\x61\xbe\xc9\x20\x84\x1e\xb0\x29\x58\x6c\x32\x89\x42\x1d\x00\xeb\xd1\x55\x9a\x60\x76\xca\xd7\x35\x9d\xe4\xdb\x80\xcc\x49\x98\xe2\x8a\xdc\x6a\xbd\xb1\xdb\xba\xde\xec\x48\xf1\x2a\x47\xc0\x90\xf7\x3b\x81\xa9\x2d\x20\xb5\xe3\x7e\x0a\xec\xd4\xc6\x8c\xf8\xae\x6f\x63\x2a\x19\xf7\x8b\x8d\x89\xf2\xf7\x94\xac\xbd\xa0\x90\xb6\x82\x47\x10\x12\x84\xe0\x0d\xa6\xbd\xef\x28\x44\xa9\xd3\x28\x9e\x48\x11\x8e\x09\x5d\x80\x9f\x1a\x87\xa2\x99\x05\x4f\x06\xdb\x7f\xf0\xc7\xb8\x28\xbe\x05\x18\x70\x01\x7f\x5c\x5a\xb0\xf5\xc4\x3c\x8f\x2d\x8d\xd9\xd5\x96\x58\x78\x50\xbe\x53\x98\xae\x3f\x5c\x4f\x57\xfc\xec\xf0\x65\xc5\x65\xee\xd7\xaf\xa7\x0b\x35\xec\xa7\xbd\xfb\x58\xd6\xfe\x4f\xa4\xe9\x33\xcb\xd7\x4d\x5b\xa8\x1f\x63\x24\xa6\xa3\xa1\x3d\x28\x42\x18\xdf\x65\xff\xbb\x35\xac\x0d\xf3\xf1\xb3\x0d\x59\x1b\xe9\xb3\x41\xfe\xaa\x18\xec\x70\xb3\x78\x57\x0c\x78\xf8\x78\x98\xbf\x2b\x68\xc3\xf0\x8f\xe2\x5d\x41\x1f\x36\x87\x9b\xf9\xbb\x82\x46\x6c\x6e\x6f\xe5\xef\x0a\x3a\xb1\xf9\xb4\x78\x57\x09\xe4\x30\xd8\xde\x90\xf5\x95\xd9\xda\xda\xde\x40\x4b\x8c\x71\x7a\x37\x97\x72\xd9\x5a\xc7\x53\xab\xb7\x31\x23\x5d\x3c\x2b\x74\x43\x31\xd7\x93\xb4\x95\xcc\xd6\x97\x76\xab\x0e\x01\x7a\x37\x36\x9f\xd9\x9b\x7f\xd4\x61\xa1\x4e\x73\xb7\x06\x75\xa2\x3b\xac\x87\xde\x18\xe4\x4b\x5b\x8f\xa4\x51\x8f\x9a\x31\xa8\x47\xc8\x18\xae\x2e\xe2\xca\x0a\x22\x7d\xbd\x48\xef\xbc\xa5\x98\x91\x89\x5e\x1d\xc8\x9c\x84\x19\x53\xcf\xe1\xe6\x9f\x4e\xf6\xeb\xd7\x11\x7a\xa6\x95\xd7\xae\x3f\xd9\x57\x5b\x02\x9b\xd8\x02\xdc\x2d\x3b\x5e\x18\x26\x2e\x64\x24\xdb\x18\x52\x90\x8e\xec\x21\xc3\x3a\x4b\xdb\xef\xbb\x66\x64\x6c\xbe\x87\xe7\x53\x98\xcb\xa8\x79\xaa\xad\x97\x5c\xd6\xac\xe7\x60\x93\x05\x85\x1b\x53\x69\x9e\x36\x54\x22\x09\xee\xf6\x26\x7d\xb4\xf5\x4b\x09\x95\xd7\x2d\x67\x0a\xb8\x23\x9e\xb7\x9d\x79\xe9\x04\x48\x9a\x3d\x46\x24\xdd\x18\xae\xf8\x33\x5c\xa6\xa0\x2b\x10\xe9\xdc\xa4\xea\x21\x64\x64\xeb\x77\xd9\xdb\xa4\x0d\x81\xad\x8b\xda\x73\x55\xb5\x90\x4b\x97\x01\x83\xf7\x66\x64\x9a\x22\x86\xaf\x41\x88\x29\x19\x16\x25\x4f\x6a\x25\x9b\x45\xc9\xd3\x5a\xc9\x56\x51\xf2\x47\xad\x64\xbb\x28\x79\x56\x2b\x79\x5c\x94\x94\x80\x65\x8a\x9e\xa8\xa2\x1a\x84\x21\xf9\xde\x59\x43\xbe\x8f\xd0\xfc\xeb\xcf\xc1\x28\xb6\x07\x7f\x1e\x21\xd3\x36\x12\xc8\xb3\x1d\xae\x69\x55\x3f\xb3\x73\xb2\xa3\x96\xa0\x04\x53\x1d\x37\x64\x0d\xeb\x72\x98\x02\x26\xd8\x34\x40\xf6\xd9\xcd\x9f\xbe\x94\xcc\xf6\xeb\x74\x9d\x23\x91\x22\x43\xbf\xc7\x1b\x4f\xf8\xf6\xef\x02\x03\x4d\xc9\x0d\x25\xea\x9d\xb5\x7e\xf4\x86\xbc\x56\x1f\x3d\x2e\x3e\xf5\xa3\x78\x12\xc5\x40\x5e\x94\x9f\xbf\x6a\xc3\xf7\x48\x56\x0d\xbd\x22\xa9\xe2\xfe\x8e\x74\x7b\xb5\x24\x67\xfa\xb1\x27\xe9\xa3\x27\x7c\x1b\x81\xfc\x65\xda\x7a\x61\x9d\x22\x85\x96\x90\x29\xde\x48\xb5\x0c\x42\xc2\x91\xd3\x50\x0f\x3d\x35\xb9\x8c\xa2\x7d\xc4\x55\x5a\x98\x15\x5f\x90\x0c\xca\x4b\x44\xf1\x9c\x97\x95\x65\xc5\xf3\x54\x82\x69\xc5\x29\x1d\x71\x74\xd8\x38\x5f\xb3\xa7\x73\xf2\x32\xc5\xcb\xb6\xeb\x14\x6d\x4f\x8f\x52\x2c\xa6\x30\x40\x7b\xee\xa6\x96\xf5\x44\x54\xc5\xa1\xc8\x09\xc8\xb6\x5d\xef\xdc\xf4\x0a\xe5\x66\xe0\x4f\xdc\x0c\xf3\x24\x4c\x95\x41\xa1\x22\xdb\xfa\xfb\xdd\x0c\x2a\xcd\x37\xef\xdb\x7c\xb0\xd4\x6c\x58\x36\x3b\x4f\x61\x38\xd4\x41\x14\x96\xd1\x07\x16\x6d\x56\x4a\x06\x4b\x25\x83\x4a\x49\xad\xbb\x4a\xc9\xd6\x52\xc9\x56\xa5\x64\x7b\xa9\x64\xbb\x52\xf2\x78\xa9\xe4\x71\xa5\xe4\xc9\x52\xc9\x93\x4a\xc9\xd3\xa5\x92\xa7\x95\x92\x3f\x96\x4a\xfe\xa8\x94\x3c\x5b\x2a\x79\xa6\x4b\x6a\x48\x46\x4f\xc8\x78\x5a\x2e\x28\x7c\x68\x87\x77\x64\xaa\x23\x56\xf2\x7b\x3f\xd9\x95\x2d\x80\x5d\xdb\x79\x89\xc2\xeb\x37\x9a\x80\xc5\xc0\x04\xaa\x90\x6f\xd5\xe3\x8e\xd6\xb3\x7c\x44\x21\x69\x37\x5d\x1b\x2f\xf2\xc8\x3e\x40\x03\x07\x76\xa2\x1e\x62\x0a\x53\x7b\x4e\x3e\xa4\x80\xfe\xc6\x68\xdf\x47\xd2\x14\x9e\x6e\xf2\xc7\x08\xe1\x9c\x42\xaa\x2a\x22\xeb\x6f\x59\x90\x31\x82\x91\xaa\x28\x55\xfc\xf7\x01\x27\x1f\xd3\xe5\x16\x54\xf1\xe3\x3b\x52\x71\xe3\xba\x54\xf5\xb2\x67\x3f\x40\x7a\x7e\xda\x8a\x81\x10\x71\xf4\x62\x85\x3c\x17\x14\xde\xa5\x77\x38\x13\x19\xe3\xd7\x4a\x7c\x9a\x4f\x69\xbb\x02\xc6\xd7\xe9\x34\x4e\xd0\xd5\x46\xc9\x12\x0e\x0a\x0a\x9e\x83\xf2\x43\xe2\xec\x66\xc4\x67\x24\x4b\x09\xd3\x46\x18\xc5\x6f\xaf\xbc\x68\x30\x2b\x97\xe5\x2b\xc7\x8b\x95\x33\x11\x65\xeb\xcb\x34\x23\xa7\xa9\xf6\xf9\xa8\xae\x95\xa7\x17\x48\xaf\x76\xb1\x46\xac\xb2\x46\xd7\xb1\xc3\x5a\x23\xef\x56\xf7\x31\x53\x23\xe1\xaa\x6b\xa9\xba\x64\xe0\x5e\x2b\xb9\xf4\x8b\xe2\x6e\x0e\x6d\x0f\xdc\x53\x1b\x03\x3a\x9f\xad\x8d\xb8\x7b\x61\x73\x70\x2f\x55\x17\x89\x6a\x7d\x66\x82\x8e\x0a\x07\x83\x57\x84\xe9\xeb\x1f\x19\x8b\x30\x6e\x45\x90\x20\x7c\x3c\x18\xe4\x91\x65\xd3\x03\x7e\xc1\x6f\x2c\x08\x4c\x00\x8a\x29\x8b\x32\x5e\xc6\xc9\xa8\xc6\x8a\x3d\xd3\xb7\xca\xa7\xc2\xa9\xc6\x98\xbd\x2b\xac\x6e\x9e\x87\xef\x6f\x85\xd4\xcd\x93\xfa\xfd\xf3\x78\xba\x2d\xb1\x6d\x0f\x8c\x29\xf9\x41\xea\xb4\xc7\x0f\xc1\x80\x23\xa7\x26\xe0\x88\x92\x99\xf3\xd5\x28\xa4\xea\xe2\x45\x29\x7e\xe7\xaf\x6a\x01\x4a\x56\xc2\x91\x94\xd2\xff\x49\x42\x3e\x0b\x1c\xe9\x75\x19\x30\x04\x4e\x1a\x69\x58\x8b\x6e\xc1\x02\xf1\xbd\x9a\xe5\xf3\x43\x02\x12\x4a\xcb\xfc\x83\x54\x6b\x7c\x6f\x53\x87\xf0\xc4\x09\xc2\x7a\x14\xec\x98\xec\xc4\x84\x27\xe4\x15\x93\xbc\x1f\x27\x33\xa2\x6f\x88\x29\xbc\x4a\xab\x3a\x77\x13\x48\xfe\xa5\x9a\x6d\x22\xb4\xce\xfd\x6d\x7a\x57\xec\xcc\xdc\x09\xc9\xc4\xe4\x19\x99\xf0\x48\x23\x13\xde\x69\x64\xdc\xc4\x46\x33\x49\xa6\xc4\x78\xf5\xf4\x19\x70\xb4\x21\x64\x98\xac\x06\xbd\x69\x98\xf1\xaa\xc9\xcc\x5f\x6e\xfe\x4a\xf3\xd7\x20\x8f\x17\x42\x89\xf7\x37\xe4\x4c\x9d\x5d\xcb\x82\x07\x43\x03\xe9\x4a\x6c\x7f\x93\x3a\xea\xb8\x59\x96\x3a\x6f\xea\xdf\x53\x5b\x27\x87\x37\x88\xee\xda\x7e\x21\xd4\xb1\xc3\x97\x0b\xd8\x6f\x52\xef\x9c\x2b\x84\x12\x53\xf0\x51\xb9\xaa\x03\xe7\xa0\x9b\x9b\x4e\xb2\x50\x5e\x87\x3e\xc7\xfb\xd5\xf2\x12\x46\x71\x9e\x0a\x2b\xe2\xad\x88\xd1\xcd\x2a\x04\x68\xbd\x64\xf1\x6f\xb2\xe3\xf2\x4e\x18\x63\xae\xa5\x09\x4b\xa5\xa5\x11\x22\x6a\x93\x9b\xd1\x21\x5e\x5d\xfb\x80\xa6\x78\x47\xda\x1a\x5d\xa7\xec\x71\xbf\xa0\xc1\x29\x3b\xcd\x3f\xbc\x9b\x91\x80\xbc\x4d\x61\xad\xd7\xd3\x07\xf2\x26\x05\xb5\x38\x42\xad\x0d\x06\x02\xcf\x96\x71\x11\xc7\xeb\xf4\x4b\x9c\x7c\x97\x11\xd9\x77\xcf\xf0\x81\xe3\x83\xc2\xb2\xf8\x30\x23\xfb\x29\xa8\x47\x10\xea\x37\x42\xde\x71\x2b\x11\x38\xc2\x5f\xc8\x99\x2b\xd6\xed\x45\x3b\x51\x95\xad\x92\xd2\x9c\xbc\x50\xac\xc6\x70\xf3\x77\x01\xbc\x66\x54\xe1\x32\x85\xde\x99\x33\xdc\xfc\x5d\x8d\x6f\xab\x37\xa4\x1b\x4a\x3c\xcb\xfa\x6c\x42\xd5\x0f\x01\x9e\x92\x1a\xb5\xce\x7c\x13\x18\x55\xe2\x23\x73\x50\x36\x64\x30\xdc\x54\xa2\x57\x29\x0f\x30\x23\x0f\x28\x62\xb0\x31\x23\xc7\x6a\xa6\xec\xab\x16\x09\x90\x40\xd4\x38\x27\xbe\xf1\xf4\x77\x51\xc7\x58\x7c\x03\x11\xf3\x8f\x66\xea\xbe\x12\xbc\x6e\x85\xef\xd4\x3a\x2f\x4e\x37\x0a\x21\x69\xdb\x8e\x9d\xe1\x63\x10\x0e\xc6\xb9\x35\xc1\x66\x1a\x22\x92\x6c\xe5\xf5\x50\x9e\x68\xaf\xb7\x99\xd7\x43\xf1\x63\x4d\xc5\xe1\x12\xd3\x29\x01\xb7\x62\x2b\xe7\x3e\xd5\x7c\x14\x40\x9c\x99\xc7\x15\xb6\xb2\x6c\x33\x5c\xdf\x66\x60\xc7\xce\xa6\x9a\xdf\xe6\xba\xd1\x98\x4a\xeb\x96\x00\x57\x60\x08\xc2\x79\xda\x5c\xa9\x8c\xd2\xb2\xa6\x16\x92\xd5\x35\x12\xd8\x8f\x54\x81\x52\x0c\x3c\xd5\x36\xab\xef\xef\xa8\xbb\x55\xa9\xfb\xb5\xfd\x04\xcc\xc9\x5e\x9a\x47\x39\x2b\xe4\x1f\x0e\x92\x8e\xa4\x8d\x1d\xc5\xb8\x8c\xe8\x5c\xf9\xad\x01\x75\xf5\x1c\x14\x02\xf0\x4b\xcf\x5b\x07\x1b\x47\xcd\x2d\x7f\x34\xb6\xac\x0e\x5d\xd4\x5a\x66\xb9\x99\x49\x83\xe2\x27\x0f\x81\xcb\x97\xcc\x43\xf6\x5b\x3c\x65\x74\x0a\x84\x45\xc5\x9b\x39\x1e\x9d\xab\x33\xbc\x03\x5c\xfd\xb9\xa6\xd4\x3e\x27\xf8\xb8\x43\x01\x5f\x2c\xb4\x40\x39\x09\x40\x63\x78\x3c\xf0\xcf\xdb\x7d\x46\x3e\x90\x0c\x7e\xb2\x89\x62\xe7\x26\x4c\xfb\x45\xd6\x24\x9a\x4a\x0d\xdc\x89\x4d\x35\x71\xbd\x0a\x43\xe8\x0d\xd5\xaf\xf2\xbd\xd4\x24\xb4\x06\xf1\xba\x0b\x51\x1a\x48\xd4\x04\xa0\xbc\x7c\x47\x2e\x68\xd5\x1f\x91\x37\xd9\x3c\x57\x3c\x8c\x2f\x30\xaa\x78\x61\x99\xfd\xbc\x44\x14\x44\x28\x41\x1e\xcb\x31\xff\x0b\x23\xea\x25\x3e\xe0\x60\x87\x38\xee\xd8\x51\xac\x3d\xb2\xec\x3d\x64\xfc\xc5\x86\xf6\x0c\x65\xad\x4c\x7e\xbf\x3b\x12\xda\xb5\x83\xe3\x45\xa8\xd6\x26\x78\xce\x4a\xbe\xa6\xac\xcf\x44\x2d\xbc\x1c\x6e\xdd\xad\xda\x92\xab\x4a\x5a\x6f\x50\xb4\xb5\x52\x50\xf8\x8f\xb1\x3c\x10\x40\x91\xc9\xa8\xe8\x47\x27\x33\xdf\x91\xf9\xe4\x97\x08\x6e\x5e\x8c\x1c\x3a\x5d\x18\x57\xfc\xd6\x1e\x74\x4a\xf1\x8a\x69\xfd\x87\x10\xf4\xda\x09\xbd\x38\x17\x08\x17\x74\x84\x8d\xb4\x84\x25\x10\xf0\x96\x3e\x43\x28\x24\x18\xf2\xcb\x73\xbc\xf2\xc2\x58\xef\xec\x95\xed\x69\x29\x50\x49\x00\x08\xa6\x4a\xec\x4b\x94\xd8\xa7\xde\x25\x80\x00\xbc\x28\xa4\x5f\xed\xf6\xae\xd6\x26\x40\xa7\x25\x17\xa3\x0c\xb4\x4b\x54\x7f\x0e\x46\x03\x1b\x49\x99\xb1\x96\x4f\x9c\x39\x11\x10\x42\xd0\x76\x7b\x16\x8f\x66\x24\x8e\x60\x46\x52\x78\x32\x00\x8c\xfa\x6d\xcf\xc8\xb7\x14\xdf\x6c\x6e\xeb\x37\x8b\x92\xb9\xd4\xf3\xb8\xb6\x93\xbe\xab\x46\x9d\x60\x24\xfe\x22\x9b\x15\x0e\x2f\xd0\xdf\xac\x0c\x7b\xc5\x2f\x27\x3f\xfd\x72\xd9\x6f\xb1\xb6\xd8\x8a\x1d\x46\xbe\xa0\x88\xcd\x31\x23\xf1\xe8\x7d\x6a\x7f\x4e\xc1\xd5\x00\xb7\x32\xae\x40\x8f\x2b\x28\x22\x81\x45\xed\xba\xa0\x3a\x67\x3a\xc3\x0f\xe4\x1c\x28\x6d\xe2\x2e\xcf\x4c\x9c\x45\x1e\x39\x6f\x04\x64\x91\xb3\x2f\x80\x45\xad\x17\x5e\x87\xb6\xe8\xb3\x43\x34\xd7\xef\xbb\x14\x3c\x5b\x60\xe4\x32\xa1\x83\x9e\x81\xfb\xd6\x16\x3a\x72\x99\xe8\x33\x35\x5a\x2f\x72\xde\x0a\x48\x22\xe7\x95\x80\x30\x6a\x3a\xf4\x73\x92\x44\x30\x1c\x0c\x71\x83\x7f\xfd\xc2\x9f\x4f\x9e\x69\xbd\x5c\x2e\x25\x63\xf4\x2d\x2c\xd9\xde\xc2\xe8\xb4\xa6\xde\xf6\x63\xfc\x35\x92\x1b\x43\x5b\xe2\x35\x9f\x17\xe9\xe8\xb5\x15\x6d\x9a\xa0\xa3\x9e\x28\xd7\x3c\x5e\x50\x08\xa2\x76\x0d\xa7\xea\xf6\x09\x7e\x7e\x34\x23\xa1\x02\x24\x2f\xd2\x1e\x32\x06\x94\xc2\x28\x87\x45\x37\x5a\x6b\x88\xc9\xd1\xa3\x84\x6b\x5b\x8d\xa6\x28\xf8\xe8\x24\xf7\x35\x01\x13\xd0\xf6\xb9\xa8\xa2\x3a\x35\x74\x66\xa2\x64\xe9\x44\x12\x92\xfe\x59\x34\x88\xab\x91\xb2\xb4\xd3\x05\x8b\x8a\xc8\xa9\x69\xb4\x3e\x42\x65\x35\xb9\x86\x29\xc4\x8b\xc6\xa8\x55\xf4\xd1\x11\xff\x95\xf8\x92\x38\x33\x12\x44\xe0\xe9\xa4\x9b\x61\x40\x92\xd2\xfa\x24\x9f\xd5\x0d\x49\x23\x60\x08\x08\x7d\x76\xd8\x23\xc9\x06\xc3\x78\xf5\xc0\xfa\x1e\xcd\xd3\x65\xf4\x5d\x48\x9a\xe3\x94\x21\xee\xd5\xb5\xbc\x4a\x9d\x29\x71\xd5\xd2\xeb\xe0\x27\x6a\x54\xcf\x0b\x3f\xaf\xe6\x75\x65\x6a\x99\x9e\x67\x66\x23\x92\x90\x60\x64\x32\xfc\xb0\x96\xc2\x9e\x57\x02\xc5\x70\x8c\xc8\x50\x6f\x5d\x2c\x72\x86\xe2\x99\x5e\xe6\x04\xb4\x03\x7b\xab\xb9\x40\x87\x3b\x3f\xd9\x3e\x9e\x32\x0a\xec\xcc\x8e\x81\x6d\x2a\xe9\x87\x49\x0a\xae\x6b\xde\xbb\x81\x7a\xc5\x25\x05\xef\x8d\x2d\xc0\x9d\xe8\xf7\x8b\x7a\xae\x09\x0d\x92\x7f\x14\x51\xde\x2a\xa6\xae\x78\x2e\x44\xc9\xcf\xeb\xb3\xb4\x39\xd0\x69\xf3\xe8\x08\x57\x8c\xf7\xbd\x37\xc0\xfb\xae\x8b\x01\x9f\xb2\x48\x5b\xec\x51\x88\xd5\xe4\x54\x7d\x54\x91\xae\xd6\x9f\x20\x27\xcb\x23\xf8\xa3\xde\xe2\xd9\x1f\x4d\x0d\xd8\x7e\xde\x60\xb3\xd2\x20\x20\x51\x59\xe3\x4c\xf5\x1b\xa8\xa7\x4d\x38\x27\x02\x06\xd5\x70\x2e\xad\x35\xb1\xcf\xe1\xa0\x58\x00\xd5\x46\x9b\x43\x2d\x28\xbc\x11\xda\x12\xe3\x0c\x94\xc8\x16\x39\x4b\x61\xf7\x62\xae\x2a\xfc\x93\x18\x72\x91\x89\x21\xe7\xa7\x8a\x79\xd8\x6f\x08\x55\x65\xfe\xf9\x16\xc2\x00\x1a\x92\xaf\x54\x22\x9f\x7b\x61\x93\xe9\xf0\xcb\x8c\xc4\x1b\x88\x46\xb0\x27\x3f\x82\x6e\x40\x31\x1a\xfa\x15\x7e\x3b\x0f\xad\x65\xe2\x41\x4d\xa3\x22\x1e\xd4\xbe\xa0\xf0\x2e\x25\x5d\x49\xac\xaf\x22\x89\x2f\x3a\x7e\x26\xd0\xa8\xa1\xa3\xf3\xa3\x63\x90\xf2\x6e\xb4\xd6\xa6\x9c\x71\x7b\x92\x80\x7b\x66\xc7\x28\x03\x8f\x23\x13\x63\xe9\xf2\xce\x66\x04\xa3\xb3\xa2\x20\xac\x4e\x8c\xce\xd0\x6b\x8f\x23\xec\x67\x52\x6b\x2e\x1b\x9d\x9a\x0d\x0f\xcd\x08\x73\x70\x3f\xb9\x7a\x96\x7d\x76\x8a\xe2\x76\xb6\xca\x71\xcd\x89\x8c\xe0\x34\x45\x51\xa0\xc6\x79\xc9\x7e\xda\x77\xcf\x9e\xc7\x4e\x86\x8a\x88\xa5\x10\xbe\xba\x0c\xcd\x49\x49\x85\xae\x4a\xf8\x99\xda\x33\xd2\x8d\x20\x03\xd9\x4f\x51\xd5\x89\x3f\x15\x95\x74\xbf\x54\xf8\x64\x93\xfb\x06\x6d\xd6\x71\x88\xee\x17\x1c\x22\x0e\x98\xfd\x7f\x31\x54\x76\x5a\x0e\x95\x9d\x56\xf8\xf1\xb6\xa1\x7a\xce\x34\xd2\x43\x25\x99\x1e\x5c\x9a\x82\x87\x26\x4f\xea\xab\xb8\xe6\xf6\xc7\x14\x95\x50\x4d\xdf\x65\xcb\xdf\xcd\x96\xbf\xbb\x65\xd7\x9b\x5c\x46\x30\x8d\x2a\x6d\x2e\x23\xd8\x4f\xcb\xe1\x60\x6b\xbd\xe0\x97\x11\xf8\xb5\x15\xdf\x5e\xea\x8e\x9d\xe8\x6f\xc6\x9a\x7d\x39\xa9\xb0\x91\x2b\xd5\x2e\x23\xe8\xd6\x6a\x3d\x59\xae\x75\xb4\xd4\xd9\x51\x51\xed\xe9\x6a\xb5\xa2\xb3\xb2\xd6\x1f\xb6\x76\xc6\x5d\xd9\xef\x73\x22\xfb\x53\x25\xb6\xe1\x9f\xeb\x56\xf5\xd9\x1e\xae\x01\xce\x1f\x57\xa7\x94\x12\x50\x4e\x58\x62\xf3\xf7\x48\xbe\x3a\x5a\x03\x2f\xb4\x7f\x9b\x5e\x4a\xfd\xdb\x94\xc4\x45\xc9\x34\x82\x06\x15\xbf\x00\xa3\x81\x5d\x85\x2a\xcf\x49\xfa\x9e\xda\x23\x8e\xbe\xc5\xee\x17\x5b\x38\x49\x9f\x69\x55\x7f\x71\x8b\x94\x38\xc4\xab\xc2\x93\x86\x1a\x35\x61\x25\x2a\x79\xea\xf4\x7a\xe6\x4a\x22\x3f\xc0\xcb\x1f\x2a\xee\x21\x3c\x5c\x21\xef\x86\x6a\x1b\xa8\x15\xad\x37\xd6\xd6\x1f\x47\xeb\x8a\x68\x9d\xeb\x54\xd5\x49\x45\xab\xc5\x66\xe4\x4b\x0a\xe8\xec\x22\xfa\xec\x71\x11\x04\xb9\x66\xa5\x3d\xb0\x6f\x10\x61\x75\x29\xb0\xc7\xf6\x1c\x9f\x1f\x53\x70\x3f\xda\x71\x46\xac\x97\x49\x16\xf9\x9d\x38\x91\x9d\x34\x73\xc7\xa1\x44\xdd\xa5\xc2\xa9\x90\xa7\x4c\xee\x84\x29\x96\xcf\xb9\xec\x60\x12\x81\xbe\x95\x3b\x1e\x65\xd5\x68\xcb\xb9\xf9\xfb\x47\x3b\x4c\x2a\x76\xcc\xb9\x0d\xfc\xe7\x0c\xde\x20\xcf\x16\xa4\x3a\xe0\x22\xbc\xc2\x13\x78\x62\x0c\xc6\x7f\xa0\xc1\x38\xbe\xa8\x38\x42\x3c\x33\x87\x7c\xeb\x81\xa3\x76\x45\xa1\x90\x7e\x77\xb4\x9b\xd8\xa5\x43\x80\xdc\xa8\xa6\x7e\xb6\x36\xbc\xca\xa9\x2e\xc7\xe4\x29\x39\xb8\x38\x25\xac\x6a\x06\xac\xfd\x1f\x12\x33\xce\x39\x39\x70\x8d\x7b\x8b\x7b\xad\x58\xa6\x23\x8a\x03\xbf\x4d\x1b\x5c\x2d\x1a\x72\x7a\x22\x29\x2d\xb3\x7a\x62\x0e\xfc\xc7\xf6\x0d\xd9\x4d\x4d\x9c\x10\x0f\xe3\xc6\x0a\x04\x0b\x6f\xd7\xc6\x39\xe8\x64\x9f\x8d\xae\x8c\x02\xe6\xe4\x44\x2d\x19\xce\x5e\x8f\xf1\x3d\xae\xe5\x8a\x23\xc7\xd6\x03\x23\x68\x8f\x54\xb3\xdd\x44\x49\xb5\x0d\x23\x44\xb6\x80\x33\x20\x99\x3e\x8a\xc6\x5a\x71\x65\xcc\x33\xf2\x29\x45\x3e\xbd\x36\x52\xd1\x77\x3f\x2e\x60\xd9\x42\xfd\xc4\xa5\x15\x83\x15\xcd\x39\x37\x80\xa7\xb7\x0a\x9e\x7b\x1a\x0c\x31\x5a\x7b\xc7\x0f\xd3\x49\xc4\xe6\x1d\x16\x04\x3a\xec\x12\x66\x28\x4f\xd7\xc2\x22\xb4\x40\x78\x01\xa3\xde\xaa\x0b\xc5\x9e\x86\xd1\x12\x3a\x8f\x73\xe8\x44\xff\x9d\x29\xaa\xc1\xaf\xe9\x6a\xac\x8e\xca\xa8\xd7\x38\xa9\xaa\x1a\xaf\x56\x1d\xc7\x56\xfa\x50\x5b\xa2\xd6\x79\xa2\x71\x74\x71\x30\xa3\xa4\xc1\x17\x44\x09\x21\xa2\xac\xd8\x9f\xae\xb8\x32\xa9\xae\x5c\x5c\xf2\xc7\x90\x2c\x39\x07\x0e\x87\x76\x56\xfa\xe4\xe8\xa5\x4a\x30\xfc\xf9\x8a\x13\x0d\x5e\xd7\x28\x50\x58\x5a\x9f\x17\x7a\x7d\x92\x26\x9f\xbe\xdc\x7b\xa1\x98\x2f\x9a\x6c\x45\xeb\xa3\xa0\xbd\x7a\xfd\xe1\xf5\xd1\xeb\xe5\x40\x68\xf3\xa8\xe2\x65\xa0\xaf\xee\x8c\x8b\xc1\x4d\xf4\xf7\x2e\xd2\xfa\xae\xdf\x72\x97\x36\x8b\x40\xc0\x3c\xd2\x37\x1a\xd7\x7f\xa7\xdb\x86\xb8\x59\x2b\x97\x74\x27\x09\xc1\x7b\x3a\x74\x23\x6f\x5d\x81\x0b\x1d\x85\xcc\x3d\xd0\xce\x15\x87\x51\xa3\xfd\xf1\x21\xd3\x49\x1d\x72\x3f\xdc\x2b\xfb\xab\x20\x31\x05\x36\xb7\x63\x70\x4f\xf4\xbd\xf0\x51\xd4\x6a\x7d\xb8\x9a\xff\xdc\xcb\xf2\x7b\xfa\x1a\x44\x46\x49\x4d\x4b\x1a\x26\xf5\x6d\x8e\x33\xad\x3d\x59\x50\x78\x1d\x39\x07\xe4\xaf\x21\x6c\xc2\xe0\x3b\x85\xb3\x36\x85\xc0\x0a\xd9\xda\xac\x1f\x80\xb9\x3d\x23\x47\x51\xb3\xb2\x78\x8f\xc3\x61\xa4\xa6\xfb\x3a\xa2\x0b\x88\x6b\x3e\xc0\x2b\xe7\xb1\x6b\x1b\x07\x3f\x0d\xdb\xee\x7b\x44\x7a\x73\x7d\xcc\xe7\xe4\x1a\xb9\x38\xd8\x59\x9d\x7a\x4e\x21\xde\x2b\xda\x6e\x98\xf3\xbe\xeb\xd3\x55\xdf\x5e\xcd\x69\x7a\xcb\x94\x23\x6f\x5c\xf9\x9a\x26\x7c\x73\x72\x13\xa1\x91\x40\x57\x92\x23\x25\xcc\x78\xa3\x92\x64\xf1\x2a\xc9\xb2\xa8\xbd\x9b\x94\x14\x6f\xbb\x38\xec\x4b\xa7\x35\x44\x46\x85\x21\xdf\xe2\x69\xf7\xb9\x6b\x06\x49\xdf\xa3\xa8\x9d\xe0\x6e\xad\x53\x40\x4f\xba\x30\xf7\xa4\xf3\x1c\xb6\xe2\x49\x97\x50\xf0\xbe\x53\x6a\x37\x20\x81\x70\x81\xc1\x3c\x9b\x8f\x7a\xd5\xeb\x0f\xfd\xc7\xa3\x35\xf6\x56\xed\xbb\xbf\x82\x42\x87\x77\xa2\xd0\xed\xd5\x5d\x43\x37\xee\x55\x1c\x5b\x25\x85\x15\x6c\xeb\xee\xdb\x68\x79\xa2\xdb\xd8\x55\x72\xa0\xca\xbc\x8c\x70\x43\x13\x73\xec\x77\xc4\x34\x51\x90\x8a\x28\xf0\x9c\x28\xa0\x24\x5e\xd5\xed\x67\x0d\x8e\x7a\x6a\x74\x43\x04\xbf\x93\x14\x24\x64\xf0\x9a\x55\xd0\xe7\xba\x16\xe5\x1e\x2d\xb3\x36\x99\x76\xa5\x7b\xbb\x36\x67\x33\x3b\xb0\x63\x60\xc7\xb6\x04\xf7\x9b\xcd\xc1\xed\x6a\x4c\xf1\xca\x98\x7a\x24\x22\xbc\x08\x63\x16\xad\xcb\x1a\x2c\x8c\x65\xc5\x0b\xd1\x9e\xe3\x43\x9b\xa7\xa4\xea\x33\x87\x26\xe9\x77\xab\x06\x75\xd7\x16\x60\x52\x11\xc3\x1b\x33\x0e\xe6\xfb\x82\xa7\x69\xbb\x79\x8a\xd6\x40\xac\x37\x48\x11\x9c\xf9\xf3\x26\x73\x94\x94\x4b\x19\xd5\xac\x4e\x72\x83\x14\x3f\x4c\x99\x1b\xfd\x5b\x19\x9e\xcf\xb4\x35\xce\x84\x6b\xe3\x0f\x41\x4e\x12\xf2\x46\x89\x28\x79\x1e\x99\xdc\xf2\x64\x5f\xe8\xa4\x33\x7a\x72\x65\xb2\x99\x94\x93\x17\x42\x67\x72\x16\x77\xd8\x5e\xfc\x64\x1f\x6d\x09\xec\x93\x9d\x01\xfb\x6c\x73\x60\xcf\x6c\x06\x2e\xaa\xcf\xce\xf5\x92\xee\x9b\x25\xbd\x48\x4e\xb8\x48\xc3\x24\x2e\x17\xd5\xcd\xc2\xc8\x7f\x85\xc6\x3d\x4b\xaf\x8e\x53\x2e\x2a\xaf\x04\x8b\xbd\xcb\x6a\x46\x9d\x69\xb8\xdc\xcf\xb4\xd2\x71\xca\x71\xae\xda\xc4\xe5\x65\x94\x1b\xdf\xc8\x50\x4d\x71\x3f\xb7\xae\x89\x83\xf0\xc2\x82\x57\x62\xa9\xfd\xbb\x38\x48\x70\x51\x74\xa5\x28\x4b\x31\x4c\xdd\x99\xea\xf3\xad\x49\x6d\x7d\x1e\xdd\xc3\x1d\x27\xe7\x0e\xb4\x5b\xfc\xa7\x00\x62\x78\x19\x2d\xd3\x65\xa1\xe8\xb2\x36\x06\xdf\x8b\xd6\xdd\x80\x69\xfe\xff\x3c\x82\x82\xbf\x3e\x63\x70\xac\xf8\xeb\x1c\x41\xb8\x87\xf6\x4f\x17\xfd\x5e\x16\x06\xed\x51\xf8\x10\xb5\xc7\x15\x7c\xa6\xa3\x2a\x3d\x59\xbd\xa9\x7c\x62\xb0\xc5\x94\xec\xba\x70\xa8\x0e\xb9\xfb\xd8\x70\xf6\x1c\x24\xd5\x81\xae\xea\x58\xe1\x31\x32\x65\xde\xcc\xf6\xc0\x3b\xb5\x5f\x71\xe2\xd1\x8a\x34\x33\xd4\xe4\xc9\x83\xc4\x99\x92\xb3\x08\x8e\x10\x75\x0c\x4c\xaf\x0a\x33\x68\xb2\x51\x77\x37\x35\xdd\x7d\x56\xdd\x81\x37\xd0\xb7\x40\x1a\xe9\xed\x73\x60\xab\x26\xa9\x79\xc3\x53\xfb\xa5\x66\x0e\x0b\x01\xe0\x58\xbb\xa8\xe6\x1e\xaa\x35\xfd\x01\xfa\x4a\x3b\x73\x72\x15\x81\x89\x85\x9e\x2c\xd4\x10\x87\x7a\x68\xe1\xea\xd0\x4e\xed\xf7\x9c\x28\xf2\x34\xb4\xc3\x72\x54\x5f\xaa\xa3\x1a\xd8\x61\x03\x02\xf5\x4e\xed\x1f\x9c\x84\x34\x1f\x1e\xee\xe6\x6b\x4c\xaf\x7b\xad\xc5\xb8\x2b\x55\xbc\x2c\x5d\x06\xcd\x1d\xbd\xe0\x24\xa0\xcb\xf3\x7c\xc3\xc9\x5b\xf5\xb6\xd1\xed\x3e\x6f\x77\xb6\xcc\xbc\x6f\x37\xbb\xd9\xc7\x25\x1b\x36\x5c\x92\xf6\xf6\x12\x52\x2d\x6b\x89\x04\x20\x2b\xd1\x2c\x56\x6d\x8f\xcb\xc1\x5c\x25\x8d\xf4\x73\x46\xf6\x8c\x24\x51\x10\xce\x40\xc3\xa4\xe6\x38\xdc\xc7\xea\x33\xb3\x1c\x26\x83\x26\x98\xc4\xdb\xb9\x02\x0a\x35\x19\x74\x35\x08\xea\x4e\xbc\x81\xee\xc4\x80\xa0\xbb\xba\xcf\x03\xdb\x6d\x06\xba\xc7\xb6\xab\x8e\x75\x3e\x1c\xef\xac\xa5\x83\x33\xd3\x01\x5b\xe2\xd4\x52\x0d\x6c\xa6\xad\x01\xb3\x74\xb5\xf5\xd0\x4e\x9b\xa1\x6b\xd3\x4e\x9d\x1b\x72\x51\x74\xd1\xcd\xe7\xd0\xd0\x49\xd7\x74\x52\x0c\x61\x05\x24\xdc\x15\x46\xe7\x8f\x7a\x95\xf9\x4a\x95\x7a\x88\x00\x2f\xae\x57\xd9\xac\xf3\xb0\xde\x75\xa5\x4a\x8b\x94\xf6\x63\x99\x75\xfb\x18\xad\x4f\xfb\x38\xb3\x39\xdc\xda\x12\x32\x9d\xcb\x2b\x83\x1d\x4d\x71\x76\xa3\x66\xf7\x3c\xf7\xe1\x43\x62\x59\x9a\xf7\xd2\xca\x40\x37\x4f\xc4\xd0\x67\xb0\x1b\xa1\x76\x84\xda\xa7\x0b\x38\x6d\x45\xc9\xd7\x32\xbf\x38\x1c\xe9\x28\xbd\x76\x9e\xc9\xc1\xc4\x50\x7e\xb7\xfc\x71\x29\xe6\x95\xa6\x3e\x6f\xc8\x5a\x46\x17\x1e\x33\x6c\x43\x91\x22\x6a\xb1\x80\x4f\x6d\x28\x5c\x07\xac\x75\x2c\x93\x53\x4f\xaa\x79\x49\x1d\xac\xf0\x81\xcc\x23\x15\xc6\x8e\x7a\x64\x20\x9d\x77\x11\xde\x30\xe7\x57\x73\x95\x0c\x8d\xe2\xb9\x44\xf7\xf5\x58\xd5\x89\x97\xee\xde\xb4\xed\x85\x0e\x54\x0c\xa7\x91\x0e\xd9\x52\x4d\x7e\x40\xe1\xa0\x75\x8d\x5a\x42\xcb\x3f\x88\x4b\xff\x79\x93\x04\x6b\x39\xbd\x81\xe8\x67\x79\xd4\x48\x5a\xae\x19\xde\x6c\x3c\xcf\xe3\xa8\xf1\x3e\x7b\xf8\x70\x39\xb2\x5c\x51\x27\x76\xe4\x62\x41\x62\x32\x25\x1f\x23\x38\x5d\xf1\x8f\x7c\xa9\x69\x74\x39\x51\xbd\xe3\x0f\x1f\xea\xc8\x69\x7d\x36\x8a\xfb\xae\x1d\xd3\x85\x92\x25\x33\x0a\x6a\x1d\x08\xa6\xfb\x3e\xa2\xfd\xee\xa8\x9b\xd8\x18\x77\xe0\x53\x04\xdd\xc4\x44\x0d\x7e\x68\x69\x54\xa9\x76\xff\x09\x30\xa9\x65\xeb\x93\xe8\x5e\x36\xd9\x97\x8a\x71\x62\x0a\x76\x6f\x6d\x0e\x07\x76\x02\x87\x36\x83\x23\xdb\x83\x63\x3b\x83\x5d\x0d\xcb\xb7\xd1\xdf\xc8\xe4\x26\x49\x11\x68\x98\x07\x46\xd5\x8c\xdc\xf5\x1a\x75\xc7\xc7\x08\x44\x7f\x07\x44\x3f\x03\xd1\xbf\x05\xd1\x9f\x41\x7e\x9b\x84\x89\x15\xa3\xa5\x5c\xf3\x45\xa6\xf9\xf6\x0c\xea\x71\x7f\x07\x77\x34\x43\x33\xfa\x5b\xb4\xa2\x9f\x3d\xaf\x8a\xce\xaf\x70\xdd\xcf\x28\x78\x7a\xab\x4a\xa6\x52\x0f\xb7\x39\x39\xe5\x8c\xdc\x46\xe8\x4f\x73\x9e\xc0\x69\x06\xfb\x21\xc1\xc7\x2b\x06\xf3\x90\x58\x01\x8b\x52\x6e\x69\xcd\x3a\xbc\x8d\xd6\x44\xe9\x68\x4c\x90\x5f\x7c\xe3\x20\x51\x64\x05\x4f\xe5\xda\xfb\xe4\x19\x79\xab\x46\x43\xa4\x23\x1a\x2f\x31\x6f\x2b\x01\x47\x71\x92\x6a\x59\xd4\xa2\x08\x88\xfb\x33\x20\x78\x79\x7a\x46\x09\xda\xf7\xd0\xef\x68\x67\x92\xbb\x93\xbf\xa9\xcc\xdf\x5b\x93\x2a\xaf\x71\xa5\xb5\xbb\xc2\x99\xc1\x0c\x1a\x11\x60\x6e\xc0\x92\x38\x5c\x90\x18\x3c\x3a\xca\x47\x56\xa4\xa2\x29\xb6\xe1\xbb\x42\x82\x45\x40\xd1\x05\xec\xaf\xd9\x8f\xc6\x04\x30\xae\x41\xaf\x79\x32\x47\x14\x59\x17\x4a\xca\x9b\x91\x2b\x38\x51\xdf\x7c\x21\xee\xf3\xcf\x1b\x41\xf2\xb8\xf0\x14\xf6\x8b\xd0\xd1\x14\x7f\xe8\x08\xd1\x78\xdf\x72\x1b\xc1\x4a\x8c\xe8\x1c\x52\xe6\x98\xcf\x94\xea\x36\x45\xa4\x69\xaa\xe0\xac\x12\x0d\xdb\xfc\x2e\x43\x5f\x9b\x17\x3a\xd2\xb5\xf9\x61\xfc\x08\x8c\xfc\xa7\x06\xa7\x44\xb9\x30\xbe\x50\xc3\xab\x25\x4d\x4c\xfe\xdd\x9d\xd3\x27\x4d\x23\x68\xcc\x24\xeb\x24\xc4\x33\x28\xbf\xc0\xe1\xa7\x1a\x87\xd7\xa1\xcd\x84\x97\x15\x14\x62\xbd\xa7\x44\x22\x94\x95\x9b\xaa\xc4\xc4\x99\x92\x73\x0e\x8f\x0e\xde\x7d\x7c\x6b\xc1\xb5\x44\xd9\x1d\x01\xfb\x4d\xb9\x32\x6a\x66\xf8\xee\x0c\xdf\x72\x3f\xd4\xd7\xd9\x27\x62\x39\x0d\x6c\x5c\x1a\x91\xc6\x90\x39\x72\xed\x29\x13\x80\xce\x44\x59\x7e\xce\xc2\x35\xfe\xfc\xf9\x0d\x9a\xa0\xe0\x5e\x2b\x14\x9c\x80\x70\xc9\x38\xa0\x30\x09\xc8\x29\x35\x29\x2b\xc3\x96\x81\x1b\x18\x8a\xf9\xcc\x42\x5d\x87\x80\xb0\x0a\x47\xea\x39\xf7\xb5\xd0\x20\x82\x10\xda\x30\xe8\x94\x9c\x28\x70\xdf\x91\xf0\x60\xa8\xfe\xad\xfc\x1f\x53\x4d\x99\x0f\x55\x3e\x5e\x05\x57\xbd\xda\xab\x03\x3c\xc3\xd3\x8e\x2f\xb5\xd0\x48\xe1\x4d\xe4\x90\x2c\x71\x50\x19\x76\x05\x9f\x39\xec\xab\x79\x5c\xc1\xcb\x04\x2d\x27\xd4\xe3\x55\x02\xfb\xe6\xf1\x07\x87\x50\x3f\xbd\xe7\x70\xa6\x9f\x5e\x70\x78\x6b\x8a\x5f\x71\x78\x65\x1e\x75\xd4\xc5\x86\x99\x69\x3e\x66\x41\xbf\xd3\x26\xb3\x09\x44\x89\x4d\xec\x14\x5a\xc6\x64\x28\x6d\xee\x47\xce\x0f\x01\x5f\x22\x13\xd9\xf1\x58\xdb\x2e\x6c\x2d\xe0\x85\x7e\xda\x5c\xc0\x0f\xfd\xf4\x64\x01\x9f\xa3\xfb\x24\xb9\xba\x6a\x31\x51\x1e\x03\x77\x5e\x32\x1d\xf5\x76\x46\x3e\x47\xda\x44\xc9\x4d\x74\x6e\x5f\x6b\x22\x12\x3f\xc3\x46\x16\x04\x09\xc6\x7e\x53\x52\xeb\x48\x51\x74\x5b\x51\x7f\xaf\xa9\xd5\x45\x2d\x5d\x41\xde\x32\x69\x08\xb1\x84\xcd\xf3\x08\x4a\xd5\x4e\x82\x5a\xb8\xa8\x1d\xdd\x89\xd1\x05\xfd\x7b\xb1\x9e\xc2\xa6\x58\x4f\x15\xfb\x8d\x9a\x8f\xf5\x4a\xe2\x8f\xce\x75\x82\xfd\x04\x7a\xf6\xd6\xd2\xc0\xfd\x9a\xcf\x8d\x19\x38\x64\xce\x2d\x27\xf9\xd2\x5d\x4a\x39\xb1\x1f\x3d\x8a\x12\x8f\x45\x97\x49\x2a\xed\x67\x83\x67\x5b\x8f\xac\xaa\x52\x23\x82\x73\xed\x2c\x3e\x76\x7e\xea\xbb\xbc\x53\xbc\x99\x93\xa5\xc2\x3b\x4a\xc0\x3d\xb1\x87\x15\x30\xec\xae\x62\xc9\xe9\xea\x2b\x7f\xf5\x55\xb4\xfa\x2a\x5d\x7d\xe5\xae\xbe\x0a\x56\x5f\x85\xab\xaf\x1a\xb0\x77\x03\x29\x66\xab\xaf\xb2\xd5\x57\x0d\xe9\x6e\x1b\xd8\x38\xb1\x86\xb3\x53\x12\xad\x0f\xee\x13\x3b\x04\xf7\x99\x1d\x80\xe7\xda\x1e\x78\xd7\x36\x07\x2f\xb6\x33\xf0\x7e\xd8\x12\xbc\x99\x9d\x82\x37\xb7\x19\xde\x86\x82\xf7\xce\x4e\xc0\x3b\xb5\x23\xf0\xce\xec\x18\xbc\xae\x3d\x05\x6f\x60\x8f\xc1\x1b\xda\x5d\x70\x0f\x6d\x77\x51\xff\xdf\xf2\x75\x6c\xbe\x73\x0f\x86\xe0\xee\xe3\xa5\x1f\x99\x91\x8b\x04\xc3\x14\xaa\xc7\x4b\xf5\xe8\x51\x4a\x38\x25\x21\x25\xb3\x84\x6a\xbe\x99\x64\x94\x30\x4a\xc2\xa4\xfc\x2f\xa0\xc4\xa3\x44\x52\xf2\xd3\xbb\xb1\x93\x85\xe6\x92\x7f\x08\xe7\x36\x56\x20\xf2\xbe\x15\x21\x94\x92\x88\xd8\x20\x96\x6d\x6d\x9c\x15\xe9\x8e\xe0\xeb\x3a\xab\x5b\x23\xa1\x49\x7b\x97\x48\xd8\x25\xa5\x74\xf6\x2d\x6a\x67\xe8\x12\x45\xc4\x4e\x5d\x13\xdb\x28\xf6\x9d\x6f\x11\xb1\xbc\x88\xa5\xe9\x47\x36\xe6\x16\x05\xe1\xe7\xae\x5d\xee\xb5\x92\x12\xa5\xef\x7c\x8b\x89\xe5\x87\x53\x8b\x02\xd7\x3f\xd2\x09\x8b\x2d\x0a\x99\xef\x7c\x8d\x81\xf9\xce\x8c\x48\x1f\x4e\x01\xb1\x39\x37\x4f\x99\x4f\xac\x0f\x09\xf3\xc3\xf8\xa2\xdf\xef\x5b\xf4\xbb\x0e\x8a\xe3\xf9\x8e\x10\x90\xf8\x2d\xb1\x65\x92\xe3\xc9\x84\x8b\x97\x2c\xe5\x84\x2e\x20\xf4\xff\xc6\xd5\x9a\xbe\x57\xcb\x95\x10\xcb\x77\x11\xcc\xaf\xe3\x8a\x4f\xac\xb8\x4c\x0b\xf4\xa4\xdc\x4c\xca\x44\x4d\xcb\xf5\xef\x19\x8e\x29\xd5\x0d\x43\x8b\x42\xe4\x3b\x4c\x80\xef\xb7\x2f\x7c\xe4\x43\x0c\xa6\x07\x81\x56\x6b\x53\xdf\xf1\x04\x74\xfd\x86\x2d\x8e\x9d\x78\x64\x05\xac\x37\x0e\xe3\x2c\xb5\x6c\xf5\x38\x89\xb2\xd4\x2a\x11\x51\xe0\xab\x45\x3e\x41\x5c\x14\xfb\xc4\x72\x65\xdc\x71\x65\xdc\x4b\x32\x19\x85\x31\xef\x85\x71\x90\x74\xdc\x44\xf8\x5c\xf4\x06\x9d\xb1\xe8\x0d\x3b\x63\xb7\x37\x44\x76\x61\xea\x83\x35\x66\xe2\x22\x8c\x7b\x11\x0f\xa4\x05\x56\x6f\x4b\xf0\xb1\xda\x23\xbd\x87\x29\x76\xae\xba\x0d\x18\xea\xdc\xf1\x13\x63\xd1\xdb\xc4\x3a\xa7\x6a\xeb\x15\xfb\x96\x18\x73\xc1\xb1\x06\x23\x19\xca\x48\x81\xd0\xa5\x5e\x97\x2c\xb2\x28\x4c\xf4\x33\xb3\x28\x5c\xf8\xda\x96\xb0\x75\x89\x8e\x78\x1e\xec\xae\xb5\xca\x8f\xc0\x54\x21\x07\xe4\xaf\x1c\x5f\x5b\x80\x4f\xa9\x7a\xfc\x8e\xa6\x49\xfe\xda\x04\x42\x71\x35\x63\x85\x09\x20\xa2\xfd\xa0\xc1\x58\xa5\x38\x17\x3e\xc9\x30\xab\xc9\x48\x1f\x33\xd6\xef\x8e\x08\xfa\x84\x14\xa9\xe7\x62\xc7\x24\x38\x98\x49\x82\xb1\x45\x13\x09\x63\x49\xe4\x86\xd5\x51\x27\x85\x52\x4c\xd9\xdc\x58\x07\x6b\x88\xa6\x1a\x82\x62\x7e\x93\xea\x57\x6b\x5f\x1b\x4b\x92\x0f\x44\x67\xd0\xca\xf0\x63\x95\x9e\xf4\x07\x36\x4c\x6f\x4b\xef\xf5\x3b\x0c\x1d\xdf\x78\x02\x0f\x48\x1e\xdf\xa9\x9f\x4e\xa2\x50\x92\x47\xff\x4a\x37\x1e\x5d\x28\x71\xf3\xc6\xec\x31\x13\x17\x5c\x5a\x14\xae\xf5\xc6\x4a\xdf\xa2\xb0\x63\x9e\x2f\x2d\x0a\x87\xe6\x59\xf1\x9d\x47\x7e\xfb\xfd\x7b\x8c\x6e\x1f\x7d\x36\xa4\x74\x54\x01\xe7\x1d\x79\x1f\x78\xce\x45\x94\x46\x80\xcd\xcf\x4d\xa7\x06\xb0\x16\x5e\x7d\x28\x90\xb5\xf3\x0f\xde\xf9\x25\x8b\xc2\x09\x23\xc5\x48\xdb\xbe\xa7\x0e\x67\xfb\xe7\x16\x14\x5e\xeb\x55\x89\x14\xae\x38\x5b\x5a\x15\x0e\x85\xc0\xd4\x9e\x21\x42\x54\x33\x44\x28\xa9\x62\x74\x9e\xe7\x07\xc6\x0c\x71\xf6\x39\xc6\xef\x30\x22\x6e\x25\x27\x0c\x2a\x73\x04\x9c\x93\x53\xd0\x52\x04\x85\xab\xb5\x87\xa3\x9e\xb2\x32\x2e\xbc\xa1\xfc\xe7\x78\x07\xe4\x6b\xaf\x84\x3e\xa7\x79\x6a\xad\x97\x66\xc7\x99\x8b\xa7\xff\xdc\x77\x24\x83\x3d\xbf\xcd\xfd\x0e\x62\x67\x97\x10\xee\xcc\xc8\x99\x6f\x62\xb3\x4a\xf8\x2c\x49\x25\xe1\x0d\xad\x06\x6a\x6f\xc5\x05\x9f\x0b\x5c\x10\x53\x8c\xd6\xee\x62\xde\x8e\x50\x89\x38\xe8\xf8\xec\x56\x18\xb7\xd7\xbe\xde\x39\x85\xfb\x26\x49\x1a\x6a\xee\x19\x05\x92\xd0\xb3\x34\xcc\xb1\x28\xbc\x88\x7b\xa1\xe4\xe3\xb4\x87\x8e\xe6\x9d\x28\x4c\x65\x4f\x87\xf4\x57\xaf\x4b\x00\x9c\x28\xa4\xea\xf6\xb6\x4b\x10\x94\x05\x48\xcc\x7a\xc3\x01\x96\x6e\x76\xfc\x5e\x10\xf1\x9b\xce\x4a\xc7\x79\xb3\x1f\x4a\x64\x85\xc1\x9f\x2f\xd0\x8e\xf1\xbd\x3a\x09\x9e\xdf\x24\x88\x88\x8c\xfc\xec\xda\xcf\x30\x77\x1b\x4a\x62\x47\xbe\x8e\xb7\x62\x2b\x48\xb3\x28\x10\x0c\xd2\xf9\x94\xf6\xbb\x23\xfd\xc6\x7e\xc3\xb4\xef\xc0\x31\x7e\xe3\x34\x53\x6b\x73\xd8\x77\x79\xa5\x0a\x52\xeb\x96\x63\xe0\xb3\xf8\x82\x8b\xca\x41\x68\x83\x7d\x3e\xe7\xbd\x34\x62\xe9\x65\xc3\x01\x28\xd4\x0c\x8a\xf4\x17\x43\x88\xff\xd3\x43\x70\x79\x14\xb5\x8c\x61\x3f\x2b\xbe\xbf\xac\x2a\x2d\x2e\x6f\x46\x5a\x7e\x75\xac\x8d\x2f\x21\xf9\x92\xad\x9a\xec\x97\xde\xd1\x21\xea\xd0\x07\x26\xd3\x98\xab\xf8\x34\x0d\x6e\x95\x14\x87\xf7\xc6\x2b\xb7\x0c\x63\xc8\x36\xcf\x28\x0a\xe3\xeb\x95\xb9\x7c\x08\xe3\x6b\x8d\x50\x08\x26\x03\x83\x0b\x22\xd0\x5b\x2e\xc7\xa2\x2f\x8b\x5e\xf0\x30\x76\x0a\x48\x1c\x62\x37\x38\xb3\xb7\x4c\x9f\x13\xf6\x9e\x96\xd0\x63\x18\x38\x1d\xf1\x1f\x3d\x50\x34\xda\xfa\xe0\xaf\x49\x47\x5c\xe4\x09\x1a\xb5\x7b\x39\x68\x1b\xe3\x72\x79\x64\x75\x79\xf4\xc9\xaa\x32\x27\xf9\x72\x2c\xc3\x84\xe4\x37\xb2\x67\x54\x54\x86\x7d\xc9\x52\x2e\x7a\x29\x8f\xb8\xa7\xd8\x97\x30\x0e\x65\xc8\xa2\xa2\xb4\x37\x4e\x6e\x7b\x77\x54\x99\x71\xf7\x3a\x94\x77\xd4\x32\xdb\xe5\x25\x91\x92\x19\xad\xff\xf5\xd8\xf5\x06\x7e\x41\x77\x32\x9f\x88\x8d\xdf\x1c\xeb\xb7\x8d\x78\xe3\x37\xeb\x37\xdc\x92\xbb\x28\x8b\x26\x28\x07\x8c\x9c\x13\xad\xba\x86\xb1\x4f\xac\x37\x08\x82\x1d\x77\xde\x91\x97\x61\xda\x89\x98\xcb\xa3\xca\x57\xac\x8d\x9c\x7f\x5e\x00\xa7\x76\xc3\x12\xa9\xcf\xa4\xdc\x4b\x62\x9f\x89\xf9\xea\x8a\xaa\x3e\x3e\x26\xb2\x83\x0b\x6e\xce\xc3\x77\x85\xc0\xbd\x5f\xbf\x30\x92\x35\x46\xd2\x61\xce\x7a\xf4\x33\x1c\xe4\xf8\x67\x4e\xba\x0a\xff\x30\x34\x6c\x92\xce\x57\x41\x30\xee\x14\x5e\xbd\x8c\xce\x24\x91\x8a\x35\xc1\xe3\x65\xd9\x4b\x3f\x53\x0b\xa4\x53\x1b\xff\x38\xd2\xa3\x1d\x14\xcb\x3e\xbb\x0c\x25\xef\xa5\x13\xe6\x71\x0b\xac\x38\x99\x09\x36\xa9\x4c\x45\xea\xe1\x2f\x41\xd5\x69\x1d\x0b\x8f\xdd\xde\x96\x81\xfa\x44\x02\x83\x5d\x92\xe8\x58\x3c\x62\x34\x23\x97\x45\xb5\x12\xc3\x9b\x21\xe4\xe7\x64\x46\xf6\x7c\xc0\x24\xac\x59\x71\x4e\xf4\xa1\xf8\xe8\xb7\x5f\x34\x60\x8e\x5e\x75\x4e\xa6\x09\x4c\xb5\x01\xa8\x5f\xb5\x14\xd2\xc7\x47\x7b\x58\xc5\x26\x67\x58\x5c\xbd\xe7\xa9\x4e\x61\x12\xf5\x1e\x9b\x01\xed\xca\x36\x3a\xe8\x92\x0f\x3e\x9e\x4a\x4c\xa6\xe8\xe2\x35\x51\x88\x77\x35\x7b\x10\x43\x86\x52\x1e\xad\xda\xfd\xbb\xb7\xc8\xe5\x32\xac\xe0\x20\x12\x63\xaa\xc9\xf3\xe5\x0e\x67\xe4\xa3\x8f\x01\xae\x14\x91\x05\x85\xf5\xb2\x42\xb3\xfa\x89\x29\x70\xd2\x3b\xaa\x61\x2a\xed\x04\x49\x16\xfb\x68\x96\xee\x89\x3b\xc4\xcf\xf7\x81\x11\x3f\x4f\x95\x04\x44\x2c\xef\x92\x7b\xd7\x78\xb8\xdf\x69\x26\xf3\x52\x8e\xa3\x37\x89\xe2\x20\x3f\xe9\x17\xa1\x2a\x3c\x30\xe2\x56\x3c\xc9\x14\x03\x7a\x62\x58\x2a\x7d\x56\xe0\xd6\x2f\x2d\x57\x0d\x93\x0a\x45\xcf\xdf\x29\xaa\xbb\x5e\x19\x1e\x76\x3e\x51\x8c\xca\x5b\xbf\x5d\xb8\xce\x19\x06\xb5\x0d\x31\x9b\x22\xed\x6e\xa2\xf5\x63\xa9\x60\x57\x01\xb0\x56\xcc\xf7\xbc\x24\x96\x22\x89\x8a\x9f\x6a\x00\x6e\x72\x53\xb6\x3d\xc0\xb6\xaf\x7c\x33\x6d\x2c\x83\x4f\x3e\x31\x42\xd6\x72\x37\xbd\x7c\xb2\xa7\x7e\x99\xc2\x92\x52\xf8\xcc\xf4\xbd\x90\x04\x91\x51\x43\x21\x66\xe4\xa4\x18\x56\xad\x97\x7c\x8d\xde\xf9\x05\xc9\xc9\xf4\x63\x8e\x56\x28\xbc\xf1\xd7\x3b\x6f\xb6\xaf\x87\x49\xc1\x54\x3d\xd2\xaa\x0a\x92\xb0\x0a\xa3\xce\x4b\xb6\xdb\x20\x57\xe6\x5d\x2b\xe0\x89\x7d\x0b\x2c\x29\x58\x9c\x4e\x98\x40\x1d\xb5\x41\x03\x41\x12\x6b\xa4\x7c\xc9\x45\x58\xbe\xf6\x32\x91\x22\x3a\x9e\x24\x61\xac\x15\xdc\xba\xc0\xe0\x59\x44\x19\x31\x37\x4c\x5d\x3e\x14\x8d\x78\xf1\xd2\x0b\x07\xa3\x67\xbd\xef\xdf\x33\xa8\xf1\x17\x0d\xaa\x85\xe1\x1a\x85\x63\xdf\xf9\x8d\xc7\x53\xa7\xaa\x8e\xfd\x0d\x5e\xf8\xce\x1f\xf0\xc3\x77\x86\x5b\xf0\x19\xe5\x5d\xa9\xb9\xd8\x6b\x09\x5d\x89\xfe\xf1\xf0\xfe\x1e\x5a\x82\x61\xa1\x25\xf8\xda\x04\xd7\x3a\xac\x94\xb1\xcc\xfe\xa6\x6a\xa4\x09\x58\xd7\x7c\xfe\x32\xf1\xb9\x05\x18\x5a\x9e\xc2\xb1\xc8\xfd\x12\xfd\xc2\x89\xb0\x1b\x54\x1d\x09\x93\xa0\x74\xf5\x8b\xa7\x85\xab\xdf\xb1\xd0\x59\xaf\xc5\x54\xab\x7b\xc6\x2c\x52\xe0\x23\xa7\xb8\x06\xe9\x84\x47\x11\x02\xaf\x92\x73\xa7\x78\xa4\xf4\x80\x28\x64\xd3\xd6\x90\x63\xde\xb9\x16\x9c\xaf\x75\x70\x9d\x2b\xcc\xf5\xca\x3e\x80\xe7\xc4\x53\x45\x3e\x12\xe7\x84\x69\x20\xcf\x4c\x38\x65\xd7\xc7\xc8\x5a\x9e\xc2\xda\xa1\xf3\xd9\x27\x9c\x42\xe0\x5c\x10\x0f\x97\xd1\x24\x63\xf9\xc6\x00\x45\x11\x93\xfc\xc6\xb2\x6c\xaf\xdf\x1d\x59\x97\x2c\x35\xfc\xa3\x65\xe3\x8f\x34\xf3\x3c\x9e\x56\x55\x28\xe5\x29\x16\xc9\xac\x13\x27\xbd\x8b\x4c\x4a\x2e\xd2\x16\x76\x7d\x57\x73\x86\xcc\x53\xdf\xab\xa1\x01\x2f\x89\x3a\xd6\x86\x28\x94\x2b\x61\xdc\x9b\x85\xbe\xbc\xb4\x40\x8e\xac\xad\xc1\x60\x72\x63\xd9\xd6\x26\xfe\x6d\x40\x22\x8d\x9f\x57\x67\x97\xc7\xb2\x97\x4a\xc1\xa5\x77\xd9\xd4\x4e\x7d\x15\x11\x44\xcf\x5c\x12\x2e\xe3\x98\x4f\x7e\x73\xf6\x53\x3c\x16\x41\x22\x0a\xfc\x80\x5b\x4b\x1e\x0c\xd5\x6e\x62\x8a\x30\x8f\xd4\x9c\x81\xd5\x11\xff\xe1\x57\xdc\xa6\x1b\x77\x29\x4f\xf6\xf6\xc2\xa7\x26\x27\xdc\x03\xc7\xc9\xf2\x46\xef\x99\xaa\xf7\x3c\x76\xce\x09\x83\xb0\xe2\x86\x68\xcc\x54\xba\xa3\xcc\xb5\x67\x64\xdf\x87\x07\xc8\x61\xf7\x59\x41\x6f\x32\x77\x41\x21\xf3\x48\x4b\x96\xe6\x17\x3e\x1d\xa9\xde\x87\xd4\xc6\x9a\xd2\x23\x5f\x59\x81\x15\xcb\xf5\xaa\xac\x55\x8f\x4d\x26\x3c\xf6\xcb\x25\x5b\xe5\xda\x26\x22\x1c\x33\x31\xb7\xd4\xd9\x27\x01\x85\xa4\x81\x1d\x53\x1c\x9f\x1c\xd5\xf7\xc4\x4b\xa2\x1e\xcb\x64\xa2\x08\xc3\x66\xd3\xc6\x35\x6e\xda\xe4\x2e\xbe\x51\x09\x0c\x9e\xc1\x5f\x77\x88\x41\xbd\x64\x45\x78\x30\xee\x3b\x95\x91\x97\x4c\x0d\xcc\x88\x98\x16\x7d\x29\xc8\x50\x2c\xf7\x12\xdf\x5d\x4e\xfe\x25\xd2\x96\x8e\x01\x27\xe8\xf0\xfe\x45\xdf\x6a\x66\x7c\x91\x04\x20\x6b\x3a\x36\x50\xed\xb2\x94\x23\x8e\x46\x6c\xfc\x95\x91\x63\x9f\x96\x7d\x1f\xfb\xe5\xe8\x4c\x76\x0d\x36\xbd\xa7\x32\xd6\x9b\x36\xd8\xac\xe6\x6a\x26\x4a\x47\x45\x78\x3c\x6b\x45\x8b\xaa\x86\xec\x8b\x64\xe2\x27\x33\x7d\xec\xb5\xce\x13\xd1\x11\x9b\x62\xac\x83\xca\x20\x85\x21\x1d\xc9\x74\x1d\xfb\x50\xd2\xe2\xe0\x49\xc7\x0f\xdd\xce\xd8\xdd\xec\x8c\x45\xa3\x4a\xc0\xe3\x9a\x8c\xad\x65\x11\x4e\xd5\x97\x15\xe1\x97\x05\x64\xf3\x2a\xa7\xb8\x59\xdd\x23\x9c\x40\x41\xda\xc3\xe9\x3d\x89\x5c\x30\x75\xfe\x00\x77\xea\x6c\x0f\x20\x9d\x2a\x12\x16\x4d\x9d\xad\x3f\xc0\x9f\xde\x33\x1f\x7b\x6e\xf1\x54\x24\x64\xbf\xd0\xb9\x50\x0b\xc4\x71\x9a\x11\x49\xab\x69\xd9\xa7\xd3\x95\xb4\xec\x39\xbd\x60\xe7\x68\x37\xe0\x46\xa8\x9a\x75\xc7\xc8\xb5\x7a\x53\x6d\x54\xfb\x01\x5d\x2e\x26\x01\x68\xaa\xa0\xc3\x81\xb6\x11\x55\x7f\x9a\x2b\x8a\xde\x49\x8c\x97\x9b\xa1\xd1\xb2\x18\x25\x0a\xe1\xe8\x1d\x96\xfa\x76\x7d\x12\xc0\x69\xf6\x77\x7a\xe4\xd8\x5b\x13\x51\xb9\x03\x33\xd7\x13\x45\x36\x61\x65\x3e\x25\xb2\x0d\x1d\xbb\xd3\x62\x55\x7d\x8f\x84\x05\xf2\x8d\x96\xde\x27\xc5\xfb\xb4\x7c\xaf\x24\xa0\x49\x00\x89\x41\xe0\x6c\x8a\x08\x3c\x43\xbd\x68\xbe\x1a\x79\xb3\x60\x5a\xc1\xe5\x32\xef\x21\xf2\x0a\x5c\xfe\xd9\x27\x0c\x3d\x55\x4a\x7c\x6e\xbc\x90\xf5\xf2\x86\x53\x8d\xcf\x59\x05\x9f\x27\xeb\xf1\x79\x30\xa5\x23\xf5\x85\x21\xb5\x13\x83\xcf\x5d\x0f\x55\x5c\x29\x7e\x57\xf1\x2e\xc8\x1e\x7a\x59\x6a\x41\xca\xd5\x9e\x52\x98\x7a\x24\xc5\x46\xff\x59\xcc\x2f\x10\x11\xc4\xb4\x19\xfb\x2f\x28\x74\xdb\x59\x1e\x03\xc2\xde\x14\x32\xe7\x01\xca\xd9\x12\xe2\xbe\xb7\x47\x95\xd4\xfd\x39\xc8\x4d\x5a\x3d\x25\x21\x2b\xce\x25\x5b\xc3\xb7\x60\x14\xae\x06\xf1\x16\x1d\x9d\x92\x29\x58\xaf\x63\xd4\xf9\x68\xd6\x5f\x4b\x65\x68\x21\x24\xc0\xf3\xaa\x1e\x73\x62\x54\x0a\xcc\x12\xfe\x29\x1b\xd4\x6d\x67\x83\x58\x03\x1b\x54\x67\x7e\xa6\x53\x14\x83\x01\x97\xa1\xa2\xf9\x05\xae\x04\x89\xfb\x13\xa3\x0f\x4a\xb2\xe9\x5c\xf3\x79\x27\x48\x44\x31\xe9\x5c\xd7\x60\x74\xfd\xff\xa1\xee\xfe\x2d\x52\xe7\x7a\xcb\x0a\xee\xf2\x9b\x95\xb7\x86\xa3\x20\xdc\x21\x99\x13\x53\x85\xf4\x62\x27\x53\x28\xb0\xba\xca\x8a\xb5\xf0\x92\xf1\x24\xe2\x92\xf7\xc6\x3c\xce\x3a\xd6\x06\x21\x59\x9f\x6d\xfd\xfa\x95\xf5\xdd\xd7\xf4\xe1\x43\x75\xfa\xac\xf4\x32\x99\x29\x72\xa7\xb8\x67\x8f\x24\x78\x74\x28\x04\xfa\xb1\x72\x99\x21\x57\x89\xa0\xea\xb5\x54\x85\x78\x53\x85\xe6\xb4\x52\x30\x27\xcd\x6a\x65\xe5\x82\xc2\x78\xea\xfc\xec\xda\x4f\x16\x70\x79\x07\xfd\x6d\xa4\xb3\xa5\x78\x68\x37\x95\xaf\x13\xf9\x4e\x18\x19\x7b\x44\xf4\xbd\xe3\x15\x5d\x50\x9c\x53\xea\xf2\x86\x72\x32\x35\xf9\xb6\x2e\x1a\x68\xa1\xc6\xfb\xb1\xc2\xfc\x65\x52\xe9\xd6\x04\xa0\xd7\xf2\x8e\x34\xb2\x71\xdf\x3b\x5e\x14\x52\xdf\x67\xa9\xc3\x25\x88\x65\x3d\xf1\xaa\x38\xad\xb8\x45\xb5\xb5\x38\xe9\x50\x80\x25\x99\xfb\x2e\xf6\xf9\x0d\xe6\x22\x1a\xd2\x7c\x2d\x2a\xb7\x17\x82\x47\x4c\x2f\x60\x8b\x04\xbc\xbc\xc5\x27\x8c\x4c\xa6\xe6\x2e\x17\xf5\x16\xa2\xb7\xbd\x66\x89\x4b\x10\x3d\x30\xf6\x84\x76\xc7\xda\xd0\x96\x6a\x68\x41\x24\x2a\x58\x70\x36\x6d\x37\x78\x72\x3f\xfc\xfa\x25\xfa\xee\xeb\x91\x02\x6c\xe9\x08\xaa\x10\x23\xa6\x13\xdb\x43\x9d\xa3\x26\xe3\x68\xbd\x19\xfd\x2d\x5a\x2e\x0d\x2d\xf7\x0a\xca\x2d\xef\xdf\x5e\xea\xb6\xeb\xb6\x02\x57\xa8\xb3\x7a\xde\xf0\x64\xe1\xa9\xba\x2c\x4f\xd5\xa5\x3e\x55\xff\xc6\x2e\x95\xcc\x41\x3d\x09\xae\xe2\x04\x38\x92\xb8\xf1\x14\xe9\xe1\x85\xb7\xc2\x17\x54\x08\xa8\x3b\xa5\xa3\x89\x47\x3c\x6a\x1b\x8e\x40\xfd\x62\xfa\x57\x3a\xa5\xa3\xb1\xa7\x05\x6d\x0e\x6d\xa1\x22\x35\x0c\x67\x94\x52\xfb\xb5\xbb\x28\xee\xff\x4b\x70\x31\x61\x02\x2c\xb0\xdc\x28\x41\x4d\x80\x51\xdd\x1a\x7c\x3f\x1c\x0c\xfe\x2f\xab\x81\x12\x2f\xa1\x98\xce\xd2\xaf\x9e\x08\x2f\x2e\x65\x89\x76\x2e\x51\x18\x95\x1a\xdf\xd8\x33\x72\x31\x45\x0f\x04\xf7\x05\x2d\x2f\xed\x81\x81\xb7\xa0\x30\x5f\x43\x83\xdf\x69\x36\x92\xe9\x1b\xfe\xae\xbe\xe2\xdf\xd1\x5e\xc4\x27\x80\xbe\x51\x6f\x74\x94\xbd\xd7\x78\x5b\xe1\xfd\x58\xaf\x58\xf6\x98\xf0\x3b\x55\xf2\x5b\x2f\xec\x5d\x72\xe6\x57\xf9\xf9\xcb\x2a\x80\x75\x14\x90\x49\xe6\xa6\x9d\x4a\x5d\x7c\x91\x37\xb8\x21\x6f\x7c\x18\x80\xa7\x51\xc8\x07\x86\x89\x2b\xcd\x49\x7c\x63\x6c\x2d\x15\x99\xc0\x7a\xc3\xc6\x7a\xa2\xcf\x2e\x47\x16\x5a\x09\x77\x88\xe6\x08\xa8\x65\xeb\x17\xb9\xc4\xe7\xf9\x4b\x99\x31\x67\x64\x36\xd5\x3a\x64\x46\x29\xcc\xc9\x5b\x1f\x72\x99\xd1\xb7\x40\xf4\x8f\xe1\x94\xe5\xef\xcb\x8b\x3d\x10\xfd\x43\xf8\x58\x14\xe8\xdb\x36\x10\xfd\x23\xd8\x65\x39\x39\x5b\x59\x1f\x37\xf1\xe7\xf9\x64\xbd\x51\x39\x12\x9e\x8f\xa4\x3b\x45\x7d\x36\xbb\xc4\x7d\xcf\x8b\x65\x5e\x9c\x4d\xe1\xa7\x77\x6e\x3f\x18\x20\x84\x56\xbf\x72\xda\xc6\xd2\xe5\xa2\x74\x79\x47\xb2\x62\x1b\xb3\xa5\x89\x8a\xb9\xea\xd8\x04\x66\x3f\x88\x17\x86\x4a\xc6\xa3\x75\x46\x06\x5b\x55\x39\xfb\x65\x12\x45\x6c\x92\xf2\x0e\x8b\x22\xa3\x1b\xb7\xe8\x77\x7b\x8d\xd1\xc0\x52\x73\x6d\xa0\xb9\xdc\x38\x9f\x60\xe8\xc3\x9c\xec\xfa\x90\x40\xa8\x78\x27\x69\x50\xef\x8d\xd6\xd2\x5d\x0e\x2d\x0a\xd7\xd3\x25\x63\xac\x9b\x69\x69\x8c\x15\x27\x32\x57\xd2\x9b\x1e\x77\x74\x43\xc4\x31\x29\x1a\x75\x1c\xae\x95\x69\xef\xaf\xf6\x16\xcc\x0f\x93\x26\x81\xd6\x14\xdc\x4b\xe1\x2d\x10\xed\xc5\x88\xef\xe4\xbf\xab\xe4\x5e\x50\x38\x9a\x1a\xd3\xdd\xd7\x53\x13\x7d\xf2\x0c\x1f\x86\x83\x05\x5c\xe1\xd3\x1f\x0b\x78\x89\x0f\xdb\x0b\x38\x9f\xb6\x3a\x05\x57\x84\xdf\xc1\x9f\x0e\x06\x23\xd7\x81\xc8\x95\x1c\x62\x56\xeb\x9d\x24\x99\xc6\x53\x9e\x13\x43\xe2\x08\x08\x1d\x09\x81\xc3\xc1\x75\xcc\x8d\x54\x46\x21\x75\x4c\xbc\x61\x81\x49\x92\x9f\xc7\x8e\x07\xc2\x49\x40\x3a\x21\x70\x27\x80\xcc\x71\x81\x39\xa9\x92\x94\xf7\xa6\x6b\xfd\xc4\x3a\x01\x39\x9f\xa2\xe7\xc8\x37\x89\xe9\x85\xd0\xdd\xfd\x14\xe6\xe4\x6b\x8a\xd1\x0b\x75\xac\xc5\x0f\xd3\x36\x8b\x3a\x93\x5a\xad\x96\x23\x73\xb8\xbd\x3d\xc8\xcd\x7b\x2b\xae\xfd\xb5\x68\x01\xdb\xf5\xfc\x64\xb5\x10\x11\x4f\x6a\xbe\x8f\x83\x7a\x56\xb2\xba\x75\xde\x26\x7a\xc6\xb5\x21\xf5\x09\x86\x4e\xe7\xce\x94\xec\x4d\x61\x38\x04\x0c\xbd\x2b\x81\x64\x4e\x83\x9f\xba\xa8\xa7\xd6\x8c\x6b\x71\x0a\xd0\xfe\x72\xf4\xd4\x8e\x7b\x2b\xc3\x78\x62\x8a\x9e\xe2\xdf\xa1\x1d\x6f\x0c\x17\x0b\xb2\xa3\xa8\xe7\x87\x69\x1e\x9d\xb8\x08\x5d\xfc\xb4\x97\x15\xef\x32\xa7\x0c\x61\xac\x00\xdd\x21\xf1\xbd\x06\xa7\xbf\x34\xb0\x9b\x07\x39\x68\x1f\xe4\xa0\x7d\x90\x99\xce\xe0\x51\x44\x58\x8e\xf5\x4b\x58\x5a\xbe\xb8\xaa\xc6\x90\xcb\x4b\x9b\x81\xa4\x68\x60\xba\x4b\x72\x38\xda\x6d\x65\xf7\x30\x42\xca\x9f\x4f\x47\xc2\x9e\x91\xdd\xa9\x92\x95\x5c\xcc\xd8\x07\x33\xf2\x29\x01\xa1\x11\x82\xaf\xdf\x19\x1d\xdf\x29\x9e\xb9\xad\x05\xbc\x9b\xde\x69\xee\xfa\xeb\x97\xf1\xef\x33\x5e\x37\x4b\x81\x66\x17\x14\x3e\x2d\x75\x21\x31\x9f\x91\x31\x47\xb8\x20\x87\x9e\x02\x9c\x43\x4f\x1d\xd4\x91\x85\x77\xed\xe3\x24\x96\x97\x4a\x4a\x82\xac\xfd\x56\xa6\x08\x60\x1c\x17\x31\x75\x05\x5d\x1b\xd7\xf9\x41\xdc\xef\x3e\x7c\xa8\x86\x3a\x23\x19\x5a\x8d\x70\x3a\x12\xb6\x65\x2d\x34\xb7\x8a\x03\xbe\x02\xab\x83\xaa\x08\x54\x66\xe1\x2b\x01\x56\x67\x9c\x64\x29\x4f\xd0\x7d\x07\x75\x52\x58\x70\x0b\x56\xc7\x08\xe1\xcb\x49\x91\xcb\x78\x70\xec\x16\x3b\x6d\x8b\x05\x67\x59\xc5\x25\xb0\x8b\x26\x65\xe7\xc4\x8c\x0d\x47\xa7\xe8\x2a\x86\x0f\xc4\xf6\xa2\xcf\x7e\xfd\xda\xc4\xb8\xbe\x6e\xd9\xde\x3c\x74\x5c\x2e\x67\x9c\xc7\xd6\x82\xd0\x9c\x81\x3f\x27\x98\x26\x42\x31\x02\xef\xa6\xd0\x9a\x2a\x2e\x04\x74\x9c\x2f\x07\xdb\xa8\x3a\xf3\x99\xe4\x1d\x97\x79\xd7\xd6\x06\x61\x7d\xa6\xfe\x71\x37\x62\xda\x28\xb2\xaa\xaa\x81\x48\x62\x69\x6d\x24\x1b\x24\xdc\x20\xde\x86\x09\x5c\xe7\xfb\x60\x95\x6b\x09\x29\x7a\xc8\xe7\x39\x9c\x15\xa9\x3f\x9d\x96\x74\xe2\x4c\x81\xd2\x17\x0c\xcd\xce\x69\x45\xae\x39\xb8\x8b\x22\x96\xfc\xe1\x69\x6e\x38\xf0\x69\x9a\xa7\x35\x33\x9d\x9c\x4c\x5b\xbd\x5c\x3f\xa2\x3c\x82\xf1\xbd\xd4\xcf\xdd\x29\x48\x38\xa5\x6d\x97\x54\x57\x59\x2a\xc3\x60\x5e\x5c\x0e\xd5\x35\xc7\x15\x23\x34\xce\xaf\x2b\x7c\xe8\xaa\x67\x05\x7e\xf3\x67\x3d\x19\xde\x1e\x87\x23\x0f\xef\x1a\x0f\x33\x25\xbb\xec\xa3\x04\x73\x94\x29\x61\xe5\xab\x62\xed\xac\xa3\xcb\xcc\x02\xeb\x8d\x08\x2d\xb0\x0e\x99\xb4\xbe\xaf\xc4\xf3\xa9\xf6\x72\x77\x7b\x74\x33\xc1\x5e\x6a\x78\x6d\x69\x30\x45\xc5\xf5\x43\x52\xcb\xbd\x20\x35\x9e\x53\x81\x08\xae\x18\x0b\x63\x73\x5b\x5c\x82\x46\x26\x11\x32\x5e\x4e\x69\xc5\xf2\xe3\xa0\xbe\x81\xb7\x88\xa1\x06\x0b\x78\x35\x35\x11\x4b\xdf\x6a\xde\xc9\x55\xfd\xbd\xd1\xcf\x13\x8b\xc2\x7e\x3b\xb8\xfc\xec\xda\x4f\xaa\xa9\xc0\xf1\x56\x79\x6d\xf5\xc7\xf5\xea\xc7\xe6\x3e\x56\x8a\x24\xbe\xb0\xe8\x9a\xe4\xe1\x2b\x51\x5b\x4c\xfe\xb9\xb8\xdf\x1d\xbd\x4d\xec\x94\x53\xed\xaf\xa8\xf0\x33\x2f\x32\x36\xb6\x5b\x6e\xe4\x39\xa6\x2a\xe9\xa5\x88\xe5\x15\x81\x0b\xbd\x24\x9e\x72\x21\x3b\xa9\x14\x21\x8e\xec\xc5\x54\xdf\x5a\x7f\x35\xbc\xfb\x9c\x83\x27\x28\x85\x1f\xd3\x36\x4f\xdf\x3a\xa8\xcb\x70\xcc\x27\xa1\x77\x5d\x05\xef\xe3\x42\x91\x97\x66\xee\x15\xf7\x64\xd5\x28\x68\x64\xbd\x8e\x7d\xcb\xb6\x0e\x73\x55\xe5\x32\x14\x5c\x26\x99\x68\x52\xfa\x66\x93\x9e\xb6\xfc\x37\x37\x33\xc5\x99\x52\x18\x62\x4e\xf6\xd5\x81\x1c\xc0\x1a\xdb\x5f\x16\x5f\x44\xbc\x67\x94\xfc\xa7\xe6\xbb\x07\xc6\xce\x41\x01\x9a\x1b\x65\xc2\xd2\x0b\x3d\x23\x5f\xb0\x3f\xb5\x40\x14\xd9\xdb\xca\xc1\x0c\x03\x22\x73\x7c\x2e\xfa\xec\xba\x1a\xa8\xd5\x1a\xa0\x21\x55\x9e\x77\x42\xfb\x87\x60\xb5\x9d\x3b\xab\xa9\xf3\x70\xe6\x91\x4d\xcd\x6f\x4f\x43\x3e\xab\x4f\x35\xe7\xad\x2b\xd7\x61\x4a\x28\xbf\xc7\xba\xf4\xee\x5c\x18\xd5\x53\xb9\x34\x2b\xf2\x60\x12\xad\x7e\xa1\x54\x3c\xd9\xab\xfb\xa8\xa4\x2e\xc9\xff\xe9\x4e\x0e\xff\xc3\x3b\x39\xfc\xe7\x3b\xf9\xe3\x7e\x3b\xf9\x63\xed\x4e\xfe\xf3\xbd\x1b\xfe\xdb\x7b\xa7\x4e\x68\x0b\x34\xe9\xed\x23\x71\x3b\x7a\xd2\xee\xae\x6d\xea\x27\x85\x6e\x2c\xcb\x9e\x91\x79\x02\x7f\x80\x44\xc6\x6b\x61\x90\x94\x1c\x19\x9e\xef\x5a\xfd\x73\x45\x6d\xf3\x73\x47\xfd\x73\x5b\xd0\x6e\x64\x76\xe2\x05\x85\xcf\xd3\xa6\xf8\xff\xc6\xeb\xaa\xb4\x68\x68\xb0\xa7\x1c\x1b\xcd\xfe\xc5\xa5\x34\xea\x02\xbc\x55\x47\xd3\xee\x16\x4b\x54\xc9\x6f\xe4\x3a\x33\xd4\xe5\xf2\x46\x1b\x54\x5d\x65\xf9\xba\xf9\x79\xbc\x1c\x32\x3c\xf8\xdb\x83\x3d\xa9\x5a\x1b\x97\x73\x6d\xbc\x06\x11\x25\xfb\xf3\x7e\xda\x9a\x71\xb7\xcd\x4e\x5a\xc7\x89\x72\x74\x9c\x28\x0c\xb7\xea\xa2\xe1\xea\x2e\x21\xf2\x0e\xa3\xff\xdc\x7a\x11\xed\xf7\x65\xdf\x5d\xe5\x0e\xd7\x1b\xf0\xff\x33\xf3\xfc\x8a\x31\xbe\x30\xc6\xf8\xc2\x18\xe3\x1f\xf9\xc8\x08\x14\x46\xf6\xe8\x8d\x51\x33\xb2\x57\x92\x87\x36\xc6\x5e\x76\x69\xb9\xbf\x31\xb6\x68\x37\xc6\xfe\x3c\x45\x8f\x18\x9e\xef\xc7\xd7\x69\xfb\x91\xaa\x18\x8e\xb2\x81\xfe\x5c\xf9\xa5\xf7\xa8\x49\xd1\x66\x97\xdf\xa6\xf7\x71\xab\x5b\xc9\x82\xb3\xb2\x88\x66\xe1\x64\xdf\x1d\xfd\x35\x23\x6f\xa6\x39\x2f\x7c\x5c\xd1\x3a\xed\xe4\x61\x64\xf5\x1d\x9a\xdd\x41\xff\xc6\xaf\x02\x33\xc0\x14\x48\xe5\xeb\x14\x3d\x59\x50\x4d\xd6\xdc\xcf\xc7\xa4\x8c\x48\x5b\xb9\xdd\x33\x67\x7d\x99\x01\xd5\xeb\x58\x4f\xf4\x5d\xba\x00\xb6\xce\x4a\x1b\xb4\xe2\xbf\xbd\x19\x13\x31\xf2\x32\xcb\x66\xc7\x8a\x0d\x8b\xbb\xed\xd1\x16\x1b\x1c\x13\xab\xc3\xa9\x30\xc9\x9e\x0f\x2f\x3d\x98\x91\x6f\x7a\xee\xf5\x14\x47\xc6\x41\xb1\xce\x15\x33\x5f\x8d\x40\x74\x1d\x6b\x2c\x7b\x8f\x2d\x90\xdd\x15\x03\x8a\xd5\x89\xed\x12\xd1\x05\xe3\xd8\x33\xb2\x3a\x4b\x77\xcc\x56\x49\x04\xb4\x6a\xed\x5d\x8b\xd9\x58\x85\x09\x2b\x76\x65\xdf\x64\x5f\xec\x68\x3a\x8d\x1b\x8e\x9b\x53\x6e\x56\x6e\xd3\x9e\x56\xec\x8f\xb4\xf6\xf9\x45\x56\xd1\xe5\x0e\x11\xbd\xc3\x32\x11\xd5\x02\x68\x81\xa4\xcd\x42\x16\x74\xb5\x69\x0b\xab\x16\x14\xbd\x80\x73\x1f\xc5\xc8\x9a\x3e\x70\x41\xcc\x71\xe2\x5d\xc3\xce\x67\x5d\x67\xad\xda\xd8\x5c\xc2\x23\x1e\x3d\x71\x2b\x1c\xca\x67\xa1\x69\xe0\x4e\x09\x93\xc0\xba\xf7\x39\xa4\x0a\x3f\x75\xac\x0d\xd1\xcd\x7b\xeb\xd6\x3c\x54\x90\x0d\x40\x87\x75\x6e\xd9\xd6\x31\xa6\xd6\x6c\xb4\x5d\x1a\x47\xbd\xcd\xce\xaa\xf1\xc2\x09\x23\xbc\xbb\x32\xf3\x78\x99\x59\x58\x6a\x6b\x80\x42\xeb\xc1\x97\xee\xff\x50\x3d\x5c\x50\x05\x0f\x97\xed\xd9\x02\x92\xae\xd1\xdc\x84\xdd\x3b\x72\xb8\xb0\x3e\xe3\x79\x2c\x3e\xaf\x12\x46\xbd\x49\xfa\xd7\x16\x52\x9a\xa7\x48\xa2\x6c\xac\x33\x4c\x18\x2b\xfd\x8a\x4d\x44\xc7\xda\x90\x55\xe0\x5d\x45\x1b\xa2\x44\x31\x78\x29\xcc\xa7\x84\xe9\x84\x00\x9e\xb9\x4f\xcb\x56\x0d\x6f\x3a\x4b\x30\x54\x6c\x7d\xce\x06\xad\x1c\xe4\xfb\x8e\xfc\xbf\x67\xb4\x95\x81\xe5\xa8\x42\x3b\xe6\x78\xcd\x07\xe4\xee\xd5\x35\x6e\x57\xff\x13\x8b\x9b\x03\xdc\xea\x3d\xe1\x5d\xe7\x38\xc9\xa1\x71\x41\x21\xe8\xde\xef\xd6\x42\x89\x95\x95\x03\x17\x90\xb0\x0b\x07\x3e\x18\x89\x11\x94\x30\xd2\x8b\x2e\x7a\xdb\x68\xc0\xf9\xc4\xc4\xd6\xf9\xe0\xc1\x8d\x47\xe1\xc6\x23\x49\x97\x42\x4c\xa1\x68\xf6\xca\xe4\x3f\x29\x5b\x6e\x2d\xb5\x3c\x5f\x6a\x29\x2b\x2d\x5f\xa3\xc9\x7b\xe3\xe7\xf6\x96\x1a\x89\x86\x45\xd1\x1b\x65\x1a\x0f\x4d\xe3\x95\x9d\x52\xc7\xf6\xff\xf9\xbf\xad\x15\x9f\xa4\xa5\xbd\xa8\xa3\x39\x83\x3b\x3a\xda\x16\xa0\xb7\x64\x6c\x71\xe3\x11\xaf\xdb\x2e\x30\x78\x2c\xe2\xb1\xcf\xc4\x92\xb8\xf0\x9d\xde\xe5\x0f\x12\x0a\x78\xf4\x5f\x24\x89\x7f\xa9\x71\xed\x60\x8d\x2e\x7d\x14\xf6\x25\x4f\x25\x89\x9d\x98\x8e\x2c\x9f\x49\xd6\xb3\x36\x62\x3b\x86\x47\xff\xf5\xaf\xf4\x77\x72\xc5\xa6\x2c\xf5\x44\x38\x91\xf6\x2f\x55\x68\x2b\x26\xf6\x5f\x8f\x2e\xe5\x38\x2a\x9a\x0a\x47\xa0\x45\x95\x4e\x98\xa5\x90\xbb\x27\x40\x77\x75\x21\xd8\x78\x7c\xce\xfd\x10\xe3\x80\xe4\x31\xb5\x20\xed\xb6\x39\x44\xe7\x9e\xd0\xe2\x5f\xf1\xaf\x7f\x89\x5f\xff\x8a\xb5\x43\x74\xd4\xd5\x6e\xaf\xfc\x46\x32\xc1\x99\x45\xc1\xef\xae\x4d\xcc\x35\x27\x3b\x29\x6c\xc1\xf0\x31\x7c\x15\x24\xed\xea\x34\xaf\x68\xbd\x90\xfd\xf7\x20\x47\xb1\xfe\xfc\xc6\xe5\xf9\x8d\xba\xe6\x00\x67\xf9\x01\x96\x78\x80\xf9\xbd\xb1\x23\x7c\xf4\x08\x53\x4b\xfd\x1f\x40\x93\xff\x2d\xe3\x6e\x1a\xe2\x7f\x1a\x61\xfe\x0f\x2c\x78\x41\xa2\x97\x26\xf3\x8f\x51\xe7\xb4\xdb\xe8\xf5\xa3\x23\xe4\xf2\x3e\x7b\x0c\x98\x50\xae\x0b\x9e\xfa\x33\x00\xf4\xf7\xfc\x08\xa1\xfa\xb5\x87\x69\xe6\xd8\x2b\x0c\xf2\xd5\x1d\x9d\x13\xeb\x23\x9f\xe5\x69\x22\x14\x3a\x7b\x8d\x0e\x4a\x18\xc3\xd7\x7a\xed\x87\xb2\x2c\x7b\xcb\x89\x09\x29\x58\x0d\xd9\xd6\x72\x73\x9d\x0b\x58\x73\x12\x74\x21\xeb\xbb\x5f\x20\xeb\xb3\x53\xc8\xfa\x29\xce\xbb\x0b\x1e\xb0\x0a\x72\x2d\x42\xfc\x88\xae\xd1\x3d\x16\x28\xf5\xf5\x14\xf3\x97\x9e\x50\x98\x12\xbf\x0b\xd6\xcb\x3c\x01\x79\x5e\x75\x56\x54\x3d\xd2\x55\x8f\x96\x96\xb6\x20\x1d\x73\x12\x77\x81\x43\xa2\xc3\x52\xb1\x2e\x4a\x89\x6a\x8c\x57\x8a\xe8\x19\xbb\xd0\xae\xc3\x05\x8c\xbb\x4e\x26\xe0\xb2\x11\xb9\xc4\x82\x04\x02\x55\x1b\x79\xb0\x8c\xee\x3d\x0d\xb5\x2f\x5a\x2b\x7a\x0c\xc5\xc8\x1d\xc1\x3b\xf3\x24\xeb\xa4\x99\x79\x98\xb1\x58\x76\x64\xd2\xd1\xf9\xe3\x97\x58\xf2\x91\x45\x81\x6d\xdb\xeb\x2d\x61\x4f\x18\xd9\xc7\x44\x3f\x7a\xae\x55\x03\xc6\x97\x49\x1c\x84\x62\xac\x69\x8d\xfb\xc3\xde\xe7\xe4\x28\xa1\xe0\x3d\xb1\xad\xd7\xfa\x6b\xf9\xbe\x63\x56\x8a\x35\xcc\x71\x93\x5e\xc2\x58\x53\xa6\x3c\x0a\x8c\x86\xa9\x74\x6d\x30\xc7\x6a\x03\x0d\xde\xcf\x7d\x13\x65\x10\xf3\x58\xb4\x7e\x05\x5d\x28\x36\x88\xf5\xd0\x44\x44\xd3\x7e\xdf\x5a\x30\xbe\xd1\x28\xfd\xf2\xb1\x45\xe1\x7a\xcd\x38\xff\xcf\x0c\x26\xb0\x7a\xc7\x63\x72\x5c\xac\xd2\x93\x59\x17\x99\x90\xd4\x02\xd1\x67\xa7\x75\xd1\x53\x97\x23\x57\x84\x35\xdc\x2f\x0d\x97\x33\xd8\x05\x6e\xaf\x6f\x7a\xc1\xe0\x5b\xa8\x22\x71\x7d\xf8\x9b\x9e\xf0\xcb\x41\xf6\x65\x05\xba\x4e\x8c\x96\x93\x52\x38\xf5\x88\xa0\x8d\xb1\xe8\x97\xe6\xb9\x5e\x0f\xb0\x4e\xcc\x5b\x09\x38\x60\xc0\x7e\x17\xdd\x6e\x2a\x83\xd2\x13\xb7\x68\xe3\xb5\xd5\x7f\xa0\xff\x57\x3c\xe2\x5a\xc9\xad\x56\x55\xac\xa8\x5e\x4b\xbd\xce\x27\x4f\x6d\xd0\x35\xa5\x70\xe0\x91\x78\x84\x37\xe2\x17\x5d\x10\xf0\x60\x48\xa9\xbd\x23\x0b\x55\xa8\x5c\x50\xd8\xe9\x36\x84\x33\x34\x6b\x28\x6b\xaa\x1f\x5e\x89\xb8\x88\xd1\x3a\x4c\xcc\xd5\x36\x7b\x41\x36\x5f\x68\x03\xda\xb5\x96\xb1\xee\xc9\xc2\x58\xc4\xe2\x35\x2b\xa5\x18\x3d\xe0\xb2\xbb\xea\x8e\x5d\x4e\xb1\xa1\xa3\x73\xb5\xe5\x0a\xc8\xae\xbb\x79\x10\x04\xf5\x82\xa2\x95\xf2\x02\xe3\xe1\x18\x1f\xe5\x1c\xaa\x72\xd3\xa7\x55\x2d\x8b\x6c\xd5\xb2\x1c\x76\xab\x59\x56\x8e\xd6\x48\x19\x68\x8a\x27\xf3\xc0\xad\x27\x1e\xec\xf3\xba\x2e\x43\x14\x17\x02\x95\x30\x96\x99\x4f\xde\x31\x72\xeb\xa1\x36\x6c\xc9\xa3\xc7\x65\xfe\x05\xef\xe0\xbf\xbd\x49\x18\x45\xc9\xcc\xfc\x30\x23\x35\x68\x00\xf1\xa4\x4c\x26\x4b\xae\x66\xfa\x3a\x3b\x36\x2c\xf8\xa2\xe5\x73\xdf\xf1\x3e\x61\x41\xe1\xf5\xaa\x0a\x29\x0c\x88\x4e\xdf\x51\x51\x90\xb7\x58\x31\x16\x88\xcb\xdc\x9d\x1e\x29\xe0\x1b\xa8\xc5\x5b\x55\x5b\xdf\xab\x8b\xc6\xd0\x1b\xd8\x6b\xdc\xf7\xae\x40\xc1\x50\x71\x17\x70\xf6\x7f\x32\x1d\xfc\x82\x06\x07\x78\x89\xdb\x77\xfd\x45\x2b\x45\xbc\xea\x1a\x93\xb3\x97\x9a\xfc\xb8\x16\x85\xf3\x7b\xa9\x90\x2a\x7c\xa8\x48\x66\x56\x4d\x91\x67\xee\xd7\x7a\x9b\x28\x23\x62\xdd\xa5\xc0\x12\x33\xf2\xb2\xdb\xc4\x9b\x2e\xdd\xce\xf5\x86\x83\xbb\x5d\xd6\x44\x21\xeb\xed\x35\xf3\x93\xa2\x35\xb2\xc4\x97\x22\x6f\x81\x09\x6c\xf3\x4d\xdf\xbd\xd3\x3b\x98\xc2\xd2\x9f\x11\x6a\xb1\x24\x0a\xbb\xdc\x53\x64\xaa\xff\xa7\xc9\xc5\x17\x4e\xae\xba\xff\x5d\xb4\x62\xa5\xf3\x65\x42\x21\xcb\x4d\x3c\xef\x82\xf5\xee\x95\x65\x02\xb5\xf9\xc5\x3b\x4d\xd5\x3b\x4c\x62\xd1\x39\x96\x7e\xa1\x45\xb1\x62\x0a\x96\x0a\xd9\x69\x59\xa8\x55\x90\xfe\x72\xe3\x4a\xb9\xd6\x55\xfa\x1d\x77\x6e\xbe\xcb\x4e\xca\xb2\x9c\xd5\xd6\x05\x47\xd5\x01\x49\x8e\xaf\x15\x5e\x32\x3b\x53\x94\xe6\x0a\x66\x0b\x96\x4d\x6c\xce\x13\x78\xe7\x99\xdb\x11\x0a\x52\x27\x05\x02\xa1\x88\x20\xd7\x44\xf0\xac\x0b\x12\x1e\x0c\x0a\x22\xb8\xa0\xf0\xc1\xb0\x77\x9b\x4a\x7c\xd2\xcf\x5e\xe2\x2b\x10\xda\xd5\xbf\x26\x6a\x9f\xe0\xd4\x54\x33\xd6\x33\xf0\x4e\xff\x8e\xd9\xd4\xa2\xf0\xa9\xeb\xfc\xbc\xb1\xcb\xcc\x0f\xe0\x26\xb6\xd1\x79\x5b\x0b\x38\xd0\xa5\xfa\xad\xb5\x80\x93\xbc\x76\x11\x41\x19\x4b\x0e\xf3\x5f\x0b\xb8\x2d\x6a\x14\x69\xa3\xb0\x46\xfe\x6b\x01\xaf\x8a\x1a\x26\xa1\x0d\x96\xeb\xe7\x05\xbc\xed\xb6\x87\x58\x6b\x04\xfd\x6e\x1d\xec\x3f\x75\x6b\x20\x7f\xd0\xcd\x89\xa4\x61\x07\x8c\xf1\xe6\xb2\xcd\xe6\x6d\xb7\x96\xef\xf4\x55\xb7\x96\x8f\xe3\xa0\x5b\x87\xf7\x93\xee\x62\xa1\xaf\xa1\x46\x56\xa7\xf4\xc7\x5d\x50\x78\x73\x27\xb7\xbd\x14\x79\x62\x63\x46\xde\x1a\x04\xbc\xea\x3e\x5d\x89\xf8\x70\xcb\x88\xe8\xdf\x60\x8c\x1d\xe3\x0c\x54\x73\x0d\x32\x51\x20\x90\xd0\x7f\xea\xc2\x6d\x17\x5e\x75\xe1\xa4\x0b\x6a\xc5\xf3\x98\x82\x13\x91\x8c\xb9\xbc\xe4\x59\xda\x0f\x93\x47\x7e\xe2\xa5\x7a\xf3\xc3\xf8\x42\x3f\x8c\x59\xcc\x2e\xb8\x78\xa4\xb7\x66\x97\x47\x13\x6b\xf1\x9d\xc2\x97\xf5\x38\x7c\xc9\xb1\xc0\xc8\x12\xcc\xf7\xd1\x67\xcf\xda\x46\x6f\xb9\xdc\x35\xc7\x84\x1f\x12\xab\xb7\xb4\xf0\xc5\x23\x71\xdf\x3b\xad\xe3\x6d\x63\xec\xd4\x99\x54\xc4\x8a\x7d\xaf\x6a\x0d\x7d\xdc\x75\x42\x41\x2c\x81\x36\xd3\x2f\xba\xed\x99\xe9\x3f\x7b\x60\xe1\x72\xaa\x3e\x30\x68\x15\x1c\x77\x89\x95\xca\x79\xc4\xd3\x4b\xce\x65\x61\x51\x15\x25\xcc\x47\x6b\x2a\x41\x3c\x8c\x7a\x5d\x98\xe1\x71\x21\x12\x61\x8a\xe2\x8c\x58\x6f\x58\x18\x71\x5f\xd1\x61\xd5\xa6\xf3\xf2\xf0\xb0\x13\x88\x64\xac\x13\x3c\x51\xe3\xc1\xa9\xc3\xa7\x1e\xc4\xe4\xa7\xf7\xca\xbe\x02\xef\x8b\x7d\xce\xc0\x3b\xb0\x1b\x19\xcb\xee\x48\x91\x11\x4d\x6c\xd9\xc2\x56\x3f\xb6\x81\xd9\x73\xf2\x35\x02\xeb\x7f\x59\x40\x62\x9d\x57\x8e\x3d\x01\xfd\x6e\x64\x29\x7e\xe2\x08\xfd\x19\xdf\x47\x8a\xad\xc8\x60\x57\x91\x86\xf9\xa8\x8c\x26\x69\x97\x21\x26\xe3\xbe\xeb\x29\xfe\xb2\xcf\x32\x8c\xe0\x0f\xde\xb6\xdd\x95\xe4\x87\xa0\xe0\x3d\xb3\x3f\x44\xe0\xbb\x0d\x23\x53\x7c\xc8\x01\xf9\xeb\xbd\x5e\x7a\xe4\x00\x76\x2a\x20\x63\x2d\x16\x0b\xfa\x9c\x25\xce\xcf\x7d\x16\xc6\xf6\xcf\x30\x0e\xa5\xfd\x43\x90\x83\x90\x92\x81\xfa\x48\xdc\x7f\x1d\x8d\x47\x79\xbf\x1d\x63\x32\x15\x24\x82\x20\x8f\xde\x09\xe3\x8e\xa4\xf8\x47\x8c\x30\x7a\x95\xe5\x38\x7c\x34\x21\x4f\xa8\x1d\x13\xf1\x17\xff\x0e\xf2\x2f\xfe\x9d\xda\xea\xd1\x51\x8f\x0b\x82\x5d\x02\x4b\xa8\x8d\x4f\x0e\x4b\x16\x44\xb1\x41\xf4\xf9\xff\x1b\x00\x00\xff\xff\xfc\x7a\x5c\xc5\x8e\xb1\x01\x00"), }, "/templates": &vfsgen۰DirInfo{ name: "templates", @@ -184,16 +184,16 @@ var Assets = func() http.FileSystem { fs["/static/script.js"].(os.FileInfo), } fs["/static/lib"].(*vfsgen۰DirInfo).entries = []os.FileInfo{ - fs["/static/lib/bootstrap-4.0.0-alpha.6-dist"].(os.FileInfo), + fs["/static/lib/bootstrap-4.6.2-dist"].(os.FileInfo), fs["/static/lib/elm-datepicker"].(os.FileInfo), fs["/static/lib/font-awesome-4.7.0"].(os.FileInfo), } - fs["/static/lib/bootstrap-4.0.0-alpha.6-dist"].(*vfsgen۰DirInfo).entries = []os.FileInfo{ - fs["/static/lib/bootstrap-4.0.0-alpha.6-dist/css"].(os.FileInfo), + fs["/static/lib/bootstrap-4.6.2-dist"].(*vfsgen۰DirInfo).entries = []os.FileInfo{ + fs["/static/lib/bootstrap-4.6.2-dist/css"].(os.FileInfo), } - fs["/static/lib/bootstrap-4.0.0-alpha.6-dist/css"].(*vfsgen۰DirInfo).entries = []os.FileInfo{ - fs["/static/lib/bootstrap-4.0.0-alpha.6-dist/css/bootstrap.min.css"].(os.FileInfo), - fs["/static/lib/bootstrap-4.0.0-alpha.6-dist/css/bootstrap.min.css.map"].(os.FileInfo), + fs["/static/lib/bootstrap-4.6.2-dist/css"].(*vfsgen۰DirInfo).entries = []os.FileInfo{ + fs["/static/lib/bootstrap-4.6.2-dist/css/bootstrap.min.css"].(os.FileInfo), + fs["/static/lib/bootstrap-4.6.2-dist/css/bootstrap.min.css.map"].(os.FileInfo), } fs["/static/lib/elm-datepicker"].(*vfsgen۰DirInfo).entries = []os.FileInfo{ fs["/static/lib/elm-datepicker/css"].(os.FileInfo), diff --git a/vendor/github.com/prometheus/alertmanager/config/config.go b/vendor/github.com/prometheus/alertmanager/config/config.go index 4f8d803e63c..d0107614749 100644 --- a/vendor/github.com/prometheus/alertmanager/config/config.go +++ b/vendor/github.com/prometheus/alertmanager/config/config.go @@ -14,6 +14,7 @@ package config import ( + "cmp" "encoding/json" "errors" "fmt" @@ -24,6 +25,7 @@ import ( "regexp" "sort" "strings" + "text/template" "time" commoncfg "github.com/prometheus/common/config" @@ -199,6 +201,85 @@ func (s *SecretURL) UnmarshalJSON(data []byte) error { return nil } +// containsTemplating checks if the string contains template syntax. +func containsTemplating(s string) (bool, error) { + if !strings.Contains(s, "{{") { + return false, nil + } + // If it contains template syntax, validate it's actually a valid templ. + _, err := template.New("").Parse(s) + if err != nil { + return true, err + } + return true, nil +} + +// SecretTemplateURL is a Secret string that represents a URL which may contain +// Go template syntax. Unlike SecretURL, it allows templated values and only +// validates non-templated URLs at unmarshal time. +type SecretTemplateURL Secret + +// MarshalYAML implements the yaml.Marshaler interface for SecretTemplateURL. +func (s SecretTemplateURL) MarshalYAML() (any, error) { + if s != "" { + if MarshalSecretValue { + return string(s), nil + } + return secretToken, nil + } + return nil, nil +} + +// UnmarshalYAML implements the yaml.Unmarshaler interface for SecretTemplateURL. +func (s *SecretTemplateURL) UnmarshalYAML(unmarshal func(any) error) error { + type plain Secret + if err := unmarshal((*plain)(s)); err != nil { + return err + } + + urlStr := string(*s) + + // Skip validation for empty strings or secret token + if urlStr == "" || urlStr == secretToken { + return nil + } + + // Check if the URL contains template syntax + isTemplated, err := containsTemplating(urlStr) + if err != nil { + return fmt.Errorf("invalid template syntax: %w", err) + } + + // Only validate as URL if it's not templated + if !isTemplated { + if _, err := parseURL(urlStr); err != nil { + return fmt.Errorf("invalid URL: %w", err) + } + } + + return nil +} + +// MarshalJSON implements the json.Marshaler interface for SecretTemplateURL. +func (s SecretTemplateURL) MarshalJSON() ([]byte, error) { + return Secret(s).MarshalJSON() +} + +// UnmarshalJSON implements the json.Unmarshaler interface for SecretTemplateURL. +func (s *SecretTemplateURL) UnmarshalJSON(data []byte) error { + if string(data) == secretToken || string(data) == secretTokenJSON { + *s = "" + return nil + } + // Just unmarshal as a string since Secret doesn't have UnmarshalJSON + var str string + if err := json.Unmarshal(data, &str); err != nil { + return err + } + *s = SecretTemplateURL(str) + return nil +} + // Load parses the YAML input s into a Config. func Load(s string) (*Config, error) { cfg := &Config{} @@ -407,6 +488,10 @@ func (c *Config) UnmarshalYAML(unmarshal func(any) error) error { return errors.New("at most one of victorops_api_key & victorops_api_key_file must be configured") } + if c.Global.TelegramBotToken != "" && len(c.Global.TelegramBotTokenFile) > 0 { + return errors.New("at most one of telegram_bot_token & telegram_bot_token_file must be configured") + } + if len(c.Global.SMTPAuthPassword) > 0 && len(c.Global.SMTPAuthPasswordFile) > 0 { return errors.New("at most one of smtp_auth_password & smtp_auth_password_file must be configured") } @@ -419,6 +504,14 @@ func (c *Config) UnmarshalYAML(unmarshal func(any) error) error { return errors.New("at most one of rocketchat_token_id & rocketchat_token_id_file must be configured") } + if len(c.Global.SMTPAuthSecret) > 0 && len(c.Global.SMTPAuthSecretFile) > 0 { + return fmt.Errorf("at most one of smtp_auth_secret & smtp_auth_secret_file must be configured") + } + + if c.Global.WeChatAPISecret != "" && len(c.Global.WeChatAPISecretFile) > 0 { + return errors.New("at most one of wechat_api_secret & wechat_api_secret_file must be configured") + } + names := map[string]struct{}{} for _, rcv := range c.Receivers { @@ -426,53 +519,39 @@ func (c *Config) UnmarshalYAML(unmarshal func(any) error) error { return fmt.Errorf("notification config name %q is not unique", rcv.Name) } for _, wh := range rcv.WebhookConfigs { - if wh.HTTPConfig == nil { - wh.HTTPConfig = c.Global.HTTPConfig - } + wh.HTTPConfig = cmp.Or(wh.HTTPConfig, c.Global.HTTPConfig) } for _, ec := range rcv.EmailConfigs { - if ec.TLSConfig == nil { - ec.TLSConfig = c.Global.SMTPTLSConfig - } + ec.TLSConfig = cmp.Or(ec.TLSConfig, c.Global.SMTPTLSConfig) + ec.Smarthost = cmp.Or(ec.Smarthost, c.Global.SMTPSmarthost) if ec.Smarthost.String() == "" { - if c.Global.SMTPSmarthost.String() == "" { - return errors.New("no global SMTP smarthost set") - } - ec.Smarthost = c.Global.SMTPSmarthost + return errors.New("no global SMTP smarthost set") } + ec.From = cmp.Or(ec.From, c.Global.SMTPFrom) if ec.From == "" { - if c.Global.SMTPFrom == "" { - return errors.New("no global SMTP from set") - } - ec.From = c.Global.SMTPFrom - } - if ec.Hello == "" { - ec.Hello = c.Global.SMTPHello - } - if ec.AuthUsername == "" { - ec.AuthUsername = c.Global.SMTPAuthUsername + return errors.New("no global SMTP from set") } + ec.Hello = cmp.Or(ec.Hello, c.Global.SMTPHello) + ec.AuthUsername = cmp.Or(ec.AuthUsername, c.Global.SMTPAuthUsername) if ec.AuthPassword == "" && ec.AuthPasswordFile == "" { ec.AuthPassword = c.Global.SMTPAuthPassword ec.AuthPasswordFile = c.Global.SMTPAuthPasswordFile } - if ec.AuthSecret == "" { - ec.AuthSecret = c.Global.SMTPAuthSecret - } - if ec.AuthIdentity == "" { - ec.AuthIdentity = c.Global.SMTPAuthIdentity - } + ec.AuthSecret = cmp.Or(ec.AuthSecret, c.Global.SMTPAuthSecret) + ec.AuthSecretFile = cmp.Or(ec.AuthSecretFile, c.Global.SMTPAuthSecretFile) + ec.AuthIdentity = cmp.Or(ec.AuthIdentity, c.Global.SMTPAuthIdentity) if ec.RequireTLS == nil { ec.RequireTLS = new(bool) *ec.RequireTLS = c.Global.SMTPRequireTLS } + if ec.ForceImplicitTLS == nil { + ec.ForceImplicitTLS = c.Global.SMTPForceImplicitTLS + } } for _, sc := range rcv.SlackConfigs { + sc.AppURL = cmp.Or(sc.AppURL, c.Global.SlackAppURL) if sc.AppURL == nil { - if c.Global.SlackAppURL == nil { - return errors.New("no global Slack App URL set") - } - sc.AppURL = c.Global.SlackAppURL + return errors.New("no global Slack App URL set") } // we only want to set the app token from global if there's no local authorization or webhook url if sc.AppToken == "" && len(sc.AppTokenFile) == 0 && (sc.HTTPConfig == nil || sc.HTTPConfig.Authorization == nil) && sc.APIURL == nil { @@ -504,71 +583,51 @@ func (c *Config) UnmarshalYAML(unmarshal func(any) error) error { } } for _, poc := range rcv.PushoverConfigs { - if poc.HTTPConfig == nil { - poc.HTTPConfig = c.Global.HTTPConfig - } + poc.HTTPConfig = cmp.Or(poc.HTTPConfig, c.Global.HTTPConfig) } for _, pdc := range rcv.PagerdutyConfigs { - if pdc.HTTPConfig == nil { - pdc.HTTPConfig = c.Global.HTTPConfig - } + pdc.HTTPConfig = cmp.Or(pdc.HTTPConfig, c.Global.HTTPConfig) + pdc.URL = cmp.Or(pdc.URL, c.Global.PagerdutyURL) if pdc.URL == nil { - if c.Global.PagerdutyURL == nil { - return errors.New("no global PagerDuty URL set") - } - pdc.URL = c.Global.PagerdutyURL + return errors.New("no global PagerDuty URL set") } } for _, iio := range rcv.IncidentioConfigs { - if iio.HTTPConfig == nil { - iio.HTTPConfig = c.Global.HTTPConfig - } + iio.HTTPConfig = cmp.Or(iio.HTTPConfig, c.Global.HTTPConfig) } for _, ogc := range rcv.OpsGenieConfigs { - if ogc.HTTPConfig == nil { - ogc.HTTPConfig = c.Global.HTTPConfig - } + ogc.HTTPConfig = cmp.Or(ogc.HTTPConfig, c.Global.HTTPConfig) + ogc.APIURL = cmp.Or(ogc.APIURL, c.Global.OpsGenieAPIURL) if ogc.APIURL == nil { - if c.Global.OpsGenieAPIURL == nil { - return errors.New("no global OpsGenie URL set") - } - ogc.APIURL = c.Global.OpsGenieAPIURL + return errors.New("no global OpsGenie URL set") } if !strings.HasSuffix(ogc.APIURL.Path, "/") { ogc.APIURL.Path += "/" } + ogc.APIKey = cmp.Or(ogc.APIKey, c.Global.OpsGenieAPIKey) + ogc.APIKeyFile = cmp.Or(ogc.APIKeyFile, c.Global.OpsGenieAPIKeyFile) if ogc.APIKey == "" && len(ogc.APIKeyFile) == 0 { - if c.Global.OpsGenieAPIKey == "" && len(c.Global.OpsGenieAPIKeyFile) == 0 { - return errors.New("no global OpsGenie API Key set either inline or in a file") - } - ogc.APIKey = c.Global.OpsGenieAPIKey - ogc.APIKeyFile = c.Global.OpsGenieAPIKeyFile + return errors.New("no global OpsGenie API Key set either inline or in a file") } } for _, wcc := range rcv.WechatConfigs { - if wcc.HTTPConfig == nil { - wcc.HTTPConfig = c.Global.HTTPConfig - } - + wcc.HTTPConfig = cmp.Or(wcc.HTTPConfig, c.Global.HTTPConfig) + wcc.APIURL = cmp.Or(wcc.APIURL, c.Global.WeChatAPIURL) if wcc.APIURL == nil { - if c.Global.WeChatAPIURL == nil { - return errors.New("no global Wechat URL set") - } - wcc.APIURL = c.Global.WeChatAPIURL + return errors.New("no global Wechat URL set") } - if wcc.APISecret == "" { - if c.Global.WeChatAPISecret == "" { - return errors.New("no global Wechat ApiSecret set") + if wcc.APISecret == "" && len(wcc.APISecretFile) == 0 { + if c.Global.WeChatAPISecret == "" && len(c.Global.WeChatAPISecretFile) == 0 { + return errors.New("no global Wechat Api Secret set either inline or in a file") } wcc.APISecret = c.Global.WeChatAPISecret + wcc.APISecretFile = c.Global.WeChatAPISecretFile } + wcc.CorpID = cmp.Or(wcc.CorpID, c.Global.WeChatAPICorpID) if wcc.CorpID == "" { - if c.Global.WeChatAPICorpID == "" { - return errors.New("no global Wechat CorpID set") - } - wcc.CorpID = c.Global.WeChatAPICorpID + return errors.New("no global Wechat CorpID set") } if !strings.HasSuffix(wcc.APIURL.Path, "/") { @@ -576,113 +635,85 @@ func (c *Config) UnmarshalYAML(unmarshal func(any) error) error { } } for _, voc := range rcv.VictorOpsConfigs { - if voc.HTTPConfig == nil { - voc.HTTPConfig = c.Global.HTTPConfig - } + voc.HTTPConfig = cmp.Or(voc.HTTPConfig, c.Global.HTTPConfig) + voc.APIURL = cmp.Or(voc.APIURL, c.Global.VictorOpsAPIURL) if voc.APIURL == nil { - if c.Global.VictorOpsAPIURL == nil { - return errors.New("no global VictorOps URL set") - } - voc.APIURL = c.Global.VictorOpsAPIURL + return errors.New("no global VictorOps URL set") } if !strings.HasSuffix(voc.APIURL.Path, "/") { voc.APIURL.Path += "/" } + voc.APIKey = cmp.Or(voc.APIKey, c.Global.VictorOpsAPIKey) + voc.APIKeyFile = cmp.Or(voc.APIKeyFile, c.Global.VictorOpsAPIKeyFile) if voc.APIKey == "" && len(voc.APIKeyFile) == 0 { - if c.Global.VictorOpsAPIKey == "" && len(c.Global.VictorOpsAPIKeyFile) == 0 { - return errors.New("no global VictorOps API Key set") - } - voc.APIKey = c.Global.VictorOpsAPIKey - voc.APIKeyFile = c.Global.VictorOpsAPIKeyFile + return errors.New("no global VictorOps API Key set") } } for _, sns := range rcv.SNSConfigs { - if sns.HTTPConfig == nil { - sns.HTTPConfig = c.Global.HTTPConfig - } + sns.HTTPConfig = cmp.Or(sns.HTTPConfig, c.Global.HTTPConfig) } for _, telegram := range rcv.TelegramConfigs { - if telegram.HTTPConfig == nil { - telegram.HTTPConfig = c.Global.HTTPConfig - } - if telegram.APIUrl == nil { - telegram.APIUrl = c.Global.TelegramAPIUrl + telegram.HTTPConfig = cmp.Or(telegram.HTTPConfig, c.Global.HTTPConfig) + telegram.APIUrl = cmp.Or(telegram.APIUrl, c.Global.TelegramAPIUrl) + if telegram.BotToken == "" && len(telegram.BotTokenFile) == 0 { + if c.Global.TelegramBotToken == "" && len(c.Global.TelegramBotTokenFile) == 0 { + return errors.New("missing bot_token or bot_token_file on telegram_config") + } + telegram.BotToken = c.Global.TelegramBotToken + telegram.BotTokenFile = c.Global.TelegramBotTokenFile } } for _, discord := range rcv.DiscordConfigs { - if discord.HTTPConfig == nil { - discord.HTTPConfig = c.Global.HTTPConfig - } + discord.HTTPConfig = cmp.Or(discord.HTTPConfig, c.Global.HTTPConfig) if discord.WebhookURL == nil && len(discord.WebhookURLFile) == 0 { return errors.New("no discord webhook URL or URLFile provided") } } for _, webex := range rcv.WebexConfigs { - if webex.HTTPConfig == nil { - webex.HTTPConfig = c.Global.HTTPConfig - } + webex.HTTPConfig = cmp.Or(webex.HTTPConfig, c.Global.HTTPConfig) + webex.APIURL = cmp.Or(webex.APIURL, c.Global.WebexAPIURL) if webex.APIURL == nil { - if c.Global.WebexAPIURL == nil { - return errors.New("no global Webex URL set") - } - - webex.APIURL = c.Global.WebexAPIURL + return errors.New("no global Webex URL set") } } for _, msteams := range rcv.MSTeamsConfigs { - if msteams.HTTPConfig == nil { - msteams.HTTPConfig = c.Global.HTTPConfig - } + msteams.HTTPConfig = cmp.Or(msteams.HTTPConfig, c.Global.HTTPConfig) if msteams.WebhookURL == nil && len(msteams.WebhookURLFile) == 0 { return errors.New("no msteams webhook URL or URLFile provided") } } for _, msteamsv2 := range rcv.MSTeamsV2Configs { - if msteamsv2.HTTPConfig == nil { - msteamsv2.HTTPConfig = c.Global.HTTPConfig - } + msteamsv2.HTTPConfig = cmp.Or(msteamsv2.HTTPConfig, c.Global.HTTPConfig) if msteamsv2.WebhookURL == nil && len(msteamsv2.WebhookURLFile) == 0 { return errors.New("no msteamsv2 webhook URL or URLFile provided") } } for _, jira := range rcv.JiraConfigs { - if jira.HTTPConfig == nil { - jira.HTTPConfig = c.Global.HTTPConfig - } + jira.HTTPConfig = cmp.Or(jira.HTTPConfig, c.Global.HTTPConfig) + jira.APIURL = cmp.Or(jira.APIURL, c.Global.JiraAPIURL) if jira.APIURL == nil { - if c.Global.JiraAPIURL == nil { - return errors.New("no global Jira Cloud URL set") - } - jira.APIURL = c.Global.JiraAPIURL + return errors.New("no global Jira Cloud URL set") } } for _, rocketchat := range rcv.RocketchatConfigs { - if rocketchat.HTTPConfig == nil { - rocketchat.HTTPConfig = c.Global.HTTPConfig - } - if rocketchat.APIURL == nil { - rocketchat.APIURL = c.Global.RocketchatAPIURL - } + rocketchat.HTTPConfig = cmp.Or(rocketchat.HTTPConfig, c.Global.HTTPConfig) + rocketchat.APIURL = cmp.Or(rocketchat.APIURL, c.Global.RocketchatAPIURL) + + rocketchat.TokenID = cmp.Or(rocketchat.TokenID, c.Global.RocketchatTokenID) + rocketchat.TokenIDFile = cmp.Or(rocketchat.TokenIDFile, c.Global.RocketchatTokenIDFile) if rocketchat.TokenID == nil && len(rocketchat.TokenIDFile) == 0 { - if c.Global.RocketchatTokenID == nil && len(c.Global.RocketchatTokenIDFile) == 0 { - return errors.New("no global Rocketchat TokenID set either inline or in a file") - } - rocketchat.TokenID = c.Global.RocketchatTokenID - rocketchat.TokenIDFile = c.Global.RocketchatTokenIDFile + return errors.New("no global Rocketchat TokenID set either inline or in a file") } + + rocketchat.Token = cmp.Or(rocketchat.Token, c.Global.RocketchatToken) + rocketchat.TokenFile = cmp.Or(rocketchat.TokenFile, c.Global.RocketchatTokenFile) if rocketchat.Token == nil && len(rocketchat.TokenFile) == 0 { - if c.Global.RocketchatToken == nil && len(c.Global.RocketchatTokenFile) == 0 { - return errors.New("no global Rocketchat Token set either inline or in a file") - } - rocketchat.Token = c.Global.RocketchatToken - rocketchat.TokenFile = c.Global.RocketchatTokenFile + return errors.New("no global Rocketchat Token set either inline or in a file") } } for _, mattermost := range rcv.MattermostConfigs { - if mattermost.HTTPConfig == nil { - mattermost.HTTPConfig = c.Global.HTTPConfig - } + mattermost.HTTPConfig = cmp.Or(mattermost.HTTPConfig, c.Global.HTTPConfig) } names[rcv.Name] = struct{}{} @@ -898,9 +929,11 @@ type GlobalConfig struct { SMTPAuthPassword Secret `yaml:"smtp_auth_password,omitempty" json:"smtp_auth_password,omitempty"` SMTPAuthPasswordFile string `yaml:"smtp_auth_password_file,omitempty" json:"smtp_auth_password_file,omitempty"` SMTPAuthSecret Secret `yaml:"smtp_auth_secret,omitempty" json:"smtp_auth_secret,omitempty"` + SMTPAuthSecretFile string `yaml:"smtp_auth_secret_file,omitempty" json:"smtp_auth_secret_file,omitempty"` SMTPAuthIdentity string `yaml:"smtp_auth_identity,omitempty" json:"smtp_auth_identity,omitempty"` SMTPRequireTLS bool `yaml:"smtp_require_tls" json:"smtp_require_tls,omitempty"` SMTPTLSConfig *commoncfg.TLSConfig `yaml:"smtp_tls_config,omitempty" json:"smtp_tls_config,omitempty"` + SMTPForceImplicitTLS *bool `yaml:"smtp_force_implicit_tls,omitempty" json:"smtp_force_implicit_tls,omitempty"` SlackAPIURL *SecretURL `yaml:"slack_api_url,omitempty" json:"slack_api_url,omitempty"` SlackAPIURLFile string `yaml:"slack_api_url_file,omitempty" json:"slack_api_url_file,omitempty"` SlackAppToken Secret `yaml:"slack_app_token,omitempty" json:"slack_app_token,omitempty"` @@ -912,11 +945,14 @@ type GlobalConfig struct { OpsGenieAPIKeyFile string `yaml:"opsgenie_api_key_file,omitempty" json:"opsgenie_api_key_file,omitempty"` WeChatAPIURL *URL `yaml:"wechat_api_url,omitempty" json:"wechat_api_url,omitempty"` WeChatAPISecret Secret `yaml:"wechat_api_secret,omitempty" json:"wechat_api_secret,omitempty"` + WeChatAPISecretFile string `yaml:"wechat_api_secret_file,omitempty" json:"wechat_api_secret_file,omitempty"` WeChatAPICorpID string `yaml:"wechat_api_corp_id,omitempty" json:"wechat_api_corp_id,omitempty"` VictorOpsAPIURL *URL `yaml:"victorops_api_url,omitempty" json:"victorops_api_url,omitempty"` VictorOpsAPIKey Secret `yaml:"victorops_api_key,omitempty" json:"victorops_api_key,omitempty"` VictorOpsAPIKeyFile string `yaml:"victorops_api_key_file,omitempty" json:"victorops_api_key_file,omitempty"` TelegramAPIUrl *URL `yaml:"telegram_api_url,omitempty" json:"telegram_api_url,omitempty"` + TelegramBotToken Secret `yaml:"telegram_bot_token,omitempty" json:"telegram_bot_token,omitempty"` + TelegramBotTokenFile string `yaml:"telegram_bot_token_file,omitempty" json:"telegram_bot_token_file,omitempty"` WebexAPIURL *URL `yaml:"webex_api_url,omitempty" json:"webex_api_url,omitempty"` RocketchatAPIURL *URL `yaml:"rocketchat_api_url,omitempty" json:"rocketchat_api_url,omitempty"` RocketchatToken *Secret `yaml:"rocketchat_token,omitempty" json:"rocketchat_token,omitempty"` @@ -979,6 +1015,10 @@ func (r *Route) UnmarshalYAML(unmarshal func(any) error) error { } } + if r.GroupByStr != nil && len(r.GroupByStr) == 0 { + r.GroupBy = make([]model.LabelName, 0) + } + if len(r.GroupBy) > 0 && r.GroupByAll { return errors.New("cannot have wildcard group_by (`...`) and other labels at the same time") } diff --git a/vendor/github.com/prometheus/alertmanager/config/notifiers.go b/vendor/github.com/prometheus/alertmanager/config/notifiers.go index bf7be0b28a5..ed6b6e90dde 100644 --- a/vendor/github.com/prometheus/alertmanager/config/notifiers.go +++ b/vendor/github.com/prometheus/alertmanager/config/notifiers.go @@ -18,8 +18,8 @@ import ( "fmt" "net/textproto" "regexp" + "slices" "strings" - "text/template" "time" commoncfg "github.com/prometheus/common/config" @@ -309,13 +309,19 @@ type EmailConfig struct { AuthPassword Secret `yaml:"auth_password,omitempty" json:"auth_password,omitempty"` AuthPasswordFile string `yaml:"auth_password_file,omitempty" json:"auth_password_file,omitempty"` AuthSecret Secret `yaml:"auth_secret,omitempty" json:"auth_secret,omitempty"` + AuthSecretFile string `yaml:"auth_secret_file,omitempty" json:"auth_secret_file,omitempty"` AuthIdentity string `yaml:"auth_identity,omitempty" json:"auth_identity,omitempty"` Headers map[string]string `yaml:"headers,omitempty" json:"headers,omitempty"` HTML string `yaml:"html,omitempty" json:"html,omitempty"` Text string `yaml:"text,omitempty" json:"text,omitempty"` RequireTLS *bool `yaml:"require_tls,omitempty" json:"require_tls,omitempty"` TLSConfig *commoncfg.TLSConfig `yaml:"tls_config,omitempty" json:"tls_config,omitempty"` - Threading ThreadingConfig `yaml:"threading,omitempty" json:"threading,omitempty"` + // ForceImplicitTLS controls whether to use implicit TLS (direct TLS connection). + // true: force use of implicit TLS (direct TLS connection) + // false: force disable implicit TLS (use explicit TLS/STARTTLS if required) + // nil (default): auto-detect based on port (465=implicit, other=explicit) for backward compatibility + ForceImplicitTLS *bool `yaml:"force_implicit_tls,omitempty" json:"force_implicit_tls,omitempty"` + Threading ThreadingConfig `yaml:"threading,omitempty" json:"threading,omitempty"` } // ThreadingConfig configures mail threading. @@ -352,6 +358,9 @@ func (c *EmailConfig) UnmarshalYAML(unmarshal func(any) error) error { if _, ok := normalizedHeaders["In-Reply-To"]; ok { return errors.New("conflicting configuration: threading.enabled conflicts with custom In-Reply-To header") } + if !slices.Contains([]string{"none", "daily"}, c.Threading.ThreadByDate) { + return errors.New("threading.thread_by_date must be either 'none' or 'daily'") + } } return nil @@ -533,6 +542,7 @@ type SlackConfig struct { TitleLink string `yaml:"title_link,omitempty" json:"title_link,omitempty"` Pretext string `yaml:"pretext,omitempty" json:"pretext,omitempty"` Text string `yaml:"text,omitempty" json:"text,omitempty"` + MessageText string `yaml:"message_text,omitempty" json:"message_text,omitempty"` Fields []*SlackField `yaml:"fields,omitempty" json:"fields,omitempty"` ShortFields bool `yaml:"short_fields" json:"short_fields,omitempty"` Footer string `yaml:"footer,omitempty" json:"footer,omitempty"` @@ -630,8 +640,8 @@ type WebhookConfig struct { HTTPConfig *commoncfg.HTTPClientConfig `yaml:"http_config,omitempty" json:"http_config,omitempty"` // URL to send POST request to. - URL *SecretURL `yaml:"url" json:"url"` - URLFile string `yaml:"url_file" json:"url_file"` + URL SecretTemplateURL `yaml:"url,omitempty" json:"url,omitempty"` + URLFile string `yaml:"url_file" json:"url_file"` // MaxAlerts is the maximum number of alerts to be sent per webhook message. // Alerts exceeding this threshold will be truncated. Setting this to 0 @@ -650,10 +660,10 @@ func (c *WebhookConfig) UnmarshalYAML(unmarshal func(any) error) error { if err := unmarshal((*plain)(c)); err != nil { return err } - if c.URL == nil && c.URLFile == "" { + if c.URL == "" && c.URLFile == "" { return errors.New("one of url or url_file must be configured") } - if c.URL != nil && c.URLFile != "" { + if c.URL != "" && c.URLFile != "" { return errors.New("at most one of url & url_file must be configured") } return nil @@ -665,15 +675,16 @@ type WechatConfig struct { HTTPConfig *commoncfg.HTTPClientConfig `yaml:"http_config,omitempty" json:"http_config,omitempty"` - APISecret Secret `yaml:"api_secret,omitempty" json:"api_secret,omitempty"` - CorpID string `yaml:"corp_id,omitempty" json:"corp_id,omitempty"` - Message string `yaml:"message,omitempty" json:"message,omitempty"` - APIURL *URL `yaml:"api_url,omitempty" json:"api_url,omitempty"` - ToUser string `yaml:"to_user,omitempty" json:"to_user,omitempty"` - ToParty string `yaml:"to_party,omitempty" json:"to_party,omitempty"` - ToTag string `yaml:"to_tag,omitempty" json:"to_tag,omitempty"` - AgentID string `yaml:"agent_id,omitempty" json:"agent_id,omitempty"` - MessageType string `yaml:"message_type,omitempty" json:"message_type,omitempty"` + APISecret Secret `yaml:"api_secret,omitempty" json:"api_secret,omitempty"` + APISecretFile string `yaml:"api_secret_file,omitempty" json:"api_secret_file,omitempty"` + CorpID string `yaml:"corp_id,omitempty" json:"corp_id,omitempty"` + Message string `yaml:"message,omitempty" json:"message,omitempty"` + APIURL *URL `yaml:"api_url,omitempty" json:"api_url,omitempty"` + ToUser string `yaml:"to_user,omitempty" json:"to_user,omitempty"` + ToParty string `yaml:"to_party,omitempty" json:"to_party,omitempty"` + ToTag string `yaml:"to_tag,omitempty" json:"to_tag,omitempty"` + AgentID string `yaml:"agent_id,omitempty" json:"agent_id,omitempty"` + MessageType string `yaml:"message_type,omitempty" json:"message_type,omitempty"` } const wechatValidTypesRe = `^(text|markdown)$` @@ -696,6 +707,10 @@ func (c *WechatConfig) UnmarshalYAML(unmarshal func(any) error) error { return fmt.Errorf("weChat message type %q does not match valid options %s", c.MessageType, wechatValidTypesRe) } + if c.APISecret != "" && len(c.APISecretFile) > 0 { + return errors.New("at most one of api_secret & api_secret_file must be configured") + } + return nil } @@ -742,12 +757,11 @@ func (c *OpsGenieConfig) UnmarshalYAML(unmarshal func(any) error) error { return fmt.Errorf("opsGenieConfig responder %v has to have at least one of id, username or name specified", r) } - if strings.Contains(r.Type, "{{") { - _, err := template.New("").Parse(r.Type) - if err != nil { - return fmt.Errorf("opsGenieConfig responder %v type is not a valid template: %w", r, err) - } - } else { + isTemplated, err := containsTemplating(r.Type) + if err != nil { + return fmt.Errorf("opsGenieConfig responder %v type contains invalid template syntax: %w", r, err) + } + if !isTemplated { r.Type = strings.ToLower(r.Type) if !opsgenieTypeMatcher.MatchString(r.Type) { return fmt.Errorf("opsGenieConfig responder %v type does not match valid options %s", r, opsgenieValidTypesRe) @@ -910,6 +924,7 @@ type TelegramConfig struct { BotToken Secret `yaml:"bot_token,omitempty" json:"token,omitempty"` BotTokenFile string `yaml:"bot_token_file,omitempty" json:"token_file,omitempty"` ChatID int64 `yaml:"chat_id,omitempty" json:"chat,omitempty"` + ChatIDFile string `yaml:"chat_id_file,omitempty" json:"chat_file,omitempty"` MessageThreadID int `yaml:"message_thread_id,omitempty" json:"message_thread_id,omitempty"` Message string `yaml:"message,omitempty" json:"message,omitempty"` DisableNotifications bool `yaml:"disable_notifications,omitempty" json:"disable_notifications,omitempty"` @@ -923,14 +938,14 @@ func (c *TelegramConfig) UnmarshalYAML(unmarshal func(any) error) error { if err := unmarshal((*plain)(c)); err != nil { return err } - if c.BotToken == "" && c.BotTokenFile == "" { - return errors.New("missing bot_token or bot_token_file on telegram_config") - } if c.BotToken != "" && c.BotTokenFile != "" { return errors.New("at most one of bot_token & bot_token_file must be configured") } - if c.ChatID == 0 { - return errors.New("missing chat_id on telegram_config") + if c.ChatID == 0 && c.ChatIDFile == "" { + return errors.New("missing chat_id or chat_id_file on telegram_config") + } + if c.ChatID != 0 && c.ChatIDFile != "" { + return errors.New("at most one of chat_id & chat_id_file must be configured") } if c.ParseMode != "" && c.ParseMode != "Markdown" && diff --git a/vendor/github.com/prometheus/alertmanager/featurecontrol/featurecontrol.go b/vendor/github.com/prometheus/alertmanager/featurecontrol/featurecontrol.go index b4b7cf4735c..63e1056a2cd 100644 --- a/vendor/github.com/prometheus/alertmanager/featurecontrol/featurecontrol.go +++ b/vendor/github.com/prometheus/alertmanager/featurecontrol/featurecontrol.go @@ -21,6 +21,7 @@ import ( ) const ( + FeatureAlertNamesInMetrics = "alert-names-in-metrics" FeatureReceiverNameInMetrics = "receiver-name-in-metrics" FeatureClassicMode = "classic-mode" FeatureUTF8StrictMode = "utf8-strict-mode" @@ -29,6 +30,7 @@ const ( ) var AllowedFlags = []string{ + FeatureAlertNamesInMetrics, FeatureReceiverNameInMetrics, FeatureClassicMode, FeatureUTF8StrictMode, @@ -37,6 +39,7 @@ var AllowedFlags = []string{ } type Flagger interface { + EnableAlertNamesInMetrics() bool EnableReceiverNamesInMetrics() bool ClassicMode() bool UTF8StrictMode() bool @@ -46,6 +49,7 @@ type Flagger interface { type Flags struct { logger *slog.Logger + enableAlertNamesInMetrics bool enableReceiverNamesInMetrics bool classicMode bool utf8StrictMode bool @@ -53,6 +57,10 @@ type Flags struct { enableAutoGOMAXPROCS bool } +func (f *Flags) EnableAlertNamesInMetrics() bool { + return f.enableAlertNamesInMetrics +} + func (f *Flags) EnableReceiverNamesInMetrics() bool { return f.enableReceiverNamesInMetrics } @@ -105,6 +113,12 @@ func enableAutoGOMAXPROCS() flagOption { } } +func enableAlertNamesInMetrics() flagOption { + return func(configs *Flags) { + configs.enableAlertNamesInMetrics = true + } +} + func NewFlags(logger *slog.Logger, features string) (Flagger, error) { fc := &Flags{logger: logger} opts := []flagOption{} @@ -115,6 +129,9 @@ func NewFlags(logger *slog.Logger, features string) (Flagger, error) { for feature := range strings.SplitSeq(features, ",") { switch feature { + case FeatureAlertNamesInMetrics: + opts = append(opts, enableAlertNamesInMetrics()) + logger.Warn("Alert names in metrics enabled") case FeatureReceiverNameInMetrics: opts = append(opts, enableReceiverNameInMetrics()) logger.Warn("Experimental receiver name in metrics enabled") @@ -148,6 +165,8 @@ func NewFlags(logger *slog.Logger, features string) (Flagger, error) { type NoopFlags struct{} +func (n NoopFlags) EnableAlertNamesInMetrics() bool { return false } + func (n NoopFlags) EnableReceiverNamesInMetrics() bool { return false } func (n NoopFlags) ClassicMode() bool { return false } diff --git a/vendor/github.com/prometheus/alertmanager/limit/bucket.go b/vendor/github.com/prometheus/alertmanager/limit/bucket.go new file mode 100644 index 00000000000..bccc91bcc59 --- /dev/null +++ b/vendor/github.com/prometheus/alertmanager/limit/bucket.go @@ -0,0 +1,160 @@ +// Copyright The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +package limit + +import ( + "container/heap" + "sync" + "time" +) + +// item represents a value and its priority based on time. +type item[V any] struct { + value V + priority time.Time + index int +} + +// expired returns true if the item is expired (priority is before the given time). +func (i *item[V]) expired(at time.Time) bool { + return i.priority.Before(at) +} + +// sortedItems is a heap of items. +type sortedItems[V any] []*item[V] + +// Len returns the number of items in the heap. +func (s sortedItems[V]) Len() int { return len(s) } + +// Less reports whether the element with index i should sort before the element with index j. +func (s sortedItems[V]) Less(i, j int) bool { return s[i].priority.Before(s[j].priority) } + +// Swap swaps the elements with indexes i and j. +func (s sortedItems[V]) Swap(i, j int) { + s[i], s[j] = s[j], s[i] + s[i].index = i + s[j].index = j +} + +// Push adds an item to the heap. +func (s *sortedItems[V]) Push(x any) { + n := len(*s) + item := x.(*item[V]) + item.index = n + *s = append(*s, item) +} + +// Pop removes and returns the minimum element (according to Less). +func (s *sortedItems[V]) Pop() any { + old := *s + n := len(old) + item := old[n-1] + old[n-1] = nil // don't stop the GC from reclaiming the item eventually + item.index = -1 // for safety + *s = old[0 : n-1] + return item +} + +// update modifies the priority and value of an item in the heap. +func (s *sortedItems[V]) update(item *item[V], priority time.Time) { + item.priority = priority + heap.Fix(s, item.index) +} + +// Bucket is a simple cache for values with priority(expiry). +// It has: +// - configurable capacity. +// - a mutex for thread safety. +// - a sorted heap of items for priority/expiry based eviction. +// - an index of items for fast updates. +type Bucket[V comparable] struct { + mtx sync.Mutex + index map[V]*item[V] + items sortedItems[V] + capacity int +} + +// NewBucket creates a new bucket with the given capacity. +// All internal data structures are initialized to the given capacity to avoid allocations during runtime. +func NewBucket[V comparable](capacity int) *Bucket[V] { + items := make(sortedItems[V], 0, capacity) + heap.Init(&items) + return &Bucket[V]{ + index: make(map[V]*item[V], capacity), + items: items, + capacity: capacity, + } +} + +// IsStale returns true if the latest item in the bucket is expired. +func (b *Bucket[V]) IsStale() (stale bool) { + b.mtx.Lock() + defer b.mtx.Unlock() + if b.items.Len() == 0 { + return true + } + + latest := b.items[b.items.Len()-1] + return latest.expired(time.Now()) +} + +// Upsert tries to add a new value and its priority to the bucket. +// If the value is already in the bucket, its priority is updated. +// If the bucket is not full, the new value is added. +// If the bucket is full, oldest expired item is evicted based on priority and the new value is added. +// Otherwise the new value is ignored and the method returns false. +func (b *Bucket[V]) Upsert(value V, priority time.Time) (ok bool) { + if b.capacity < 1 { + return false + } + + b.mtx.Lock() + defer b.mtx.Unlock() + + // If the value is already in the index, update it. + if item, exists := b.index[value]; exists { + b.items.update(item, priority) + return true + } + + // If the bucket is not full, add the new value to the heap and index. + if b.items.Len() < b.capacity { + item := &item[V]{ + value: value, + priority: priority, + } + b.index[value] = item + heap.Push(&b.items, item) + return true + } + + // If the bucket is full, check the oldest item (at heap root) and evict it if expired + oldest := b.items[0] + if oldest.expired(time.Now()) { + // Remove the expired item from both the heap and the index + heap.Pop(&b.items) + delete(b.index, oldest.value) + + // Add the new item + item := &item[V]{ + value: value, + priority: priority, + } + b.index[value] = item + heap.Push(&b.items, item) + return true + } + + return false +} diff --git a/vendor/github.com/prometheus/alertmanager/nflog/nflog.go b/vendor/github.com/prometheus/alertmanager/nflog/nflog.go index 74d07cc1c7d..3d7176b4c03 100644 --- a/vendor/github.com/prometheus/alertmanager/nflog/nflog.go +++ b/vendor/github.com/prometheus/alertmanager/nflog/nflog.go @@ -76,6 +76,100 @@ func QGroupKey(gk string) QueryParam { } } +// Store abstracts the NFLog's receiver data storage as a mutable key/value store. A store +// can be generated from a nflogpb.Entry and then written via the call to Log. +// +// Every key in the Store is associated with either an int, float, or string value. +type Store struct { + data map[string]*pb.ReceiverDataValue +} + +// NewStore creates a Store from the entry's receiver data. If entry is nil, the resulting +// Store is empty. +func NewStore(entry *pb.Entry) *Store { + var receiverData map[string]*pb.ReceiverDataValue + if entry != nil { + receiverData = maps.Clone(entry.ReceiverData) + } + if receiverData == nil { + receiverData = make(map[string]*pb.ReceiverDataValue) + } + return &Store{ + data: receiverData, + } +} + +// GetInt finds the integer value associated with the key, if any, and returns it. +func (s *Store) GetInt(key string) (int64, bool) { + dataValue, ok := s.data[key] + if !ok { + return 0, false + } + intVal, ok := dataValue.Value.(*pb.ReceiverDataValue_IntVal) + if !ok { + return 0, false + } + return intVal.IntVal, true +} + +// GetFloat finds the float value associated with the key, if any, and returns it. +func (s *Store) GetFloat(key string) (float64, bool) { + dataValue, ok := s.data[key] + if !ok { + return 0, false + } + floatVal, ok := dataValue.Value.(*pb.ReceiverDataValue_DoubleVal) + if !ok { + return 0, false + } + return floatVal.DoubleVal, true +} + +// GetFloat finds the string value associated with the key, if any, and returns it. +func (s *Store) GetStr(key string) (string, bool) { + dataValue, ok := s.data[key] + if !ok { + return "", false + } + strVal, ok := dataValue.Value.(*pb.ReceiverDataValue_StrVal) + if !ok { + return "", false + } + return strVal.StrVal, true +} + +// SetInt associates an integer value with the provided key, overwriting any existing value. +func (s *Store) SetInt(key string, v int64) { + s.data[key] = &pb.ReceiverDataValue{ + Value: &pb.ReceiverDataValue_IntVal{ + IntVal: v, + }, + } +} + +// SetFloat associates a float value with the provided key, overwriting any existing value. +func (s *Store) SetFloat(key string, v float64) { + s.data[key] = &pb.ReceiverDataValue{ + Value: &pb.ReceiverDataValue_DoubleVal{ + DoubleVal: v, + }, + } +} + +// SetStr associates a string value with the provided key, overwriting any existing value. +func (s *Store) SetStr(key, v string) { + s.data[key] = &pb.ReceiverDataValue{ + Value: &pb.ReceiverDataValue_StrVal{ + StrVal: v, + }, + } +} + +// Delete deletes any value associated with the key. +func (s *Store) Delete(key string) { + delete(s.data, key) +} + // Log holds the notification log state for alerts that have been notified. type Log struct { clock quartz.Clock @@ -368,7 +462,7 @@ func stateKey(k string, r *pb.Receiver) string { return fmt.Sprintf("%s:%s", k, receiverKey(r)) } -func (l *Log) Log(r *pb.Receiver, gkey string, firingAlerts, resolvedAlerts []uint64, expiry time.Duration) error { +func (l *Log) Log(r *pb.Receiver, gkey string, firingAlerts, resolvedAlerts []uint64, store *Store, expiry time.Duration) error { // Write all st with the same timestamp. now := l.now() key := stateKey(gkey, r) @@ -389,6 +483,11 @@ func (l *Log) Log(r *pb.Receiver, gkey string, firingAlerts, resolvedAlerts []ui expiresAt = now.Add(expiry) } + var receiverData map[string]*pb.ReceiverDataValue + if store != nil { + receiverData = store.data + } + e := &pb.MeshEntry{ Entry: &pb.Entry{ Receiver: r, @@ -396,6 +495,7 @@ func (l *Log) Log(r *pb.Receiver, gkey string, firingAlerts, resolvedAlerts []ui Timestamp: now, FiringAlerts: firingAlerts, ResolvedAlerts: resolvedAlerts, + ReceiverData: receiverData, }, ExpiresAt: expiresAt, } diff --git a/vendor/github.com/prometheus/alertmanager/nflog/nflogpb/nflog.pb.go b/vendor/github.com/prometheus/alertmanager/nflog/nflogpb/nflog.pb.go index a5960171a0f..5de7db88b0e 100644 --- a/vendor/github.com/prometheus/alertmanager/nflog/nflogpb/nflog.pb.go +++ b/vendor/github.com/prometheus/alertmanager/nflog/nflogpb/nflog.pb.go @@ -4,6 +4,7 @@ package nflogpb import ( + encoding_binary "encoding/binary" fmt "fmt" _ "github.com/gogo/protobuf/gogoproto" @@ -92,10 +93,12 @@ type Entry struct { // FiringAlerts list of hashes of firing alerts at the last notification time. FiringAlerts []uint64 `protobuf:"varint,6,rep,packed,name=firing_alerts,json=firingAlerts,proto3" json:"firing_alerts,omitempty"` // ResolvedAlerts list of hashes of resolved alerts at the last notification time. - ResolvedAlerts []uint64 `protobuf:"varint,7,rep,packed,name=resolved_alerts,json=resolvedAlerts,proto3" json:"resolved_alerts,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + ResolvedAlerts []uint64 `protobuf:"varint,7,rep,packed,name=resolved_alerts,json=resolvedAlerts,proto3" json:"resolved_alerts,omitempty"` + // Data specific to the receiver which sent the notification + ReceiverData map[string]*ReceiverDataValue `protobuf:"bytes,8,rep,name=receiver_data,json=receiverData,proto3" json:"receiver_data,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *Entry) Reset() { *m = Entry{} } @@ -177,41 +180,152 @@ func (m *MeshEntry) XXX_DiscardUnknown() { var xxx_messageInfo_MeshEntry proto.InternalMessageInfo +type ReceiverDataValue struct { + // Types that are valid to be assigned to Value: + // + // *ReceiverDataValue_StrVal + // *ReceiverDataValue_IntVal + // *ReceiverDataValue_DoubleVal + Value isReceiverDataValue_Value `protobuf_oneof:"value"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ReceiverDataValue) Reset() { *m = ReceiverDataValue{} } +func (m *ReceiverDataValue) String() string { return proto.CompactTextString(m) } +func (*ReceiverDataValue) ProtoMessage() {} +func (*ReceiverDataValue) Descriptor() ([]byte, []int) { + return fileDescriptor_c2d9785ad9c3e602, []int{3} +} +func (m *ReceiverDataValue) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ReceiverDataValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ReceiverDataValue.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 *ReceiverDataValue) XXX_Merge(src proto.Message) { + xxx_messageInfo_ReceiverDataValue.Merge(m, src) +} +func (m *ReceiverDataValue) XXX_Size() int { + return m.Size() +} +func (m *ReceiverDataValue) XXX_DiscardUnknown() { + xxx_messageInfo_ReceiverDataValue.DiscardUnknown(m) +} + +var xxx_messageInfo_ReceiverDataValue proto.InternalMessageInfo + +type isReceiverDataValue_Value interface { + isReceiverDataValue_Value() + MarshalTo([]byte) (int, error) + Size() int +} + +type ReceiverDataValue_StrVal struct { + StrVal string `protobuf:"bytes,1,opt,name=str_val,json=strVal,proto3,oneof" json:"str_val,omitempty"` +} +type ReceiverDataValue_IntVal struct { + IntVal int64 `protobuf:"varint,2,opt,name=int_val,json=intVal,proto3,oneof" json:"int_val,omitempty"` +} +type ReceiverDataValue_DoubleVal struct { + DoubleVal float64 `protobuf:"fixed64,3,opt,name=double_val,json=doubleVal,proto3,oneof" json:"double_val,omitempty"` +} + +func (*ReceiverDataValue_StrVal) isReceiverDataValue_Value() {} +func (*ReceiverDataValue_IntVal) isReceiverDataValue_Value() {} +func (*ReceiverDataValue_DoubleVal) isReceiverDataValue_Value() {} + +func (m *ReceiverDataValue) GetValue() isReceiverDataValue_Value { + if m != nil { + return m.Value + } + return nil +} + +func (m *ReceiverDataValue) GetStrVal() string { + if x, ok := m.GetValue().(*ReceiverDataValue_StrVal); ok { + return x.StrVal + } + return "" +} + +func (m *ReceiverDataValue) GetIntVal() int64 { + if x, ok := m.GetValue().(*ReceiverDataValue_IntVal); ok { + return x.IntVal + } + return 0 +} + +func (m *ReceiverDataValue) GetDoubleVal() float64 { + if x, ok := m.GetValue().(*ReceiverDataValue_DoubleVal); ok { + return x.DoubleVal + } + return 0 +} + +// XXX_OneofWrappers is for the internal use of the proto package. +func (*ReceiverDataValue) XXX_OneofWrappers() []interface{} { + return []interface{}{ + (*ReceiverDataValue_StrVal)(nil), + (*ReceiverDataValue_IntVal)(nil), + (*ReceiverDataValue_DoubleVal)(nil), + } +} + func init() { proto.RegisterType((*Receiver)(nil), "nflogpb.Receiver") proto.RegisterType((*Entry)(nil), "nflogpb.Entry") + proto.RegisterMapType((map[string]*ReceiverDataValue)(nil), "nflogpb.Entry.ReceiverDataEntry") proto.RegisterType((*MeshEntry)(nil), "nflogpb.MeshEntry") + proto.RegisterType((*ReceiverDataValue)(nil), "nflogpb.ReceiverDataValue") } func init() { proto.RegisterFile("nflog.proto", fileDescriptor_c2d9785ad9c3e602) } var fileDescriptor_c2d9785ad9c3e602 = []byte{ - // 385 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x90, 0xcf, 0x6e, 0xd3, 0x40, - 0x10, 0xc6, 0xbb, 0x4d, 0xd3, 0xda, 0xe3, 0xb4, 0x94, 0x15, 0x07, 0xcb, 0x08, 0xc7, 0x0a, 0x48, - 0xf8, 0x82, 0x23, 0x95, 0x27, 0x68, 0x10, 0x12, 0x12, 0x82, 0xc3, 0x8a, 0x2b, 0xb2, 0x36, 0x74, - 0xb2, 0x5e, 0x61, 0x7b, 0xad, 0xf5, 0x36, 0x6a, 0xde, 0x82, 0x47, 0xe0, 0x71, 0x72, 0xe4, 0x09, - 0xf8, 0x93, 0x27, 0x41, 0xde, 0xb5, 0x1d, 0x8e, 0xdc, 0x66, 0x7f, 0xf3, 0xcd, 0xcc, 0xb7, 0x1f, - 0x04, 0xf5, 0xa6, 0x54, 0x22, 0x6b, 0xb4, 0x32, 0x8a, 0x5e, 0xd8, 0x47, 0xb3, 0x8e, 0xe6, 0x42, - 0x29, 0x51, 0xe2, 0xd2, 0xe2, 0xf5, 0xfd, 0x66, 0x69, 0x64, 0x85, 0xad, 0xe1, 0x55, 0xe3, 0x94, - 0xd1, 0x13, 0xa1, 0x84, 0xb2, 0xe5, 0xb2, 0xab, 0x1c, 0x5d, 0x7c, 0x06, 0x8f, 0xe1, 0x17, 0x94, - 0x5b, 0xd4, 0xf4, 0x19, 0x80, 0xd0, 0xea, 0xbe, 0xc9, 0x6b, 0x5e, 0x61, 0x48, 0x12, 0x92, 0xfa, - 0xcc, 0xb7, 0xe4, 0x23, 0xaf, 0x90, 0x26, 0x10, 0xc8, 0xda, 0xa0, 0xd0, 0xdc, 0x48, 0x55, 0x87, - 0xa7, 0xb6, 0xff, 0x2f, 0xa2, 0xd7, 0x30, 0x91, 0x77, 0x0f, 0xe1, 0x24, 0x21, 0xe9, 0x25, 0xeb, - 0xca, 0xc5, 0xf7, 0x53, 0x98, 0xbe, 0xad, 0x8d, 0xde, 0xd1, 0xa7, 0xe0, 0x56, 0xe5, 0x5f, 0x71, - 0x67, 0x77, 0xcf, 0x98, 0x67, 0xc1, 0x7b, 0xdc, 0xd1, 0x57, 0xe0, 0xe9, 0xde, 0x85, 0xdd, 0x1b, - 0xdc, 0x3c, 0xce, 0xfa, 0x8f, 0x65, 0x83, 0x3d, 0x36, 0x4a, 0x8e, 0x46, 0x0b, 0xde, 0x16, 0xf6, - 0xdc, 0xac, 0x37, 0xfa, 0x8e, 0xb7, 0x05, 0x8d, 0xba, 0x6d, 0xad, 0x2a, 0xb7, 0x78, 0x17, 0x9e, - 0x25, 0x24, 0xf5, 0xd8, 0xf8, 0xa6, 0x2b, 0xf0, 0xc7, 0x60, 0xc2, 0xa9, 0x3d, 0x15, 0x65, 0x2e, - 0xba, 0x6c, 0x88, 0x2e, 0xfb, 0x34, 0x28, 0x56, 0xde, 0xfe, 0xe7, 0xfc, 0xe4, 0xdb, 0xaf, 0x39, - 0x61, 0xc7, 0x31, 0xfa, 0x1c, 0x2e, 0x37, 0x52, 0xcb, 0x5a, 0xe4, 0xbc, 0x44, 0x6d, 0xda, 0xf0, - 0x3c, 0x99, 0xa4, 0x67, 0x6c, 0xe6, 0xe0, 0xad, 0x65, 0xf4, 0x25, 0x3c, 0x1a, 0x8e, 0x0e, 0xb2, - 0x0b, 0x2b, 0xbb, 0x1a, 0xb0, 0x13, 0x2e, 0xb6, 0xe0, 0x7f, 0xc0, 0xb6, 0x70, 0x29, 0xbd, 0x80, - 0x29, 0x76, 0x85, 0x4d, 0x28, 0xb8, 0xb9, 0x1a, 0x53, 0xb0, 0x6d, 0xe6, 0x9a, 0xf4, 0x0d, 0x00, - 0x3e, 0x34, 0x52, 0x63, 0x9b, 0x73, 0xd3, 0x07, 0xf6, 0x9f, 0xbf, 0xe8, 0xe7, 0x6e, 0xcd, 0xea, - 0x7a, 0xff, 0x27, 0x3e, 0xd9, 0x1f, 0x62, 0xf2, 0xe3, 0x10, 0x93, 0xdf, 0x87, 0x98, 0xac, 0xcf, - 0xed, 0xe8, 0xeb, 0xbf, 0x01, 0x00, 0x00, 0xff, 0xff, 0x49, 0xcd, 0xa7, 0x1e, 0x61, 0x02, 0x00, - 0x00, + // 509 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x52, 0x4d, 0x8f, 0xd3, 0x30, + 0x10, 0x6d, 0x36, 0xdb, 0x36, 0x99, 0xb6, 0xcb, 0xae, 0xc5, 0x21, 0x04, 0xd1, 0x46, 0x05, 0x89, + 0x5e, 0x48, 0x51, 0xb9, 0x20, 0x6e, 0x5b, 0x58, 0xa9, 0x12, 0x82, 0x83, 0x85, 0x7a, 0x41, 0x28, + 0x72, 0xa9, 0x9b, 0x5a, 0xa4, 0x71, 0x65, 0xbb, 0xd1, 0xf6, 0x5f, 0xf0, 0xa3, 0x38, 0xf4, 0xc8, + 0x2f, 0xe0, 0xa3, 0xbf, 0x04, 0xd9, 0x4e, 0xb2, 0xbb, 0xda, 0x0b, 0xb7, 0xf1, 0x7b, 0x6f, 0x66, + 0xde, 0xbc, 0x04, 0x3a, 0xf9, 0x2a, 0xe3, 0x69, 0xbc, 0x15, 0x5c, 0x71, 0xd4, 0x36, 0x8f, 0xed, + 0x22, 0x1c, 0xa4, 0x9c, 0xa7, 0x19, 0x1d, 0x1b, 0x78, 0xb1, 0x5b, 0x8d, 0x15, 0xdb, 0x50, 0xa9, + 0xc8, 0x66, 0x6b, 0x95, 0xe1, 0xc3, 0x94, 0xa7, 0xdc, 0x94, 0x63, 0x5d, 0x59, 0x74, 0xf8, 0x05, + 0x3c, 0x4c, 0xbf, 0x52, 0x56, 0x50, 0x81, 0x9e, 0x00, 0xa4, 0x82, 0xef, 0xb6, 0x49, 0x4e, 0x36, + 0x34, 0x70, 0x22, 0x67, 0xe4, 0x63, 0xdf, 0x20, 0x1f, 0xc9, 0x86, 0xa2, 0x08, 0x3a, 0x2c, 0x57, + 0x34, 0x15, 0x44, 0x31, 0x9e, 0x07, 0x27, 0x86, 0xbf, 0x0d, 0xa1, 0x73, 0x70, 0xd9, 0xf2, 0x3a, + 0x70, 0x23, 0x67, 0xd4, 0xc3, 0xba, 0x1c, 0xfe, 0x70, 0xa1, 0x79, 0x95, 0x2b, 0xb1, 0x47, 0x8f, + 0xc1, 0x8e, 0x4a, 0xbe, 0xd1, 0xbd, 0x99, 0xdd, 0xc5, 0x9e, 0x01, 0xde, 0xd3, 0x3d, 0x7a, 0x01, + 0x9e, 0x28, 0x5d, 0x98, 0xb9, 0x9d, 0xc9, 0x45, 0x5c, 0x1e, 0x16, 0x57, 0xf6, 0x70, 0x2d, 0xb9, + 0x31, 0xba, 0x26, 0x72, 0x6d, 0xd6, 0x75, 0x4b, 0xa3, 0x33, 0x22, 0xd7, 0x28, 0xd4, 0xd3, 0x24, + 0xcf, 0x0a, 0xba, 0x0c, 0x4e, 0x23, 0x67, 0xe4, 0xe1, 0xfa, 0x8d, 0xa6, 0xe0, 0xd7, 0xc1, 0x04, + 0x4d, 0xb3, 0x2a, 0x8c, 0x6d, 0x74, 0x71, 0x15, 0x5d, 0xfc, 0xa9, 0x52, 0x4c, 0xbd, 0xc3, 0xaf, + 0x41, 0xe3, 0xfb, 0xef, 0x81, 0x83, 0x6f, 0xda, 0xd0, 0x53, 0xe8, 0xad, 0x98, 0x60, 0x79, 0x9a, + 0x90, 0x8c, 0x0a, 0x25, 0x83, 0x56, 0xe4, 0x8e, 0x4e, 0x71, 0xd7, 0x82, 0x97, 0x06, 0x43, 0xcf, + 0xe1, 0x41, 0xb5, 0xb4, 0x92, 0xb5, 0x8d, 0xec, 0xac, 0x82, 0x4b, 0xe1, 0x15, 0xf4, 0xaa, 0xc3, + 0x92, 0x25, 0x51, 0x24, 0xf0, 0x22, 0x77, 0xd4, 0x99, 0x44, 0x75, 0x00, 0x26, 0xbf, 0x3a, 0x86, + 0x77, 0x44, 0x11, 0x83, 0xe0, 0xae, 0xb8, 0x05, 0x85, 0x9f, 0xe1, 0xe2, 0x9e, 0x44, 0x7f, 0x90, + 0x2a, 0x6e, 0x1f, 0xeb, 0x12, 0xbd, 0x84, 0x66, 0x41, 0xb2, 0x1d, 0x2d, 0x63, 0x0e, 0xef, 0xc5, + 0xac, 0x9b, 0xe7, 0x5a, 0x81, 0xad, 0xf0, 0xcd, 0xc9, 0x6b, 0x67, 0x58, 0x80, 0xff, 0x81, 0xca, + 0xb5, 0x1d, 0xfa, 0x0c, 0x9a, 0x54, 0x17, 0x66, 0x6c, 0x67, 0x72, 0x76, 0xd7, 0x28, 0xb6, 0x24, + 0x7a, 0x0b, 0x40, 0xaf, 0xb7, 0x4c, 0x50, 0x99, 0x10, 0x55, 0x6f, 0xfb, 0xaf, 0xa4, 0xcb, 0xbe, + 0x4b, 0x35, 0x94, 0x77, 0x8f, 0x32, 0xbe, 0xd0, 0x23, 0x68, 0x4b, 0x25, 0x92, 0x82, 0x64, 0xf6, + 0xb0, 0x59, 0x03, 0xb7, 0xa4, 0x12, 0x73, 0x92, 0x69, 0x8a, 0xe5, 0xca, 0x50, 0x7a, 0xa3, 0xab, + 0x29, 0x96, 0x2b, 0x4d, 0x0d, 0x00, 0x96, 0x7c, 0xb7, 0xc8, 0xa8, 0x61, 0xf5, 0x3f, 0xe3, 0xcc, + 0x1a, 0xd8, 0xb7, 0xd8, 0x9c, 0x64, 0xd3, 0x76, 0x99, 0xcc, 0xf4, 0xfc, 0xf0, 0xb7, 0xdf, 0x38, + 0x1c, 0xfb, 0xce, 0xcf, 0x63, 0xdf, 0xf9, 0x73, 0xec, 0x3b, 0x8b, 0x96, 0xf1, 0xfb, 0xea, 0x5f, + 0x00, 0x00, 0x00, 0xff, 0xff, 0x42, 0xe0, 0xe0, 0xa3, 0x7a, 0x03, 0x00, 0x00, } func (m *Receiver) Marshal() (dAtA []byte, err error) { @@ -284,48 +398,74 @@ func (m *Entry) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.ReceiverData) > 0 { + for k := range m.ReceiverData { + v := m.ReceiverData[k] + baseI := i + if v != nil { + { + size, err := v.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintNflog(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + i -= len(k) + copy(dAtA[i:], k) + i = encodeVarintNflog(dAtA, i, uint64(len(k))) + i-- + dAtA[i] = 0xa + i = encodeVarintNflog(dAtA, i, uint64(baseI-i)) + i-- + dAtA[i] = 0x42 + } + } if len(m.ResolvedAlerts) > 0 { - dAtA2 := make([]byte, len(m.ResolvedAlerts)*10) - var j1 int + dAtA3 := make([]byte, len(m.ResolvedAlerts)*10) + var j2 int for _, num := range m.ResolvedAlerts { for num >= 1<<7 { - dAtA2[j1] = uint8(uint64(num)&0x7f | 0x80) + dAtA3[j2] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j1++ + j2++ } - dAtA2[j1] = uint8(num) - j1++ + dAtA3[j2] = uint8(num) + j2++ } - i -= j1 - copy(dAtA[i:], dAtA2[:j1]) - i = encodeVarintNflog(dAtA, i, uint64(j1)) + i -= j2 + copy(dAtA[i:], dAtA3[:j2]) + i = encodeVarintNflog(dAtA, i, uint64(j2)) i-- dAtA[i] = 0x3a } if len(m.FiringAlerts) > 0 { - dAtA4 := make([]byte, len(m.FiringAlerts)*10) - var j3 int + dAtA5 := make([]byte, len(m.FiringAlerts)*10) + var j4 int for _, num := range m.FiringAlerts { for num >= 1<<7 { - dAtA4[j3] = uint8(uint64(num)&0x7f | 0x80) + dAtA5[j4] = uint8(uint64(num)&0x7f | 0x80) num >>= 7 - j3++ + j4++ } - dAtA4[j3] = uint8(num) - j3++ + dAtA5[j4] = uint8(num) + j4++ } - i -= j3 - copy(dAtA[i:], dAtA4[:j3]) - i = encodeVarintNflog(dAtA, i, uint64(j3)) + i -= j4 + copy(dAtA[i:], dAtA5[:j4]) + i = encodeVarintNflog(dAtA, i, uint64(j4)) i-- dAtA[i] = 0x32 } - n5, err5 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Timestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp):]) - if err5 != nil { - return 0, err5 + n6, err6 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Timestamp, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Timestamp):]) + if err6 != nil { + return 0, err6 } - i -= n5 - i = encodeVarintNflog(dAtA, i, uint64(n5)) + i -= n6 + i = encodeVarintNflog(dAtA, i, uint64(n6)) i-- dAtA[i] = 0x2a if m.Resolved { @@ -391,12 +531,12 @@ func (m *MeshEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n7, err7 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.ExpiresAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.ExpiresAt):]) - if err7 != nil { - return 0, err7 + n8, err8 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.ExpiresAt, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.ExpiresAt):]) + if err8 != nil { + return 0, err8 } - i -= n7 - i = encodeVarintNflog(dAtA, i, uint64(n7)) + i -= n8 + i = encodeVarintNflog(dAtA, i, uint64(n8)) i-- dAtA[i] = 0x12 if m.Entry != nil { @@ -414,6 +554,81 @@ func (m *MeshEntry) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *ReceiverDataValue) 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 *ReceiverDataValue) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ReceiverDataValue) 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 m.Value != nil { + { + size := m.Value.Size() + i -= size + if _, err := m.Value.MarshalTo(dAtA[i:]); err != nil { + return 0, err + } + } + } + return len(dAtA) - i, nil +} + +func (m *ReceiverDataValue_StrVal) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ReceiverDataValue_StrVal) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + i -= len(m.StrVal) + copy(dAtA[i:], m.StrVal) + i = encodeVarintNflog(dAtA, i, uint64(len(m.StrVal))) + i-- + dAtA[i] = 0xa + return len(dAtA) - i, nil +} +func (m *ReceiverDataValue_IntVal) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ReceiverDataValue_IntVal) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + i = encodeVarintNflog(dAtA, i, uint64(m.IntVal)) + i-- + dAtA[i] = 0x10 + return len(dAtA) - i, nil +} +func (m *ReceiverDataValue_DoubleVal) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ReceiverDataValue_DoubleVal) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + i -= 8 + encoding_binary.LittleEndian.PutUint64(dAtA[i:], uint64(math.Float64bits(float64(m.DoubleVal)))) + i-- + dAtA[i] = 0x19 + return len(dAtA) - i, nil +} func encodeVarintNflog(dAtA []byte, offset int, v uint64) int { offset -= sovNflog(v) base := offset @@ -485,6 +700,19 @@ func (m *Entry) Size() (n int) { } n += 1 + sovNflog(uint64(l)) + l } + if len(m.ReceiverData) > 0 { + for k, v := range m.ReceiverData { + _ = k + _ = v + l = 0 + if v != nil { + l = v.Size() + l += 1 + sovNflog(uint64(l)) + } + mapEntrySize := 1 + len(k) + sovNflog(uint64(len(k))) + l + n += mapEntrySize + 1 + sovNflog(uint64(mapEntrySize)) + } + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -509,6 +737,50 @@ func (m *MeshEntry) Size() (n int) { return n } +func (m *ReceiverDataValue) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Value != nil { + n += m.Value.Size() + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *ReceiverDataValue_StrVal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.StrVal) + n += 1 + l + sovNflog(uint64(l)) + return n +} +func (m *ReceiverDataValue_IntVal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += 1 + sovNflog(uint64(m.IntVal)) + return n +} +func (m *ReceiverDataValue_DoubleVal) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + n += 9 + return n +} + func sovNflog(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -987,6 +1259,135 @@ func (m *Entry) Unmarshal(dAtA []byte) error { } else { return fmt.Errorf("proto: wrong wireType = %d for field ResolvedAlerts", wireType) } + case 8: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ReceiverData", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNflog + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthNflog + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthNflog + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.ReceiverData == nil { + m.ReceiverData = make(map[string]*ReceiverDataValue) + } + var mapkey string + var mapvalue *ReceiverDataValue + for iNdEx < postIndex { + entryPreIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNflog + } + 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 ErrIntOverflowNflog + } + 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 ErrInvalidLengthNflog + } + postStringIndexmapkey := iNdEx + intStringLenmapkey + if postStringIndexmapkey < 0 { + return ErrInvalidLengthNflog + } + 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 ErrIntOverflowNflog + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + mapmsglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if mapmsglen < 0 { + return ErrInvalidLengthNflog + } + postmsgIndex := iNdEx + mapmsglen + if postmsgIndex < 0 { + return ErrInvalidLengthNflog + } + if postmsgIndex > l { + return io.ErrUnexpectedEOF + } + mapvalue = &ReceiverDataValue{} + if err := mapvalue.Unmarshal(dAtA[iNdEx:postmsgIndex]); err != nil { + return err + } + iNdEx = postmsgIndex + } else { + iNdEx = entryPreIndex + skippy, err := skipNflog(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthNflog + } + if (iNdEx + skippy) > postIndex { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + m.ReceiverData[mapkey] = mapvalue + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipNflog(dAtA[iNdEx:]) @@ -1129,6 +1530,120 @@ func (m *MeshEntry) Unmarshal(dAtA []byte) error { } return nil } +func (m *ReceiverDataValue) 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 ErrIntOverflowNflog + } + 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: ReceiverDataValue: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ReceiverDataValue: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field StrVal", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNflog + } + 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 ErrInvalidLengthNflog + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthNflog + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Value = &ReceiverDataValue_StrVal{string(dAtA[iNdEx:postIndex])} + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field IntVal", wireType) + } + var v int64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowNflog + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Value = &ReceiverDataValue_IntVal{v} + case 3: + if wireType != 1 { + return fmt.Errorf("proto: wrong wireType = %d for field DoubleVal", wireType) + } + var v uint64 + if (iNdEx + 8) > l { + return io.ErrUnexpectedEOF + } + v = uint64(encoding_binary.LittleEndian.Uint64(dAtA[iNdEx:])) + iNdEx += 8 + m.Value = &ReceiverDataValue_DoubleVal{float64(math.Float64frombits(v))} + default: + iNdEx = preIndex + skippy, err := skipNflog(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthNflog + } + 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 skipNflog(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/vendor/github.com/prometheus/alertmanager/nflog/nflogpb/nflog.proto b/vendor/github.com/prometheus/alertmanager/nflog/nflogpb/nflog.proto index eb4fd8ba9e7..ee7d4054495 100644 --- a/vendor/github.com/prometheus/alertmanager/nflog/nflogpb/nflog.proto +++ b/vendor/github.com/prometheus/alertmanager/nflog/nflogpb/nflog.proto @@ -39,6 +39,8 @@ message Entry { repeated uint64 firing_alerts = 6; // ResolvedAlerts list of hashes of resolved alerts at the last notification time. repeated uint64 resolved_alerts = 7; + // Data specific to the receiver which sent the notification + map receiver_data = 8; } // MeshEntry is a wrapper message to communicate a notify log @@ -50,3 +52,11 @@ message MeshEntry { // the log entry from its state. google.protobuf.Timestamp expires_at = 2 [(gogoproto.stdtime) = true, (gogoproto.nullable) = false]; } + +message ReceiverDataValue { + oneof value { + string str_val = 1; + int64 int_val = 2; + double double_val = 3; + } +} diff --git a/vendor/github.com/prometheus/alertmanager/notify/email/email.go b/vendor/github.com/prometheus/alertmanager/notify/email/email.go index 6ed98d1b40c..3677a9e130d 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/email/email.go +++ b/vendor/github.com/prometheus/alertmanager/notify/email/email.go @@ -83,7 +83,11 @@ func (n *Email) auth(mechs string) (smtp.Auth, error) { for mech := range strings.SplitSeq(mechs, " ") { switch mech { case "CRAM-MD5": - secret := string(n.conf.AuthSecret) + secret, secretErr := n.getAuthSecret() + if secretErr != nil { + err.Add(secretErr) + continue + } if secret == "" { err.Add(errors.New("missing secret for CRAM-MD5 auth mechanism")) continue @@ -130,7 +134,16 @@ func (n *Email) Notify(ctx context.Context, as ...*types.Alert) (bool, error) { err error success = false ) - if n.conf.Smarthost.Port == "465" { + // Determine whether to use Implicit TLS + var useImplicitTLS bool + if n.conf.ForceImplicitTLS != nil { + useImplicitTLS = *n.conf.ForceImplicitTLS + } else { + // Default logic: port 465 uses implicit TLS (backward compatibility) + useImplicitTLS = n.conf.Smarthost.Port == "465" + } + + if useImplicitTLS { tlsConfig, err := commoncfg.NewTLSConfig(n.conf.TLSConfig) if err != nil { return false, fmt.Errorf("parse TLS configuration: %w", err) @@ -173,7 +186,7 @@ func (n *Email) Notify(ctx context.Context, as ...*types.Alert) (bool, error) { } // Global Config guarantees RequireTLS is not nil. - if *n.conf.RequireTLS { + if *n.conf.RequireTLS && !useImplicitTLS { if ok, _ := c.Extension("STARTTLS"); !ok { return true, fmt.Errorf("'require_tls' is true (default) but %q does not advertise the STARTTLS extension", n.conf.Smarthost) } @@ -410,3 +423,14 @@ func (n *Email) getPassword() (string, error) { } return string(n.conf.AuthPassword), nil } + +func (n *Email) getAuthSecret() (string, error) { + if len(n.conf.AuthSecretFile) > 0 { + content, err := os.ReadFile(n.conf.AuthSecretFile) + if err != nil { + return "", fmt.Errorf("could not read %s: %w", n.conf.AuthSecretFile, err) + } + return string(content), nil + } + return string(n.conf.AuthSecret), nil +} diff --git a/vendor/github.com/prometheus/alertmanager/notify/jira/jira.go b/vendor/github.com/prometheus/alertmanager/notify/jira/jira.go index 3b0f2f5e0a7..d2fc8889331 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/jira/jira.go +++ b/vendor/github.com/prometheus/alertmanager/notify/jira/jira.go @@ -173,13 +173,25 @@ func (n *Notifier) prepareIssueRequestBody(_ context.Context, logger *slog.Logge logger.Warn("Truncated description", "max_runes", maxDescriptionLenRunes) } + var description *jiraDescription descriptionCopy := issueDescriptionString if isAPIv3Path(n.conf.APIURL.Path) { - if !json.Valid([]byte(descriptionCopy)) { - return issue{}, fmt.Errorf("description template: invalid JSON for API v3") + descriptionCopy = strings.TrimSpace(descriptionCopy) + if descriptionCopy != "" { + if !json.Valid([]byte(descriptionCopy)) { + return issue{}, fmt.Errorf("description template: invalid JSON for API v3") + } + raw := json.RawMessage(descriptionCopy) + description = &jiraDescription{ + RawJSONDescription: append(json.RawMessage(nil), raw...), + } } + } else if descriptionCopy != "" { + desc := descriptionCopy + description = &jiraDescription{StringDescription: &desc} } - requestBody.Fields.Description = &descriptionCopy + + requestBody.Fields.Description = description for i, label := range n.conf.Labels { label, err = tmplTextFunc(label) @@ -283,7 +295,7 @@ func (n *Notifier) prepareSearchRequest(jql string) (issueSearch, string) { } if n.conf.APIType == "cloud" || n.conf.APIType == "auto" && strings.HasSuffix(n.conf.APIURL.Host, "atlassian.net") { - searchPath := strings.Replace(n.conf.APIURL.JoinPath("/search/jql").String(), "/2", "/3", 1) + searchPath := strings.Replace(n.conf.APIURL.JoinPath("/search/jql").String(), "/rest/api/2/", "/rest/api/3/", 1) return requestBody, searchPath } diff --git a/vendor/github.com/prometheus/alertmanager/notify/jira/types.go b/vendor/github.com/prometheus/alertmanager/notify/jira/types.go index ac933f81ddb..4d42097740c 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/jira/types.go +++ b/vendor/github.com/prometheus/alertmanager/notify/jira/types.go @@ -14,10 +14,12 @@ package jira import ( + "bytes" "encoding/json" "maps" ) +// issue represents a Jira issue wrapper. type issue struct { Key string `json:"key,omitempty"` Fields *issueFields `json:"fields,omitempty"` @@ -25,14 +27,14 @@ type issue struct { } type issueFields struct { - Description *string `json:"description,omitempty"` - Issuetype *idNameValue `json:"issuetype,omitempty"` - Labels []string `json:"labels,omitempty"` - Priority *idNameValue `json:"priority,omitempty"` - Project *issueProject `json:"project,omitempty"` - Resolution *idNameValue `json:"resolution,omitempty"` - Summary *string `json:"summary,omitempty"` - Status *issueStatus `json:"status,omitempty"` + Description *jiraDescription `json:"description,omitempty"` + Issuetype *idNameValue `json:"issuetype,omitempty"` + Labels []string `json:"labels,omitempty"` + Priority *idNameValue `json:"priority,omitempty"` + Project *issueProject `json:"project,omitempty"` + Resolution *idNameValue `json:"resolution,omitempty"` + Summary *string `json:"summary,omitempty"` + Status *issueStatus `json:"status,omitempty"` Fields map[string]any `json:"-"` } @@ -75,34 +77,95 @@ func (i issueFields) MarshalJSON() ([]byte, error) { jsonFields["summary"] = *i.Summary } - if i.Description != nil { - jsonFields["description"] = *i.Description + // Only include description when it has content. + if i.Description != nil && !i.Description.IsEmpty() { + jsonFields["description"] = i.Description } + if i.Issuetype != nil { jsonFields["issuetype"] = i.Issuetype } - if i.Labels != nil { jsonFields["labels"] = i.Labels } - if i.Priority != nil { jsonFields["priority"] = i.Priority } - if i.Project != nil { jsonFields["project"] = i.Project } - if i.Resolution != nil { jsonFields["resolution"] = i.Resolution } - if i.Status != nil { jsonFields["status"] = i.Status } - maps.Copy(jsonFields, i.Fields) + // copy custom/unknown fields into the outgoing map + if i.Fields != nil { + maps.Copy(jsonFields, i.Fields) + } return json.Marshal(jsonFields) } + +// jiraDescription holds either a plain string (v2 API) description or ADF (Atlassian Document Format) JSON (v3 API). +type jiraDescription struct { + StringDescription *string // non-nil if the description is a simple string + RawJSONDescription json.RawMessage // non-empty if the description is structured JSON +} + +func (jd jiraDescription) MarshalJSON() ([]byte, error) { + // If there's a structured JSON payload, return it as-is. + if len(jd.RawJSONDescription) > 0 { + out := make([]byte, len(jd.RawJSONDescription)) + copy(out, jd.RawJSONDescription) + return out, nil + } + + // If we have a string representation, let json.Marshal quote it properly. + if jd.StringDescription != nil { + return json.Marshal(*jd.StringDescription) + } + + // No value: represent as JSON null. + return []byte("null"), nil +} + +func (jd *jiraDescription) UnmarshalJSON(data []byte) error { + // Reset current state + jd.StringDescription = nil + jd.RawJSONDescription = nil + + trimmed := bytes.TrimSpace(data) + if len(trimmed) == 0 || bytes.Equal(trimmed, []byte("null")) { + // nothing to do (leave both fields nil/empty) + return nil + } + + // If it starts with object or array token, treat as structured JSON and keep raw bytes. + switch trimmed[0] { + case '{', '[': + // store a copy of the raw JSON + jd.RawJSONDescription = append(json.RawMessage(nil), trimmed...) + return nil + default: + // otherwise try to unmarshal as string (expected for Jira v2) + var s string + if err := json.Unmarshal(trimmed, &s); err != nil { + // fallback: if it's not a string but also not an object/array, keep raw bytes + jd.RawJSONDescription = append(json.RawMessage(nil), trimmed...) + return nil + } + jd.StringDescription = &s + return nil + } +} + +// IsEmpty reports whether the jiraDescription contains no useful value. +func (jd *jiraDescription) IsEmpty() bool { + if jd == nil { + return true + } + return jd.StringDescription == nil && len(jd.RawJSONDescription) == 0 +} diff --git a/vendor/github.com/prometheus/alertmanager/notify/notify.go b/vendor/github.com/prometheus/alertmanager/notify/notify.go index e58c16f6eec..4de234f935c 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/notify.go +++ b/vendor/github.com/prometheus/alertmanager/notify/notify.go @@ -142,6 +142,7 @@ const ( keyMuteTimeIntervals keyActiveTimeIntervals keyRouteID + keyNflogStore ) // WithReceiverName populates a context with a receiver name. @@ -262,6 +263,15 @@ func RouteID(ctx context.Context) (string, bool) { return v, ok } +func WithNflogStore(ctx context.Context, store *nflog.Store) context.Context { + return context.WithValue(ctx, keyNflogStore, store) +} + +func NflogStore(ctx context.Context) (*nflog.Store, bool) { + v, ok := ctx.Value(keyNflogStore).(*nflog.Store) + return v, ok +} + // A Stage processes alerts under the constraints of the given context. type Stage interface { Exec(ctx context.Context, l *slog.Logger, alerts ...*types.Alert) (context.Context, []*types.Alert, error) @@ -276,7 +286,7 @@ func (f StageFunc) Exec(ctx context.Context, l *slog.Logger, alerts ...*types.Al } type NotificationLog interface { - Log(r *nflogpb.Receiver, gkey string, firingAlerts, resolvedAlerts []uint64, expiry time.Duration) error + Log(r *nflogpb.Receiver, gkey string, firingAlerts, resolvedAlerts []uint64, store *nflog.Store, expiry time.Duration) error Query(params ...nflog.QueryParam) ([]*nflogpb.Entry, error) } @@ -780,14 +790,25 @@ func (n *DedupStage) Exec(ctx context.Context, _ *slog.Logger, alerts ...*types. } var entry *nflogpb.Entry + var isFirstNotification bool switch len(entries) { case 0: + isFirstNotification = true case 1: entry = entries[0] + // if this condition true, we're sending a notification for a new alert group, but the nflog entry for the previous alert + // group is still in log + isFirstNotification = len(entry.FiringAlerts) == 0 && len(firing) > 0 default: return ctx, nil, fmt.Errorf("unexpected entry result size %d", len(entries)) } + if isFirstNotification { + ctx = WithNflogStore(ctx, nflog.NewStore(nil)) + } else { + ctx = WithNflogStore(ctx, nflog.NewStore(entry)) + } + if n.needsUpdate(entry, firingSet, resolvedSet, repeatInterval) { span.AddEvent("notify.DedupStage.Exec nflog needs update") return ctx, alerts, nil @@ -942,18 +963,6 @@ func (r RetryStage) exec(ctx context.Context, l *slog.Logger, alerts ...*types.A return ctx, alerts, nil } case <-ctx.Done(): - if iErr == nil { - iErr = ctx.Err() - if errors.Is(iErr, context.Canceled) { - iErr = NewErrorWithReason(ContextCanceledReason, iErr) - } else if errors.Is(iErr, context.DeadlineExceeded) { - iErr = NewErrorWithReason(ContextDeadlineExceededReason, iErr) - } - } - if iErr != nil { - return ctx, nil, fmt.Errorf("%s/%s: notify retry canceled after %d attempts: %w", r.groupName, r.integration.String(), i, iErr) - } - return ctx, nil, nil } } } @@ -1008,7 +1017,9 @@ func (n SetNotifiesStage) Exec(ctx context.Context, l *slog.Logger, alerts ...*t attribute.Int("alerting.alerts.resolved.count", len(resolved)), ) - return ctx, alerts, n.nflog.Log(n.recv, gkey, firing, resolved, expiry) + // Extract receiver data from context if present (it's ok for it to be nil). + store, _ := NflogStore(ctx) + return ctx, alerts, n.nflog.Log(n.recv, gkey, firing, resolved, store, expiry) } type timeStage struct { diff --git a/vendor/github.com/prometheus/alertmanager/notify/slack/slack.go b/vendor/github.com/prometheus/alertmanager/notify/slack/slack.go index c888fa13e39..e3ba8d1b69a 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/slack/slack.go +++ b/vendor/github.com/prometheus/alertmanager/notify/slack/slack.go @@ -70,6 +70,7 @@ type request struct { IconEmoji string `json:"icon_emoji,omitempty"` IconURL string `json:"icon_url,omitempty"` LinkNames bool `json:"link_names,omitempty"` + Text string `json:"text,omitempty"` Attachments []attachment `json:"attachments"` } @@ -186,6 +187,7 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) IconEmoji: tmplText(n.conf.IconEmoji), IconURL: tmplText(n.conf.IconURL), LinkNames: n.conf.LinkNames, + Text: tmplText(n.conf.MessageText), Attachments: []attachment{*att}, } if err != nil { diff --git a/vendor/github.com/prometheus/alertmanager/notify/telegram/telegram.go b/vendor/github.com/prometheus/alertmanager/notify/telegram/telegram.go index 00f2f0d4b9f..da5ea46a8a2 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/telegram/telegram.go +++ b/vendor/github.com/prometheus/alertmanager/notify/telegram/telegram.go @@ -19,6 +19,7 @@ import ( "log/slog" "net/http" "os" + "strconv" "strings" commoncfg "github.com/prometheus/common/config" @@ -95,7 +96,12 @@ func (n *Notifier) Notify(ctx context.Context, alert ...*types.Alert) (bool, err return true, err } - message, err := n.client.Send(telebot.ChatID(n.conf.ChatID), messageText, &telebot.SendOptions{ + chatID, err := n.getChatID() + if err != nil { + return true, err + } + + message, err := n.client.Send(telebot.ChatID(chatID), messageText, &telebot.SendOptions{ DisableNotification: n.conf.DisableNotifications, DisableWebPagePreview: true, ThreadID: n.conf.MessageThreadID, @@ -133,3 +139,18 @@ func (n *Notifier) getBotToken() (string, error) { } return string(n.conf.BotToken), nil } + +func (n *Notifier) getChatID() (int64, error) { + if len(n.conf.ChatIDFile) > 0 { + content, err := os.ReadFile(n.conf.ChatIDFile) + if err != nil { + return 0, fmt.Errorf("could not read %s: %w", n.conf.ChatIDFile, err) + } + chatID, err := strconv.ParseInt(strings.TrimSpace(string(content)), 10, 64) + if err != nil { + return 0, fmt.Errorf("could not parse chat_id from %s: %w", n.conf.ChatIDFile, err) + } + return chatID, nil + } + return n.conf.ChatID, nil +} diff --git a/vendor/github.com/prometheus/alertmanager/notify/webhook/webhook.go b/vendor/github.com/prometheus/alertmanager/notify/webhook/webhook.go index f6f67eb68ea..d35e4079819 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/webhook/webhook.go +++ b/vendor/github.com/prometheus/alertmanager/notify/webhook/webhook.go @@ -17,6 +17,7 @@ import ( "bytes" "context" "encoding/json" + "errors" "fmt" "log/slog" "net/http" @@ -101,14 +102,25 @@ func (n *Notifier) Notify(ctx context.Context, alerts ...*types.Alert) (bool, er } var url string - if n.conf.URL != nil { - url = n.conf.URL.String() + var tmplErr error + tmpl := notify.TmplText(n.tmpl, data, &tmplErr) + + if n.conf.URL != "" { + url = tmpl(string(n.conf.URL)) } else { content, err := os.ReadFile(n.conf.URLFile) if err != nil { return false, fmt.Errorf("read url_file: %w", err) } - url = strings.TrimSpace(string(content)) + url = tmpl(strings.TrimSpace(string(content))) + } + + if tmplErr != nil { + return false, fmt.Errorf("failed to template webhook URL: %w", tmplErr) + } + + if url == "" { + return false, errors.New("webhook URL is empty after templating") } if n.conf.Timeout > 0 { diff --git a/vendor/github.com/prometheus/alertmanager/notify/wechat/wechat.go b/vendor/github.com/prometheus/alertmanager/notify/wechat/wechat.go index 9f561e039fe..35d418931de 100644 --- a/vendor/github.com/prometheus/alertmanager/notify/wechat/wechat.go +++ b/vendor/github.com/prometheus/alertmanager/notify/wechat/wechat.go @@ -23,6 +23,8 @@ import ( "log/slog" "net/http" "net/url" + "os" + "strings" "time" commoncfg "github.com/prometheus/common/config" @@ -99,7 +101,11 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) // Refresh AccessToken over 2 hours if n.accessToken == "" || time.Since(n.accessTokenAt) > 2*time.Hour { parameters := url.Values{} - parameters.Add("corpsecret", tmpl(string(n.conf.APISecret))) + apiSecret, err := n.getApiSecret() + if err != nil { + return false, err + } + parameters.Add("corpsecret", tmpl(apiSecret)) parameters.Add("corpid", tmpl(string(n.conf.CorpID))) if err != nil { return false, fmt.Errorf("templating error: %w", err) @@ -196,3 +202,14 @@ func (n *Notifier) Notify(ctx context.Context, as ...*types.Alert) (bool, error) return false, errors.New(weResp.Error) } + +func (n *Notifier) getApiSecret() (string, error) { + if len(n.conf.APISecretFile) > 0 { + content, err := os.ReadFile(n.conf.APISecretFile) + if err != nil { + return "", err + } + return strings.TrimSpace(string(content)), nil + } + return string(n.conf.APISecret), nil +} diff --git a/vendor/github.com/prometheus/alertmanager/provider/mem/mem.go b/vendor/github.com/prometheus/alertmanager/provider/mem/mem.go index 3b9dc623def..fb7294c661a 100644 --- a/vendor/github.com/prometheus/alertmanager/provider/mem/mem.go +++ b/vendor/github.com/prometheus/alertmanager/provider/mem/mem.go @@ -1,4 +1,4 @@ -// Copyright 2016 Prometheus Team +// Copyright The Prometheus Authors // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at @@ -15,6 +15,7 @@ package mem import ( "context" + "errors" "log/slog" "sync" "time" @@ -27,6 +28,7 @@ import ( "go.opentelemetry.io/otel/propagation" "go.opentelemetry.io/otel/trace" + "github.com/prometheus/alertmanager/featurecontrol" "github.com/prometheus/alertmanager/provider" "github.com/prometheus/alertmanager/store" "github.com/prometheus/alertmanager/types" @@ -52,7 +54,10 @@ type Alerts struct { logger *slog.Logger propagator propagation.TextMapPropagator + flagger featurecontrol.Flagger + alertsLimit prometheus.Gauge + alertsLimitedTotal *prometheus.CounterVec subscriberChannelWrites *prometheus.CounterVec } @@ -77,22 +82,24 @@ type listeningAlerts struct { } func (a *Alerts) registerMetrics(r prometheus.Registerer) { - newMemAlertByStatus := func(s types.AlertState) prometheus.GaugeFunc { - return promauto.With(r).NewGaugeFunc( - prometheus.GaugeOpts{ - Name: "alertmanager_alerts", - Help: "How many alerts by state.", - ConstLabels: prometheus.Labels{"state": string(s)}, - }, - func() float64 { - return float64(a.count(s)) - }, - ) - } + r.MustRegister(&alertsCollector{alerts: a}) + + a.alertsLimit = promauto.With(r).NewGauge(prometheus.GaugeOpts{ + Name: "alertmanager_alerts_per_alert_limit", + Help: "Current limit on number of alerts per alert name", + }) - newMemAlertByStatus(types.AlertStateActive) - newMemAlertByStatus(types.AlertStateSuppressed) - newMemAlertByStatus(types.AlertStateUnprocessed) + labels := []string{} + if a.flagger.EnableAlertNamesInMetrics() { + labels = append(labels, "alertname") + } + a.alertsLimitedTotal = promauto.With(r).NewCounterVec( + prometheus.CounterOpts{ + Name: "alertmanager_alerts_limited_total", + Help: "Total number of alerts that were dropped due to per alert name limit", + }, + labels, + ) a.subscriberChannelWrites = promauto.With(r).NewCounterVec( prometheus.CounterOpts{ @@ -104,25 +111,44 @@ func (a *Alerts) registerMetrics(r prometheus.Registerer) { } // NewAlerts returns a new alert provider. -func NewAlerts(ctx context.Context, m types.AlertMarker, intervalGC time.Duration, alertCallback AlertStoreCallback, l *slog.Logger, r prometheus.Registerer) (*Alerts, error) { +func NewAlerts( + ctx context.Context, + m types.AlertMarker, + intervalGC time.Duration, + perAlertNameLimit int, + alertCallback AlertStoreCallback, + l *slog.Logger, + r prometheus.Registerer, + flagger featurecontrol.Flagger, +) (*Alerts, error) { if alertCallback == nil { alertCallback = noopCallback{} } + if perAlertNameLimit > 0 { + l.Info("per alert name limit enabled", "limit", perAlertNameLimit) + } + + if flagger == nil { + flagger = featurecontrol.NoopFlags{} + } + ctx, cancel := context.WithCancel(ctx) a := &Alerts{ marker: m, - alerts: store.NewAlerts(), + alerts: store.NewAlerts().WithPerAlertLimit(perAlertNameLimit), cancel: cancel, listeners: map[int]listeningAlerts{}, next: 0, logger: l.With("component", "provider"), propagator: otel.GetTextMapPropagator(), callback: alertCallback, + flagger: flagger, } if r != nil { a.registerMetrics(r) + a.alertsLimit.Set(float64(perAlertNameLimit)) } go a.gcLoop(ctx, intervalGC) @@ -286,7 +312,14 @@ func (a *Alerts) Put(ctx context.Context, alerts ...*types.Alert) error { } if err := a.alerts.Set(alert); err != nil { - a.logger.Error("error on set alert", "err", err) + a.logger.Warn("error on set alert", "alertname", alert.Name(), "err", err) + if errors.Is(err, store.ErrLimited) { + labels := []string{} + if a.flagger.EnableAlertNamesInMetrics() { + labels = append(labels, alert.Name()) + } + a.alertsLimitedTotal.WithLabelValues(labels...).Inc() + } continue } @@ -311,23 +344,46 @@ func (a *Alerts) Put(ctx context.Context, alerts ...*types.Alert) error { return nil } -// count returns the number of non-resolved alerts we currently have stored filtered by the provided state. -func (a *Alerts) count(state types.AlertState) int { - var count int +// countByState returns the number of non-resolved alerts by state. +func (a *Alerts) countByState() (active, suppressed, unprocessed int) { for _, alert := range a.alerts.List() { if alert.Resolved() { continue } - status := a.marker.Status(alert.Fingerprint()) - if status.State != state { - continue + switch a.marker.Status(alert.Fingerprint()).State { + case types.AlertStateActive: + active++ + case types.AlertStateSuppressed: + suppressed++ + case types.AlertStateUnprocessed: + unprocessed++ } - - count++ } + return active, suppressed, unprocessed +} + +// alertsCollector implements prometheus.Collector to collect all alert count metrics in a single pass. +type alertsCollector struct { + alerts *Alerts +} + +var alertsDesc = prometheus.NewDesc( + "alertmanager_alerts", + "How many alerts by state.", + []string{"state"}, nil, +) + +func (c *alertsCollector) Describe(ch chan<- *prometheus.Desc) { + ch <- alertsDesc +} + +func (c *alertsCollector) Collect(ch chan<- prometheus.Metric) { + active, suppressed, unprocessed := c.alerts.countByState() - return count + ch <- prometheus.MustNewConstMetric(alertsDesc, prometheus.GaugeValue, float64(active), string(types.AlertStateActive)) + ch <- prometheus.MustNewConstMetric(alertsDesc, prometheus.GaugeValue, float64(suppressed), string(types.AlertStateSuppressed)) + ch <- prometheus.MustNewConstMetric(alertsDesc, prometheus.GaugeValue, float64(unprocessed), string(types.AlertStateUnprocessed)) } type noopCallback struct{} diff --git a/vendor/github.com/prometheus/alertmanager/silence/silence.go b/vendor/github.com/prometheus/alertmanager/silence/silence.go index 3969cce3bb2..bdf2b49dbaf 100644 --- a/vendor/github.com/prometheus/alertmanager/silence/silence.go +++ b/vendor/github.com/prometheus/alertmanager/silence/silence.go @@ -333,8 +333,8 @@ type metrics struct { matcherCompileLoadSnapshotErrorsTotal prometheus.Counter } -func newSilenceMetricByState(s *Silences, st types.SilenceState) prometheus.GaugeFunc { - return prometheus.NewGaugeFunc( +func newSilenceMetricByState(r prometheus.Registerer, s *Silences, st types.SilenceState) prometheus.GaugeFunc { + return promauto.With(r).NewGaugeFunc( prometheus.GaugeOpts{ Name: "alertmanager_silences", Help: "How many silences by state.", @@ -417,9 +417,9 @@ func newMetrics(r prometheus.Registerer, s *Silences) *metrics { Help: "Number of received gossip messages that have been further gossiped.", }) if s != nil { - m.silencesActive = newSilenceMetricByState(s, types.SilenceStateActive) - m.silencesPending = newSilenceMetricByState(s, types.SilenceStatePending) - m.silencesExpired = newSilenceMetricByState(s, types.SilenceStateExpired) + m.silencesActive = newSilenceMetricByState(r, s, types.SilenceStateActive) + m.silencesPending = newSilenceMetricByState(r, s, types.SilenceStatePending) + m.silencesExpired = newSilenceMetricByState(r, s, types.SilenceStateExpired) m.stateSize = promauto.With(r).NewGauge(prometheus.GaugeOpts{ Name: "alertmanager_silences_state_size", Help: "The number of silences in the state map.", diff --git a/vendor/github.com/prometheus/alertmanager/store/store.go b/vendor/github.com/prometheus/alertmanager/store/store.go index bcb69b0f3a9..daa7c14357f 100644 --- a/vendor/github.com/prometheus/alertmanager/store/store.go +++ b/vendor/github.com/prometheus/alertmanager/store/store.go @@ -21,9 +21,13 @@ import ( "github.com/prometheus/common/model" + "github.com/prometheus/alertmanager/limit" "github.com/prometheus/alertmanager/types" ) +// ErrLimited is returned if a Store has reached the per-alert limit. +var ErrLimited = errors.New("alert limited") + // ErrNotFound is returned if a Store cannot find the Alert. var ErrNotFound = errors.New("alert not found") @@ -33,26 +37,40 @@ var ErrNotFound = errors.New("alert not found") // resolved alerts that have been removed. type Alerts struct { sync.Mutex - c map[model.Fingerprint]*types.Alert - cb func([]types.Alert) + alerts map[model.Fingerprint]*types.Alert + gcCallback func([]types.Alert) + limits map[string]*limit.Bucket[model.Fingerprint] + perAlertLimit int } // NewAlerts returns a new Alerts struct. func NewAlerts() *Alerts { a := &Alerts{ - c: make(map[model.Fingerprint]*types.Alert), - cb: func(_ []types.Alert) {}, + alerts: make(map[model.Fingerprint]*types.Alert), + gcCallback: func(_ []types.Alert) {}, + perAlertLimit: 0, } return a } +// WithPerAlertLimit sets the per-alert limit for the Alerts struct. +func (a *Alerts) WithPerAlertLimit(lim int) *Alerts { + a.Lock() + defer a.Unlock() + + a.limits = make(map[string]*limit.Bucket[model.Fingerprint]) + a.perAlertLimit = lim + + return a +} + // SetGCCallback sets a GC callback to be executed after each GC. func (a *Alerts) SetGCCallback(cb func([]types.Alert)) { a.Lock() defer a.Unlock() - a.cb = cb + a.gcCallback = cb } // Run starts the GC loop. The interval must be greater than zero; if not, the function will panic. @@ -73,9 +91,9 @@ func (a *Alerts) Run(ctx context.Context, interval time.Duration) { func (a *Alerts) GC() []types.Alert { a.Lock() var resolved []types.Alert - for fp, alert := range a.c { + for fp, alert := range a.alerts { if alert.Resolved() { - delete(a.c, fp) + delete(a.alerts, fp) resolved = append(resolved, types.Alert{ Alert: model.Alert{ Labels: alert.Labels.Clone(), @@ -89,8 +107,16 @@ func (a *Alerts) GC() []types.Alert { }) } } + + // Remove stale alert limit buckets + for alertName, bucket := range a.limits { + if bucket.IsStale() { + delete(a.limits, alertName) + } + } + a.Unlock() - a.cb(resolved) + a.gcCallback(resolved) return resolved } @@ -100,7 +126,7 @@ func (a *Alerts) Get(fp model.Fingerprint) (*types.Alert, error) { a.Lock() defer a.Unlock() - alert, prs := a.c[fp] + alert, prs := a.alerts[fp] if !prs { return nil, ErrNotFound } @@ -112,7 +138,22 @@ func (a *Alerts) Set(alert *types.Alert) error { a.Lock() defer a.Unlock() - a.c[alert.Fingerprint()] = alert + fp := alert.Fingerprint() + name := alert.Name() + + // Apply per alert limits if necessary + if a.perAlertLimit > 0 { + bucket, ok := a.limits[name] + if !ok { + bucket = limit.NewBucket[model.Fingerprint](a.perAlertLimit) + a.limits[name] = bucket + } + if !bucket.Upsert(fp, alert.EndsAt) { + return ErrLimited + } + } + + a.alerts[fp] = alert return nil } @@ -123,8 +164,8 @@ func (a *Alerts) DeleteIfNotModified(alerts types.AlertSlice) error { defer a.Unlock() for _, alert := range alerts { fp := alert.Fingerprint() - if other, ok := a.c[fp]; ok && alert.UpdatedAt.Equal(other.UpdatedAt) { - delete(a.c, fp) + if other, ok := a.alerts[fp]; ok && alert.UpdatedAt.Equal(other.UpdatedAt) { + delete(a.alerts, fp) } } return nil @@ -135,8 +176,8 @@ func (a *Alerts) List() []*types.Alert { a.Lock() defer a.Unlock() - alerts := make([]*types.Alert, 0, len(a.c)) - for _, alert := range a.c { + alerts := make([]*types.Alert, 0, len(a.alerts)) + for _, alert := range a.alerts { alerts = append(alerts, alert) } @@ -148,7 +189,7 @@ func (a *Alerts) Empty() bool { a.Lock() defer a.Unlock() - return len(a.c) == 0 + return len(a.alerts) == 0 } // Len returns the number of alerts in the store. @@ -156,5 +197,5 @@ func (a *Alerts) Len() int { a.Lock() defer a.Unlock() - return len(a.c) + return len(a.alerts) } diff --git a/vendor/github.com/prometheus/sigv4/sigv4.go b/vendor/github.com/prometheus/sigv4/sigv4.go index e225ab5ffbf..15d984d39e3 100644 --- a/vendor/github.com/prometheus/sigv4/sigv4.go +++ b/vendor/github.com/prometheus/sigv4/sigv4.go @@ -99,7 +99,15 @@ func NewSigV4RoundTripper(cfg *SigV4Config, next http.RoundTripper) (http.RoundT } if cfg.RoleARN != "" { - awscfg.Credentials = stscreds.NewAssumeRoleProvider(sts.NewFromConfig(awscfg), cfg.RoleARN) + awscfg.Credentials = stscreds.NewAssumeRoleProvider( + sts.NewFromConfig(awscfg), + cfg.RoleARN, + func(o *stscreds.AssumeRoleOptions) { + if cfg.ExternalID != "" { + o.ExternalID = aws.String(cfg.ExternalID) + } + }, + ) } serviceName := "aps" diff --git a/vendor/github.com/prometheus/sigv4/sigv4_config.go b/vendor/github.com/prometheus/sigv4/sigv4_config.go index f756151d61d..0057ddb696e 100644 --- a/vendor/github.com/prometheus/sigv4/sigv4_config.go +++ b/vendor/github.com/prometheus/sigv4/sigv4_config.go @@ -28,6 +28,7 @@ type SigV4Config struct { //nolint:revive SecretKey config.Secret `yaml:"secret_key,omitempty"` Profile string `yaml:"profile,omitempty"` RoleARN string `yaml:"role_arn,omitempty"` + ExternalID string `yaml:"external_id,omitempty"` UseFIPSSTSEndpoint bool `yaml:"use_fips_sts_endpoint,omitempty"` ServiceName string `yaml:"service_name,omitempty"` } @@ -36,6 +37,9 @@ func (c *SigV4Config) Validate() error { if (c.AccessKey == "") != (c.SecretKey == "") { return fmt.Errorf("must provide a AWS SigV4 Access key and Secret Key if credentials are specified in the SigV4 config") } + if c.ExternalID != "" && c.RoleARN == "" { + return fmt.Errorf("external_id can only be used with role_arn") + } return nil } diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/internal/semconv/client.go b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/internal/semconv/client.go new file mode 100644 index 00000000000..10895b8db34 --- /dev/null +++ b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/internal/semconv/client.go @@ -0,0 +1,305 @@ +// Code generated by gotmpl. DO NOT MODIFY. +// source: internal/shared/semconv/client.go.tmpl + +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package semconv provides OpenTelemetry semantic convention types and +// functionality. +package semconv // import "go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/internal/semconv" + +import ( + "context" + "fmt" + "net/http" + "reflect" + "slices" + "strconv" + "strings" + + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/semconv/v1.37.0" + "go.opentelemetry.io/otel/semconv/v1.37.0/httpconv" +) + +type HTTPClient struct{ + requestBodySize httpconv.ClientRequestBodySize + requestDuration httpconv.ClientRequestDuration +} + +func NewHTTPClient(meter metric.Meter) HTTPClient { + client := HTTPClient{} + + var err error + client.requestBodySize, err = httpconv.NewClientRequestBodySize(meter) + handleErr(err) + + client.requestDuration, err = httpconv.NewClientRequestDuration( + meter, + metric.WithExplicitBucketBoundaries(0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10), + ) + handleErr(err) + + return client +} + +func (n HTTPClient) Status(code int) (codes.Code, string) { + if code < 100 || code >= 600 { + return codes.Error, fmt.Sprintf("Invalid HTTP status code %d", code) + } + if code >= 400 { + return codes.Error, "" + } + return codes.Unset, "" +} + +// RequestTraceAttrs returns trace attributes for an HTTP request made by a client. +func (n HTTPClient) RequestTraceAttrs(req *http.Request) []attribute.KeyValue { + /* + below attributes are returned: + - http.request.method + - http.request.method.original + - url.full + - server.address + - server.port + - network.protocol.name + - network.protocol.version + */ + numOfAttributes := 3 // URL, server address, proto, and method. + + var urlHost string + if req.URL != nil { + urlHost = req.URL.Host + } + var requestHost string + var requestPort int + for _, hostport := range []string{urlHost, req.Header.Get("Host")} { + requestHost, requestPort = SplitHostPort(hostport) + if requestHost != "" || requestPort > 0 { + break + } + } + + eligiblePort := requiredHTTPPort(req.URL != nil && req.URL.Scheme == "https", requestPort) + if eligiblePort > 0 { + numOfAttributes++ + } + useragent := req.UserAgent() + if useragent != "" { + numOfAttributes++ + } + + protoName, protoVersion := netProtocol(req.Proto) + if protoName != "" && protoName != "http" { + numOfAttributes++ + } + if protoVersion != "" { + numOfAttributes++ + } + + method, originalMethod := n.method(req.Method) + if originalMethod != (attribute.KeyValue{}) { + numOfAttributes++ + } + + attrs := make([]attribute.KeyValue, 0, numOfAttributes) + + attrs = append(attrs, method) + if originalMethod != (attribute.KeyValue{}) { + attrs = append(attrs, originalMethod) + } + + var u string + if req.URL != nil { + // Remove any username/password info that may be in the URL. + userinfo := req.URL.User + req.URL.User = nil + u = req.URL.String() + // Restore any username/password info that was removed. + req.URL.User = userinfo + } + attrs = append(attrs, semconv.URLFull(u)) + + attrs = append(attrs, semconv.ServerAddress(requestHost)) + if eligiblePort > 0 { + attrs = append(attrs, semconv.ServerPort(eligiblePort)) + } + + if protoName != "" && protoName != "http" { + attrs = append(attrs, semconv.NetworkProtocolName(protoName)) + } + if protoVersion != "" { + attrs = append(attrs, semconv.NetworkProtocolVersion(protoVersion)) + } + + return attrs +} + +// ResponseTraceAttrs returns trace attributes for an HTTP response made by a client. +func (n HTTPClient) ResponseTraceAttrs(resp *http.Response) []attribute.KeyValue { + /* + below attributes are returned: + - http.response.status_code + - error.type + */ + var count int + if resp.StatusCode > 0 { + count++ + } + + if isErrorStatusCode(resp.StatusCode) { + count++ + } + + attrs := make([]attribute.KeyValue, 0, count) + if resp.StatusCode > 0 { + attrs = append(attrs, semconv.HTTPResponseStatusCode(resp.StatusCode)) + } + + if isErrorStatusCode(resp.StatusCode) { + errorType := strconv.Itoa(resp.StatusCode) + attrs = append(attrs, semconv.ErrorTypeKey.String(errorType)) + } + return attrs +} + +func (n HTTPClient) ErrorType(err error) attribute.KeyValue { + t := reflect.TypeOf(err) + var value string + if t.PkgPath() == "" && t.Name() == "" { + // Likely a builtin type. + value = t.String() + } else { + value = fmt.Sprintf("%s.%s", t.PkgPath(), t.Name()) + } + + if value == "" { + return semconv.ErrorTypeOther + } + + return semconv.ErrorTypeKey.String(value) +} + +func (n HTTPClient) method(method string) (attribute.KeyValue, attribute.KeyValue) { + if method == "" { + return semconv.HTTPRequestMethodGet, attribute.KeyValue{} + } + if attr, ok := methodLookup[method]; ok { + return attr, attribute.KeyValue{} + } + + orig := semconv.HTTPRequestMethodOriginal(method) + if attr, ok := methodLookup[strings.ToUpper(method)]; ok { + return attr, orig + } + return semconv.HTTPRequestMethodGet, orig +} + +func (n HTTPClient) MetricAttributes(req *http.Request, statusCode int, additionalAttributes []attribute.KeyValue) []attribute.KeyValue { + num := len(additionalAttributes) + 2 + var h string + if req.URL != nil { + h = req.URL.Host + } + var requestHost string + var requestPort int + for _, hostport := range []string{h, req.Header.Get("Host")} { + requestHost, requestPort = SplitHostPort(hostport) + if requestHost != "" || requestPort > 0 { + break + } + } + + port := requiredHTTPPort(req.URL != nil && req.URL.Scheme == "https", requestPort) + if port > 0 { + num++ + } + + protoName, protoVersion := netProtocol(req.Proto) + if protoName != "" { + num++ + } + if protoVersion != "" { + num++ + } + + if statusCode > 0 { + num++ + } + + attributes := slices.Grow(additionalAttributes, num) + attributes = append(attributes, + semconv.HTTPRequestMethodKey.String(standardizeHTTPMethod(req.Method)), + semconv.ServerAddress(requestHost), + n.scheme(req), + ) + + if port > 0 { + attributes = append(attributes, semconv.ServerPort(port)) + } + if protoName != "" { + attributes = append(attributes, semconv.NetworkProtocolName(protoName)) + } + if protoVersion != "" { + attributes = append(attributes, semconv.NetworkProtocolVersion(protoVersion)) + } + + if statusCode > 0 { + attributes = append(attributes, semconv.HTTPResponseStatusCode(statusCode)) + } + return attributes +} + +type MetricOpts struct { + measurement metric.MeasurementOption + addOptions metric.AddOption +} + +func (o MetricOpts) MeasurementOption() metric.MeasurementOption { + return o.measurement +} + +func (o MetricOpts) AddOptions() metric.AddOption { + return o.addOptions +} + +func (n HTTPClient) MetricOptions(ma MetricAttributes) map[string]MetricOpts { + opts := map[string]MetricOpts{} + + attributes := n.MetricAttributes(ma.Req, ma.StatusCode, ma.AdditionalAttributes) + set := metric.WithAttributeSet(attribute.NewSet(attributes...)) + opts["new"] = MetricOpts{ + measurement: set, + addOptions: set, + } + + return opts +} + +func (n HTTPClient) RecordMetrics(ctx context.Context, md MetricData, opts map[string]MetricOpts) { + n.requestBodySize.Inst().Record(ctx, md.RequestSize, opts["new"].MeasurementOption()) + n.requestDuration.Inst().Record(ctx, md.ElapsedTime/1000, opts["new"].MeasurementOption()) +} + +// TraceAttributes returns attributes for httptrace. +func (n HTTPClient) TraceAttributes(host string) []attribute.KeyValue { + return []attribute.KeyValue{ + semconv.ServerAddress(host), + } +} + +func (n HTTPClient) scheme(req *http.Request) attribute.KeyValue { + if req.URL != nil && req.URL.Scheme != "" { + return semconv.URLScheme(req.URL.Scheme) + } + if req.TLS != nil { + return semconv.URLScheme("https") + } + return semconv.URLScheme("http") +} + +func isErrorStatusCode(code int) bool { + return code >= 400 || code < 100 +} diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/internal/semconv/env.go b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/internal/semconv/env.go deleted file mode 100644 index 040f88f4b8b..00000000000 --- a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/internal/semconv/env.go +++ /dev/null @@ -1,248 +0,0 @@ -// Code generated by gotmpl. DO NOT MODIFY. -// source: internal/shared/semconv/env.go.tmpl - -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package semconv // import "go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/internal/semconv" - -import ( - "context" - "fmt" - "net/http" - "strings" - "sync" - - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/codes" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/semconv/v1.37.0/httpconv" -) - -// OTelSemConvStabilityOptIn is an environment variable. -// That can be set to "http/dup" to keep getting the old HTTP semantic conventions. -const OTelSemConvStabilityOptIn = "OTEL_SEMCONV_STABILITY_OPT_IN" - -type ResponseTelemetry struct { - StatusCode int - ReadBytes int64 - ReadError error - WriteBytes int64 - WriteError error -} - -type HTTPServer struct { - requestBodySizeHistogram httpconv.ServerRequestBodySize - responseBodySizeHistogram httpconv.ServerResponseBodySize - requestDurationHistogram httpconv.ServerRequestDuration -} - -// RequestTraceAttrs returns trace attributes for an HTTP request received by a -// server. -// -// The server must be the primary server name if it is known. For example this -// would be the ServerName directive -// (https://httpd.apache.org/docs/2.4/mod/core.html#servername) for an Apache -// server, and the server_name directive -// (http://nginx.org/en/docs/http/ngx_http_core_module.html#server_name) for an -// nginx server. More generically, the primary server name would be the host -// header value that matches the default virtual host of an HTTP server. It -// should include the host identifier and if a port is used to route to the -// server that port identifier should be included as an appropriate port -// suffix. -// -// If the primary server name is not known, server should be an empty string. -// The req Host will be used to determine the server instead. -func (s HTTPServer) RequestTraceAttrs(server string, req *http.Request, opts RequestTraceAttrsOpts) []attribute.KeyValue { - return CurrentHTTPServer{}.RequestTraceAttrs(server, req, opts) -} - -func (s HTTPServer) NetworkTransportAttr(network string) []attribute.KeyValue { - return []attribute.KeyValue{ - CurrentHTTPServer{}.NetworkTransportAttr(network), - } -} - -// ResponseTraceAttrs returns trace attributes for telemetry from an HTTP response. -// -// If any of the fields in the ResponseTelemetry are not set the attribute will be omitted. -func (s HTTPServer) ResponseTraceAttrs(resp ResponseTelemetry) []attribute.KeyValue { - return CurrentHTTPServer{}.ResponseTraceAttrs(resp) -} - -// Route returns the attribute for the route. -func (s HTTPServer) Route(route string) attribute.KeyValue { - return CurrentHTTPServer{}.Route(route) -} - -// Status returns a span status code and message for an HTTP status code -// value returned by a server. Status codes in the 400-499 range are not -// returned as errors. -func (s HTTPServer) Status(code int) (codes.Code, string) { - if code < 100 || code >= 600 { - return codes.Error, fmt.Sprintf("Invalid HTTP status code %d", code) - } - if code >= 500 { - return codes.Error, "" - } - return codes.Unset, "" -} - -type ServerMetricData struct { - ServerName string - ResponseSize int64 - - MetricData - MetricAttributes -} - -type MetricAttributes struct { - Req *http.Request - StatusCode int - AdditionalAttributes []attribute.KeyValue -} - -type MetricData struct { - RequestSize int64 - - // The request duration, in milliseconds - ElapsedTime float64 -} - -var ( - metricAddOptionPool = &sync.Pool{ - New: func() any { - return &[]metric.AddOption{} - }, - } - - metricRecordOptionPool = &sync.Pool{ - New: func() any { - return &[]metric.RecordOption{} - }, - } -) - -func (s HTTPServer) RecordMetrics(ctx context.Context, md ServerMetricData) { - attributes := CurrentHTTPServer{}.MetricAttributes(md.ServerName, md.Req, md.StatusCode, md.AdditionalAttributes) - o := metric.WithAttributeSet(attribute.NewSet(attributes...)) - recordOpts := metricRecordOptionPool.Get().(*[]metric.RecordOption) - *recordOpts = append(*recordOpts, o) - s.requestBodySizeHistogram.Inst().Record(ctx, md.RequestSize, *recordOpts...) - s.responseBodySizeHistogram.Inst().Record(ctx, md.ResponseSize, *recordOpts...) - s.requestDurationHistogram.Inst().Record(ctx, md.ElapsedTime/1000.0, o) - *recordOpts = (*recordOpts)[:0] - metricRecordOptionPool.Put(recordOpts) -} - -// hasOptIn returns true if the comma-separated version string contains the -// exact optIn value. -func hasOptIn(version, optIn string) bool { - for _, v := range strings.Split(version, ",") { - if strings.TrimSpace(v) == optIn { - return true - } - } - return false -} - -func NewHTTPServer(meter metric.Meter) HTTPServer { - server := HTTPServer{} - - var err error - server.requestBodySizeHistogram, err = httpconv.NewServerRequestBodySize(meter) - handleErr(err) - - server.responseBodySizeHistogram, err = httpconv.NewServerResponseBodySize(meter) - handleErr(err) - - server.requestDurationHistogram, err = httpconv.NewServerRequestDuration( - meter, - metric.WithExplicitBucketBoundaries( - 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, - 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10, - ), - ) - handleErr(err) - return server -} - -type HTTPClient struct { - requestBodySize httpconv.ClientRequestBodySize - requestDuration httpconv.ClientRequestDuration -} - -func NewHTTPClient(meter metric.Meter) HTTPClient { - client := HTTPClient{} - - var err error - client.requestBodySize, err = httpconv.NewClientRequestBodySize(meter) - handleErr(err) - - client.requestDuration, err = httpconv.NewClientRequestDuration( - meter, - metric.WithExplicitBucketBoundaries(0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10), - ) - handleErr(err) - - return client -} - -// RequestTraceAttrs returns attributes for an HTTP request made by a client. -func (c HTTPClient) RequestTraceAttrs(req *http.Request) []attribute.KeyValue { - return CurrentHTTPClient{}.RequestTraceAttrs(req) -} - -// ResponseTraceAttrs returns metric attributes for an HTTP request made by a client. -func (c HTTPClient) ResponseTraceAttrs(resp *http.Response) []attribute.KeyValue { - return CurrentHTTPClient{}.ResponseTraceAttrs(resp) -} - -func (c HTTPClient) Status(code int) (codes.Code, string) { - if code < 100 || code >= 600 { - return codes.Error, fmt.Sprintf("Invalid HTTP status code %d", code) - } - if code >= 400 { - return codes.Error, "" - } - return codes.Unset, "" -} - -func (c HTTPClient) ErrorType(err error) attribute.KeyValue { - return CurrentHTTPClient{}.ErrorType(err) -} - -type MetricOpts struct { - measurement metric.MeasurementOption - addOptions metric.AddOption -} - -func (o MetricOpts) MeasurementOption() metric.MeasurementOption { - return o.measurement -} - -func (o MetricOpts) AddOptions() metric.AddOption { - return o.addOptions -} - -func (c HTTPClient) MetricOptions(ma MetricAttributes) map[string]MetricOpts { - opts := map[string]MetricOpts{} - - attributes := CurrentHTTPClient{}.MetricAttributes(ma.Req, ma.StatusCode, ma.AdditionalAttributes) - set := metric.WithAttributeSet(attribute.NewSet(attributes...)) - opts["new"] = MetricOpts{ - measurement: set, - addOptions: set, - } - - return opts -} - -func (s HTTPClient) RecordMetrics(ctx context.Context, md MetricData, opts map[string]MetricOpts) { - s.requestBodySize.Inst().Record(ctx, md.RequestSize, opts["new"].MeasurementOption()) - s.requestDuration.Inst().Record(ctx, md.ElapsedTime/1000, opts["new"].MeasurementOption()) -} - -func (s HTTPClient) TraceAttributes(host string) []attribute.KeyValue { - return CurrentHTTPClient{}.TraceAttributes(host) -} diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/internal/semconv/gen.go b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/internal/semconv/gen.go index c1c580a830f..d6aed214ef9 100644 --- a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/internal/semconv/gen.go +++ b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/internal/semconv/gen.go @@ -6,10 +6,10 @@ package semconv // import "go.opentelemetry.io/contrib/instrumentation/net/http/ // Generate semconv package: //go:generate gotmpl --body=../../../../../../../internal/shared/semconv/bench_test.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace\" }" --out=bench_test.go //go:generate gotmpl --body=../../../../../../../internal/shared/semconv/common_test.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace\" }" --out=common_test.go -//go:generate gotmpl --body=../../../../../../../internal/shared/semconv/env.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace\" }" --out=env.go -//go:generate gotmpl --body=../../../../../../../internal/shared/semconv/env_test.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace\" }" --out=env_test.go -//go:generate gotmpl --body=../../../../../../../internal/shared/semconv/httpconv.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace\" }" --out=httpconv.go -//go:generate gotmpl --body=../../../../../../../internal/shared/semconv/httpconv_test.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace\" }" --out=httpconv_test.go +//go:generate gotmpl --body=../../../../../../../internal/shared/semconv/server.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=server.go +//go:generate gotmpl --body=../../../../../../../internal/shared/semconv/server_test.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=server_test.go +//go:generate gotmpl --body=../../../../../../../internal/shared/semconv/client.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=client.go +//go:generate gotmpl --body=../../../../../../../internal/shared/semconv/client_test.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=client_test.go //go:generate gotmpl --body=../../../../../../../internal/shared/semconv/httpconvtest_test.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace\" }" --out=httpconvtest_test.go //go:generate gotmpl --body=../../../../../../../internal/shared/semconv/util.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace\" }" --out=util.go //go:generate gotmpl --body=../../../../../../../internal/shared/semconv/util_test.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace\" }" --out=util_test.go diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/internal/semconv/httpconv.go b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/internal/semconv/httpconv.go deleted file mode 100644 index a82bdbd0a46..00000000000 --- a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/internal/semconv/httpconv.go +++ /dev/null @@ -1,517 +0,0 @@ -// Code generated by gotmpl. DO NOT MODIFY. -// source: internal/shared/semconv/httpconv.go.tmpl - -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -// Package semconv provides OpenTelemetry semantic convention types and -// functionality. -package semconv // import "go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/internal/semconv" - -import ( - "fmt" - "net/http" - "reflect" - "slices" - "strconv" - "strings" - - "go.opentelemetry.io/otel/attribute" - semconvNew "go.opentelemetry.io/otel/semconv/v1.37.0" -) - -type RequestTraceAttrsOpts struct { - // If set, this is used as value for the "http.client_ip" attribute. - HTTPClientIP string -} - -type CurrentHTTPServer struct{} - -// RequestTraceAttrs returns trace attributes for an HTTP request received by a -// server. -// -// The server must be the primary server name if it is known. For example this -// would be the ServerName directive -// (https://httpd.apache.org/docs/2.4/mod/core.html#servername) for an Apache -// server, and the server_name directive -// (http://nginx.org/en/docs/http/ngx_http_core_module.html#server_name) for an -// nginx server. More generically, the primary server name would be the host -// header value that matches the default virtual host of an HTTP server. It -// should include the host identifier and if a port is used to route to the -// server that port identifier should be included as an appropriate port -// suffix. -// -// If the primary server name is not known, server should be an empty string. -// The req Host will be used to determine the server instead. -func (n CurrentHTTPServer) RequestTraceAttrs(server string, req *http.Request, opts RequestTraceAttrsOpts) []attribute.KeyValue { - count := 3 // ServerAddress, Method, Scheme - - var host string - var p int - if server == "" { - host, p = SplitHostPort(req.Host) - } else { - // Prioritize the primary server name. - host, p = SplitHostPort(server) - if p < 0 { - _, p = SplitHostPort(req.Host) - } - } - - hostPort := requiredHTTPPort(req.TLS != nil, p) - if hostPort > 0 { - count++ - } - - method, methodOriginal := n.method(req.Method) - if methodOriginal != (attribute.KeyValue{}) { - count++ - } - - scheme := n.scheme(req.TLS != nil) - - peer, peerPort := SplitHostPort(req.RemoteAddr) - if peer != "" { - // The Go HTTP server sets RemoteAddr to "IP:port", this will not be a - // file-path that would be interpreted with a sock family. - count++ - if peerPort > 0 { - count++ - } - } - - useragent := req.UserAgent() - if useragent != "" { - count++ - } - - // For client IP, use, in order: - // 1. The value passed in the options - // 2. The value in the X-Forwarded-For header - // 3. The peer address - clientIP := opts.HTTPClientIP - if clientIP == "" { - clientIP = serverClientIP(req.Header.Get("X-Forwarded-For")) - if clientIP == "" { - clientIP = peer - } - } - if clientIP != "" { - count++ - } - - if req.URL != nil && req.URL.Path != "" { - count++ - } - - protoName, protoVersion := netProtocol(req.Proto) - if protoName != "" && protoName != "http" { - count++ - } - if protoVersion != "" { - count++ - } - - route := httpRoute(req.Pattern) - if route != "" { - count++ - } - - attrs := make([]attribute.KeyValue, 0, count) - attrs = append(attrs, - semconvNew.ServerAddress(host), - method, - scheme, - ) - - if hostPort > 0 { - attrs = append(attrs, semconvNew.ServerPort(hostPort)) - } - if methodOriginal != (attribute.KeyValue{}) { - attrs = append(attrs, methodOriginal) - } - - if peer, peerPort := SplitHostPort(req.RemoteAddr); peer != "" { - // The Go HTTP server sets RemoteAddr to "IP:port", this will not be a - // file-path that would be interpreted with a sock family. - attrs = append(attrs, semconvNew.NetworkPeerAddress(peer)) - if peerPort > 0 { - attrs = append(attrs, semconvNew.NetworkPeerPort(peerPort)) - } - } - - if useragent != "" { - attrs = append(attrs, semconvNew.UserAgentOriginal(useragent)) - } - - if clientIP != "" { - attrs = append(attrs, semconvNew.ClientAddress(clientIP)) - } - - if req.URL != nil && req.URL.Path != "" { - attrs = append(attrs, semconvNew.URLPath(req.URL.Path)) - } - - if protoName != "" && protoName != "http" { - attrs = append(attrs, semconvNew.NetworkProtocolName(protoName)) - } - if protoVersion != "" { - attrs = append(attrs, semconvNew.NetworkProtocolVersion(protoVersion)) - } - - if route != "" { - attrs = append(attrs, n.Route(route)) - } - - return attrs -} - -func (n CurrentHTTPServer) NetworkTransportAttr(network string) attribute.KeyValue { - switch network { - case "tcp", "tcp4", "tcp6": - return semconvNew.NetworkTransportTCP - case "udp", "udp4", "udp6": - return semconvNew.NetworkTransportUDP - case "unix", "unixgram", "unixpacket": - return semconvNew.NetworkTransportUnix - default: - return semconvNew.NetworkTransportPipe - } -} - -func (n CurrentHTTPServer) method(method string) (attribute.KeyValue, attribute.KeyValue) { - if method == "" { - return semconvNew.HTTPRequestMethodGet, attribute.KeyValue{} - } - if attr, ok := methodLookup[method]; ok { - return attr, attribute.KeyValue{} - } - - orig := semconvNew.HTTPRequestMethodOriginal(method) - if attr, ok := methodLookup[strings.ToUpper(method)]; ok { - return attr, orig - } - return semconvNew.HTTPRequestMethodGet, orig -} - -func (n CurrentHTTPServer) scheme(https bool) attribute.KeyValue { //nolint:revive // ignore linter - if https { - return semconvNew.URLScheme("https") - } - return semconvNew.URLScheme("http") -} - -// ResponseTraceAttrs returns trace attributes for telemetry from an HTTP -// response. -// -// If any of the fields in the ResponseTelemetry are not set the attribute will -// be omitted. -func (n CurrentHTTPServer) ResponseTraceAttrs(resp ResponseTelemetry) []attribute.KeyValue { - var count int - - if resp.ReadBytes > 0 { - count++ - } - if resp.WriteBytes > 0 { - count++ - } - if resp.StatusCode > 0 { - count++ - } - - attributes := make([]attribute.KeyValue, 0, count) - - if resp.ReadBytes > 0 { - attributes = append(attributes, - semconvNew.HTTPRequestBodySize(int(resp.ReadBytes)), - ) - } - if resp.WriteBytes > 0 { - attributes = append(attributes, - semconvNew.HTTPResponseBodySize(int(resp.WriteBytes)), - ) - } - if resp.StatusCode > 0 { - attributes = append(attributes, - semconvNew.HTTPResponseStatusCode(resp.StatusCode), - ) - } - - return attributes -} - -// Route returns the attribute for the route. -func (n CurrentHTTPServer) Route(route string) attribute.KeyValue { - return semconvNew.HTTPRoute(route) -} - -func (n CurrentHTTPServer) MetricAttributes(server string, req *http.Request, statusCode int, additionalAttributes []attribute.KeyValue) []attribute.KeyValue { - num := len(additionalAttributes) + 3 - var host string - var p int - if server == "" { - host, p = SplitHostPort(req.Host) - } else { - // Prioritize the primary server name. - host, p = SplitHostPort(server) - if p < 0 { - _, p = SplitHostPort(req.Host) - } - } - hostPort := requiredHTTPPort(req.TLS != nil, p) - if hostPort > 0 { - num++ - } - protoName, protoVersion := netProtocol(req.Proto) - if protoName != "" { - num++ - } - if protoVersion != "" { - num++ - } - - if statusCode > 0 { - num++ - } - - attributes := slices.Grow(additionalAttributes, num) - attributes = append(attributes, - semconvNew.HTTPRequestMethodKey.String(standardizeHTTPMethod(req.Method)), - n.scheme(req.TLS != nil), - semconvNew.ServerAddress(host)) - - if hostPort > 0 { - attributes = append(attributes, semconvNew.ServerPort(hostPort)) - } - if protoName != "" { - attributes = append(attributes, semconvNew.NetworkProtocolName(protoName)) - } - if protoVersion != "" { - attributes = append(attributes, semconvNew.NetworkProtocolVersion(protoVersion)) - } - - if statusCode > 0 { - attributes = append(attributes, semconvNew.HTTPResponseStatusCode(statusCode)) - } - return attributes -} - -type CurrentHTTPClient struct{} - -// RequestTraceAttrs returns trace attributes for an HTTP request made by a client. -func (n CurrentHTTPClient) RequestTraceAttrs(req *http.Request) []attribute.KeyValue { - /* - below attributes are returned: - - http.request.method - - http.request.method.original - - url.full - - server.address - - server.port - - network.protocol.name - - network.protocol.version - */ - numOfAttributes := 3 // URL, server address, proto, and method. - - var urlHost string - if req.URL != nil { - urlHost = req.URL.Host - } - var requestHost string - var requestPort int - for _, hostport := range []string{urlHost, req.Header.Get("Host")} { - requestHost, requestPort = SplitHostPort(hostport) - if requestHost != "" || requestPort > 0 { - break - } - } - - eligiblePort := requiredHTTPPort(req.URL != nil && req.URL.Scheme == "https", requestPort) - if eligiblePort > 0 { - numOfAttributes++ - } - useragent := req.UserAgent() - if useragent != "" { - numOfAttributes++ - } - - protoName, protoVersion := netProtocol(req.Proto) - if protoName != "" && protoName != "http" { - numOfAttributes++ - } - if protoVersion != "" { - numOfAttributes++ - } - - method, originalMethod := n.method(req.Method) - if originalMethod != (attribute.KeyValue{}) { - numOfAttributes++ - } - - attrs := make([]attribute.KeyValue, 0, numOfAttributes) - - attrs = append(attrs, method) - if originalMethod != (attribute.KeyValue{}) { - attrs = append(attrs, originalMethod) - } - - var u string - if req.URL != nil { - // Remove any username/password info that may be in the URL. - userinfo := req.URL.User - req.URL.User = nil - u = req.URL.String() - // Restore any username/password info that was removed. - req.URL.User = userinfo - } - attrs = append(attrs, semconvNew.URLFull(u)) - - attrs = append(attrs, semconvNew.ServerAddress(requestHost)) - if eligiblePort > 0 { - attrs = append(attrs, semconvNew.ServerPort(eligiblePort)) - } - - if protoName != "" && protoName != "http" { - attrs = append(attrs, semconvNew.NetworkProtocolName(protoName)) - } - if protoVersion != "" { - attrs = append(attrs, semconvNew.NetworkProtocolVersion(protoVersion)) - } - - return attrs -} - -// ResponseTraceAttrs returns trace attributes for an HTTP response made by a client. -func (n CurrentHTTPClient) ResponseTraceAttrs(resp *http.Response) []attribute.KeyValue { - /* - below attributes are returned: - - http.response.status_code - - error.type - */ - var count int - if resp.StatusCode > 0 { - count++ - } - - if isErrorStatusCode(resp.StatusCode) { - count++ - } - - attrs := make([]attribute.KeyValue, 0, count) - if resp.StatusCode > 0 { - attrs = append(attrs, semconvNew.HTTPResponseStatusCode(resp.StatusCode)) - } - - if isErrorStatusCode(resp.StatusCode) { - errorType := strconv.Itoa(resp.StatusCode) - attrs = append(attrs, semconvNew.ErrorTypeKey.String(errorType)) - } - return attrs -} - -func (n CurrentHTTPClient) ErrorType(err error) attribute.KeyValue { - t := reflect.TypeOf(err) - var value string - if t.PkgPath() == "" && t.Name() == "" { - // Likely a builtin type. - value = t.String() - } else { - value = fmt.Sprintf("%s.%s", t.PkgPath(), t.Name()) - } - - if value == "" { - return semconvNew.ErrorTypeOther - } - - return semconvNew.ErrorTypeKey.String(value) -} - -func (n CurrentHTTPClient) method(method string) (attribute.KeyValue, attribute.KeyValue) { - if method == "" { - return semconvNew.HTTPRequestMethodGet, attribute.KeyValue{} - } - if attr, ok := methodLookup[method]; ok { - return attr, attribute.KeyValue{} - } - - orig := semconvNew.HTTPRequestMethodOriginal(method) - if attr, ok := methodLookup[strings.ToUpper(method)]; ok { - return attr, orig - } - return semconvNew.HTTPRequestMethodGet, orig -} - -func (n CurrentHTTPClient) MetricAttributes(req *http.Request, statusCode int, additionalAttributes []attribute.KeyValue) []attribute.KeyValue { - num := len(additionalAttributes) + 2 - var h string - if req.URL != nil { - h = req.URL.Host - } - var requestHost string - var requestPort int - for _, hostport := range []string{h, req.Header.Get("Host")} { - requestHost, requestPort = SplitHostPort(hostport) - if requestHost != "" || requestPort > 0 { - break - } - } - - port := requiredHTTPPort(req.URL != nil && req.URL.Scheme == "https", requestPort) - if port > 0 { - num++ - } - - protoName, protoVersion := netProtocol(req.Proto) - if protoName != "" { - num++ - } - if protoVersion != "" { - num++ - } - - if statusCode > 0 { - num++ - } - - attributes := slices.Grow(additionalAttributes, num) - attributes = append(attributes, - semconvNew.HTTPRequestMethodKey.String(standardizeHTTPMethod(req.Method)), - semconvNew.ServerAddress(requestHost), - n.scheme(req), - ) - - if port > 0 { - attributes = append(attributes, semconvNew.ServerPort(port)) - } - if protoName != "" { - attributes = append(attributes, semconvNew.NetworkProtocolName(protoName)) - } - if protoVersion != "" { - attributes = append(attributes, semconvNew.NetworkProtocolVersion(protoVersion)) - } - - if statusCode > 0 { - attributes = append(attributes, semconvNew.HTTPResponseStatusCode(statusCode)) - } - return attributes -} - -// TraceAttributes returns attributes for httptrace. -func (n CurrentHTTPClient) TraceAttributes(host string) []attribute.KeyValue { - return []attribute.KeyValue{ - semconvNew.ServerAddress(host), - } -} - -func (n CurrentHTTPClient) scheme(req *http.Request) attribute.KeyValue { - if req.URL != nil && req.URL.Scheme != "" { - return semconvNew.URLScheme(req.URL.Scheme) - } - if req.TLS != nil { - return semconvNew.URLScheme("https") - } - return semconvNew.URLScheme("http") -} - -func isErrorStatusCode(code int) bool { - return code >= 400 || code < 100 -} diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/internal/semconv/server.go b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/internal/semconv/server.go new file mode 100644 index 00000000000..5e770b74ad6 --- /dev/null +++ b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/internal/semconv/server.go @@ -0,0 +1,403 @@ +// Code generated by gotmpl. DO NOT MODIFY. +// source: internal/shared/semconv/server.go.tmpl + +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package semconv provides OpenTelemetry semantic convention types and +// functionality. +package semconv // import "go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/internal/semconv" + +import ( + "context" + "fmt" + "net/http" + "slices" + "strings" + "sync" + + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/semconv/v1.37.0" + "go.opentelemetry.io/otel/semconv/v1.37.0/httpconv" +) + +type RequestTraceAttrsOpts struct { + // If set, this is used as value for the "http.client_ip" attribute. + HTTPClientIP string +} + +type ResponseTelemetry struct { + StatusCode int + ReadBytes int64 + ReadError error + WriteBytes int64 + WriteError error +} + +type HTTPServer struct{ + requestBodySizeHistogram httpconv.ServerRequestBodySize + responseBodySizeHistogram httpconv.ServerResponseBodySize + requestDurationHistogram httpconv.ServerRequestDuration +} + +func NewHTTPServer(meter metric.Meter) HTTPServer { + server := HTTPServer{} + + var err error + server.requestBodySizeHistogram, err = httpconv.NewServerRequestBodySize(meter) + handleErr(err) + + server.responseBodySizeHistogram, err = httpconv.NewServerResponseBodySize(meter) + handleErr(err) + + server.requestDurationHistogram, err = httpconv.NewServerRequestDuration( + meter, + metric.WithExplicitBucketBoundaries( + 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, + 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10, + ), + ) + handleErr(err) + return server +} + +// Status returns a span status code and message for an HTTP status code +// value returned by a server. Status codes in the 400-499 range are not +// returned as errors. +func (n HTTPServer) Status(code int) (codes.Code, string) { + if code < 100 || code >= 600 { + return codes.Error, fmt.Sprintf("Invalid HTTP status code %d", code) + } + if code >= 500 { + return codes.Error, "" + } + return codes.Unset, "" +} + +// RequestTraceAttrs returns trace attributes for an HTTP request received by a +// server. +// +// The server must be the primary server name if it is known. For example this +// would be the ServerName directive +// (https://httpd.apache.org/docs/2.4/mod/core.html#servername) for an Apache +// server, and the server_name directive +// (http://nginx.org/en/docs/http/ngx_http_core_module.html#server_name) for an +// nginx server. More generically, the primary server name would be the host +// header value that matches the default virtual host of an HTTP server. It +// should include the host identifier and if a port is used to route to the +// server that port identifier should be included as an appropriate port +// suffix. +// +// If the primary server name is not known, server should be an empty string. +// The req Host will be used to determine the server instead. +func (n HTTPServer) RequestTraceAttrs(server string, req *http.Request, opts RequestTraceAttrsOpts) []attribute.KeyValue { + count := 3 // ServerAddress, Method, Scheme + + var host string + var p int + if server == "" { + host, p = SplitHostPort(req.Host) + } else { + // Prioritize the primary server name. + host, p = SplitHostPort(server) + if p < 0 { + _, p = SplitHostPort(req.Host) + } + } + + hostPort := requiredHTTPPort(req.TLS != nil, p) + if hostPort > 0 { + count++ + } + + method, methodOriginal := n.method(req.Method) + if methodOriginal != (attribute.KeyValue{}) { + count++ + } + + scheme := n.scheme(req.TLS != nil) + + peer, peerPort := SplitHostPort(req.RemoteAddr) + if peer != "" { + // The Go HTTP server sets RemoteAddr to "IP:port", this will not be a + // file-path that would be interpreted with a sock family. + count++ + if peerPort > 0 { + count++ + } + } + + useragent := req.UserAgent() + if useragent != "" { + count++ + } + + // For client IP, use, in order: + // 1. The value passed in the options + // 2. The value in the X-Forwarded-For header + // 3. The peer address + clientIP := opts.HTTPClientIP + if clientIP == "" { + clientIP = serverClientIP(req.Header.Get("X-Forwarded-For")) + if clientIP == "" { + clientIP = peer + } + } + if clientIP != "" { + count++ + } + + if req.URL != nil && req.URL.Path != "" { + count++ + } + + protoName, protoVersion := netProtocol(req.Proto) + if protoName != "" && protoName != "http" { + count++ + } + if protoVersion != "" { + count++ + } + + route := httpRoute(req.Pattern) + if route != "" { + count++ + } + + attrs := make([]attribute.KeyValue, 0, count) + attrs = append(attrs, + semconv.ServerAddress(host), + method, + scheme, + ) + + if hostPort > 0 { + attrs = append(attrs, semconv.ServerPort(hostPort)) + } + if methodOriginal != (attribute.KeyValue{}) { + attrs = append(attrs, methodOriginal) + } + + if peer, peerPort := SplitHostPort(req.RemoteAddr); peer != "" { + // The Go HTTP server sets RemoteAddr to "IP:port", this will not be a + // file-path that would be interpreted with a sock family. + attrs = append(attrs, semconv.NetworkPeerAddress(peer)) + if peerPort > 0 { + attrs = append(attrs, semconv.NetworkPeerPort(peerPort)) + } + } + + if useragent != "" { + attrs = append(attrs, semconv.UserAgentOriginal(useragent)) + } + + if clientIP != "" { + attrs = append(attrs, semconv.ClientAddress(clientIP)) + } + + if req.URL != nil && req.URL.Path != "" { + attrs = append(attrs, semconv.URLPath(req.URL.Path)) + } + + if protoName != "" && protoName != "http" { + attrs = append(attrs, semconv.NetworkProtocolName(protoName)) + } + if protoVersion != "" { + attrs = append(attrs, semconv.NetworkProtocolVersion(protoVersion)) + } + + if route != "" { + attrs = append(attrs, n.Route(route)) + } + + return attrs +} + +func (s HTTPServer) NetworkTransportAttr(network string) []attribute.KeyValue { + attr := semconv.NetworkTransportPipe + switch network { + case "tcp", "tcp4", "tcp6": + attr = semconv.NetworkTransportTCP + case "udp", "udp4", "udp6": + attr = semconv.NetworkTransportUDP + case "unix", "unixgram", "unixpacket": + attr = semconv.NetworkTransportUnix + } + + return []attribute.KeyValue{attr} +} + +type ServerMetricData struct { + ServerName string + ResponseSize int64 + + MetricData + MetricAttributes +} + +type MetricAttributes struct { + Req *http.Request + StatusCode int + Route string + AdditionalAttributes []attribute.KeyValue +} + +type MetricData struct { + RequestSize int64 + + // The request duration, in milliseconds + ElapsedTime float64 +} + +var ( + metricAddOptionPool = &sync.Pool{ + New: func() any { + return &[]metric.AddOption{} + }, + } + + metricRecordOptionPool = &sync.Pool{ + New: func() any { + return &[]metric.RecordOption{} + }, + } +) + +func (n HTTPServer) RecordMetrics(ctx context.Context, md ServerMetricData) { + attributes := n.MetricAttributes(md.ServerName, md.Req, md.StatusCode, md.Route, md.AdditionalAttributes) + o := metric.WithAttributeSet(attribute.NewSet(attributes...)) + recordOpts := metricRecordOptionPool.Get().(*[]metric.RecordOption) + *recordOpts = append(*recordOpts, o) + n.requestBodySizeHistogram.Inst().Record(ctx, md.RequestSize, *recordOpts...) + n.responseBodySizeHistogram.Inst().Record(ctx, md.ResponseSize, *recordOpts...) + n.requestDurationHistogram.Inst().Record(ctx, md.ElapsedTime/1000.0, o) + *recordOpts = (*recordOpts)[:0] + metricRecordOptionPool.Put(recordOpts) +} + +func (n HTTPServer) method(method string) (attribute.KeyValue, attribute.KeyValue) { + if method == "" { + return semconv.HTTPRequestMethodGet, attribute.KeyValue{} + } + if attr, ok := methodLookup[method]; ok { + return attr, attribute.KeyValue{} + } + + orig := semconv.HTTPRequestMethodOriginal(method) + if attr, ok := methodLookup[strings.ToUpper(method)]; ok { + return attr, orig + } + return semconv.HTTPRequestMethodGet, orig +} + +func (n HTTPServer) scheme(https bool) attribute.KeyValue { //nolint:revive // ignore linter + if https { + return semconv.URLScheme("https") + } + return semconv.URLScheme("http") +} + +// ResponseTraceAttrs returns trace attributes for telemetry from an HTTP +// response. +// +// If any of the fields in the ResponseTelemetry are not set the attribute will +// be omitted. +func (n HTTPServer) ResponseTraceAttrs(resp ResponseTelemetry) []attribute.KeyValue { + var count int + + if resp.ReadBytes > 0 { + count++ + } + if resp.WriteBytes > 0 { + count++ + } + if resp.StatusCode > 0 { + count++ + } + + attributes := make([]attribute.KeyValue, 0, count) + + if resp.ReadBytes > 0 { + attributes = append(attributes, + semconv.HTTPRequestBodySize(int(resp.ReadBytes)), + ) + } + if resp.WriteBytes > 0 { + attributes = append(attributes, + semconv.HTTPResponseBodySize(int(resp.WriteBytes)), + ) + } + if resp.StatusCode > 0 { + attributes = append(attributes, + semconv.HTTPResponseStatusCode(resp.StatusCode), + ) + } + + return attributes +} + +// Route returns the attribute for the route. +func (n HTTPServer) Route(route string) attribute.KeyValue { + return semconv.HTTPRoute(route) +} + +func (n HTTPServer) MetricAttributes(server string, req *http.Request, statusCode int, route string, additionalAttributes []attribute.KeyValue) []attribute.KeyValue { + num := len(additionalAttributes) + 3 + var host string + var p int + if server == "" { + host, p = SplitHostPort(req.Host) + } else { + // Prioritize the primary server name. + host, p = SplitHostPort(server) + if p < 0 { + _, p = SplitHostPort(req.Host) + } + } + hostPort := requiredHTTPPort(req.TLS != nil, p) + if hostPort > 0 { + num++ + } + protoName, protoVersion := netProtocol(req.Proto) + if protoName != "" { + num++ + } + if protoVersion != "" { + num++ + } + + if statusCode > 0 { + num++ + } + + if route != "" { + num++ + } + + attributes := slices.Grow(additionalAttributes, num) + attributes = append(attributes, + semconv.HTTPRequestMethodKey.String(standardizeHTTPMethod(req.Method)), + n.scheme(req.TLS != nil), + semconv.ServerAddress(host)) + + if hostPort > 0 { + attributes = append(attributes, semconv.ServerPort(hostPort)) + } + if protoName != "" { + attributes = append(attributes, semconv.NetworkProtocolName(protoName)) + } + if protoVersion != "" { + attributes = append(attributes, semconv.NetworkProtocolVersion(protoVersion)) + } + + if statusCode > 0 { + attributes = append(attributes, semconv.HTTPResponseStatusCode(statusCode)) + } + + if route != "" { + attributes = append(attributes, semconv.HTTPRoute(route)) + } + return attributes +} diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/version.go b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/version.go index f3be3d052ef..ba8a5df0edd 100644 --- a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/version.go +++ b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/version.go @@ -5,6 +5,6 @@ package otelhttptrace // import "go.opentelemetry.io/contrib/instrumentation/net // Version is the current release version of the httptrace instrumentation. func Version() string { - return "0.63.0" + return "0.64.0" // This string is updated by the pre_release.sh script during release } diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/client.go b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/client.go index 521daa25dbf..e980ab62b85 100644 --- a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/client.go +++ b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/client.go @@ -14,9 +14,15 @@ import ( // DefaultClient is the default Client and is used by Get, Head, Post and PostForm. // Please be careful of initialization order - for example, if you change // the global propagator, the DefaultClient might still be using the old one. +// +// Deprecated: [DefaultClient] will be removed in a future release. +// Create your own [http.Client] based on the [Transport] example: https://pkg.go.dev/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp#example-NewTransport var DefaultClient = &http.Client{Transport: NewTransport(http.DefaultTransport)} // Get is a convenient replacement for http.Get that adds a span around the request. +// +// Deprecated: [Get] will be removed in a future release. +// Create your own [http.Client] based on the [Transport] example: https://pkg.go.dev/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp#example-NewTransport func Get(ctx context.Context, targetURL string) (resp *http.Response, err error) { req, err := http.NewRequestWithContext(ctx, http.MethodGet, targetURL, http.NoBody) if err != nil { @@ -26,6 +32,9 @@ func Get(ctx context.Context, targetURL string) (resp *http.Response, err error) } // Head is a convenient replacement for http.Head that adds a span around the request. +// +// Deprecated: [Head] will be removed in a future release. +// Create your own [http.Client] based on the [Transport] example: https://pkg.go.dev/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp#example-NewTransport func Head(ctx context.Context, targetURL string) (resp *http.Response, err error) { req, err := http.NewRequestWithContext(ctx, http.MethodHead, targetURL, http.NoBody) if err != nil { @@ -35,6 +44,9 @@ func Head(ctx context.Context, targetURL string) (resp *http.Response, err error } // Post is a convenient replacement for http.Post that adds a span around the request. +// +// Deprecated: [Post] will be removed in a future release. +// Create your own [http.Client] based on the [Transport] example: https://pkg.go.dev/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp#example-NewTransport func Post(ctx context.Context, targetURL, contentType string, body io.Reader) (resp *http.Response, err error) { req, err := http.NewRequestWithContext(ctx, http.MethodPost, targetURL, body) if err != nil { @@ -45,6 +57,9 @@ func Post(ctx context.Context, targetURL, contentType string, body io.Reader) (r } // PostForm is a convenient replacement for http.PostForm that adds a span around the request. +// +// Deprecated: [PostForm] will be removed in a future release. +// Create your own [http.Client] based on the [Transport] example: https://pkg.go.dev/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp#example-NewTransport func PostForm(ctx context.Context, targetURL string, data url.Values) (resp *http.Response, err error) { return Post(ctx, targetURL, "application/x-www-form-urlencoded", strings.NewReader(data.Encode())) } diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/config.go b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/config.go index 38fb79c0328..c3be78616b2 100644 --- a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/config.go +++ b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/config.go @@ -26,7 +26,6 @@ type config struct { Meter metric.Meter Propagators propagation.TextMapPropagator SpanStartOptions []trace.SpanStartOption - PublicEndpoint bool PublicEndpointFn func(*http.Request) bool ReadEvent bool WriteEvent bool @@ -96,17 +95,19 @@ func WithMeterProvider(provider metric.MeterProvider) Option { // WithPublicEndpoint configures the Handler to link the span with an incoming // span context. If this option is not provided, then the association is a child // association instead of a link. +// +// Deprecated: Use [WithPublicEndpointFn] instead. +// To migrate, replace WithPublicEndpoint() with: +// +// WithPublicEndpointFn(func(*http.Request) bool { return true }) func WithPublicEndpoint() Option { - return optionFunc(func(c *config) { - c.PublicEndpoint = true - }) + return WithPublicEndpointFn(func(*http.Request) bool { return true }) } // WithPublicEndpointFn runs with every request, and allows conditionally // configuring the Handler to link the span with an incoming span context. If // this option is not provided or returns false, then the association is a // child association instead of a link. -// Note: WithPublicEndpoint takes precedence over WithPublicEndpointFn. func WithPublicEndpointFn(fn func(*http.Request) bool) Option { return optionFunc(func(c *config) { c.PublicEndpointFn = fn @@ -143,11 +144,13 @@ func WithFilter(f Filter) Option { }) } -type event int +// Event represents message event types for [WithMessageEvents]. +type Event int // Different types of events that can be recorded, see WithMessageEvents. const ( - ReadEvents event = iota + unspecifiedEvents Event = iota + ReadEvents WriteEvents ) @@ -160,7 +163,7 @@ const ( // using the ReadBytesKey // - WriteEvents: Record the number of bytes written after every http.ResponeWriter.Write // using the WriteBytesKey -func WithMessageEvents(events ...event) Option { +func WithMessageEvents(events ...Event) Option { return optionFunc(func(c *config) { for _, e := range events { switch e { diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/doc.go b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/doc.go index 56b24b982ae..1c9aa3ff425 100644 --- a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/doc.go +++ b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/doc.go @@ -2,6 +2,5 @@ // SPDX-License-Identifier: Apache-2.0 // Package otelhttp provides an http.Handler and functions that are intended -// to be used to add tracing by wrapping existing handlers (with Handler) and -// routes WithRouteTag. +// to be used to add tracing by wrapping existing handlers. package otelhttp // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp" diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/handler.go b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/handler.go index fef83b42fe1..c1bbf3a3c2d 100644 --- a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/handler.go +++ b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/handler.go @@ -29,7 +29,6 @@ type middleware struct { writeEvent bool filters []Filter spanNameFormatter func(string, *http.Request) string - publicEndpoint bool publicEndpointFn func(*http.Request) bool metricAttributesFn func(*http.Request) []attribute.KeyValue @@ -77,7 +76,6 @@ func (h *middleware) configure(c *config) { h.writeEvent = c.WriteEvent h.filters = c.Filters h.spanNameFormatter = c.SpanNameFormatter - h.publicEndpoint = c.PublicEndpoint h.publicEndpointFn = c.PublicEndpointFn h.server = c.ServerName h.semconv = semconv.NewHTTPServer(c.Meter) @@ -102,7 +100,7 @@ func (h *middleware) serveHTTP(w http.ResponseWriter, r *http.Request, next http } opts = append(opts, h.spanStartOptions...) - if h.publicEndpoint || (h.publicEndpointFn != nil && h.publicEndpointFn(r.WithContext(ctx))) { + if h.publicEndpointFn != nil && h.publicEndpointFn(r.WithContext(ctx)) { opts = append(opts, trace.WithNewRoot()) // Linking incoming span context if any for public endpoint. if s := trace.SpanContextFromContext(ctx); s.IsValid() && s.IsRemote() { @@ -224,6 +222,9 @@ func (h *middleware) metricAttributesFromRequest(r *http.Request) []attribute.Ke // WithRouteTag annotates spans and metrics with the provided route name // with HTTP route attribute. +// +// Deprecated: spans are automatically annotated with the route attribute. +// To annotate metrics, use the [WithMetricAttributesFn] option. func WithRouteTag(route string, h http.Handler) http.Handler { attr := semconv.NewHTTPServer(nil).Route(route) return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/client.go b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/client.go new file mode 100644 index 00000000000..45d3d934f52 --- /dev/null +++ b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/client.go @@ -0,0 +1,305 @@ +// Code generated by gotmpl. DO NOT MODIFY. +// source: internal/shared/semconv/client.go.tmpl + +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package semconv provides OpenTelemetry semantic convention types and +// functionality. +package semconv // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv" + +import ( + "context" + "fmt" + "net/http" + "reflect" + "slices" + "strconv" + "strings" + + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/semconv/v1.37.0" + "go.opentelemetry.io/otel/semconv/v1.37.0/httpconv" +) + +type HTTPClient struct{ + requestBodySize httpconv.ClientRequestBodySize + requestDuration httpconv.ClientRequestDuration +} + +func NewHTTPClient(meter metric.Meter) HTTPClient { + client := HTTPClient{} + + var err error + client.requestBodySize, err = httpconv.NewClientRequestBodySize(meter) + handleErr(err) + + client.requestDuration, err = httpconv.NewClientRequestDuration( + meter, + metric.WithExplicitBucketBoundaries(0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10), + ) + handleErr(err) + + return client +} + +func (n HTTPClient) Status(code int) (codes.Code, string) { + if code < 100 || code >= 600 { + return codes.Error, fmt.Sprintf("Invalid HTTP status code %d", code) + } + if code >= 400 { + return codes.Error, "" + } + return codes.Unset, "" +} + +// RequestTraceAttrs returns trace attributes for an HTTP request made by a client. +func (n HTTPClient) RequestTraceAttrs(req *http.Request) []attribute.KeyValue { + /* + below attributes are returned: + - http.request.method + - http.request.method.original + - url.full + - server.address + - server.port + - network.protocol.name + - network.protocol.version + */ + numOfAttributes := 3 // URL, server address, proto, and method. + + var urlHost string + if req.URL != nil { + urlHost = req.URL.Host + } + var requestHost string + var requestPort int + for _, hostport := range []string{urlHost, req.Header.Get("Host")} { + requestHost, requestPort = SplitHostPort(hostport) + if requestHost != "" || requestPort > 0 { + break + } + } + + eligiblePort := requiredHTTPPort(req.URL != nil && req.URL.Scheme == "https", requestPort) + if eligiblePort > 0 { + numOfAttributes++ + } + useragent := req.UserAgent() + if useragent != "" { + numOfAttributes++ + } + + protoName, protoVersion := netProtocol(req.Proto) + if protoName != "" && protoName != "http" { + numOfAttributes++ + } + if protoVersion != "" { + numOfAttributes++ + } + + method, originalMethod := n.method(req.Method) + if originalMethod != (attribute.KeyValue{}) { + numOfAttributes++ + } + + attrs := make([]attribute.KeyValue, 0, numOfAttributes) + + attrs = append(attrs, method) + if originalMethod != (attribute.KeyValue{}) { + attrs = append(attrs, originalMethod) + } + + var u string + if req.URL != nil { + // Remove any username/password info that may be in the URL. + userinfo := req.URL.User + req.URL.User = nil + u = req.URL.String() + // Restore any username/password info that was removed. + req.URL.User = userinfo + } + attrs = append(attrs, semconv.URLFull(u)) + + attrs = append(attrs, semconv.ServerAddress(requestHost)) + if eligiblePort > 0 { + attrs = append(attrs, semconv.ServerPort(eligiblePort)) + } + + if protoName != "" && protoName != "http" { + attrs = append(attrs, semconv.NetworkProtocolName(protoName)) + } + if protoVersion != "" { + attrs = append(attrs, semconv.NetworkProtocolVersion(protoVersion)) + } + + return attrs +} + +// ResponseTraceAttrs returns trace attributes for an HTTP response made by a client. +func (n HTTPClient) ResponseTraceAttrs(resp *http.Response) []attribute.KeyValue { + /* + below attributes are returned: + - http.response.status_code + - error.type + */ + var count int + if resp.StatusCode > 0 { + count++ + } + + if isErrorStatusCode(resp.StatusCode) { + count++ + } + + attrs := make([]attribute.KeyValue, 0, count) + if resp.StatusCode > 0 { + attrs = append(attrs, semconv.HTTPResponseStatusCode(resp.StatusCode)) + } + + if isErrorStatusCode(resp.StatusCode) { + errorType := strconv.Itoa(resp.StatusCode) + attrs = append(attrs, semconv.ErrorTypeKey.String(errorType)) + } + return attrs +} + +func (n HTTPClient) ErrorType(err error) attribute.KeyValue { + t := reflect.TypeOf(err) + var value string + if t.PkgPath() == "" && t.Name() == "" { + // Likely a builtin type. + value = t.String() + } else { + value = fmt.Sprintf("%s.%s", t.PkgPath(), t.Name()) + } + + if value == "" { + return semconv.ErrorTypeOther + } + + return semconv.ErrorTypeKey.String(value) +} + +func (n HTTPClient) method(method string) (attribute.KeyValue, attribute.KeyValue) { + if method == "" { + return semconv.HTTPRequestMethodGet, attribute.KeyValue{} + } + if attr, ok := methodLookup[method]; ok { + return attr, attribute.KeyValue{} + } + + orig := semconv.HTTPRequestMethodOriginal(method) + if attr, ok := methodLookup[strings.ToUpper(method)]; ok { + return attr, orig + } + return semconv.HTTPRequestMethodGet, orig +} + +func (n HTTPClient) MetricAttributes(req *http.Request, statusCode int, additionalAttributes []attribute.KeyValue) []attribute.KeyValue { + num := len(additionalAttributes) + 2 + var h string + if req.URL != nil { + h = req.URL.Host + } + var requestHost string + var requestPort int + for _, hostport := range []string{h, req.Header.Get("Host")} { + requestHost, requestPort = SplitHostPort(hostport) + if requestHost != "" || requestPort > 0 { + break + } + } + + port := requiredHTTPPort(req.URL != nil && req.URL.Scheme == "https", requestPort) + if port > 0 { + num++ + } + + protoName, protoVersion := netProtocol(req.Proto) + if protoName != "" { + num++ + } + if protoVersion != "" { + num++ + } + + if statusCode > 0 { + num++ + } + + attributes := slices.Grow(additionalAttributes, num) + attributes = append(attributes, + semconv.HTTPRequestMethodKey.String(standardizeHTTPMethod(req.Method)), + semconv.ServerAddress(requestHost), + n.scheme(req), + ) + + if port > 0 { + attributes = append(attributes, semconv.ServerPort(port)) + } + if protoName != "" { + attributes = append(attributes, semconv.NetworkProtocolName(protoName)) + } + if protoVersion != "" { + attributes = append(attributes, semconv.NetworkProtocolVersion(protoVersion)) + } + + if statusCode > 0 { + attributes = append(attributes, semconv.HTTPResponseStatusCode(statusCode)) + } + return attributes +} + +type MetricOpts struct { + measurement metric.MeasurementOption + addOptions metric.AddOption +} + +func (o MetricOpts) MeasurementOption() metric.MeasurementOption { + return o.measurement +} + +func (o MetricOpts) AddOptions() metric.AddOption { + return o.addOptions +} + +func (n HTTPClient) MetricOptions(ma MetricAttributes) map[string]MetricOpts { + opts := map[string]MetricOpts{} + + attributes := n.MetricAttributes(ma.Req, ma.StatusCode, ma.AdditionalAttributes) + set := metric.WithAttributeSet(attribute.NewSet(attributes...)) + opts["new"] = MetricOpts{ + measurement: set, + addOptions: set, + } + + return opts +} + +func (n HTTPClient) RecordMetrics(ctx context.Context, md MetricData, opts map[string]MetricOpts) { + n.requestBodySize.Inst().Record(ctx, md.RequestSize, opts["new"].MeasurementOption()) + n.requestDuration.Inst().Record(ctx, md.ElapsedTime/1000, opts["new"].MeasurementOption()) +} + +// TraceAttributes returns attributes for httptrace. +func (n HTTPClient) TraceAttributes(host string) []attribute.KeyValue { + return []attribute.KeyValue{ + semconv.ServerAddress(host), + } +} + +func (n HTTPClient) scheme(req *http.Request) attribute.KeyValue { + if req.URL != nil && req.URL.Scheme != "" { + return semconv.URLScheme(req.URL.Scheme) + } + if req.TLS != nil { + return semconv.URLScheme("https") + } + return semconv.URLScheme("http") +} + +func isErrorStatusCode(code int) bool { + return code >= 400 || code < 100 +} diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/env.go b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/env.go deleted file mode 100644 index 821b80ec41c..00000000000 --- a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/env.go +++ /dev/null @@ -1,248 +0,0 @@ -// Code generated by gotmpl. DO NOT MODIFY. -// source: internal/shared/semconv/env.go.tmpl - -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -package semconv // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv" - -import ( - "context" - "fmt" - "net/http" - "strings" - "sync" - - "go.opentelemetry.io/otel/attribute" - "go.opentelemetry.io/otel/codes" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/semconv/v1.37.0/httpconv" -) - -// OTelSemConvStabilityOptIn is an environment variable. -// That can be set to "http/dup" to keep getting the old HTTP semantic conventions. -const OTelSemConvStabilityOptIn = "OTEL_SEMCONV_STABILITY_OPT_IN" - -type ResponseTelemetry struct { - StatusCode int - ReadBytes int64 - ReadError error - WriteBytes int64 - WriteError error -} - -type HTTPServer struct { - requestBodySizeHistogram httpconv.ServerRequestBodySize - responseBodySizeHistogram httpconv.ServerResponseBodySize - requestDurationHistogram httpconv.ServerRequestDuration -} - -// RequestTraceAttrs returns trace attributes for an HTTP request received by a -// server. -// -// The server must be the primary server name if it is known. For example this -// would be the ServerName directive -// (https://httpd.apache.org/docs/2.4/mod/core.html#servername) for an Apache -// server, and the server_name directive -// (http://nginx.org/en/docs/http/ngx_http_core_module.html#server_name) for an -// nginx server. More generically, the primary server name would be the host -// header value that matches the default virtual host of an HTTP server. It -// should include the host identifier and if a port is used to route to the -// server that port identifier should be included as an appropriate port -// suffix. -// -// If the primary server name is not known, server should be an empty string. -// The req Host will be used to determine the server instead. -func (s HTTPServer) RequestTraceAttrs(server string, req *http.Request, opts RequestTraceAttrsOpts) []attribute.KeyValue { - return CurrentHTTPServer{}.RequestTraceAttrs(server, req, opts) -} - -func (s HTTPServer) NetworkTransportAttr(network string) []attribute.KeyValue { - return []attribute.KeyValue{ - CurrentHTTPServer{}.NetworkTransportAttr(network), - } -} - -// ResponseTraceAttrs returns trace attributes for telemetry from an HTTP response. -// -// If any of the fields in the ResponseTelemetry are not set the attribute will be omitted. -func (s HTTPServer) ResponseTraceAttrs(resp ResponseTelemetry) []attribute.KeyValue { - return CurrentHTTPServer{}.ResponseTraceAttrs(resp) -} - -// Route returns the attribute for the route. -func (s HTTPServer) Route(route string) attribute.KeyValue { - return CurrentHTTPServer{}.Route(route) -} - -// Status returns a span status code and message for an HTTP status code -// value returned by a server. Status codes in the 400-499 range are not -// returned as errors. -func (s HTTPServer) Status(code int) (codes.Code, string) { - if code < 100 || code >= 600 { - return codes.Error, fmt.Sprintf("Invalid HTTP status code %d", code) - } - if code >= 500 { - return codes.Error, "" - } - return codes.Unset, "" -} - -type ServerMetricData struct { - ServerName string - ResponseSize int64 - - MetricData - MetricAttributes -} - -type MetricAttributes struct { - Req *http.Request - StatusCode int - AdditionalAttributes []attribute.KeyValue -} - -type MetricData struct { - RequestSize int64 - - // The request duration, in milliseconds - ElapsedTime float64 -} - -var ( - metricAddOptionPool = &sync.Pool{ - New: func() any { - return &[]metric.AddOption{} - }, - } - - metricRecordOptionPool = &sync.Pool{ - New: func() any { - return &[]metric.RecordOption{} - }, - } -) - -func (s HTTPServer) RecordMetrics(ctx context.Context, md ServerMetricData) { - attributes := CurrentHTTPServer{}.MetricAttributes(md.ServerName, md.Req, md.StatusCode, md.AdditionalAttributes) - o := metric.WithAttributeSet(attribute.NewSet(attributes...)) - recordOpts := metricRecordOptionPool.Get().(*[]metric.RecordOption) - *recordOpts = append(*recordOpts, o) - s.requestBodySizeHistogram.Inst().Record(ctx, md.RequestSize, *recordOpts...) - s.responseBodySizeHistogram.Inst().Record(ctx, md.ResponseSize, *recordOpts...) - s.requestDurationHistogram.Inst().Record(ctx, md.ElapsedTime/1000.0, o) - *recordOpts = (*recordOpts)[:0] - metricRecordOptionPool.Put(recordOpts) -} - -// hasOptIn returns true if the comma-separated version string contains the -// exact optIn value. -func hasOptIn(version, optIn string) bool { - for _, v := range strings.Split(version, ",") { - if strings.TrimSpace(v) == optIn { - return true - } - } - return false -} - -func NewHTTPServer(meter metric.Meter) HTTPServer { - server := HTTPServer{} - - var err error - server.requestBodySizeHistogram, err = httpconv.NewServerRequestBodySize(meter) - handleErr(err) - - server.responseBodySizeHistogram, err = httpconv.NewServerResponseBodySize(meter) - handleErr(err) - - server.requestDurationHistogram, err = httpconv.NewServerRequestDuration( - meter, - metric.WithExplicitBucketBoundaries( - 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, - 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10, - ), - ) - handleErr(err) - return server -} - -type HTTPClient struct { - requestBodySize httpconv.ClientRequestBodySize - requestDuration httpconv.ClientRequestDuration -} - -func NewHTTPClient(meter metric.Meter) HTTPClient { - client := HTTPClient{} - - var err error - client.requestBodySize, err = httpconv.NewClientRequestBodySize(meter) - handleErr(err) - - client.requestDuration, err = httpconv.NewClientRequestDuration( - meter, - metric.WithExplicitBucketBoundaries(0.005, 0.01, 0.025, 0.05, 0.075, 0.1, 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10), - ) - handleErr(err) - - return client -} - -// RequestTraceAttrs returns attributes for an HTTP request made by a client. -func (c HTTPClient) RequestTraceAttrs(req *http.Request) []attribute.KeyValue { - return CurrentHTTPClient{}.RequestTraceAttrs(req) -} - -// ResponseTraceAttrs returns metric attributes for an HTTP request made by a client. -func (c HTTPClient) ResponseTraceAttrs(resp *http.Response) []attribute.KeyValue { - return CurrentHTTPClient{}.ResponseTraceAttrs(resp) -} - -func (c HTTPClient) Status(code int) (codes.Code, string) { - if code < 100 || code >= 600 { - return codes.Error, fmt.Sprintf("Invalid HTTP status code %d", code) - } - if code >= 400 { - return codes.Error, "" - } - return codes.Unset, "" -} - -func (c HTTPClient) ErrorType(err error) attribute.KeyValue { - return CurrentHTTPClient{}.ErrorType(err) -} - -type MetricOpts struct { - measurement metric.MeasurementOption - addOptions metric.AddOption -} - -func (o MetricOpts) MeasurementOption() metric.MeasurementOption { - return o.measurement -} - -func (o MetricOpts) AddOptions() metric.AddOption { - return o.addOptions -} - -func (c HTTPClient) MetricOptions(ma MetricAttributes) map[string]MetricOpts { - opts := map[string]MetricOpts{} - - attributes := CurrentHTTPClient{}.MetricAttributes(ma.Req, ma.StatusCode, ma.AdditionalAttributes) - set := metric.WithAttributeSet(attribute.NewSet(attributes...)) - opts["new"] = MetricOpts{ - measurement: set, - addOptions: set, - } - - return opts -} - -func (s HTTPClient) RecordMetrics(ctx context.Context, md MetricData, opts map[string]MetricOpts) { - s.requestBodySize.Inst().Record(ctx, md.RequestSize, opts["new"].MeasurementOption()) - s.requestDuration.Inst().Record(ctx, md.ElapsedTime/1000, opts["new"].MeasurementOption()) -} - -func (s HTTPClient) TraceAttributes(host string) []attribute.KeyValue { - return CurrentHTTPClient{}.TraceAttributes(host) -} diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/gen.go b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/gen.go index 1bb207b8092..a8a0d58df35 100644 --- a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/gen.go +++ b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/gen.go @@ -6,10 +6,10 @@ package semconv // import "go.opentelemetry.io/contrib/instrumentation/net/http/ // Generate semconv package: //go:generate gotmpl --body=../../../../../../internal/shared/semconv/bench_test.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=bench_test.go //go:generate gotmpl --body=../../../../../../internal/shared/semconv/common_test.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=common_test.go -//go:generate gotmpl --body=../../../../../../internal/shared/semconv/env.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=env.go -//go:generate gotmpl --body=../../../../../../internal/shared/semconv/env_test.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=env_test.go -//go:generate gotmpl --body=../../../../../../internal/shared/semconv/httpconv.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=httpconv.go -//go:generate gotmpl --body=../../../../../../internal/shared/semconv/httpconv_test.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=httpconv_test.go +//go:generate gotmpl --body=../../../../../../internal/shared/semconv/server.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=server.go +//go:generate gotmpl --body=../../../../../../internal/shared/semconv/server_test.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=server_test.go +//go:generate gotmpl --body=../../../../../../internal/shared/semconv/client.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=client.go +//go:generate gotmpl --body=../../../../../../internal/shared/semconv/client_test.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=client_test.go //go:generate gotmpl --body=../../../../../../internal/shared/semconv/httpconvtest_test.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=httpconvtest_test.go //go:generate gotmpl --body=../../../../../../internal/shared/semconv/util.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=util.go //go:generate gotmpl --body=../../../../../../internal/shared/semconv/util_test.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp\" }" --out=util_test.go diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/httpconv.go b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/httpconv.go deleted file mode 100644 index 28c51a3b389..00000000000 --- a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/httpconv.go +++ /dev/null @@ -1,517 +0,0 @@ -// Code generated by gotmpl. DO NOT MODIFY. -// source: internal/shared/semconv/httpconv.go.tmpl - -// Copyright The OpenTelemetry Authors -// SPDX-License-Identifier: Apache-2.0 - -// Package semconv provides OpenTelemetry semantic convention types and -// functionality. -package semconv // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv" - -import ( - "fmt" - "net/http" - "reflect" - "slices" - "strconv" - "strings" - - "go.opentelemetry.io/otel/attribute" - semconvNew "go.opentelemetry.io/otel/semconv/v1.37.0" -) - -type RequestTraceAttrsOpts struct { - // If set, this is used as value for the "http.client_ip" attribute. - HTTPClientIP string -} - -type CurrentHTTPServer struct{} - -// RequestTraceAttrs returns trace attributes for an HTTP request received by a -// server. -// -// The server must be the primary server name if it is known. For example this -// would be the ServerName directive -// (https://httpd.apache.org/docs/2.4/mod/core.html#servername) for an Apache -// server, and the server_name directive -// (http://nginx.org/en/docs/http/ngx_http_core_module.html#server_name) for an -// nginx server. More generically, the primary server name would be the host -// header value that matches the default virtual host of an HTTP server. It -// should include the host identifier and if a port is used to route to the -// server that port identifier should be included as an appropriate port -// suffix. -// -// If the primary server name is not known, server should be an empty string. -// The req Host will be used to determine the server instead. -func (n CurrentHTTPServer) RequestTraceAttrs(server string, req *http.Request, opts RequestTraceAttrsOpts) []attribute.KeyValue { - count := 3 // ServerAddress, Method, Scheme - - var host string - var p int - if server == "" { - host, p = SplitHostPort(req.Host) - } else { - // Prioritize the primary server name. - host, p = SplitHostPort(server) - if p < 0 { - _, p = SplitHostPort(req.Host) - } - } - - hostPort := requiredHTTPPort(req.TLS != nil, p) - if hostPort > 0 { - count++ - } - - method, methodOriginal := n.method(req.Method) - if methodOriginal != (attribute.KeyValue{}) { - count++ - } - - scheme := n.scheme(req.TLS != nil) - - peer, peerPort := SplitHostPort(req.RemoteAddr) - if peer != "" { - // The Go HTTP server sets RemoteAddr to "IP:port", this will not be a - // file-path that would be interpreted with a sock family. - count++ - if peerPort > 0 { - count++ - } - } - - useragent := req.UserAgent() - if useragent != "" { - count++ - } - - // For client IP, use, in order: - // 1. The value passed in the options - // 2. The value in the X-Forwarded-For header - // 3. The peer address - clientIP := opts.HTTPClientIP - if clientIP == "" { - clientIP = serverClientIP(req.Header.Get("X-Forwarded-For")) - if clientIP == "" { - clientIP = peer - } - } - if clientIP != "" { - count++ - } - - if req.URL != nil && req.URL.Path != "" { - count++ - } - - protoName, protoVersion := netProtocol(req.Proto) - if protoName != "" && protoName != "http" { - count++ - } - if protoVersion != "" { - count++ - } - - route := httpRoute(req.Pattern) - if route != "" { - count++ - } - - attrs := make([]attribute.KeyValue, 0, count) - attrs = append(attrs, - semconvNew.ServerAddress(host), - method, - scheme, - ) - - if hostPort > 0 { - attrs = append(attrs, semconvNew.ServerPort(hostPort)) - } - if methodOriginal != (attribute.KeyValue{}) { - attrs = append(attrs, methodOriginal) - } - - if peer, peerPort := SplitHostPort(req.RemoteAddr); peer != "" { - // The Go HTTP server sets RemoteAddr to "IP:port", this will not be a - // file-path that would be interpreted with a sock family. - attrs = append(attrs, semconvNew.NetworkPeerAddress(peer)) - if peerPort > 0 { - attrs = append(attrs, semconvNew.NetworkPeerPort(peerPort)) - } - } - - if useragent != "" { - attrs = append(attrs, semconvNew.UserAgentOriginal(useragent)) - } - - if clientIP != "" { - attrs = append(attrs, semconvNew.ClientAddress(clientIP)) - } - - if req.URL != nil && req.URL.Path != "" { - attrs = append(attrs, semconvNew.URLPath(req.URL.Path)) - } - - if protoName != "" && protoName != "http" { - attrs = append(attrs, semconvNew.NetworkProtocolName(protoName)) - } - if protoVersion != "" { - attrs = append(attrs, semconvNew.NetworkProtocolVersion(protoVersion)) - } - - if route != "" { - attrs = append(attrs, n.Route(route)) - } - - return attrs -} - -func (n CurrentHTTPServer) NetworkTransportAttr(network string) attribute.KeyValue { - switch network { - case "tcp", "tcp4", "tcp6": - return semconvNew.NetworkTransportTCP - case "udp", "udp4", "udp6": - return semconvNew.NetworkTransportUDP - case "unix", "unixgram", "unixpacket": - return semconvNew.NetworkTransportUnix - default: - return semconvNew.NetworkTransportPipe - } -} - -func (n CurrentHTTPServer) method(method string) (attribute.KeyValue, attribute.KeyValue) { - if method == "" { - return semconvNew.HTTPRequestMethodGet, attribute.KeyValue{} - } - if attr, ok := methodLookup[method]; ok { - return attr, attribute.KeyValue{} - } - - orig := semconvNew.HTTPRequestMethodOriginal(method) - if attr, ok := methodLookup[strings.ToUpper(method)]; ok { - return attr, orig - } - return semconvNew.HTTPRequestMethodGet, orig -} - -func (n CurrentHTTPServer) scheme(https bool) attribute.KeyValue { //nolint:revive // ignore linter - if https { - return semconvNew.URLScheme("https") - } - return semconvNew.URLScheme("http") -} - -// ResponseTraceAttrs returns trace attributes for telemetry from an HTTP -// response. -// -// If any of the fields in the ResponseTelemetry are not set the attribute will -// be omitted. -func (n CurrentHTTPServer) ResponseTraceAttrs(resp ResponseTelemetry) []attribute.KeyValue { - var count int - - if resp.ReadBytes > 0 { - count++ - } - if resp.WriteBytes > 0 { - count++ - } - if resp.StatusCode > 0 { - count++ - } - - attributes := make([]attribute.KeyValue, 0, count) - - if resp.ReadBytes > 0 { - attributes = append(attributes, - semconvNew.HTTPRequestBodySize(int(resp.ReadBytes)), - ) - } - if resp.WriteBytes > 0 { - attributes = append(attributes, - semconvNew.HTTPResponseBodySize(int(resp.WriteBytes)), - ) - } - if resp.StatusCode > 0 { - attributes = append(attributes, - semconvNew.HTTPResponseStatusCode(resp.StatusCode), - ) - } - - return attributes -} - -// Route returns the attribute for the route. -func (n CurrentHTTPServer) Route(route string) attribute.KeyValue { - return semconvNew.HTTPRoute(route) -} - -func (n CurrentHTTPServer) MetricAttributes(server string, req *http.Request, statusCode int, additionalAttributes []attribute.KeyValue) []attribute.KeyValue { - num := len(additionalAttributes) + 3 - var host string - var p int - if server == "" { - host, p = SplitHostPort(req.Host) - } else { - // Prioritize the primary server name. - host, p = SplitHostPort(server) - if p < 0 { - _, p = SplitHostPort(req.Host) - } - } - hostPort := requiredHTTPPort(req.TLS != nil, p) - if hostPort > 0 { - num++ - } - protoName, protoVersion := netProtocol(req.Proto) - if protoName != "" { - num++ - } - if protoVersion != "" { - num++ - } - - if statusCode > 0 { - num++ - } - - attributes := slices.Grow(additionalAttributes, num) - attributes = append(attributes, - semconvNew.HTTPRequestMethodKey.String(standardizeHTTPMethod(req.Method)), - n.scheme(req.TLS != nil), - semconvNew.ServerAddress(host)) - - if hostPort > 0 { - attributes = append(attributes, semconvNew.ServerPort(hostPort)) - } - if protoName != "" { - attributes = append(attributes, semconvNew.NetworkProtocolName(protoName)) - } - if protoVersion != "" { - attributes = append(attributes, semconvNew.NetworkProtocolVersion(protoVersion)) - } - - if statusCode > 0 { - attributes = append(attributes, semconvNew.HTTPResponseStatusCode(statusCode)) - } - return attributes -} - -type CurrentHTTPClient struct{} - -// RequestTraceAttrs returns trace attributes for an HTTP request made by a client. -func (n CurrentHTTPClient) RequestTraceAttrs(req *http.Request) []attribute.KeyValue { - /* - below attributes are returned: - - http.request.method - - http.request.method.original - - url.full - - server.address - - server.port - - network.protocol.name - - network.protocol.version - */ - numOfAttributes := 3 // URL, server address, proto, and method. - - var urlHost string - if req.URL != nil { - urlHost = req.URL.Host - } - var requestHost string - var requestPort int - for _, hostport := range []string{urlHost, req.Header.Get("Host")} { - requestHost, requestPort = SplitHostPort(hostport) - if requestHost != "" || requestPort > 0 { - break - } - } - - eligiblePort := requiredHTTPPort(req.URL != nil && req.URL.Scheme == "https", requestPort) - if eligiblePort > 0 { - numOfAttributes++ - } - useragent := req.UserAgent() - if useragent != "" { - numOfAttributes++ - } - - protoName, protoVersion := netProtocol(req.Proto) - if protoName != "" && protoName != "http" { - numOfAttributes++ - } - if protoVersion != "" { - numOfAttributes++ - } - - method, originalMethod := n.method(req.Method) - if originalMethod != (attribute.KeyValue{}) { - numOfAttributes++ - } - - attrs := make([]attribute.KeyValue, 0, numOfAttributes) - - attrs = append(attrs, method) - if originalMethod != (attribute.KeyValue{}) { - attrs = append(attrs, originalMethod) - } - - var u string - if req.URL != nil { - // Remove any username/password info that may be in the URL. - userinfo := req.URL.User - req.URL.User = nil - u = req.URL.String() - // Restore any username/password info that was removed. - req.URL.User = userinfo - } - attrs = append(attrs, semconvNew.URLFull(u)) - - attrs = append(attrs, semconvNew.ServerAddress(requestHost)) - if eligiblePort > 0 { - attrs = append(attrs, semconvNew.ServerPort(eligiblePort)) - } - - if protoName != "" && protoName != "http" { - attrs = append(attrs, semconvNew.NetworkProtocolName(protoName)) - } - if protoVersion != "" { - attrs = append(attrs, semconvNew.NetworkProtocolVersion(protoVersion)) - } - - return attrs -} - -// ResponseTraceAttrs returns trace attributes for an HTTP response made by a client. -func (n CurrentHTTPClient) ResponseTraceAttrs(resp *http.Response) []attribute.KeyValue { - /* - below attributes are returned: - - http.response.status_code - - error.type - */ - var count int - if resp.StatusCode > 0 { - count++ - } - - if isErrorStatusCode(resp.StatusCode) { - count++ - } - - attrs := make([]attribute.KeyValue, 0, count) - if resp.StatusCode > 0 { - attrs = append(attrs, semconvNew.HTTPResponseStatusCode(resp.StatusCode)) - } - - if isErrorStatusCode(resp.StatusCode) { - errorType := strconv.Itoa(resp.StatusCode) - attrs = append(attrs, semconvNew.ErrorTypeKey.String(errorType)) - } - return attrs -} - -func (n CurrentHTTPClient) ErrorType(err error) attribute.KeyValue { - t := reflect.TypeOf(err) - var value string - if t.PkgPath() == "" && t.Name() == "" { - // Likely a builtin type. - value = t.String() - } else { - value = fmt.Sprintf("%s.%s", t.PkgPath(), t.Name()) - } - - if value == "" { - return semconvNew.ErrorTypeOther - } - - return semconvNew.ErrorTypeKey.String(value) -} - -func (n CurrentHTTPClient) method(method string) (attribute.KeyValue, attribute.KeyValue) { - if method == "" { - return semconvNew.HTTPRequestMethodGet, attribute.KeyValue{} - } - if attr, ok := methodLookup[method]; ok { - return attr, attribute.KeyValue{} - } - - orig := semconvNew.HTTPRequestMethodOriginal(method) - if attr, ok := methodLookup[strings.ToUpper(method)]; ok { - return attr, orig - } - return semconvNew.HTTPRequestMethodGet, orig -} - -func (n CurrentHTTPClient) MetricAttributes(req *http.Request, statusCode int, additionalAttributes []attribute.KeyValue) []attribute.KeyValue { - num := len(additionalAttributes) + 2 - var h string - if req.URL != nil { - h = req.URL.Host - } - var requestHost string - var requestPort int - for _, hostport := range []string{h, req.Header.Get("Host")} { - requestHost, requestPort = SplitHostPort(hostport) - if requestHost != "" || requestPort > 0 { - break - } - } - - port := requiredHTTPPort(req.URL != nil && req.URL.Scheme == "https", requestPort) - if port > 0 { - num++ - } - - protoName, protoVersion := netProtocol(req.Proto) - if protoName != "" { - num++ - } - if protoVersion != "" { - num++ - } - - if statusCode > 0 { - num++ - } - - attributes := slices.Grow(additionalAttributes, num) - attributes = append(attributes, - semconvNew.HTTPRequestMethodKey.String(standardizeHTTPMethod(req.Method)), - semconvNew.ServerAddress(requestHost), - n.scheme(req), - ) - - if port > 0 { - attributes = append(attributes, semconvNew.ServerPort(port)) - } - if protoName != "" { - attributes = append(attributes, semconvNew.NetworkProtocolName(protoName)) - } - if protoVersion != "" { - attributes = append(attributes, semconvNew.NetworkProtocolVersion(protoVersion)) - } - - if statusCode > 0 { - attributes = append(attributes, semconvNew.HTTPResponseStatusCode(statusCode)) - } - return attributes -} - -// TraceAttributes returns attributes for httptrace. -func (n CurrentHTTPClient) TraceAttributes(host string) []attribute.KeyValue { - return []attribute.KeyValue{ - semconvNew.ServerAddress(host), - } -} - -func (n CurrentHTTPClient) scheme(req *http.Request) attribute.KeyValue { - if req.URL != nil && req.URL.Scheme != "" { - return semconvNew.URLScheme(req.URL.Scheme) - } - if req.TLS != nil { - return semconvNew.URLScheme("https") - } - return semconvNew.URLScheme("http") -} - -func isErrorStatusCode(code int) bool { - return code >= 400 || code < 100 -} diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/server.go b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/server.go new file mode 100644 index 00000000000..5ae6a07386b --- /dev/null +++ b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv/server.go @@ -0,0 +1,403 @@ +// Code generated by gotmpl. DO NOT MODIFY. +// source: internal/shared/semconv/server.go.tmpl + +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package semconv provides OpenTelemetry semantic convention types and +// functionality. +package semconv // import "go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv" + +import ( + "context" + "fmt" + "net/http" + "slices" + "strings" + "sync" + + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/codes" + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/semconv/v1.37.0" + "go.opentelemetry.io/otel/semconv/v1.37.0/httpconv" +) + +type RequestTraceAttrsOpts struct { + // If set, this is used as value for the "http.client_ip" attribute. + HTTPClientIP string +} + +type ResponseTelemetry struct { + StatusCode int + ReadBytes int64 + ReadError error + WriteBytes int64 + WriteError error +} + +type HTTPServer struct{ + requestBodySizeHistogram httpconv.ServerRequestBodySize + responseBodySizeHistogram httpconv.ServerResponseBodySize + requestDurationHistogram httpconv.ServerRequestDuration +} + +func NewHTTPServer(meter metric.Meter) HTTPServer { + server := HTTPServer{} + + var err error + server.requestBodySizeHistogram, err = httpconv.NewServerRequestBodySize(meter) + handleErr(err) + + server.responseBodySizeHistogram, err = httpconv.NewServerResponseBodySize(meter) + handleErr(err) + + server.requestDurationHistogram, err = httpconv.NewServerRequestDuration( + meter, + metric.WithExplicitBucketBoundaries( + 0.005, 0.01, 0.025, 0.05, 0.075, 0.1, + 0.25, 0.5, 0.75, 1, 2.5, 5, 7.5, 10, + ), + ) + handleErr(err) + return server +} + +// Status returns a span status code and message for an HTTP status code +// value returned by a server. Status codes in the 400-499 range are not +// returned as errors. +func (n HTTPServer) Status(code int) (codes.Code, string) { + if code < 100 || code >= 600 { + return codes.Error, fmt.Sprintf("Invalid HTTP status code %d", code) + } + if code >= 500 { + return codes.Error, "" + } + return codes.Unset, "" +} + +// RequestTraceAttrs returns trace attributes for an HTTP request received by a +// server. +// +// The server must be the primary server name if it is known. For example this +// would be the ServerName directive +// (https://httpd.apache.org/docs/2.4/mod/core.html#servername) for an Apache +// server, and the server_name directive +// (http://nginx.org/en/docs/http/ngx_http_core_module.html#server_name) for an +// nginx server. More generically, the primary server name would be the host +// header value that matches the default virtual host of an HTTP server. It +// should include the host identifier and if a port is used to route to the +// server that port identifier should be included as an appropriate port +// suffix. +// +// If the primary server name is not known, server should be an empty string. +// The req Host will be used to determine the server instead. +func (n HTTPServer) RequestTraceAttrs(server string, req *http.Request, opts RequestTraceAttrsOpts) []attribute.KeyValue { + count := 3 // ServerAddress, Method, Scheme + + var host string + var p int + if server == "" { + host, p = SplitHostPort(req.Host) + } else { + // Prioritize the primary server name. + host, p = SplitHostPort(server) + if p < 0 { + _, p = SplitHostPort(req.Host) + } + } + + hostPort := requiredHTTPPort(req.TLS != nil, p) + if hostPort > 0 { + count++ + } + + method, methodOriginal := n.method(req.Method) + if methodOriginal != (attribute.KeyValue{}) { + count++ + } + + scheme := n.scheme(req.TLS != nil) + + peer, peerPort := SplitHostPort(req.RemoteAddr) + if peer != "" { + // The Go HTTP server sets RemoteAddr to "IP:port", this will not be a + // file-path that would be interpreted with a sock family. + count++ + if peerPort > 0 { + count++ + } + } + + useragent := req.UserAgent() + if useragent != "" { + count++ + } + + // For client IP, use, in order: + // 1. The value passed in the options + // 2. The value in the X-Forwarded-For header + // 3. The peer address + clientIP := opts.HTTPClientIP + if clientIP == "" { + clientIP = serverClientIP(req.Header.Get("X-Forwarded-For")) + if clientIP == "" { + clientIP = peer + } + } + if clientIP != "" { + count++ + } + + if req.URL != nil && req.URL.Path != "" { + count++ + } + + protoName, protoVersion := netProtocol(req.Proto) + if protoName != "" && protoName != "http" { + count++ + } + if protoVersion != "" { + count++ + } + + route := httpRoute(req.Pattern) + if route != "" { + count++ + } + + attrs := make([]attribute.KeyValue, 0, count) + attrs = append(attrs, + semconv.ServerAddress(host), + method, + scheme, + ) + + if hostPort > 0 { + attrs = append(attrs, semconv.ServerPort(hostPort)) + } + if methodOriginal != (attribute.KeyValue{}) { + attrs = append(attrs, methodOriginal) + } + + if peer, peerPort := SplitHostPort(req.RemoteAddr); peer != "" { + // The Go HTTP server sets RemoteAddr to "IP:port", this will not be a + // file-path that would be interpreted with a sock family. + attrs = append(attrs, semconv.NetworkPeerAddress(peer)) + if peerPort > 0 { + attrs = append(attrs, semconv.NetworkPeerPort(peerPort)) + } + } + + if useragent != "" { + attrs = append(attrs, semconv.UserAgentOriginal(useragent)) + } + + if clientIP != "" { + attrs = append(attrs, semconv.ClientAddress(clientIP)) + } + + if req.URL != nil && req.URL.Path != "" { + attrs = append(attrs, semconv.URLPath(req.URL.Path)) + } + + if protoName != "" && protoName != "http" { + attrs = append(attrs, semconv.NetworkProtocolName(protoName)) + } + if protoVersion != "" { + attrs = append(attrs, semconv.NetworkProtocolVersion(protoVersion)) + } + + if route != "" { + attrs = append(attrs, n.Route(route)) + } + + return attrs +} + +func (s HTTPServer) NetworkTransportAttr(network string) []attribute.KeyValue { + attr := semconv.NetworkTransportPipe + switch network { + case "tcp", "tcp4", "tcp6": + attr = semconv.NetworkTransportTCP + case "udp", "udp4", "udp6": + attr = semconv.NetworkTransportUDP + case "unix", "unixgram", "unixpacket": + attr = semconv.NetworkTransportUnix + } + + return []attribute.KeyValue{attr} +} + +type ServerMetricData struct { + ServerName string + ResponseSize int64 + + MetricData + MetricAttributes +} + +type MetricAttributes struct { + Req *http.Request + StatusCode int + Route string + AdditionalAttributes []attribute.KeyValue +} + +type MetricData struct { + RequestSize int64 + + // The request duration, in milliseconds + ElapsedTime float64 +} + +var ( + metricAddOptionPool = &sync.Pool{ + New: func() any { + return &[]metric.AddOption{} + }, + } + + metricRecordOptionPool = &sync.Pool{ + New: func() any { + return &[]metric.RecordOption{} + }, + } +) + +func (n HTTPServer) RecordMetrics(ctx context.Context, md ServerMetricData) { + attributes := n.MetricAttributes(md.ServerName, md.Req, md.StatusCode, md.Route, md.AdditionalAttributes) + o := metric.WithAttributeSet(attribute.NewSet(attributes...)) + recordOpts := metricRecordOptionPool.Get().(*[]metric.RecordOption) + *recordOpts = append(*recordOpts, o) + n.requestBodySizeHistogram.Inst().Record(ctx, md.RequestSize, *recordOpts...) + n.responseBodySizeHistogram.Inst().Record(ctx, md.ResponseSize, *recordOpts...) + n.requestDurationHistogram.Inst().Record(ctx, md.ElapsedTime/1000.0, o) + *recordOpts = (*recordOpts)[:0] + metricRecordOptionPool.Put(recordOpts) +} + +func (n HTTPServer) method(method string) (attribute.KeyValue, attribute.KeyValue) { + if method == "" { + return semconv.HTTPRequestMethodGet, attribute.KeyValue{} + } + if attr, ok := methodLookup[method]; ok { + return attr, attribute.KeyValue{} + } + + orig := semconv.HTTPRequestMethodOriginal(method) + if attr, ok := methodLookup[strings.ToUpper(method)]; ok { + return attr, orig + } + return semconv.HTTPRequestMethodGet, orig +} + +func (n HTTPServer) scheme(https bool) attribute.KeyValue { //nolint:revive // ignore linter + if https { + return semconv.URLScheme("https") + } + return semconv.URLScheme("http") +} + +// ResponseTraceAttrs returns trace attributes for telemetry from an HTTP +// response. +// +// If any of the fields in the ResponseTelemetry are not set the attribute will +// be omitted. +func (n HTTPServer) ResponseTraceAttrs(resp ResponseTelemetry) []attribute.KeyValue { + var count int + + if resp.ReadBytes > 0 { + count++ + } + if resp.WriteBytes > 0 { + count++ + } + if resp.StatusCode > 0 { + count++ + } + + attributes := make([]attribute.KeyValue, 0, count) + + if resp.ReadBytes > 0 { + attributes = append(attributes, + semconv.HTTPRequestBodySize(int(resp.ReadBytes)), + ) + } + if resp.WriteBytes > 0 { + attributes = append(attributes, + semconv.HTTPResponseBodySize(int(resp.WriteBytes)), + ) + } + if resp.StatusCode > 0 { + attributes = append(attributes, + semconv.HTTPResponseStatusCode(resp.StatusCode), + ) + } + + return attributes +} + +// Route returns the attribute for the route. +func (n HTTPServer) Route(route string) attribute.KeyValue { + return semconv.HTTPRoute(route) +} + +func (n HTTPServer) MetricAttributes(server string, req *http.Request, statusCode int, route string, additionalAttributes []attribute.KeyValue) []attribute.KeyValue { + num := len(additionalAttributes) + 3 + var host string + var p int + if server == "" { + host, p = SplitHostPort(req.Host) + } else { + // Prioritize the primary server name. + host, p = SplitHostPort(server) + if p < 0 { + _, p = SplitHostPort(req.Host) + } + } + hostPort := requiredHTTPPort(req.TLS != nil, p) + if hostPort > 0 { + num++ + } + protoName, protoVersion := netProtocol(req.Proto) + if protoName != "" { + num++ + } + if protoVersion != "" { + num++ + } + + if statusCode > 0 { + num++ + } + + if route != "" { + num++ + } + + attributes := slices.Grow(additionalAttributes, num) + attributes = append(attributes, + semconv.HTTPRequestMethodKey.String(standardizeHTTPMethod(req.Method)), + n.scheme(req.TLS != nil), + semconv.ServerAddress(host)) + + if hostPort > 0 { + attributes = append(attributes, semconv.ServerPort(hostPort)) + } + if protoName != "" { + attributes = append(attributes, semconv.NetworkProtocolName(protoName)) + } + if protoVersion != "" { + attributes = append(attributes, semconv.NetworkProtocolVersion(protoVersion)) + } + + if statusCode > 0 { + attributes = append(attributes, semconv.HTTPResponseStatusCode(statusCode)) + } + + if route != "" { + attributes = append(attributes, semconv.HTTPRoute(route)) + } + return attributes +} diff --git a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/version.go b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/version.go index dfb53cf1f3a..6e096da5e21 100644 --- a/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/version.go +++ b/vendor/go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/version.go @@ -5,6 +5,6 @@ package otelhttp // import "go.opentelemetry.io/contrib/instrumentation/net/http // Version is the current release version of the otelhttp instrumentation. func Version() string { - return "0.63.0" + return "0.64.0" // This string is updated by the pre_release.sh script during release } diff --git a/vendor/go.opentelemetry.io/otel/.codespellignore b/vendor/go.opentelemetry.io/otel/.codespellignore index 2b53a25e1e1..a6d0cbcc9e8 100644 --- a/vendor/go.opentelemetry.io/otel/.codespellignore +++ b/vendor/go.opentelemetry.io/otel/.codespellignore @@ -8,3 +8,4 @@ nam valu thirdparty addOpt +observ diff --git a/vendor/go.opentelemetry.io/otel/.golangci.yml b/vendor/go.opentelemetry.io/otel/.golangci.yml index b01762ffcc7..1b1b2aff9a4 100644 --- a/vendor/go.opentelemetry.io/otel/.golangci.yml +++ b/vendor/go.opentelemetry.io/otel/.golangci.yml @@ -197,6 +197,9 @@ linters: - float-compare - go-require - require-error + usetesting: + context-background: true + context-todo: true exclusions: generated: lax presets: diff --git a/vendor/go.opentelemetry.io/otel/.lycheeignore b/vendor/go.opentelemetry.io/otel/.lycheeignore index 5328505888d..994b677df7f 100644 --- a/vendor/go.opentelemetry.io/otel/.lycheeignore +++ b/vendor/go.opentelemetry.io/otel/.lycheeignore @@ -1,4 +1,5 @@ http://localhost +https://localhost http://jaeger-collector https://github.com/open-telemetry/opentelemetry-go/milestone/ https://github.com/open-telemetry/opentelemetry-go/projects @@ -6,4 +7,7 @@ https://github.com/open-telemetry/opentelemetry-go/projects https?:\/\/github\.com\/open-telemetry\/semantic-conventions\/archive\/refs\/tags\/[^.]+\.zip\[[^]]+] file:///home/runner/work/opentelemetry-go/opentelemetry-go/libraries file:///home/runner/work/opentelemetry-go/opentelemetry-go/manual -http://4.3.2.1:78/user/123 \ No newline at end of file +http://4.3.2.1:78/user/123 +file:///home/runner/work/opentelemetry-go/opentelemetry-go/exporters/otlp/otlptrace/otlptracegrpc/internal/observ/dns:/:4317 +# URL works, but it has blocked link checkers. +https://dl.acm.org/doi/10.1145/198429.198435 diff --git a/vendor/go.opentelemetry.io/otel/CHANGELOG.md b/vendor/go.opentelemetry.io/otel/CHANGELOG.md index f3abcfdc2e3..ecbe0582c48 100644 --- a/vendor/go.opentelemetry.io/otel/CHANGELOG.md +++ b/vendor/go.opentelemetry.io/otel/CHANGELOG.md @@ -11,6 +11,74 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm +## [1.39.0/0.61.0/0.15.0/0.0.14] 2025-12-05 + +### Added + +- Greatly reduce the cost of recording metrics in `go.opentelemetry.io/otel/sdk/metric` using hashing for map keys. (#7175) +- Add `WithInstrumentationAttributeSet` option to `go.opentelemetry.io/otel/log`, `go.opentelemetry.io/otel/metric`, and `go.opentelemetry.io/otel/trace` packages. + This provides a concurrent-safe and performant alternative to `WithInstrumentationAttributes` by accepting a pre-constructed `attribute.Set`. (#7287) +- Add experimental observability for the Prometheus exporter in `go.opentelemetry.io/otel/exporters/prometheus`. + Check the `go.opentelemetry.io/otel/exporters/prometheus/internal/x` package documentation for more information. (#7345) +- Add experimental observability metrics in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc`. (#7353) +- Add temporality selector functions `DeltaTemporalitySelector`, `CumulativeTemporalitySelector`, `LowMemoryTemporalitySelector` to `go.opentelemetry.io/otel/sdk/metric`. (#7434) +- Add experimental observability metrics for simple log processor in `go.opentelemetry.io/otel/sdk/log`. (#7548) +- Add experimental observability metrics in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc`. (#7459) +- Add experimental observability metrics in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`. (#7486) +- Add experimental observability metrics for simple span processor in `go.opentelemetry.io/otel/sdk/trace`. (#7374) +- Add experimental observability metrics in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. (#7512) +- Add experimental observability metrics for manual reader in `go.opentelemetry.io/otel/sdk/metric`. (#7524) +- Add experimental observability metrics for periodic reader in `go.opentelemetry.io/otel/sdk/metric`. (#7571) +- Support `OTEL_EXPORTER_OTLP_LOGS_INSECURE` and `OTEL_EXPORTER_OTLP_INSECURE` environmental variables in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. (#7608) +- Add `Enabled` method to the `Processor` interface in `go.opentelemetry.io/otel/sdk/log`. + All `Processor` implementations now include an `Enabled` method. (#7639) +- The `go.opentelemetry.io/otel/semconv/v1.38.0` package. + The package contains semantic conventions from the `v1.38.0` version of the OpenTelemetry Semantic Conventions. + See the [migration documentation](./semconv/v1.38.0/MIGRATION.md) for information on how to upgrade from `go.opentelemetry.io/otel/semconv/v1.37.0.`(#7648) + +### Changed + +- `Distinct` in `go.opentelemetry.io/otel/attribute` is no longer guaranteed to uniquely identify an attribute set. + Collisions between `Distinct` values for different Sets are possible with extremely high cardinality (billions of series per instrument), but are highly unlikely. (#7175) +- `WithInstrumentationAttributes` in `go.opentelemetry.io/otel/trace` synchronously de-duplicates the passed attributes instead of delegating it to the returned `TracerOption`. (#7266) +- `WithInstrumentationAttributes` in `go.opentelemetry.io/otel/meter` synchronously de-duplicates the passed attributes instead of delegating it to the returned `MeterOption`. (#7266) +- `WithInstrumentationAttributes` in `go.opentelemetry.io/otel/log` synchronously de-duplicates the passed attributes instead of delegating it to the returned `LoggerOption`. (#7266) +- Rename the `OTEL_GO_X_SELF_OBSERVABILITY` environment variable to `OTEL_GO_X_OBSERVABILITY` in `go.opentelemetry.io/otel/sdk/trace`, `go.opentelemetry.io/otel/sdk/log`, and `go.opentelemetry.io/otel/exporters/stdout/stdouttrace`. (#7302) +- Improve performance of histogram `Record` in `go.opentelemetry.io/otel/sdk/metric` when min and max are disabled using `NoMinMax`. (#7306) +- Improve error handling for dropped data during translation by using `prometheus.NewInvalidMetric` in `go.opentelemetry.io/otel/exporters/prometheus`. + ⚠️ **Breaking Change:** Previously, these cases were only logged and scrapes succeeded. + Now, when translation would drop data (e.g., invalid label/value), the exporter emits a `NewInvalidMetric`, and Prometheus scrapes **fail with HTTP 500** by default. + To preserve the prior behavior (scrapes succeed while errors are logged), configure your Prometheus HTTP handler with: `promhttp.HandlerOpts{ ErrorHandling: promhttp.ContinueOnError }`. (#7363) +- Replace fnv hash with xxhash in `go.opentelemetry.io/otel/attribute` for better performance. (#7371) +- The default `TranslationStrategy` in `go.opentelemetry.io/exporters/prometheus` is changed from `otlptranslator.NoUTF8EscapingWithSuffixes` to `otlptranslator.UnderscoreEscapingWithSuffixes`. (#7421) +- Improve performance of concurrent measurements in `go.opentelemetry.io/otel/sdk/metric`. (#7427) +- Include W3C TraceFlags (bits 0–7) in the OTLP `Span.Flags` field in `go.opentelemetry.io/exporters/otlp/otlptrace/otlptracehttp` and `go.opentelemetry.io/exporters/otlp/otlptrace/otlptracegrpc`. (#7438) +- The `ErrorType` function in `go.opentelemetry.io/otel/semconv/v1.37.0` now handles custom error types. + If an error implements an `ErrorType() string` method, the return value of that method will be used as the error type. (#7442) + +### Fixed + +- Fix `WithInstrumentationAttributes` options in `go.opentelemetry.io/otel/trace`, `go.opentelemetry.io/otel/metric`, and `go.opentelemetry.io/otel/log` to properly merge attributes when passed multiple times instead of replacing them. + Attributes with duplicate keys will use the last value passed. (#7300) +- The equality of `attribute.Set` when using the `Equal` method is not affected by the user overriding the empty set pointed to by `attribute.EmptySet` in `go.opentelemetry.io/otel/attribute`. (#7357) +- Return partial OTLP export errors to the caller in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc`. (#7372) +- Return partial OTLP export errors to the caller in `go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp`. (#7372) +- Return partial OTLP export errors to the caller in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc`. (#7372) +- Return partial OTLP export errors to the caller in `go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp`. (#7372) +- Return partial OTLP export errors to the caller in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc`. (#7372) +- Return partial OTLP export errors to the caller in `go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp`. (#7372) +- Fix `AddAttributes`, `SetAttributes`, `SetBody` on `Record` in `go.opentelemetry.io/otel/sdk/log` to not mutate input. (#7403) +- Do not double record measurements of `RecordSet` methods in `go.opentelemetry.io/otel/semconv/v1.37.0`. (#7655) +- Do not double record measurements of `RecordSet` methods in `go.opentelemetry.io/otel/semconv/v1.36.0`. (#7656) + +### Removed + +- Drop support for [Go 1.23]. (#7274) +- Remove the `FilterProcessor` interface in `go.opentelemetry.io/otel/sdk/log`. + The `Enabled` method has been added to the `Processor` interface instead. + All `Processor` implementations must now implement the `Enabled` method. + Custom processors that do not filter records can implement `Enabled` to return `true`. (#7639) + ## [1.38.0/0.60.0/0.14.0/0.0.13] 2025-08-29 This release is the last to support [Go 1.23]. @@ -3430,8 +3498,10 @@ It contains api and sdk for trace and meter. - CircleCI build CI manifest files. - CODEOWNERS file to track owners of this project. -[Unreleased]: https://github.com/open-telemetry/opentelemetry-go/compare/v1.38.0...HEAD +[Unreleased]: https://github.com/open-telemetry/opentelemetry-go/compare/v1.39.0...HEAD +[1.39.0/0.61.0/0.15.0/0.0.14]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.39.0 [1.38.0/0.60.0/0.14.0/0.0.13]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.38.0 +[0.59.1]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/exporters/prometheus/v0.59.1 [1.37.0/0.59.0/0.13.0]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/v1.37.0 [0.12.2]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/log/v0.12.2 [0.12.1]: https://github.com/open-telemetry/opentelemetry-go/releases/tag/log/v0.12.1 diff --git a/vendor/go.opentelemetry.io/otel/CONTRIBUTING.md b/vendor/go.opentelemetry.io/otel/CONTRIBUTING.md index 0b3ae855c19..ff5e1f76ecd 100644 --- a/vendor/go.opentelemetry.io/otel/CONTRIBUTING.md +++ b/vendor/go.opentelemetry.io/otel/CONTRIBUTING.md @@ -54,8 +54,8 @@ go get -d go.opentelemetry.io/otel (This may print some warning about "build constraints exclude all Go files", just ignore it.) -This will put the project in `${GOPATH}/src/go.opentelemetry.io/otel`. You -can alternatively use `git` directly with: +This will put the project in `${GOPATH}/src/go.opentelemetry.io/otel`. +Alternatively, you can use `git` directly with: ```sh git clone https://github.com/open-telemetry/opentelemetry-go @@ -65,8 +65,7 @@ git clone https://github.com/open-telemetry/opentelemetry-go that name is a kind of a redirector to GitHub that `go get` can understand, but `git` does not.) -This would put the project in the `opentelemetry-go` directory in -current working directory. +This will add the project as `opentelemetry-go` within the current directory. Enter the newly created directory and add your fork as a new remote: @@ -109,7 +108,7 @@ A PR is considered **ready to merge** when: This is not enforced through automation, but needs to be validated by the maintainer merging. - * At least one of the qualified approvals need to be from an + * At least one of the qualified approvals needs to be from an [Approver]/[Maintainer] affiliated with a different company than the author of the PR. * PRs introducing changes that have already been discussed and consensus @@ -166,11 +165,11 @@ guidelines](https://opentelemetry.io/docs/specs/otel/library-guidelines). ### Focus on Capabilities, Not Structure Compliance OpenTelemetry is an evolving specification, one where the desires and -use cases are clear, but the method to satisfy those uses cases are +use cases are clear, but the methods to satisfy those use cases are not. As such, Contributions should provide functionality and behavior that -conforms to the specification, but the interface and structure is +conforms to the specification, but the interface and structure are flexible. It is preferable to have contributions follow the idioms of the @@ -217,7 +216,7 @@ about dependency compatibility. This project does not partition dependencies based on the environment (i.e. `development`, `staging`, `production`). -Only the dependencies explicitly included in the released modules have be +Only the dependencies explicitly included in the released modules have been tested and verified to work with the released code. No other guarantee is made about the compatibility of other dependencies. @@ -635,8 +634,8 @@ is not in their root name. The use of internal packages should be scoped to a single module. A sub-module should never import from a parent internal package. This creates a coupling -between the two modules where a user can upgrade the parent without the child -and if the internal package API has changed it will fail to upgrade[^3]. +between the two modules where a user can upgrade the parent without the child, +and if the internal package API has changed, it will fail to upgrade[^3]. There are two known exceptions to this rule: @@ -657,7 +656,7 @@ this. ### Ignoring context cancellation -OpenTelemetry API implementations need to ignore the cancellation of the context that are +OpenTelemetry API implementations need to ignore the cancellation of the context that is passed when recording a value (e.g. starting a span, recording a measurement, emitting a log). Recording methods should not return an error describing the cancellation state of the context when they complete, nor should they abort any work. @@ -675,6 +674,441 @@ force flushing telemetry, shutting down a signal provider) the context cancellat should be honored. This means all work done on behalf of the user provided context should be canceled. +### Observability + +OpenTelemetry Go SDK components should be instrumented to enable users observability for the health and performance of the telemetry pipeline itself. +This allows operators to understand how well their observability infrastructure is functioning and to identify potential issues before they impact their applications. + +This section outlines the best practices for building instrumentation in OpenTelemetry Go SDK components. + +#### Environment Variable Activation + +Observability features are currently experimental. +They should be disabled by default and activated through the `OTEL_GO_X_OBSERVABILITY` environment variable. +This follows the established experimental feature pattern used throughout the SDK. + +Components should check for this environment variable using a consistent pattern: + +```go +import "go.opentelemetry.io/otel/*/internal/x" + +if x.Observability.Enabled() { + // Initialize observability metrics +} +``` + +**References**: + +- [stdouttrace exporter](./exporters/stdout/stdouttrace/internal/x/x.go) +- [sdk](./sdk/internal/x/x.go) + +#### Encapsulation + +Instrumentation should be encapsulated within a dedicated `struct` (e.g. `instrumentation`). +It should not be mixed into the instrumented component. + +Prefer this: + +```go +type SDKComponent struct { + inst *instrumentation +} + +type instrumentation struct { + inflight otelconv.SDKComponentInflight + exported otelconv.SDKComponentExported +} +``` + +To this: + +```go +// ❌ Avoid this pattern. +type SDKComponent struct { + /* other SDKComponent fields... */ + + inflight otelconv.SDKComponentInflight + exported otelconv.SDKComponentExported +} +``` + +The instrumentation code should not bloat the code being instrumented. +Likely, this means its own file, or its own package if it is complex or reused. + +#### Initialization + +Instrumentation setup should be explicit, side-effect free, and local to the relevant component. +Avoid relying on global or implicit [side effects][side-effect] for initialization. + +Encapsulate setup in constructor functions, ensuring clear ownership and scope: + +```go +import ( + "errors" + + semconv "go.opentelemetry.io/otel/semconv/v1.37.0" + "go.opentelemetry.io/otel/semconv/v1.37.0/otelconv" +) + +type SDKComponent struct { + inst *instrumentation +} + +func NewSDKComponent(config Config) (*SDKComponent, error) { + inst, err := newInstrumentation() + if err != nil { + return nil, err + } + return &SDKComponent{inst: inst}, nil +} + +type instrumentation struct { + inflight otelconv.SDKComponentInflight + exported otelconv.SDKComponentExported +} + +func newInstrumentation() (*instrumentation, error) { + if !x.Observability.Enabled() { + return nil, nil + } + + meter := otel.GetMeterProvider().Meter( + "", + metric.WithInstrumentationVersion(sdk.Version()), + metric.WithSchemaURL(semconv.SchemaURL), + ) + + inst := &instrumentation{} + + var err, e error + inst.inflight, e = otelconv.NewSDKComponentInflight(meter) + err = errors.Join(err, e) + + inst.exported, e = otelconv.NewSDKComponentExported(meter) + err = errors.Join(err, e) + + return inst, err +} +``` + +```go +// ❌ Avoid this pattern. +func (c *Component) initObservability() { + // Initialize observability metrics + if !x.Observability.Enabled() { + return + } + + // Initialize observability metrics + c.inst = &instrumentation{/* ... */} +} +``` + +[side-effect]: https://en.wikipedia.org/wiki/Side_effect_(computer_science) + +#### Performance + +When observability is disabled there should be little to no overhead. + +```go +func (e *Exporter) ExportSpans(ctx context.Context, spans []trace.ReadOnlySpan) error { + if e.inst != nil { + attrs := expensiveOperation() + e.inst.recordSpanInflight(ctx, int64(len(spans)), attrs...) + } + // Export spans... +} +``` + +```go +// ❌ Avoid this pattern. +func (e *Exporter) ExportSpans(ctx context.Context, spans []trace.ReadOnlySpan) error { + attrs := expensiveOperation() + e.inst.recordSpanInflight(ctx, int64(len(spans)), attrs...) + // Export spans... +} + +func (i *instrumentation) recordSpanInflight(ctx context.Context, count int64, attrs ...attribute.KeyValue) { + if i == nil || i.inflight == nil { + return + } + i.inflight.Add(ctx, count, metric.WithAttributes(attrs...)) +} +``` + +When observability is enabled, the instrumentation code paths should be optimized to reduce allocation and computation overhead. + +##### Attribute and Option Allocation Management + +Pool attribute slices and options with [`sync.Pool`] to minimize allocations in measurement calls with dynamic attributes. + +```go +var ( + attrPool = sync.Pool{ + New: func() any { + // Pre-allocate common capacity + knownCap := 8 // Adjust based on expected usage + s := make([]attribute.KeyValue, 0, knownCap) + // Return a pointer to avoid extra allocation on Put(). + return &s + }, + } + + addOptPool = &sync.Pool{ + New: func() any { + const n = 1 // WithAttributeSet + o := make([]metric.AddOption, 0, n) + // Return a pointer to avoid extra allocation on Put(). + return &o + }, + } +) + +func (i *instrumentation) record(ctx context.Context, value int64, baseAttrs ...attribute.KeyValue) { + attrs := attrPool.Get().(*[]attribute.KeyValue) + defer func() { + *attrs = (*attrs)[:0] // Reset. + attrPool.Put(attrs) + }() + + *attrs = append(*attrs, baseAttrs...) + // Add any dynamic attributes. + *attrs = append(*attrs, semconv.OTelComponentName("exporter-1")) + + addOpt := addOptPool.Get().(*[]metric.AddOption) + defer func() { + *addOpt = (*addOpt)[:0] + addOptPool.Put(addOpt) + }() + + set := attribute.NewSet(*attrs...) + *addOpt = append(*addOpt, metric.WithAttributeSet(set)) + + i.counter.Add(ctx, value, *addOpt...) +} +``` + +Pools are most effective when there are many pooled objects of the same sufficiently large size, and the objects are repeatedly used. +This amortizes the cost of allocation and synchronization. +Ideally, the pools should be scoped to be used as widely as possible within the component to maximize this efficiency while still ensuring correctness. + +[`sync.Pool`]: https://pkg.go.dev/sync#Pool + +##### Cache common attribute sets for repeated measurements + +If a static set of attributes are used for measurements and they are known at compile time, pre-compute and cache these attributes. + +```go +type spanLiveSetKey struct { + sampled bool +} + +var spanLiveSetCache = map[spanLiveSetKey]attribute.Set{ + {true}: attribute.NewSet( + otelconv.SDKSpanLive{}.AttrSpanSamplingResult( + otelconv.SpanSamplingResultRecordAndSample, + ), + ), + {false}: attribute.NewSet( + otelconv.SDKSpanLive{}.AttrSpanSamplingResult( + otelconv.SpanSamplingResultRecordOnly, + ), + ), +} + +func spanLiveSet(sampled bool) attribute.Set { + key := spanLiveSetKey{sampled: sampled} + return spanLiveSetCache[key] +} +``` + +##### Benchmarking + +Always provide benchmarks when introducing or refactoring instrumentation. +Demonstrate the impact (allocs/op, B/op, ns/op) in enabled/disabled scenarios: + +```go +func BenchmarkExportSpans(b *testing.B) { + scenarios := []struct { + name string + obsEnabled bool + }{ + {"ObsDisabled", false}, + {"ObsEnabled", true}, + } + + for _, scenario := range scenarios { + b.Run(scenario.name, func(b *testing.B) { + b.Setenv( + "OTEL_GO_X_OBSERVABILITY", + strconv.FormatBool(scenario.obsEnabled), + ) + + exporter := NewExporter() + spans := generateTestSpans(100) + + b.ResetTimer() + b.ReportAllocs() + + for i := 0; i < b.N; i++ { + _ = exporter.ExportSpans(context.Background(), spans) + } + }) + } +} +``` + +#### Error Handling and Robustness + +Errors should be reported back to the caller if possible, and partial failures should be handled as gracefully as possible. + +```go +func newInstrumentation() (*instrumentation, error) { + if !x.Observability.Enabled() { + return nil, nil + } + + m := otel.GetMeterProvider().Meter(/* initialize meter */) + counter, err := otelconv.NewSDKComponentCounter(m) + // Use the partially initialized counter if available. + i := &instrumentation{counter: counter} + // Return any error to the caller. + return i, err +} +``` + +```go +// ❌ Avoid this pattern. +func newInstrumentation() *instrumentation { + if !x.Observability.Enabled() { + return nil, nil + } + + m := otel.GetMeterProvider().Meter(/* initialize meter */) + counter, err := otelconv.NewSDKComponentCounter(m) + if err != nil { + // ❌ Do not dump the error to the OTel Handler. Return it to the + // caller. + otel.Handle(err) + // ❌ Do not return nil if we can still use the partially initialized + // counter. + return nil + } + return &instrumentation{counter: counter} +} +``` + +If the instrumented component cannot report the error to the user, let it report the error to `otel.Handle`. + +#### Context Propagation + +Ensure observability measurements receive the correct context, especially for trace exemplars and distributed context: + +```go +func (e *Exporter) ExportSpans(ctx context.Context, spans []trace.ReadOnlySpan) error { + // Use the provided context for observability measurements + e.inst.recordSpanExportStarted(ctx, len(spans)) + + err := e.doExport(ctx, spans) + + if err != nil { + e.inst.recordSpanExportFailed(ctx, len(spans), err) + } else { + e.inst.recordSpanExportSucceeded(ctx, len(spans)) + } + + return err +} +``` + +```go +// ❌ Avoid this pattern. +func (e *Exporter) ExportSpans(ctx context.Context, spans []trace.ReadOnlySpan) error { + // ❌ Do not break the context propagation. + e.inst.recordSpanExportStarted(context.Background(), len(spans)) + + err := e.doExport(ctx, spans) + + /* ... */ + + return err +} +``` + +#### Semantic Conventions Compliance + +All observability metrics should follow the [OpenTelemetry Semantic Conventions for SDK metrics](https://github.com/open-telemetry/semantic-conventions/blob/1cf2476ae5e518225a766990a28a6d5602bd5a30/docs/otel/sdk-metrics.md). + +Use the metric semantic conventions convenience package [otelconv](./semconv/v1.37.0/otelconv/metric.go). + +##### Component Identification + +Component names and types should follow [semantic convention](https://github.com/open-telemetry/semantic-conventions/blob/1cf2476ae5e518225a766990a28a6d5602bd5a30/docs/registry/attributes/otel.md#otel-component-attributes). + +If a component is not a well-known type specified in the semantic conventions, use the package path scope type as a stable identifier. + +```go +componentType := "go.opentelemetry.io/otel/sdk/trace.Span" +``` + +```go +// ❌ Do not do this. +componentType := "trace-span" +``` + +The component name should be a stable unique identifier for the specific instance of the component. + +Use a global counter to ensure uniqueness if necessary. + +```go +// Unique 0-based ID counter for component instances. +var componentIDCounter atomic.Int64 + +// nextID returns the next unique ID for a component. +func nextID() int64 { + return componentIDCounter.Add(1) - 1 +} + +// componentName returns a unique name for the component instance. +func componentName() attribute.KeyValue { + id := nextID() + name := fmt.Sprintf("%s/%d", componentType, id) + return semconv.OTelComponentName(name) +} +``` + +The component ID will need to be resettable for deterministic testing. +If tests are in a different package than the component being tested (i.e. a `_test` package name), use a generated `counter` internal package to manage the counter. +See [stdouttrace exporter example](./exporters/stdout/stdouttrace/internal/gen.go) for reference. + +#### Testing + +Use deterministic testing with isolated state: + +```go +func TestObservability(t *testing.T) { + // Restore state after test to ensure this does not affect other tests. + prev := otel.GetMeterProvider() + t.Cleanup(func() { otel.SetMeterProvider(prev) }) + + // Isolate the meter provider for deterministic testing + reader := metric.NewManualReader() + meterProvider := metric.NewMeterProvider(metric.WithReader(reader)) + otel.SetMeterProvider(meterProvider) + + // Use t.Setenv to ensure environment variable is restored after test. + t.Setenv("OTEL_GO_X_OBSERVABILITY", "true") + + // Reset component ID counter to ensure deterministic component names. + componentIDCounter.Store(0) + + /* ... test code ... */ +} +``` + +Test order should not affect results. +Ensure that any global state (e.g. component ID counters) is reset between tests. + ## Approvers and Maintainers ### Maintainers @@ -696,7 +1130,6 @@ For more information about the approver role, see the [community repository](htt ### Triagers - [Alex Kats](https://github.com/akats7), Capital One -- [Cheng-Zhen Yang](https://github.com/scorpionknifes), Independent For more information about the triager role, see the [community repository](https://github.com/open-telemetry/community/blob/main/guides/contributor/membership.md#triager). @@ -704,6 +1137,7 @@ For more information about the triager role, see the [community repository](http - [Aaron Clawson](https://github.com/MadVikingGod) - [Anthony Mirabella](https://github.com/Aneurysm9) +- [Cheng-Zhen Yang](https://github.com/scorpionknifes) - [Chester Cheung](https://github.com/hanyuancheung) - [Evan Torrie](https://github.com/evantorrie) - [Gustavo Silva Paiva](https://github.com/paivagustavo) diff --git a/vendor/go.opentelemetry.io/otel/Makefile b/vendor/go.opentelemetry.io/otel/Makefile index bc0f1f92d1f..44870248c32 100644 --- a/vendor/go.opentelemetry.io/otel/Makefile +++ b/vendor/go.opentelemetry.io/otel/Makefile @@ -146,11 +146,12 @@ build-tests/%: # Tests -TEST_TARGETS := test-default test-bench test-short test-verbose test-race test-concurrent-safe +TEST_TARGETS := test-default test-bench test-short test-verbose test-race test-concurrent-safe test-fuzz .PHONY: $(TEST_TARGETS) test test-default test-race: ARGS=-race test-bench: ARGS=-run=xxxxxMatchNothingxxxxx -test.benchtime=1ms -bench=. test-short: ARGS=-short +test-fuzz: ARGS=-fuzztime=10s -fuzz test-verbose: ARGS=-v -race test-concurrent-safe: ARGS=-run=ConcurrentSafe -count=100 -race test-concurrent-safe: TIMEOUT=120 diff --git a/vendor/go.opentelemetry.io/otel/README.md b/vendor/go.opentelemetry.io/otel/README.md index 6b7ab5f2193..c6335954311 100644 --- a/vendor/go.opentelemetry.io/otel/README.md +++ b/vendor/go.opentelemetry.io/otel/README.md @@ -55,25 +55,18 @@ Currently, this project supports the following environments. |----------|------------|--------------| | Ubuntu | 1.25 | amd64 | | Ubuntu | 1.24 | amd64 | -| Ubuntu | 1.23 | amd64 | | Ubuntu | 1.25 | 386 | | Ubuntu | 1.24 | 386 | -| Ubuntu | 1.23 | 386 | | Ubuntu | 1.25 | arm64 | | Ubuntu | 1.24 | arm64 | -| Ubuntu | 1.23 | arm64 | -| macOS 13 | 1.25 | amd64 | -| macOS 13 | 1.24 | amd64 | -| macOS 13 | 1.23 | amd64 | +| macOS | 1.25 | amd64 | +| macOS | 1.24 | amd64 | | macOS | 1.25 | arm64 | | macOS | 1.24 | arm64 | -| macOS | 1.23 | arm64 | | Windows | 1.25 | amd64 | | Windows | 1.24 | amd64 | -| Windows | 1.23 | amd64 | | Windows | 1.25 | 386 | | Windows | 1.24 | 386 | -| Windows | 1.23 | 386 | While this project should work for other systems, no compatibility guarantees are made for those systems currently. diff --git a/vendor/go.opentelemetry.io/otel/RELEASING.md b/vendor/go.opentelemetry.io/otel/RELEASING.md index 1ddcdef0396..861756fd745 100644 --- a/vendor/go.opentelemetry.io/otel/RELEASING.md +++ b/vendor/go.opentelemetry.io/otel/RELEASING.md @@ -24,7 +24,7 @@ Ensure things look correct before submitting a pull request to include the addit ## Breaking changes validation -You can run `make gorelease` that runs [gorelease](https://pkg.go.dev/golang.org/x/exp/cmd/gorelease) to ensure that there are no unwanted changes done in the public API. +You can run `make gorelease` which runs [gorelease](https://pkg.go.dev/golang.org/x/exp/cmd/gorelease) to ensure that there are no unwanted changes made in the public API. You can check/report problems with `gorelease` [here](https://golang.org/issues/26420). @@ -62,7 +62,7 @@ Update go.mod for submodules to depend on the new release which will happen in t ``` 3. Update the [Changelog](./CHANGELOG.md). - - Make sure all relevant changes for this release are included and are in language that non-contributors to the project can understand. + - Make sure all relevant changes for this release are included and are written in language that non-contributors to the project can understand. To verify this, you can look directly at the commits since the ``. ``` @@ -107,34 +107,50 @@ It is critical you make sure the version you push upstream is correct. ... ``` -## Release +## Sign artifacts -Finally create a Release for the new `` on GitHub. -The release body should include all the release notes from the Changelog for this release. +To ensure we comply with CNCF best practices, we need to sign the release artifacts. -### Sign the Release Artifact +Download the `.tar.gz` and `.zip` archives from the [tags page](https://github.com/open-telemetry/opentelemetry-go/tags) for the new release tag. +Both archives need to be signed with your GPG key. -To ensure we comply with CNCF best practices, we need to sign the release artifact. -The tarball attached to the GitHub release needs to be signed with your GPG key. +You can use [this script] to verify the contents of the archives before signing them. -Follow [these steps] to sign the release artifact and upload it to GitHub. -You can use [this script] to verify the contents of the tarball before signing it. +To find your GPG key ID, run: -Be sure to use the correct GPG key when signing the release artifact. +```terminal +gpg --list-secret-keys --keyid-format=long +``` + +The key ID is the 16-character string after `sec rsa4096/` (or similar). + +Set environment variables and sign both artifacts: ```terminal -gpg --local-user --armor --detach-sign opentelemetry-go-.tar.gz +export VERSION="" # e.g., v1.32.0 +export KEY_ID="" + +gpg --local-user $KEY_ID --armor --detach-sign opentelemetry-go-$VERSION.tar.gz +gpg --local-user $KEY_ID --armor --detach-sign opentelemetry-go-$VERSION.zip ``` -You can verify the signature with: +You can verify the signatures with: ```terminal -gpg --verify opentelemetry-go-.tar.gz.asc opentelemetry-go-.tar.gz +gpg --verify opentelemetry-go-$VERSION.tar.gz.asc opentelemetry-go-$VERSION.tar.gz +gpg --verify opentelemetry-go-$VERSION.zip.asc opentelemetry-go-$VERSION.zip ``` -[these steps]: https://wiki.debian.org/Creating%20signed%20GitHub%20releases [this script]: https://github.com/MrAlias/attest-sh +## Release + +Finally create a Release for the new `` on GitHub. +The release body should include all the release notes from the Changelog for this release. + +***IMPORTANT***: GitHub Releases are immutable once created. +You must upload the signed artifacts (`.tar.gz`, `.tar.gz.asc`, `.zip`, and `.zip.asc`) when creating the release, as they cannot be added or modified later. + ## Post-Release ### Contrib Repository @@ -160,14 +176,6 @@ This helps track what changes were included in each release. Once all related issues and PRs have been added to the milestone, close the milestone. -### Demo Repository - -Bump the dependencies in the following Go services: - -- [`accounting`](https://github.com/open-telemetry/opentelemetry-demo/tree/main/src/accounting) -- [`checkoutservice`](https://github.com/open-telemetry/opentelemetry-demo/tree/main/src/checkout) -- [`productcatalogservice`](https://github.com/open-telemetry/opentelemetry-demo/tree/main/src/product-catalog) - ### Close the `Version Release` issue Once the todo list in the `Version Release` issue is complete, close the issue. diff --git a/vendor/go.opentelemetry.io/otel/VERSIONING.md b/vendor/go.opentelemetry.io/otel/VERSIONING.md index b8cb605c166..b27c9e84f51 100644 --- a/vendor/go.opentelemetry.io/otel/VERSIONING.md +++ b/vendor/go.opentelemetry.io/otel/VERSIONING.md @@ -83,7 +83,7 @@ is designed so the following goals can be achieved. in either the module path or the import path. * In addition to public APIs, telemetry produced by stable instrumentation will remain stable and backwards compatible. This is to avoid breaking - alerts and dashboard. + alerts and dashboards. * Modules will be used to encapsulate instrumentation, detectors, exporters, propagators, and any other independent sets of related components. * Experimental modules still under active development will be versioned at diff --git a/vendor/go.opentelemetry.io/otel/attribute/encoder.go b/vendor/go.opentelemetry.io/otel/attribute/encoder.go index 6333d34b310..6cc1a1655cf 100644 --- a/vendor/go.opentelemetry.io/otel/attribute/encoder.go +++ b/vendor/go.opentelemetry.io/otel/attribute/encoder.go @@ -16,7 +16,7 @@ type ( // set into a wire representation. Encoder interface { // Encode returns the serialized encoding of the attribute set using - // its Iterator. This result may be cached by a attribute.Set. + // its Iterator. This result may be cached by an attribute.Set. Encode(iterator Iterator) string // ID returns a value that is unique for each class of attribute diff --git a/vendor/go.opentelemetry.io/otel/attribute/hash.go b/vendor/go.opentelemetry.io/otel/attribute/hash.go new file mode 100644 index 00000000000..6aa69aeaecf --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/attribute/hash.go @@ -0,0 +1,92 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package attribute // import "go.opentelemetry.io/otel/attribute" + +import ( + "fmt" + "reflect" + + "go.opentelemetry.io/otel/attribute/internal/xxhash" +) + +// Type identifiers. These identifiers are hashed before the value of the +// corresponding type. This is done to distinguish values that are hashed with +// the same value representation (e.g. `int64(1)` and `true`, []int64{0} and +// int64(0)). +// +// These are all 8 byte length strings converted to a uint64 representation. A +// uint64 is used instead of the string directly as an optimization, it avoids +// the for loop in [xxhash] which adds minor overhead. +const ( + boolID uint64 = 7953749933313450591 // "_boolean" (little endian) + int64ID uint64 = 7592915492740740150 // "64_bit_i" (little endian) + float64ID uint64 = 7376742710626956342 // "64_bit_f" (little endian) + stringID uint64 = 6874584755375207263 // "_string_" (little endian) + boolSliceID uint64 = 6875993255270243167 // "_[]bool_" (little endian) + int64SliceID uint64 = 3762322556277578591 // "_[]int64" (little endian) + float64SliceID uint64 = 7308324551835016539 // "[]double" (little endian) + stringSliceID uint64 = 7453010373645655387 // "[]string" (little endian) +) + +// hashKVs returns a new xxHash64 hash of kvs. +func hashKVs(kvs []KeyValue) uint64 { + h := xxhash.New() + for _, kv := range kvs { + h = hashKV(h, kv) + } + return h.Sum64() +} + +// hashKV returns the xxHash64 hash of kv with h as the base. +func hashKV(h xxhash.Hash, kv KeyValue) xxhash.Hash { + h = h.String(string(kv.Key)) + + switch kv.Value.Type() { + case BOOL: + h = h.Uint64(boolID) + h = h.Uint64(kv.Value.numeric) + case INT64: + h = h.Uint64(int64ID) + h = h.Uint64(kv.Value.numeric) + case FLOAT64: + h = h.Uint64(float64ID) + // Assumes numeric stored with math.Float64bits. + h = h.Uint64(kv.Value.numeric) + case STRING: + h = h.Uint64(stringID) + h = h.String(kv.Value.stringly) + case BOOLSLICE: + h = h.Uint64(boolSliceID) + rv := reflect.ValueOf(kv.Value.slice) + for i := 0; i < rv.Len(); i++ { + h = h.Bool(rv.Index(i).Bool()) + } + case INT64SLICE: + h = h.Uint64(int64SliceID) + rv := reflect.ValueOf(kv.Value.slice) + for i := 0; i < rv.Len(); i++ { + h = h.Int64(rv.Index(i).Int()) + } + case FLOAT64SLICE: + h = h.Uint64(float64SliceID) + rv := reflect.ValueOf(kv.Value.slice) + for i := 0; i < rv.Len(); i++ { + h = h.Float64(rv.Index(i).Float()) + } + case STRINGSLICE: + h = h.Uint64(stringSliceID) + rv := reflect.ValueOf(kv.Value.slice) + for i := 0; i < rv.Len(); i++ { + h = h.String(rv.Index(i).String()) + } + case INVALID: + default: + // Logging is an alternative, but using the internal logger here + // causes an import cycle so it is not done. + v := kv.Value.AsInterface() + msg := fmt.Sprintf("unknown value type: %[1]v (%[1]T)", v) + panic(msg) + } + return h +} diff --git a/vendor/go.opentelemetry.io/otel/attribute/internal/xxhash/xxhash.go b/vendor/go.opentelemetry.io/otel/attribute/internal/xxhash/xxhash.go new file mode 100644 index 00000000000..113a978383b --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/attribute/internal/xxhash/xxhash.go @@ -0,0 +1,64 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package xxhash provides a wrapper around the xxhash library for attribute hashing. +package xxhash // import "go.opentelemetry.io/otel/attribute/internal/xxhash" + +import ( + "encoding/binary" + "math" + + "github.com/cespare/xxhash/v2" +) + +// Hash wraps xxhash.Digest to provide an API friendly for hashing attribute values. +type Hash struct { + d *xxhash.Digest +} + +// New returns a new initialized xxHash64 hasher. +func New() Hash { + return Hash{d: xxhash.New()} +} + +func (h Hash) Uint64(val uint64) Hash { + var buf [8]byte + binary.LittleEndian.PutUint64(buf[:], val) + // errors from Write are always nil for xxhash + // if it returns an err then panic + _, err := h.d.Write(buf[:]) + if err != nil { + panic("xxhash write of uint64 failed: " + err.Error()) + } + return h +} + +func (h Hash) Bool(val bool) Hash { // nolint:revive // This is a hashing function. + if val { + return h.Uint64(1) + } + return h.Uint64(0) +} + +func (h Hash) Float64(val float64) Hash { + return h.Uint64(math.Float64bits(val)) +} + +func (h Hash) Int64(val int64) Hash { + return h.Uint64(uint64(val)) // nolint:gosec // Overflow doesn't matter since we are hashing. +} + +func (h Hash) String(val string) Hash { + // errors from WriteString are always nil for xxhash + // if it returns an err then panic + _, err := h.d.WriteString(val) + if err != nil { + panic("xxhash write of string failed: " + err.Error()) + } + return h +} + +// Sum64 returns the current hash value. +func (h Hash) Sum64() uint64 { + return h.d.Sum64() +} diff --git a/vendor/go.opentelemetry.io/otel/attribute/set.go b/vendor/go.opentelemetry.io/otel/attribute/set.go index 64735d382ea..911d557ee54 100644 --- a/vendor/go.opentelemetry.io/otel/attribute/set.go +++ b/vendor/go.opentelemetry.io/otel/attribute/set.go @@ -9,6 +9,8 @@ import ( "reflect" "slices" "sort" + + "go.opentelemetry.io/otel/attribute/internal/xxhash" ) type ( @@ -23,19 +25,19 @@ type ( // the Equals method to ensure stable equivalence checking. // // Users should also use the Distinct returned from Equivalent as a map key - // instead of a Set directly. In addition to that type providing guarantees - // on stable equivalence, it may also provide performance improvements. + // instead of a Set directly. Set has relatively poor performance when used + // as a map key compared to Distinct. Set struct { - equivalent Distinct + hash uint64 + data any } - // Distinct is a unique identifier of a Set. + // Distinct is an identifier of a Set which is very likely to be unique. // - // Distinct is designed to ensure equivalence stability: comparisons will - // return the same value across versions. For this reason, Distinct should - // always be used as a map key instead of a Set. + // Distinct should be used as a map key instead of a Set for to provide better + // performance for map operations. Distinct struct { - iface any + hash uint64 } // Sortable implements sort.Interface, used for sorting KeyValue. @@ -46,15 +48,34 @@ type ( Sortable []KeyValue ) +// Compile time check these types remain comparable. +var ( + _ = isComparable(Set{}) + _ = isComparable(Distinct{}) +) + +func isComparable[T comparable](t T) T { return t } + var ( // keyValueType is used in computeDistinctReflect. keyValueType = reflect.TypeOf(KeyValue{}) - // emptySet is returned for empty attribute sets. - emptySet = &Set{ - equivalent: Distinct{ - iface: [0]KeyValue{}, - }, + // emptyHash is the hash of an empty set. + emptyHash = xxhash.New().Sum64() + + // userDefinedEmptySet is an empty set. It was mistakenly exposed to users + // as something they can assign to, so it must remain addressable and + // mutable. + // + // This is kept for backwards compatibility, but should not be used in new code. + userDefinedEmptySet = &Set{ + hash: emptyHash, + data: [0]KeyValue{}, + } + + emptySet = Set{ + hash: emptyHash, + data: [0]KeyValue{}, } ) @@ -62,33 +83,35 @@ var ( // // This is a convenience provided for optimized calling utility. func EmptySet() *Set { - return emptySet -} - -// reflectValue abbreviates reflect.ValueOf(d). -func (d Distinct) reflectValue() reflect.Value { - return reflect.ValueOf(d.iface) + // Continue to return the pointer to the user-defined empty set for + // backwards-compatibility. + // + // New code should not use this, instead use emptySet. + return userDefinedEmptySet } // Valid reports whether this value refers to a valid Set. -func (d Distinct) Valid() bool { - return d.iface != nil +func (d Distinct) Valid() bool { return d.hash != 0 } + +// reflectValue abbreviates reflect.ValueOf(d). +func (l Set) reflectValue() reflect.Value { + return reflect.ValueOf(l.data) } // Len returns the number of attributes in this set. func (l *Set) Len() int { - if l == nil || !l.equivalent.Valid() { + if l == nil || l.hash == 0 { return 0 } - return l.equivalent.reflectValue().Len() + return l.reflectValue().Len() } // Get returns the KeyValue at ordered position idx in this set. func (l *Set) Get(idx int) (KeyValue, bool) { - if l == nil || !l.equivalent.Valid() { + if l == nil || l.hash == 0 { return KeyValue{}, false } - value := l.equivalent.reflectValue() + value := l.reflectValue() if idx >= 0 && idx < value.Len() { // Note: The Go compiler successfully avoids an allocation for @@ -101,10 +124,10 @@ func (l *Set) Get(idx int) (KeyValue, bool) { // Value returns the value of a specified key in this set. func (l *Set) Value(k Key) (Value, bool) { - if l == nil || !l.equivalent.Valid() { + if l == nil || l.hash == 0 { return Value{}, false } - rValue := l.equivalent.reflectValue() + rValue := l.reflectValue() vlen := rValue.Len() idx := sort.Search(vlen, func(idx int) bool { @@ -144,20 +167,29 @@ func (l *Set) ToSlice() []KeyValue { return iter.ToSlice() } -// Equivalent returns a value that may be used as a map key. The Distinct type -// guarantees that the result will equal the equivalent. Distinct value of any +// Equivalent returns a value that may be used as a map key. Equal Distinct +// values are very likely to be equivalent attribute Sets. Distinct value of any // attribute set with the same elements as this, where sets are made unique by // choosing the last value in the input for any given key. func (l *Set) Equivalent() Distinct { - if l == nil || !l.equivalent.Valid() { - return emptySet.equivalent + if l == nil || l.hash == 0 { + return Distinct{hash: emptySet.hash} } - return l.equivalent + return Distinct{hash: l.hash} } // Equals reports whether the argument set is equivalent to this set. func (l *Set) Equals(o *Set) bool { - return l.Equivalent() == o.Equivalent() + if l.Equivalent() != o.Equivalent() { + return false + } + if l == nil || l.hash == 0 { + l = &emptySet + } + if o == nil || o.hash == 0 { + o = &emptySet + } + return l.data == o.data } // Encoded returns the encoded form of this set, according to encoder. @@ -169,12 +201,6 @@ func (l *Set) Encoded(encoder Encoder) string { return encoder.Encode(l.Iter()) } -func empty() Set { - return Set{ - equivalent: emptySet.equivalent, - } -} - // NewSet returns a new Set. See the documentation for // NewSetWithSortableFiltered for more details. // @@ -204,7 +230,7 @@ func NewSetWithSortable(kvs []KeyValue, _ *Sortable) Set { func NewSetWithFiltered(kvs []KeyValue, filter Filter) (Set, []KeyValue) { // Check for empty set. if len(kvs) == 0 { - return empty(), nil + return emptySet, nil } // Stable sort so the following de-duplication can implement @@ -233,10 +259,10 @@ func NewSetWithFiltered(kvs []KeyValue, filter Filter) (Set, []KeyValue) { if filter != nil { if div := filteredToFront(kvs, filter); div != 0 { - return Set{equivalent: computeDistinct(kvs[div:])}, kvs[:div] + return newSet(kvs[div:]), kvs[:div] } } - return Set{equivalent: computeDistinct(kvs)}, nil + return newSet(kvs), nil } // NewSetWithSortableFiltered returns a new Set. @@ -316,7 +342,7 @@ func (l *Set) Filter(re Filter) (Set, []KeyValue) { if first == 0 { // It is safe to assume len(slice) >= 1 given we found at least one // attribute above that needs to be filtered out. - return Set{equivalent: computeDistinct(slice[1:])}, slice[:1] + return newSet(slice[1:]), slice[:1] } // Move the filtered slice[first] to the front (preserving order). @@ -326,25 +352,24 @@ func (l *Set) Filter(re Filter) (Set, []KeyValue) { // Do not re-evaluate re(slice[first+1:]). div := filteredToFront(slice[1:first+1], re) + 1 - return Set{equivalent: computeDistinct(slice[div:])}, slice[:div] + return newSet(slice[div:]), slice[:div] } -// computeDistinct returns a Distinct using either the fixed- or -// reflect-oriented code path, depending on the size of the input. The input -// slice is assumed to already be sorted and de-duplicated. -func computeDistinct(kvs []KeyValue) Distinct { - iface := computeDistinctFixed(kvs) - if iface == nil { - iface = computeDistinctReflect(kvs) +// newSet returns a new set based on the sorted and uniqued kvs. +func newSet(kvs []KeyValue) Set { + s := Set{ + hash: hashKVs(kvs), + data: computeDataFixed(kvs), } - return Distinct{ - iface: iface, + if s.data == nil { + s.data = computeDataReflect(kvs) } + return s } -// computeDistinctFixed computes a Distinct for small slices. It returns nil -// if the input is too large for this code path. -func computeDistinctFixed(kvs []KeyValue) any { +// computeDataFixed computes a Set data for small slices. It returns nil if the +// input is too large for this code path. +func computeDataFixed(kvs []KeyValue) any { switch len(kvs) { case 1: return [1]KeyValue(kvs) @@ -371,9 +396,9 @@ func computeDistinctFixed(kvs []KeyValue) any { } } -// computeDistinctReflect computes a Distinct using reflection, works for any -// size input. -func computeDistinctReflect(kvs []KeyValue) any { +// computeDataReflect computes a Set data using reflection, works for any size +// input. +func computeDataReflect(kvs []KeyValue) any { at := reflect.New(reflect.ArrayOf(len(kvs), keyValueType)).Elem() for i, keyValue := range kvs { *(at.Index(i).Addr().Interface().(*KeyValue)) = keyValue @@ -383,7 +408,7 @@ func computeDistinctReflect(kvs []KeyValue) any { // MarshalJSON returns the JSON encoding of the Set. func (l *Set) MarshalJSON() ([]byte, error) { - return json.Marshal(l.equivalent.iface) + return json.Marshal(l.data) } // MarshalLog is the marshaling function used by the logging system to represent this Set. diff --git a/vendor/go.opentelemetry.io/otel/attribute/type_string.go b/vendor/go.opentelemetry.io/otel/attribute/type_string.go index e584b24776b..24f1fa37dbe 100644 --- a/vendor/go.opentelemetry.io/otel/attribute/type_string.go +++ b/vendor/go.opentelemetry.io/otel/attribute/type_string.go @@ -24,8 +24,9 @@ const _Type_name = "INVALIDBOOLINT64FLOAT64STRINGBOOLSLICEINT64SLICEFLOAT64SLICE var _Type_index = [...]uint8{0, 7, 11, 16, 23, 29, 38, 48, 60, 71} func (i Type) String() string { - if i < 0 || i >= Type(len(_Type_index)-1) { + idx := int(i) - 0 + if i < 0 || idx >= len(_Type_index)-1 { return "Type(" + strconv.FormatInt(int64(i), 10) + ")" } - return _Type_name[_Type_index[i]:_Type_index[i+1]] + return _Type_name[_Type_index[idx]:_Type_index[idx+1]] } diff --git a/vendor/go.opentelemetry.io/otel/baggage/baggage.go b/vendor/go.opentelemetry.io/otel/baggage/baggage.go index f83a448ec61..78e98c4c0f3 100644 --- a/vendor/go.opentelemetry.io/otel/baggage/baggage.go +++ b/vendor/go.opentelemetry.io/otel/baggage/baggage.go @@ -648,7 +648,7 @@ func parsePropertyInternal(s string) (p Property, ok bool) { // If we couldn't find any valid key character, // it means the key is either empty or invalid. if keyStart == keyEnd { - return + return p, ok } // Skip spaces after the key: " key< >= value ". @@ -658,13 +658,13 @@ func parsePropertyInternal(s string) (p Property, ok bool) { // A key can have no value, like: " key ". ok = true p.key = s[keyStart:keyEnd] - return + return p, ok } // If we have not reached the end and we can't find the '=' delimiter, // it means the property is invalid. if s[index] != keyValueDelimiter[0] { - return + return p, ok } // Attempting to parse the value. @@ -690,14 +690,14 @@ func parsePropertyInternal(s string) (p Property, ok bool) { // we have not reached the end, it means the property is // invalid, something like: " key = value value1". if index != len(s) { - return + return p, ok } // Decode a percent-encoded value. rawVal := s[valueStart:valueEnd] unescapeVal, err := url.PathUnescape(rawVal) if err != nil { - return + return p, ok } value := replaceInvalidUTF8Sequences(len(rawVal), unescapeVal) @@ -706,7 +706,7 @@ func parsePropertyInternal(s string) (p Property, ok bool) { p.hasValue = true p.value = value - return + return p, ok } func skipSpace(s string, offset int) int { diff --git a/vendor/go.opentelemetry.io/otel/dependencies.Dockerfile b/vendor/go.opentelemetry.io/otel/dependencies.Dockerfile index a311fbb4835..cadb87cc0ee 100644 --- a/vendor/go.opentelemetry.io/otel/dependencies.Dockerfile +++ b/vendor/go.opentelemetry.io/otel/dependencies.Dockerfile @@ -1,4 +1,4 @@ # This is a renovate-friendly source of Docker images. FROM python:3.13.6-slim-bullseye@sha256:e98b521460ee75bca92175c16247bdf7275637a8faaeb2bcfa19d879ae5c4b9a AS python -FROM otel/weaver:v0.17.1@sha256:32523b5e44fb44418786347e9f7dde187d8797adb6d57a2ee99c245346c3cdfe AS weaver +FROM otel/weaver:v0.19.0@sha256:3d20814cef548f1d31f27f054fb4cd6a05125641a9f7cc29fc7eb234e8052cd9 AS weaver FROM avtodev/markdown-lint:v1@sha256:6aeedc2f49138ce7a1cd0adffc1b1c0321b841dc2102408967d9301c031949ee AS markdown diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform/span.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform/span.go index 379bc8170df..d431fc4517d 100644 --- a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform/span.go +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform/span.go @@ -113,7 +113,7 @@ func span(sd tracesdk.ReadOnlySpan) *tracepb.Span { if psid := sd.Parent().SpanID(); psid.IsValid() { s.ParentSpanId = psid[:] } - s.Flags = buildSpanFlags(sd.Parent()) + s.Flags = buildSpanFlagsWith(sd.SpanContext().TraceFlags(), sd.Parent()) return s } @@ -159,7 +159,7 @@ func links(links []tracesdk.Link) []*tracepb.Span_Link { tid := otLink.SpanContext.TraceID() sid := otLink.SpanContext.SpanID() - flags := buildSpanFlags(otLink.SpanContext) + flags := buildSpanFlagsWith(otLink.SpanContext.TraceFlags(), otLink.SpanContext) sl = append(sl, &tracepb.Span_Link{ TraceId: tid[:], @@ -172,13 +172,15 @@ func links(links []tracesdk.Link) []*tracepb.Span_Link { return sl } -func buildSpanFlags(sc trace.SpanContext) uint32 { - flags := tracepb.SpanFlags_SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK - if sc.IsRemote() { - flags |= tracepb.SpanFlags_SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK +func buildSpanFlagsWith(tf trace.TraceFlags, parent trace.SpanContext) uint32 { + // Lower 8 bits are the W3C TraceFlags; always indicate that we know whether the parent is remote + flags := uint32(tf) | uint32(tracepb.SpanFlags_SPAN_FLAGS_CONTEXT_HAS_IS_REMOTE_MASK) + // Set the parent-is-remote bit when applicable + if parent.IsRemote() { + flags |= uint32(tracepb.SpanFlags_SPAN_FLAGS_CONTEXT_IS_REMOTE_MASK) } - return uint32(flags) // nolint:gosec // Flags is a bitmask and can't be negative + return flags // nolint:gosec // Flags is a bitmask and can't be negative } // spanEvents transforms span Events to an OTLP span events. diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/client.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/client.go index 4b4cc76f4a9..76b7cd461bf 100644 --- a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/client.go +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/client.go @@ -17,9 +17,10 @@ import ( "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" - "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/exporters/otlp/otlptrace" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/counter" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/observ" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/otlpconfig" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/retry" ) @@ -45,6 +46,9 @@ type client struct { conn *grpc.ClientConn tscMu sync.RWMutex tsc coltracepb.TraceServiceClient + + instID int64 + inst *observ.Instrumentation } // Compile time check *client implements otlptrace.Client. @@ -68,6 +72,7 @@ func newClient(opts ...Option) *client { stopCtx: ctx, stopFunc: cancel, conn: cfg.GRPCConn, + instID: counter.NextExporterID(), } if len(cfg.Traces.Headers) > 0 { @@ -92,13 +97,24 @@ func (c *client) Start(context.Context) error { c.conn = conn } + // Initialize the instrumentation if not already done. + // + // Initialize here instead of NewClient to allow any errors to be passed + // back to the caller and so that any setup of the environment variables to + // enable instrumentation can be set via code. + var err error + if c.inst == nil { + target := c.conn.CanonicalTarget() + c.inst, err = observ.NewInstrumentation(c.instID, target) + } + // The otlptrace.Client interface states this method is called just once, // so no need to check if already started. c.tscMu.Lock() c.tsc = coltracepb.NewTraceServiceClient(c.conn) c.tscMu.Unlock() - return nil + return err } var errAlreadyStopped = errors.New("the client is already stopped") @@ -174,7 +190,7 @@ var errShutdown = errors.New("the client is shutdown") // // Retryable errors from the server will be handled according to any // RetryConfig the client was created with. -func (c *client) UploadTraces(ctx context.Context, protoSpans []*tracepb.ResourceSpans) error { +func (c *client) UploadTraces(ctx context.Context, protoSpans []*tracepb.ResourceSpans) (uploadErr error) { // Hold a read lock to ensure a shut down initiated after this starts does // not abandon the export. This read lock acquire has less priority than a // write lock acquire (i.e. Stop), meaning if the client is shutting down @@ -189,6 +205,12 @@ func (c *client) UploadTraces(ctx context.Context, protoSpans []*tracepb.Resourc ctx, cancel := c.exportContext(ctx) defer cancel() + var code codes.Code + if c.inst != nil { + op := c.inst.ExportSpans(ctx, len(protoSpans)) + defer func() { op.End(uploadErr, code) }() + } + return c.requestFunc(ctx, func(iCtx context.Context) error { resp, err := c.tsc.Export(iCtx, &coltracepb.ExportTraceServiceRequest{ ResourceSpans: protoSpans, @@ -197,16 +219,17 @@ func (c *client) UploadTraces(ctx context.Context, protoSpans []*tracepb.Resourc msg := resp.PartialSuccess.GetErrorMessage() n := resp.PartialSuccess.GetRejectedSpans() if n != 0 || msg != "" { - err := internal.TracePartialSuccessError(n, msg) - otel.Handle(err) + e := internal.TracePartialSuccessError(n, msg) + uploadErr = errors.Join(uploadErr, e) } } // nil is converted to OK. - if status.Code(err) == codes.OK { + code = status.Code(err) + if code == codes.OK { // Success. - return nil + return uploadErr } - return err + return errors.Join(uploadErr, err) }) } diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/counter/counter.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/counter/counter.go new file mode 100644 index 00000000000..323b2a2c9a6 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/counter/counter.go @@ -0,0 +1,31 @@ +// Code generated by gotmpl. DO NOT MODIFY. +// source: internal/shared/counter/counter.go.tmpl + +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package counter provides a simple counter for generating unique IDs. +// +// This package is used to generate unique IDs while allowing testing packages +// to reset the counter. +package counter // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/counter" + +import "sync/atomic" + +// exporterN is a global 0-based count of the number of exporters created. +var exporterN atomic.Int64 + +// NextExporterID returns the next unique ID for an exporter. +func NextExporterID() int64 { + const inc = 1 + return exporterN.Add(inc) - inc +} + +// SetExporterID sets the exporter ID counter to v and returns the previous +// value. +// +// This function is useful for testing purposes, allowing you to reset the +// counter. It should not be used in production code. +func SetExporterID(v int64) int64 { + return exporterN.Swap(v) +} diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/gen.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/gen.go index b6e6b10fbf1..7fe9c9f3a33 100644 --- a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/gen.go +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/gen.go @@ -23,3 +23,12 @@ package internal // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/ot //go:generate gotmpl --body=../../../../../internal/shared/otlp/otlptrace/otlptracetest/collector.go.tmpl "--data={}" --out=otlptracetest/collector.go //go:generate gotmpl --body=../../../../../internal/shared/otlp/otlptrace/otlptracetest/data.go.tmpl "--data={}" --out=otlptracetest/data.go //go:generate gotmpl --body=../../../../../internal/shared/otlp/otlptrace/otlptracetest/otlptest.go.tmpl "--data={}" --out=otlptracetest/otlptest.go + +//go:generate gotmpl --body=../../../../../internal/shared/x/x.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc\" }" --out=x/x.go +//go:generate gotmpl --body=../../../../../internal/shared/x/x_test.go.tmpl "--data={}" --out=x/x_test.go + +//go:generate gotmpl --body=../../../../../internal/shared/otlp/observ/target.go.tmpl "--data={ \"pkg\": \"observ\", \"pkg_path\": \"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/observ\" }" --out=observ/target.go +//go:generate gotmpl --body=../../../../../internal/shared/otlp/observ/target_test.go.tmpl "--data={ \"pkg\": \"observ\" }" --out=observ/target_test.go + +//go:generate gotmpl --body=../../../../../internal/shared/counter/counter.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/counter\" }" --out=counter/counter.go +//go:generate gotmpl --body=../../../../../internal/shared/counter/counter_test.go.tmpl "--data={}" --out=counter/counter_test.go diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/observ/doc.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/observ/doc.go new file mode 100644 index 00000000000..0dd54e4b969 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/observ/doc.go @@ -0,0 +1,6 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package observ provides experimental observability instrumentation for the +// otlptracegrpc exporter. +package observ // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/observ" diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/observ/instrumentation.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/observ/instrumentation.go new file mode 100644 index 00000000000..2257fcc865f --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/observ/instrumentation.go @@ -0,0 +1,341 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package observ // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/observ" + +import ( + "context" + "errors" + "fmt" + "sync" + "time" + + "google.golang.org/grpc/codes" + + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/x" + "go.opentelemetry.io/otel/internal/global" + "go.opentelemetry.io/otel/metric" + semconv "go.opentelemetry.io/otel/semconv/v1.37.0" + "go.opentelemetry.io/otel/semconv/v1.37.0/otelconv" +) + +const ( + // ScopeName is the unique name of the meter used for instrumentation. + ScopeName = "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/observ" + + // SchemaURL is the schema URL of the metrics produced by this + // instrumentation. + SchemaURL = semconv.SchemaURL + + // Version is the current version of this instrumentation. + // + // This matches the version of the exporter. + Version = internal.Version +) + +var ( + measureAttrsPool = &sync.Pool{ + New: func() any { + const n = 1 + // component.name + 1 + // component.type + 1 + // server.addr + 1 + // server.port + 1 + // error.type + 1 // rpc.grpc.status_code + s := make([]attribute.KeyValue, 0, n) + // Return a pointer to a slice instead of a slice itself + // to avoid allocations on every call. + return &s + }, + } + + addOptPool = &sync.Pool{ + New: func() any { + const n = 1 // WithAttributeSet + o := make([]metric.AddOption, 0, n) + return &o + }, + } + + recordOptPool = &sync.Pool{ + New: func() any { + const n = 1 // WithAttributeSet + o := make([]metric.RecordOption, 0, n) + return &o + }, + } +) + +func get[T any](p *sync.Pool) *[]T { return p.Get().(*[]T) } + +func put[T any](p *sync.Pool, s *[]T) { + *s = (*s)[:0] // Reset. + p.Put(s) +} + +// ComponentName returns the component name for the exporter with the +// provided ID. +func ComponentName(id int64) string { + t := semconv.OTelComponentTypeOtlpGRPCSpanExporter.Value.AsString() + return fmt.Sprintf("%s/%d", t, id) +} + +// Instrumentation is experimental instrumentation for the exporter. +type Instrumentation struct { + inflightSpans metric.Int64UpDownCounter + exportedSpans metric.Int64Counter + opDuration metric.Float64Histogram + + attrs []attribute.KeyValue + addOpt metric.AddOption + recOpt metric.RecordOption +} + +// NewInstrumentation returns instrumentation for an OTLP over gPRC trace +// exporter with the provided ID using the global MeterProvider. +// +// The id should be the unique exporter instance ID. It is used +// to set the "component.name" attribute. +// +// The target is the endpoint the exporter is exporting to. +// +// If the experimental observability is disabled, nil is returned. +func NewInstrumentation(id int64, target string) (*Instrumentation, error) { + if !x.Observability.Enabled() { + return nil, nil + } + + attrs := BaseAttrs(id, target) + i := &Instrumentation{ + attrs: attrs, + addOpt: metric.WithAttributeSet(attribute.NewSet(attrs...)), + + // Do not modify attrs (NewSet sorts in-place), make a new slice. + recOpt: metric.WithAttributeSet(attribute.NewSet(append( + // Default to OK status code. + []attribute.KeyValue{semconv.RPCGRPCStatusCodeOk}, + attrs..., + )...)), + } + + mp := otel.GetMeterProvider() + m := mp.Meter( + ScopeName, + metric.WithInstrumentationVersion(Version), + metric.WithSchemaURL(SchemaURL), + ) + + var err error + + inflightSpans, e := otelconv.NewSDKExporterSpanInflight(m) + if e != nil { + e = fmt.Errorf("failed to create span inflight metric: %w", e) + err = errors.Join(err, e) + } + i.inflightSpans = inflightSpans.Inst() + + exportedSpans, e := otelconv.NewSDKExporterSpanExported(m) + if e != nil { + e = fmt.Errorf("failed to create span exported metric: %w", e) + err = errors.Join(err, e) + } + i.exportedSpans = exportedSpans.Inst() + + opDuration, e := otelconv.NewSDKExporterOperationDuration(m) + if e != nil { + e = fmt.Errorf("failed to create operation duration metric: %w", e) + err = errors.Join(err, e) + } + i.opDuration = opDuration.Inst() + + return i, err +} + +// BaseAttrs returns the base attributes for the exporter with the provided ID +// and target. +// +// The id should be the unique exporter instance ID. It is used +// to set the "component.name" attribute. +// +// The target is the gRPC target the exporter is exporting to. It is expected +// to be the output of the Client's CanonicalTarget method. +func BaseAttrs(id int64, target string) []attribute.KeyValue { + host, port, err := ParseCanonicalTarget(target) + if err != nil || (host == "" && port < 0) { + if err != nil { + global.Debug("failed to parse target", "target", target, "error", err) + } + return []attribute.KeyValue{ + semconv.OTelComponentName(ComponentName(id)), + semconv.OTelComponentTypeOtlpGRPCSpanExporter, + } + } + + // Do not use append so the slice is exactly allocated. + + if port < 0 { + return []attribute.KeyValue{ + semconv.OTelComponentName(ComponentName(id)), + semconv.OTelComponentTypeOtlpGRPCSpanExporter, + semconv.ServerAddress(host), + } + } + + if host == "" { + return []attribute.KeyValue{ + semconv.OTelComponentName(ComponentName(id)), + semconv.OTelComponentTypeOtlpGRPCSpanExporter, + semconv.ServerPort(port), + } + } + + return []attribute.KeyValue{ + semconv.OTelComponentName(ComponentName(id)), + semconv.OTelComponentTypeOtlpGRPCSpanExporter, + semconv.ServerAddress(host), + semconv.ServerPort(port), + } +} + +// ExportSpans instruments the ExportSpans method of the exporter. It returns +// an [ExportOp] that must have its [ExportOp.End] method called when the +// ExportSpans method returns. +func (i *Instrumentation) ExportSpans(ctx context.Context, nSpans int) ExportOp { + start := time.Now() + + addOpt := get[metric.AddOption](addOptPool) + defer put(addOptPool, addOpt) + *addOpt = append(*addOpt, i.addOpt) + i.inflightSpans.Add(ctx, int64(nSpans), *addOpt...) + + return ExportOp{ + ctx: ctx, + start: start, + nSpans: int64(nSpans), + inst: i, + } +} + +// ExportOp tracks the operation being observed by [Instrumentation.ExportSpans]. +type ExportOp struct { + ctx context.Context + start time.Time + nSpans int64 + + inst *Instrumentation +} + +// End completes the observation of the operation being observed by a call to +// [Instrumentation.ExportSpans]. +// +// Any error that is encountered is provided as err. +// +// If err is not nil, all spans will be recorded as failures unless error is of +// type [internal.PartialSuccess]. In the case of a PartialSuccess, the number +// of successfully exported spans will be determined by inspecting the +// RejectedItems field of the PartialSuccess. +func (e ExportOp) End(err error, code codes.Code) { + addOpt := get[metric.AddOption](addOptPool) + defer put(addOptPool, addOpt) + *addOpt = append(*addOpt, e.inst.addOpt) + + e.inst.inflightSpans.Add(e.ctx, -e.nSpans, *addOpt...) + + success := successful(e.nSpans, err) + // Record successfully exported spans, even if the value is 0 which are + // meaningful to distribution aggregations. + e.inst.exportedSpans.Add(e.ctx, success, *addOpt...) + + if err != nil { + attrs := get[attribute.KeyValue](measureAttrsPool) + defer put(measureAttrsPool, attrs) + *attrs = append(*attrs, e.inst.attrs...) + *attrs = append(*attrs, semconv.ErrorType(err)) + + // Do not inefficiently make a copy of attrs by using + // WithAttributes instead of WithAttributeSet. + o := metric.WithAttributeSet(attribute.NewSet(*attrs...)) + // Reset addOpt with new attribute set. + *addOpt = append((*addOpt)[:0], o) + + e.inst.exportedSpans.Add(e.ctx, e.nSpans-success, *addOpt...) + } + + recOpt := get[metric.RecordOption](recordOptPool) + defer put(recordOptPool, recOpt) + *recOpt = append(*recOpt, e.inst.recordOption(err, code)) + + d := time.Since(e.start).Seconds() + e.inst.opDuration.Record(e.ctx, d, *recOpt...) +} + +// recordOption returns a RecordOption with attributes representing the +// outcome of the operation being recorded. +// +// If err is nil and code is codes.OK, the default recOpt of the +// Instrumentation is returned. +// +// If err is not nil or code is not codes.OK, a new RecordOption is returned +// with the base attributes of the Instrumentation plus the rpc.grpc.status_code +// attribute set to the provided code, and if err is not nil, the error.type +// attribute set to the type of the error. +func (i *Instrumentation) recordOption(err error, code codes.Code) metric.RecordOption { + if err == nil && code == codes.OK { + return i.recOpt + } + + attrs := get[attribute.KeyValue](measureAttrsPool) + defer put(measureAttrsPool, attrs) + *attrs = append(*attrs, i.attrs...) + + c := int64(code) // uint32 -> int64. + *attrs = append(*attrs, semconv.RPCGRPCStatusCodeKey.Int64(c)) + if err != nil { + *attrs = append(*attrs, semconv.ErrorType(err)) + } + + // Do not inefficiently make a copy of attrs by using WithAttributes + // instead of WithAttributeSet. + return metric.WithAttributeSet(attribute.NewSet(*attrs...)) +} + +// successful returns the number of successfully exported spans out of the n +// that were exported based on the provided error. +// +// If err is nil, n is returned. All spans were successfully exported. +// +// If err is not nil and not an [internal.PartialSuccess] error, 0 is returned. +// It is assumed all spans failed to be exported. +// +// If err is an [internal.PartialSuccess] error, the number of successfully +// exported spans is computed by subtracting the RejectedItems field from n. If +// RejectedItems is negative, n is returned. If RejectedItems is greater than +// n, 0 is returned. +func successful(n int64, err error) int64 { + if err == nil { + return n // All spans successfully exported. + } + // Split rejection calculation so successful is inlinable. + return n - rejected(n, err) +} + +var errPartialPool = &sync.Pool{ + New: func() any { return new(internal.PartialSuccess) }, +} + +// rejected returns how many out of the n spans exporter were rejected based on +// the provided non-nil err. +func rejected(n int64, err error) int64 { + ps := errPartialPool.Get().(*internal.PartialSuccess) + defer errPartialPool.Put(ps) + // Check for partial success. + if errors.As(err, ps) { + // Bound RejectedItems to [0, n]. This should not be needed, + // but be defensive as this is from an external source. + return min(max(ps.RejectedItems, 0), n) + } + return n // All spans rejected. +} diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/observ/target.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/observ/target.go new file mode 100644 index 00000000000..34eee27db0d --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/observ/target.go @@ -0,0 +1,143 @@ +// Code generated by gotmpl. DO NOT MODIFY. +// source: internal/shared/otlp/observ/target.go.tmpl + +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package observ // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/observ" + +import ( + "errors" + "fmt" + "net" + "net/netip" + "strconv" + "strings" +) + +const ( + schemeUnix = "unix" + schemeUnixAbstract = "unix-abstract" +) + +// ParseCanonicalTarget parses a target string and returns the extracted host +// (domain address or IP), the target port, or an error. +// +// If no port is specified, -1 is returned. +// +// If no host is specified, an empty string is returned. +// +// The target string is expected to always have the form +// "://[authority]/". For example: +// - "dns:///example.com:42" +// - "dns://8.8.8.8/example.com:42" +// - "unix:///path/to/socket" +// - "unix-abstract:///socket-name" +// - "passthrough:///192.34.2.1:42" +// +// The target is expected to come from the CanonicalTarget method of a gRPC +// Client. +func ParseCanonicalTarget(target string) (string, int, error) { + const sep = "://" + + // Find scheme. Do not allocate the string by using url.Parse. + idx := strings.Index(target, sep) + if idx == -1 { + return "", -1, fmt.Errorf("invalid target %q: missing scheme", target) + } + scheme, endpoint := target[:idx], target[idx+len(sep):] + + // Check for unix schemes. + if scheme == schemeUnix || scheme == schemeUnixAbstract { + return parseUnix(endpoint) + } + + // Strip leading slash and any authority. + if i := strings.Index(endpoint, "/"); i != -1 { + endpoint = endpoint[i+1:] + } + + // DNS, passthrough, and custom resolvers. + return parseEndpoint(endpoint) +} + +// parseUnix parses unix socket targets. +func parseUnix(endpoint string) (string, int, error) { + // Format: unix[-abstract]://path + // + // We should have "/path" (empty authority) if valid. + if len(endpoint) >= 1 && endpoint[0] == '/' { + // Return the full path including leading slash. + return endpoint, -1, nil + } + + // If there's no leading slash, it means there might be an authority + // Check for authority case (should error): "authority/path" + if slashIdx := strings.Index(endpoint, "/"); slashIdx > 0 { + return "", -1, fmt.Errorf("invalid (non-empty) authority: %s", endpoint[:slashIdx]) + } + + return "", -1, errors.New("invalid unix target format") +} + +// parseEndpoint parses an endpoint from a gRPC target. +// +// It supports the following formats: +// - "host" +// - "host%zone" +// - "host:port" +// - "host%zone:port" +// - "ipv4" +// - "ipv4%zone" +// - "ipv4:port" +// - "ipv4%zone:port" +// - "ipv6" +// - "ipv6%zone" +// - "[ipv6]" +// - "[ipv6%zone]" +// - "[ipv6]:port" +// - "[ipv6%zone]:port" +// +// It returns the host or host%zone (domain address or IP), the port (or -1 if +// not specified), or an error if the input is not a valid. +func parseEndpoint(endpoint string) (string, int, error) { + // First check if the endpoint is just an IP address. + if ip := parseIP(endpoint); ip != "" { + return ip, -1, nil + } + + // If there's no colon, there is no port (IPv6 with no port checked above). + if !strings.Contains(endpoint, ":") { + return endpoint, -1, nil + } + + host, portStr, err := net.SplitHostPort(endpoint) + if err != nil { + return "", -1, fmt.Errorf("invalid host:port %q: %w", endpoint, err) + } + + const base, bitSize = 10, 16 + port16, err := strconv.ParseUint(portStr, base, bitSize) + if err != nil { + return "", -1, fmt.Errorf("invalid port %q: %w", portStr, err) + } + port := int(port16) // port is guaranteed to be in the range [0, 65535]. + + return host, port, nil +} + +// parseIP attempts to parse the entire endpoint as an IP address. +// It returns the normalized string form of the IP if successful, +// or an empty string if parsing fails. +func parseIP(ip string) string { + // Strip leading and trailing brackets for IPv6 addresses. + if len(ip) >= 2 && ip[0] == '[' && ip[len(ip)-1] == ']' { + ip = ip[1 : len(ip)-1] + } + addr, err := netip.ParseAddr(ip) + if err != nil { + return "" + } + // Return the normalized string form of the IP. + return addr.String() +} diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/partialsuccess.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/partialsuccess.go index 1c465942336..a811a07b352 100644 --- a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/partialsuccess.go +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/partialsuccess.go @@ -29,6 +29,17 @@ func (ps PartialSuccess) Error() string { return fmt.Sprintf("OTLP partial success: %s (%d %s rejected)", msg, ps.RejectedItems, ps.RejectedKind) } +// As returns true if ps can be assigned to target and makes the assignment. +// Otherwise, it returns false. This supports the errors.As() interface. +func (ps PartialSuccess) As(target any) bool { + t, ok := target.(*PartialSuccess) + if !ok { + return false + } + *t = ps + return true +} + // Is supports the errors.Is() interface. func (ps PartialSuccess) Is(err error) bool { _, ok := err.(PartialSuccess) diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/retry/retry.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/retry/retry.go index 259a898ae77..a7b8e81a786 100644 --- a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/retry/retry.go +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/retry/retry.go @@ -94,6 +94,11 @@ func (c Config) RequestFunc(evaluate EvaluateFunc) RequestFunc { return err } + // Check if context is canceled before attempting to wait and retry. + if ctx.Err() != nil { + return fmt.Errorf("%w: %w", ctx.Err(), err) + } + if maxElapsedTime != 0 && time.Since(startTime) > maxElapsedTime { return fmt.Errorf("max retry time elapsed: %w", err) } diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/version.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/version.go new file mode 100644 index 00000000000..e2d7cee1e17 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/version.go @@ -0,0 +1,8 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package internal // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal" + +// Version is the current release version of the OpenTelemetry OTLP gRPC trace +// exporter in use. +const Version = "1.39.0" diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/internal/x/README.md b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/x/README.md similarity index 54% rename from vendor/go.opentelemetry.io/otel/sdk/trace/internal/x/README.md rename to vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/x/README.md index feec16fa64b..15a3011bff3 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/trace/internal/x/README.md +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/x/README.md @@ -1,33 +1,34 @@ # Experimental Features -The Trace SDK contains features that have not yet stabilized in the OpenTelemetry specification. -These features are added to the OpenTelemetry Go Trace SDK prior to stabilization in the specification so that users can start experimenting with them and provide feedback. +The `otlptracegrpc` exporter contains features that have not yet stabilized in the OpenTelemetry specification. +These features are added to the `otlptracegrpc` exporter prior to stabilization in the specification so that users can start experimenting with them and provide feedback. -These features may change in backwards incompatible ways as feedback is applied. +These feature may change in backwards incompatible ways as feedback is applied. See the [Compatibility and Stability](#compatibility-and-stability) section for more information. ## Features -- [Self-Observability](#self-observability) +- [Observability](#observability) -### Self-Observability +### Observability -The SDK provides a self-observability feature that allows you to monitor the SDK itself. +The `otlptracegrpc` exporter provides a observability feature that allows you to monitor the SDK itself. -To opt-in, set the environment variable `OTEL_GO_X_SELF_OBSERVABILITY` to `true`. +To opt-in, set the environment variable `OTEL_GO_X_OBSERVABILITY` to `true`. When enabled, the SDK will create the following metrics using the global `MeterProvider`: -- `otel.sdk.span.live` -- `otel.sdk.span.started` +- `otel.sdk.exporter.span.inflight` +- `otel.sdk.exporter.span.exported` +- `otel.sdk.exporter.operation.duration` Please see the [Semantic conventions for OpenTelemetry SDK metrics] documentation for more details on these metrics. -[Semantic conventions for OpenTelemetry SDK metrics]: https://github.com/open-telemetry/semantic-conventions/blob/v1.36.0/docs/otel/sdk-metrics.md +[Semantic conventions for OpenTelemetry SDK metrics]: https://github.com/open-telemetry/semantic-conventions/blob/v1.37.0/docs/otel/sdk-metrics.md ## Compatibility and Stability -Experimental features do not fall within the scope of the OpenTelemetry Go versioning and stability [policy](../../../../VERSIONING.md). +Experimental features do not fall within the scope of the OpenTelemetry Go versioning and stability [policy](../../../../../../VERSIONING.md). These features may be removed or modified in successive version releases, including patch versions. When an experimental feature is promoted to a stable feature, a migration path will be included in the changelog entry of the release. diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/x/observ.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/x/observ.go new file mode 100644 index 00000000000..4e89c6524f0 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/x/observ.go @@ -0,0 +1,22 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package x // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/x" + +import "strings" + +// Observability is an experimental feature flag that determines if exporter +// observability metrics are enabled. +// +// To enable this feature set the OTEL_GO_X_OBSERVABILITY environment variable +// to the case-insensitive string value of "true" (i.e. "True" and "TRUE" +// will also enable this). +var Observability = newFeature( + []string{"OBSERVABILITY"}, + func(v string) (string, bool) { + if strings.EqualFold(v, "true") { + return v, true + } + return "", false + }, +) diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/internal/x/x.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/x/x.go similarity index 55% rename from vendor/go.opentelemetry.io/otel/sdk/trace/internal/x/x.go rename to vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/x/x.go index 2fcbbcc66ec..741ba62c97f 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/trace/internal/x/x.go +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/x/x.go @@ -1,45 +1,38 @@ +// Code generated by gotmpl. DO NOT MODIFY. +// source: internal/shared/x/x.go.tmpl + // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -// Package x documents experimental features for [go.opentelemetry.io/otel/sdk/trace]. -package x // import "go.opentelemetry.io/otel/sdk/trace/internal/x" +// Package x documents experimental features for [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc]. +package x // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/x" import ( "os" - "strings" ) -// SelfObservability is an experimental feature flag that determines if SDK -// self-observability metrics are enabled. -// -// To enable this feature set the OTEL_GO_X_SELF_OBSERVABILITY environment variable -// to the case-insensitive string value of "true" (i.e. "True" and "TRUE" -// will also enable this). -var SelfObservability = newFeature("SELF_OBSERVABILITY", func(v string) (string, bool) { - if strings.EqualFold(v, "true") { - return v, true - } - return "", false -}) - // Feature is an experimental feature control flag. It provides a uniform way // to interact with these feature flags and parse their values. type Feature[T any] struct { - key string + keys []string parse func(v string) (T, bool) } -func newFeature[T any](suffix string, parse func(string) (T, bool)) Feature[T] { +func newFeature[T any](suffix []string, parse func(string) (T, bool)) Feature[T] { const envKeyRoot = "OTEL_GO_X_" + keys := make([]string, 0, len(suffix)) + for _, s := range suffix { + keys = append(keys, envKeyRoot+s) + } return Feature[T]{ - key: envKeyRoot + suffix, + keys: keys, parse: parse, } } -// Key returns the environment variable key that needs to be set to enable the +// Keys returns the environment variable keys that can be set to enable the // feature. -func (f Feature[T]) Key() string { return f.key } +func (f Feature[T]) Keys() []string { return f.keys } // Lookup returns the user configured value for the feature and true if the // user has enabled the feature. Otherwise, if the feature is not enabled, a @@ -49,11 +42,13 @@ func (f Feature[T]) Lookup() (v T, ok bool) { // // > The SDK MUST interpret an empty value of an environment variable the // > same way as when the variable is unset. - vRaw := os.Getenv(f.key) - if vRaw == "" { - return v, ok + for _, key := range f.keys { + vRaw := os.Getenv(key) + if vRaw != "" { + return f.parse(vRaw) + } } - return f.parse(vRaw) + return v, ok } // Enabled reports whether the feature is enabled. diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/client.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/client.go index c7b1a551498..d0688c2016f 100644 --- a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/client.go +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/client.go @@ -22,9 +22,10 @@ import ( tracepb "go.opentelemetry.io/proto/otlp/trace/v1" "google.golang.org/protobuf/proto" - "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/exporters/otlp/otlptrace" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/counter" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/observ" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/otlpconfig" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/retry" ) @@ -63,6 +64,9 @@ type client struct { client *http.Client stopCh chan struct{} stopOnce sync.Once + + instID int64 + inst *observ.Instrumentation } var _ otlptrace.Client = (*client)(nil) @@ -100,18 +104,29 @@ func NewClient(opts ...Option) otlptrace.Client { requestFunc: cfg.RetryConfig.RequestFunc(evaluate), stopCh: stopCh, client: httpClient, + instID: counter.NextExporterID(), } } // Start does nothing in a HTTP client. -func (*client) Start(ctx context.Context) error { +func (c *client) Start(ctx context.Context) error { + // Initialize the instrumentation if not already done. + // + // Initialize here instead of NewClient to allow any errors to be passed + // back to the caller and so that any setup of the environment variables to + // enable instrumentation can be set via code. + var err error + if c.inst == nil { + c.inst, err = observ.NewInstrumentation(c.instID, c.cfg.Endpoint) + } + // nothing to do select { case <-ctx.Done(): - return ctx.Err() + err = errors.Join(err, ctx.Err()) default: } - return nil + return err } // Stop shuts down the client and interrupt any in-flight request. @@ -128,7 +143,7 @@ func (d *client) Stop(ctx context.Context) error { } // UploadTraces sends a batch of spans to the collector. -func (d *client) UploadTraces(ctx context.Context, protoSpans []*tracepb.ResourceSpans) error { +func (d *client) UploadTraces(ctx context.Context, protoSpans []*tracepb.ResourceSpans) (uploadErr error) { pbRequest := &coltracepb.ExportTraceServiceRequest{ ResourceSpans: protoSpans, } @@ -145,7 +160,13 @@ func (d *client) UploadTraces(ctx context.Context, protoSpans []*tracepb.Resourc return err } - return d.requestFunc(ctx, func(ctx context.Context) error { + var statusCode int + if d.inst != nil { + op := d.inst.ExportSpans(ctx, len(protoSpans)) + defer func() { op.End(uploadErr, statusCode) }() + } + + return errors.Join(uploadErr, d.requestFunc(ctx, func(ctx context.Context) error { select { case <-ctx.Done(): return ctx.Err() @@ -165,12 +186,13 @@ func (d *client) UploadTraces(ctx context.Context, protoSpans []*tracepb.Resourc if resp != nil && resp.Body != nil { defer func() { if err := resp.Body.Close(); err != nil { - otel.Handle(err) + uploadErr = errors.Join(uploadErr, err) } }() } - if sc := resp.StatusCode; sc >= 200 && sc <= 299 { + statusCode = resp.StatusCode + if statusCode >= 200 && statusCode <= 299 { // Success, do not retry. // Read the partial success message, if any. var respData bytes.Buffer @@ -192,7 +214,7 @@ func (d *client) UploadTraces(ctx context.Context, protoSpans []*tracepb.Resourc n := respProto.PartialSuccess.GetRejectedSpans() if n != 0 || msg != "" { err := internal.TracePartialSuccessError(n, msg) - otel.Handle(err) + uploadErr = errors.Join(uploadErr, err) } } } @@ -214,7 +236,7 @@ func (d *client) UploadTraces(ctx context.Context, protoSpans []*tracepb.Resourc } bodyErr := fmt.Errorf("body: %s", respStr) - switch resp.StatusCode { + switch statusCode { case http.StatusTooManyRequests, http.StatusBadGateway, http.StatusServiceUnavailable, @@ -225,7 +247,7 @@ func (d *client) UploadTraces(ctx context.Context, protoSpans []*tracepb.Resourc // Non-retryable failure. return fmt.Errorf("failed to send to %s: %s (%w)", request.URL, resp.Status, bodyErr) } - }) + })) } func (d *client) newRequest(body []byte) (request, error) { diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/counter/counter.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/counter/counter.go new file mode 100644 index 00000000000..75e5c0c7ed3 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/counter/counter.go @@ -0,0 +1,31 @@ +// Code generated by gotmpl. DO NOT MODIFY. +// source: internal/shared/counter/counter.go.tmpl + +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package counter provides a simple counter for generating unique IDs. +// +// This package is used to generate unique IDs while allowing testing packages +// to reset the counter. +package counter // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/counter" + +import "sync/atomic" + +// exporterN is a global 0-based count of the number of exporters created. +var exporterN atomic.Int64 + +// NextExporterID returns the next unique ID for an exporter. +func NextExporterID() int64 { + const inc = 1 + return exporterN.Add(inc) - inc +} + +// SetExporterID sets the exporter ID counter to v and returns the previous +// value. +// +// This function is useful for testing purposes, allowing you to reset the +// counter. It should not be used in production code. +func SetExporterID(v int64) int64 { + return exporterN.Swap(v) +} diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/gen.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/gen.go index 3d344dc85ee..ca387432fd5 100644 --- a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/gen.go +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/gen.go @@ -23,3 +23,9 @@ package internal // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/ot //go:generate gotmpl --body=../../../../../internal/shared/otlp/otlptrace/otlptracetest/collector.go.tmpl "--data={}" --out=otlptracetest/collector.go //go:generate gotmpl --body=../../../../../internal/shared/otlp/otlptrace/otlptracetest/data.go.tmpl "--data={}" --out=otlptracetest/data.go //go:generate gotmpl --body=../../../../../internal/shared/otlp/otlptrace/otlptracetest/otlptest.go.tmpl "--data={}" --out=otlptracetest/otlptest.go + +//go:generate gotmpl --body=../../../../../internal/shared/x/x.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp\" }" --out=x/x.go + +//go:generate gotmpl --body=../../../../../internal/shared/counter/counter.go.tmpl "--data={ \"pkg\": \"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/counter\" }" --out=counter/counter.go +//go:generate gotmpl --body=../../../../../internal/shared/counter/counter_test.go.tmpl "--data={}" --out=counter/counter_test.go +//go:generate gotmpl --body=../../../../../internal/shared/x/x_test.go.tmpl "--data={}" --out=x/x_test.go diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/observ/instrumentation.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/observ/instrumentation.go new file mode 100644 index 00000000000..326ef0f8799 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/observ/instrumentation.go @@ -0,0 +1,397 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package observ provides experimental observability instrumentation for the +// otlptracehttp exporter. +package observ // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/observ" + +import ( + "context" + "errors" + "fmt" + "net" + "net/http" + "net/netip" + "strconv" + "strings" + "sync" + "time" + + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal" + "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/x" + "go.opentelemetry.io/otel/internal/global" + "go.opentelemetry.io/otel/metric" + semconv "go.opentelemetry.io/otel/semconv/v1.37.0" + "go.opentelemetry.io/otel/semconv/v1.37.0/otelconv" +) + +const ( + // ScopeName is the unique name of the meter used for instrumentation. + ScopeName = "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/observ" + + // SchemaURL is the schema URL of the metrics produced by this + // instrumentation. + SchemaURL = semconv.SchemaURL + + // Version is the current version of this instrumentation. + // + // This matches the version of the exporter. + Version = internal.Version +) + +var ( + measureAttrsPool = &sync.Pool{ + New: func() any { + const n = 1 + // component.name + 1 + // component.type + 1 + // server.addr + 1 + // server.port + 1 + // error.type + 1 // http.response.status_code + s := make([]attribute.KeyValue, 0, n) + // Return a pointer to a slice instead of a slice itself + // to avoid allocations on every call. + return &s + }, + } + + addOptPool = &sync.Pool{ + New: func() any { + const n = 1 // WithAttributeSet + o := make([]metric.AddOption, 0, n) + return &o + }, + } + + recordOptPool = &sync.Pool{ + New: func() any { + const n = 1 // WithAttributeSet + o := make([]metric.RecordOption, 0, n) + return &o + }, + } +) + +func get[T any](p *sync.Pool) *[]T { return p.Get().(*[]T) } + +func put[T any](p *sync.Pool, s *[]T) { + *s = (*s)[:0] // Reset. + p.Put(s) +} + +// ComponentName returns the component name for the exporter with the +// provided ID. +func ComponentName(id int64) string { + t := semconv.OTelComponentTypeOtlpHTTPSpanExporter.Value.AsString() + return fmt.Sprintf("%s/%d", t, id) +} + +// Instrumentation is experimental instrumentation for the exporter. +type Instrumentation struct { + inflightSpans metric.Int64UpDownCounter + exportedSpans metric.Int64Counter + opDuration metric.Float64Histogram + + attrs []attribute.KeyValue + addOpt metric.AddOption + recOpt metric.RecordOption +} + +// NewInstrumentation returns instrumentation for an OTLP over HTTP trace +// exporter with the provided ID and endpoint. It uses the global +// MeterProvider to create the instrumentation. +// +// The id should be the unique exporter instance ID. It is used +// to set the "component.name" attribute. +// +// The endpoint is the HTTP endpoint the exporter is exporting to. +// +// If the experimental observability is disabled, nil is returned. +func NewInstrumentation(id int64, endpoint string) (*Instrumentation, error) { + if !x.Observability.Enabled() { + return nil, nil + } + + attrs := BaseAttrs(id, endpoint) + i := &Instrumentation{ + attrs: attrs, + addOpt: metric.WithAttributeSet(attribute.NewSet(attrs...)), + + // Do not modify attrs (NewSet sorts in-place), make a new slice. + recOpt: metric.WithAttributeSet(attribute.NewSet(append( + // Default to OK status code (200). + []attribute.KeyValue{semconv.HTTPResponseStatusCode(http.StatusOK)}, + attrs..., + )...)), + } + + mp := otel.GetMeterProvider() + m := mp.Meter( + ScopeName, + metric.WithInstrumentationVersion(Version), + metric.WithSchemaURL(SchemaURL), + ) + + var err error + + inflightSpans, e := otelconv.NewSDKExporterSpanInflight(m) + if e != nil { + e = fmt.Errorf("failed to create span inflight metric: %w", e) + err = errors.Join(err, e) + } + i.inflightSpans = inflightSpans.Inst() + + exportedSpans, e := otelconv.NewSDKExporterSpanExported(m) + if e != nil { + e = fmt.Errorf("failed to create span exported metric: %w", e) + err = errors.Join(err, e) + } + i.exportedSpans = exportedSpans.Inst() + + opDuration, e := otelconv.NewSDKExporterOperationDuration(m) + if e != nil { + e = fmt.Errorf("failed to create operation duration metric: %w", e) + err = errors.Join(err, e) + } + i.opDuration = opDuration.Inst() + + return i, err +} + +// BaseAttrs returns the base attributes for the exporter with the provided ID +// and endpoint. +// +// The id should be the unique exporter instance ID. It is used +// to set the "component.name" attribute. +// +// The endpoint is the HTTP endpoint the exporter is exporting to. It should be +// in the format "host:port" or a full URL. +func BaseAttrs(id int64, endpoint string) []attribute.KeyValue { + host, port, err := parseEndpoint(endpoint) + if err != nil || (host == "" && port < 0) { + if err != nil { + global.Debug("failed to parse endpoint", "endpoint", endpoint, "error", err) + } + return []attribute.KeyValue{ + semconv.OTelComponentName(ComponentName(id)), + semconv.OTelComponentTypeOtlpHTTPSpanExporter, + } + } + + // Do not use append so the slice is exactly allocated. + + if port < 0 { + return []attribute.KeyValue{ + semconv.OTelComponentName(ComponentName(id)), + semconv.OTelComponentTypeOtlpHTTPSpanExporter, + semconv.ServerAddress(host), + } + } + + if host == "" { + return []attribute.KeyValue{ + semconv.OTelComponentName(ComponentName(id)), + semconv.OTelComponentTypeOtlpHTTPSpanExporter, + semconv.ServerPort(port), + } + } + + return []attribute.KeyValue{ + semconv.OTelComponentName(ComponentName(id)), + semconv.OTelComponentTypeOtlpHTTPSpanExporter, + semconv.ServerAddress(host), + semconv.ServerPort(port), + } +} + +// parseEndpoint parses the host and port from endpoint that has the form +// "host[:port]", or it returns an error if the endpoint is not parsable. +// +// If no port is specified, -1 is returned. +// +// If no host is specified, an empty string is returned. +func parseEndpoint(endpoint string) (string, int, error) { + // First check if the endpoint is just an IP address. + if ip := parseIP(endpoint); ip != "" { + return ip, -1, nil + } + + // If there's no colon, there is no port (IPv6 with no port checked above). + if !strings.Contains(endpoint, ":") { + return endpoint, -1, nil + } + + // Otherwise, parse as host:port. + host, portStr, err := net.SplitHostPort(endpoint) + if err != nil { + return "", -1, fmt.Errorf("invalid host:port %q: %w", endpoint, err) + } + + const base, bitSize = 10, 16 + port16, err := strconv.ParseUint(portStr, base, bitSize) + if err != nil { + return "", -1, fmt.Errorf("invalid port %q: %w", portStr, err) + } + port := int(port16) // port is guaranteed to be in the range [0, 65535]. + + return host, port, nil +} + +// parseIP attempts to parse the entire endpoint as an IP address. +// It returns the normalized string form of the IP if successful, +// or an empty string if parsing fails. +func parseIP(ip string) string { + // Strip leading and trailing brackets for IPv6 addresses. + if len(ip) >= 2 && ip[0] == '[' && ip[len(ip)-1] == ']' { + ip = ip[1 : len(ip)-1] + } + addr, err := netip.ParseAddr(ip) + if err != nil { + return "" + } + // Return the normalized string form of the IP. + return addr.String() +} + +// ExportSpans instruments the UploadTraces method of the client. It returns an +// [ExportOp] that must have its [ExportOp.End] method called when the +// operation end. +func (i *Instrumentation) ExportSpans(ctx context.Context, nSpans int) ExportOp { + start := time.Now() + + addOpt := get[metric.AddOption](addOptPool) + defer put(addOptPool, addOpt) + *addOpt = append(*addOpt, i.addOpt) + i.inflightSpans.Add(ctx, int64(nSpans), *addOpt...) + + return ExportOp{ + ctx: ctx, + start: start, + nSpans: int64(nSpans), + inst: i, + } +} + +// ExportOp tracks the export operation being observed by +// [Instrumentation.ExportSpans]. +type ExportOp struct { + ctx context.Context + start time.Time + nSpans int64 + + inst *Instrumentation +} + +// End completes the observation of the operation being observed by a call to +// [Instrumentation.ExportSpans]. +// +// Any error that is encountered is provided as err. +// The HTTP status code from the response is provided as status. +// +// If err is not nil, all spans will be recorded as failures unless error is of +// type [internal.PartialSuccess]. In the case of a PartialSuccess, the number +// of successfully exported spans will be determined by inspecting the +// RejectedItems field of the PartialSuccess. +func (e ExportOp) End(err error, status int) { + addOpt := get[metric.AddOption](addOptPool) + defer put(addOptPool, addOpt) + *addOpt = append(*addOpt, e.inst.addOpt) + + e.inst.inflightSpans.Add(e.ctx, -e.nSpans, *addOpt...) + + success := successful(e.nSpans, err) + // Record successfully exported spans, even if the value is 0 which are + // meaningful to distribution aggregations. + e.inst.exportedSpans.Add(e.ctx, success, *addOpt...) + + if err != nil { + attrs := get[attribute.KeyValue](measureAttrsPool) + defer put(measureAttrsPool, attrs) + *attrs = append(*attrs, e.inst.attrs...) + *attrs = append(*attrs, semconv.ErrorType(err)) + + // Do not inefficiently make a copy of attrs by using + // WithAttributes instead of WithAttributeSet. + o := metric.WithAttributeSet(attribute.NewSet(*attrs...)) + // Reset addOpt with new attribute set. + *addOpt = append((*addOpt)[:0], o) + + e.inst.exportedSpans.Add(e.ctx, e.nSpans-success, *addOpt...) + } + + recOpt := get[metric.RecordOption](recordOptPool) + defer put(recordOptPool, recOpt) + *recOpt = append(*recOpt, e.inst.recordOption(err, status)) + + d := time.Since(e.start).Seconds() + e.inst.opDuration.Record(e.ctx, d, *recOpt...) +} + +// recordOption returns a RecordOption with attributes representing the +// outcome of the operation being recorded. +// +// If err is nil and status is 200, the default recOpt of the +// Instrumentation is returned. +// +// Otherwise, a new RecordOption is returned with the base attributes of the +// Instrumentation plus the http.response.status_code attribute set to the +// provided status, and if err is not nil, the error.type attribute set +// to the type of the error. +func (i *Instrumentation) recordOption(err error, status int) metric.RecordOption { + if err == nil && status == http.StatusOK { + return i.recOpt + } + + attrs := get[attribute.KeyValue](measureAttrsPool) + defer put(measureAttrsPool, attrs) + *attrs = append(*attrs, i.attrs...) + + *attrs = append(*attrs, semconv.HTTPResponseStatusCode(status)) + if err != nil { + *attrs = append(*attrs, semconv.ErrorType(err)) + } + + // Do not inefficiently make a copy of attrs by using WithAttributes + // instead of WithAttributeSet. + return metric.WithAttributeSet(attribute.NewSet(*attrs...)) +} + +// successful returns the number of successfully exported spans out of the n +// that were exported based on the provided error. +// +// If err is nil, n is returned. All spans were successfully exported. +// +// If err is not nil and not an [internal.PartialSuccess] error, 0 is returned. +// It is assumed all spans failed to be exported. +// +// If err is an [internal.PartialSuccess] error, the number of successfully +// exported spans is computed by subtracting the RejectedItems field from n. If +// RejectedItems is negative, n is returned. If RejectedItems is greater than +// n, 0 is returned. +func successful(n int64, err error) int64 { + if err == nil { + return n // All spans successfully exported. + } + // Split rejection calculation so successful is inlinable. + return n - rejected(n, err) +} + +var errPartialPool = &sync.Pool{ + New: func() any { return new(internal.PartialSuccess) }, +} + +// rejected returns how many out of the n spans exporter were rejected based on +// the provided non-nil err. +func rejected(n int64, err error) int64 { + ps := errPartialPool.Get().(*internal.PartialSuccess) + defer errPartialPool.Put(ps) + // Check for partial success. + if errors.As(err, ps) { + // Bound RejectedItems to [0, n]. This should not be needed, + // but be defensive as this is from an external source. + return min(max(ps.RejectedItems, 0), n) + } + return n // All spans rejected. +} diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/partialsuccess.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/partialsuccess.go index 418e66428ae..33ff6c02438 100644 --- a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/partialsuccess.go +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/partialsuccess.go @@ -29,6 +29,17 @@ func (ps PartialSuccess) Error() string { return fmt.Sprintf("OTLP partial success: %s (%d %s rejected)", msg, ps.RejectedItems, ps.RejectedKind) } +// As returns true if ps can be assigned to target and makes the assignment. +// Otherwise, it returns false. This supports the errors.As() interface. +func (ps PartialSuccess) As(target any) bool { + t, ok := target.(*PartialSuccess) + if !ok { + return false + } + *t = ps + return true +} + // Is supports the errors.Is() interface. func (ps PartialSuccess) Is(err error) bool { _, ok := err.(PartialSuccess) diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/retry/retry.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/retry/retry.go index 107428fa6cf..bf39808254f 100644 --- a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/retry/retry.go +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/retry/retry.go @@ -94,6 +94,11 @@ func (c Config) RequestFunc(evaluate EvaluateFunc) RequestFunc { return err } + // Check if context is canceled before attempting to wait and retry. + if ctx.Err() != nil { + return fmt.Errorf("%w: %w", ctx.Err(), err) + } + if maxElapsedTime != 0 && time.Since(startTime) > maxElapsedTime { return fmt.Errorf("max retry time elapsed: %w", err) } diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/version.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/version.go new file mode 100644 index 00000000000..cbd6e63230b --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/version.go @@ -0,0 +1,8 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package internal // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal" + +// Version is the current release version of the OpenTelemetry OTLP HTTP trace +// exporter in use. +const Version = "1.39.0" diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/x/observ.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/x/observ.go new file mode 100644 index 00000000000..ecae4a79cac --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/x/observ.go @@ -0,0 +1,22 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package x // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/x" + +import "strings" + +// Observability is an experimental feature flag that determines if exporter +// observability metrics are enabled. +// +// To enable this feature set the OTEL_GO_X_OBSERVABILITY environment variable +// to the case-insensitive string value of "true" (i.e. "True" and "TRUE" +// will also enable this). +var Observability = newFeature( + []string{"OBSERVABILITY"}, + func(v string) (string, bool) { + if strings.EqualFold(v, "true") { + return v, true + } + return "", false + }, +) diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/x/x.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/x/x.go new file mode 100644 index 00000000000..099dab00710 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/x/x.go @@ -0,0 +1,58 @@ +// Code generated by gotmpl. DO NOT MODIFY. +// source: internal/shared/x/x.go.tmpl + +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package x documents experimental features for [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp]. +package x // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/x" + +import ( + "os" +) + +// Feature is an experimental feature control flag. It provides a uniform way +// to interact with these feature flags and parse their values. +type Feature[T any] struct { + keys []string + parse func(v string) (T, bool) +} + +func newFeature[T any](suffix []string, parse func(string) (T, bool)) Feature[T] { + const envKeyRoot = "OTEL_GO_X_" + keys := make([]string, 0, len(suffix)) + for _, s := range suffix { + keys = append(keys, envKeyRoot+s) + } + return Feature[T]{ + keys: keys, + parse: parse, + } +} + +// Keys returns the environment variable keys that can be set to enable the +// feature. +func (f Feature[T]) Keys() []string { return f.keys } + +// Lookup returns the user configured value for the feature and true if the +// user has enabled the feature. Otherwise, if the feature is not enabled, a +// zero-value and false are returned. +func (f Feature[T]) Lookup() (v T, ok bool) { + // https://github.com/open-telemetry/opentelemetry-specification/blob/62effed618589a0bec416a87e559c0a9d96289bb/specification/configuration/sdk-environment-variables.md#parsing-empty-value + // + // > The SDK MUST interpret an empty value of an environment variable the + // > same way as when the variable is unset. + for _, key := range f.keys { + vRaw := os.Getenv(key) + if vRaw != "" { + return f.parse(vRaw) + } + } + return v, ok +} + +// Enabled reports whether the feature is enabled. +func (f Feature[T]) Enabled() bool { + _, ok := f.Lookup() + return ok +} diff --git a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/version.go b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/version.go index 3b79c1a0b5c..6838f3c4e3f 100644 --- a/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/version.go +++ b/vendor/go.opentelemetry.io/otel/exporters/otlp/otlptrace/version.go @@ -5,5 +5,5 @@ package otlptrace // import "go.opentelemetry.io/otel/exporters/otlp/otlptrace" // Version is the current release version of the OpenTelemetry OTLP trace exporter in use. func Version() string { - return "1.38.0" + return "1.39.0" } diff --git a/vendor/go.opentelemetry.io/otel/internal/global/meter.go b/vendor/go.opentelemetry.io/otel/internal/global/meter.go index adb37b5b0e7..6db969f73c7 100644 --- a/vendor/go.opentelemetry.io/otel/internal/global/meter.go +++ b/vendor/go.opentelemetry.io/otel/internal/global/meter.go @@ -105,7 +105,7 @@ type delegatedInstrument interface { setDelegate(metric.Meter) } -// instID are the identifying properties of a instrument. +// instID are the identifying properties of an instrument. type instID struct { // name is the name of the stream. name string diff --git a/vendor/go.opentelemetry.io/otel/metric.go b/vendor/go.opentelemetry.io/otel/metric.go index 1e6473b32f3..527d9aec86b 100644 --- a/vendor/go.opentelemetry.io/otel/metric.go +++ b/vendor/go.opentelemetry.io/otel/metric.go @@ -11,7 +11,7 @@ import ( // Meter returns a Meter from the global MeterProvider. The name must be the // name of the library providing instrumentation. This name may be the same as // the instrumented code only if that code provides built-in instrumentation. -// If the name is empty, then a implementation defined default name will be +// If the name is empty, then an implementation defined default name will be // used instead. // // If this is called before a global MeterProvider is registered the returned diff --git a/vendor/go.opentelemetry.io/otel/metric/config.go b/vendor/go.opentelemetry.io/otel/metric/config.go index d9e3b13e4d1..e42dd6e70ab 100644 --- a/vendor/go.opentelemetry.io/otel/metric/config.go +++ b/vendor/go.opentelemetry.io/otel/metric/config.go @@ -3,7 +3,11 @@ package metric // import "go.opentelemetry.io/otel/metric" -import "go.opentelemetry.io/otel/attribute" +import ( + "slices" + + "go.opentelemetry.io/otel/attribute" +) // MeterConfig contains options for Meters. type MeterConfig struct { @@ -62,12 +66,38 @@ func WithInstrumentationVersion(version string) MeterOption { }) } -// WithInstrumentationAttributes sets the instrumentation attributes. +// WithInstrumentationAttributes adds the instrumentation attributes. +// +// This is equivalent to calling [WithInstrumentationAttributeSet] with an +// [attribute.Set] created from a clone of the passed attributes. +// [WithInstrumentationAttributeSet] is recommended for more control. // -// The passed attributes will be de-duplicated. +// If multiple [WithInstrumentationAttributes] or [WithInstrumentationAttributeSet] +// options are passed, the attributes will be merged together in the order +// they are passed. Attributes with duplicate keys will use the last value passed. func WithInstrumentationAttributes(attr ...attribute.KeyValue) MeterOption { + set := attribute.NewSet(slices.Clone(attr)...) + return WithInstrumentationAttributeSet(set) +} + +// WithInstrumentationAttributeSet adds the instrumentation attributes. +// +// If multiple [WithInstrumentationAttributes] or [WithInstrumentationAttributeSet] +// options are passed, the attributes will be merged together in the order +// they are passed. Attributes with duplicate keys will use the last value passed. +func WithInstrumentationAttributeSet(set attribute.Set) MeterOption { + if set.Len() == 0 { + return meterOptionFunc(func(config MeterConfig) MeterConfig { + return config + }) + } + return meterOptionFunc(func(config MeterConfig) MeterConfig { - config.attrs = attribute.NewSet(attr...) + if config.attrs.Len() == 0 { + config.attrs = set + } else { + config.attrs = mergeSets(config.attrs, set) + } return config }) } diff --git a/vendor/go.opentelemetry.io/otel/propagation/trace_context.go b/vendor/go.opentelemetry.io/otel/propagation/trace_context.go index 6692d2665d2..271ab71f1ae 100644 --- a/vendor/go.opentelemetry.io/otel/propagation/trace_context.go +++ b/vendor/go.opentelemetry.io/otel/propagation/trace_context.go @@ -111,7 +111,7 @@ func (TraceContext) extract(carrier TextMapCarrier) trace.SpanContext { } // Clear all flags other than the trace-context supported sampling bit. - scc.TraceFlags = trace.TraceFlags(opts[0]) & trace.FlagsSampled + scc.TraceFlags = trace.TraceFlags(opts[0]) & trace.FlagsSampled // nolint:gosec // slice size already checked. // Ignore the error returned here. Failure to parse tracestate MUST NOT // affect the parsing of traceparent according to the W3C tracecontext diff --git a/vendor/go.opentelemetry.io/otel/sdk/internal/x/features.go b/vendor/go.opentelemetry.io/otel/sdk/internal/x/features.go new file mode 100644 index 00000000000..bfeb73e811b --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/sdk/internal/x/features.go @@ -0,0 +1,39 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package x documents experimental features for [go.opentelemetry.io/otel/sdk]. +package x // import "go.opentelemetry.io/otel/sdk/internal/x" + +import "strings" + +// Resource is an experimental feature flag that defines if resource detectors +// should be included experimental semantic conventions. +// +// To enable this feature set the OTEL_GO_X_RESOURCE environment variable +// to the case-insensitive string value of "true" (i.e. "True" and "TRUE" +// will also enable this). +var Resource = newFeature( + []string{"RESOURCE"}, + func(v string) (string, bool) { + if strings.EqualFold(v, "true") { + return v, true + } + return "", false + }, +) + +// Observability is an experimental feature flag that determines if SDK +// observability metrics are enabled. +// +// To enable this feature set the OTEL_GO_X_OBSERVABILITY environment variable +// to the case-insensitive string value of "true" (i.e. "True" and "TRUE" +// will also enable this). +var Observability = newFeature( + []string{"OBSERVABILITY", "SELF_OBSERVABILITY"}, + func(v string) (string, bool) { + if strings.EqualFold(v, "true") { + return v, true + } + return "", false + }, +) diff --git a/vendor/go.opentelemetry.io/otel/sdk/internal/x/x.go b/vendor/go.opentelemetry.io/otel/sdk/internal/x/x.go index 1be472e917a..13347e56052 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/internal/x/x.go +++ b/vendor/go.opentelemetry.io/otel/sdk/internal/x/x.go @@ -1,48 +1,38 @@ +// Code generated by gotmpl. DO NOT MODIFY. +// source: internal/shared/x/x.go.tmpl + // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -// Package x contains support for OTel SDK experimental features. -// -// This package should only be used for features defined in the specification. -// It should not be used for experiments or new project ideas. +// Package x documents experimental features for [go.opentelemetry.io/otel/sdk]. package x // import "go.opentelemetry.io/otel/sdk/internal/x" import ( "os" - "strings" ) -// Resource is an experimental feature flag that defines if resource detectors -// should be included experimental semantic conventions. -// -// To enable this feature set the OTEL_GO_X_RESOURCE environment variable -// to the case-insensitive string value of "true" (i.e. "True" and "TRUE" -// will also enable this). -var Resource = newFeature("RESOURCE", func(v string) (string, bool) { - if strings.EqualFold(v, "true") { - return v, true - } - return "", false -}) - // Feature is an experimental feature control flag. It provides a uniform way // to interact with these feature flags and parse their values. type Feature[T any] struct { - key string + keys []string parse func(v string) (T, bool) } -func newFeature[T any](suffix string, parse func(string) (T, bool)) Feature[T] { +func newFeature[T any](suffix []string, parse func(string) (T, bool)) Feature[T] { const envKeyRoot = "OTEL_GO_X_" + keys := make([]string, 0, len(suffix)) + for _, s := range suffix { + keys = append(keys, envKeyRoot+s) + } return Feature[T]{ - key: envKeyRoot + suffix, + keys: keys, parse: parse, } } -// Key returns the environment variable key that needs to be set to enable the +// Keys returns the environment variable keys that can be set to enable the // feature. -func (f Feature[T]) Key() string { return f.key } +func (f Feature[T]) Keys() []string { return f.keys } // Lookup returns the user configured value for the feature and true if the // user has enabled the feature. Otherwise, if the feature is not enabled, a @@ -52,11 +42,13 @@ func (f Feature[T]) Lookup() (v T, ok bool) { // // > The SDK MUST interpret an empty value of an environment variable the // > same way as when the variable is unset. - vRaw := os.Getenv(f.key) - if vRaw == "" { - return v, ok + for _, key := range f.keys { + vRaw := os.Getenv(key) + if vRaw != "" { + return f.parse(vRaw) + } } - return f.parse(vRaw) + return v, ok } // Enabled reports whether the feature is enabled. diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/doc.go b/vendor/go.opentelemetry.io/otel/sdk/metric/doc.go index 0f3b9d623f7..dd75eefac1f 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/metric/doc.go +++ b/vendor/go.opentelemetry.io/otel/sdk/metric/doc.go @@ -63,6 +63,22 @@ // issues for databases that cannot handle high cardinality. // - A too low of a limit causes loss of attribute detail as more data falls into overflow. // +// # Ordering and Collection Guarantees +// +// For performance reasons, the SDK does not guarantee that the order in which +// synchronous measurements are made to the SDK is reflected in the collected +// metric data. This means that even when a single goroutine makes sequential +// synchronous measurements, it is possible for a later measurement to be +// included in the collected metric data when an earlier measurement is not. +// This applies to measurements made to different instruments, or to different +// attribute sets on the same instrument. Sequential measurements made to the +// same instrument and with the same attributes are guaranteed to preserve +// ordering with respect to collection. +// +// Additionally, the SDK does not guarantee that exemplars are always included +// in the same batch of metric data as the measurement they are associated +// with. +// // See [go.opentelemetry.io/otel/metric] for more information about // the metric API. // diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/fixed_size_reservoir.go b/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/fixed_size_reservoir.go index 08e8f68fe73..453278a0c38 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/fixed_size_reservoir.go +++ b/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/fixed_size_reservoir.go @@ -7,9 +7,11 @@ import ( "context" "math" "math/rand/v2" + "sync" "time" "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/sdk/metric/internal/reservoir" ) // FixedSizeReservoirProvider returns a provider of [FixedSizeReservoir]. @@ -34,7 +36,9 @@ var _ Reservoir = &FixedSizeReservoir{} // If there are more than k, the Reservoir will then randomly sample all // additional measurement with a decreasing probability. type FixedSizeReservoir struct { + reservoir.ConcurrentSafe *storage + mu sync.Mutex // count is the number of measurement seen. count int64 @@ -123,12 +127,14 @@ func (r *FixedSizeReservoir) Offer(ctx context.Context, t time.Time, n Value, a // https://github.com/MrAlias/reservoir-sampling for a performance // comparison of reservoir sampling algorithms. - if int(r.count) < cap(r.store) { - r.store[r.count] = newMeasurement(ctx, t, n, a) + r.mu.Lock() + defer r.mu.Unlock() + if int(r.count) < cap(r.measurements) { + r.store(int(r.count), newMeasurement(ctx, t, n, a)) } else if r.count == r.next { // Overwrite a random existing measurement with the one offered. - idx := int(rand.Int64N(int64(cap(r.store)))) - r.store[idx] = newMeasurement(ctx, t, n, a) + idx := int(rand.Int64N(int64(cap(r.measurements)))) + r.store(idx, newMeasurement(ctx, t, n, a)) r.advance() } r.count++ @@ -139,7 +145,7 @@ func (r *FixedSizeReservoir) reset() { // This resets the number of exemplars known. r.count = 0 // Random index inserts should only happen after the storage is full. - r.next = int64(cap(r.store)) + r.next = int64(cap(r.measurements)) // Initial random number in the series used to generate r.next. // @@ -150,7 +156,7 @@ func (r *FixedSizeReservoir) reset() { // This maps the uniform random number in (0,1) to a geometric distribution // over the same interval. The mean of the distribution is inversely // proportional to the storage capacity. - r.w = math.Exp(math.Log(r.randomFloat64()) / float64(cap(r.store))) + r.w = math.Exp(math.Log(r.randomFloat64()) / float64(cap(r.measurements))) r.advance() } @@ -170,7 +176,7 @@ func (r *FixedSizeReservoir) advance() { // therefore the next r.w will be based on the same distribution (i.e. // `max(u_1,u_2,...,u_k)`). Therefore, we can sample the next r.w by // computing the next random number `u` and take r.w as `w * u^(1/k)`. - r.w *= math.Exp(math.Log(r.randomFloat64()) / float64(cap(r.store))) + r.w *= math.Exp(math.Log(r.randomFloat64()) / float64(cap(r.measurements))) // Use the new random number in the series to calculate the count of the // next measurement that will be stored. // @@ -188,6 +194,8 @@ func (r *FixedSizeReservoir) advance() { // // The Reservoir state is preserved after this call. func (r *FixedSizeReservoir) Collect(dest *[]Exemplar) { + r.mu.Lock() + defer r.mu.Unlock() r.storage.Collect(dest) // Call reset here even though it will reset r.count and restart the random // number series. This will persist any old exemplars as long as no new diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/histogram_reservoir.go b/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/histogram_reservoir.go index decab613e77..60c871a4432 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/histogram_reservoir.go +++ b/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/histogram_reservoir.go @@ -7,9 +7,11 @@ import ( "context" "slices" "sort" + "sync" "time" "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/sdk/metric/internal/reservoir" ) // HistogramReservoirProvider is a provider of [HistogramReservoir]. @@ -39,7 +41,9 @@ var _ Reservoir = &HistogramReservoir{} // falls within a histogram bucket. The histogram bucket upper-boundaries are // define by bounds. type HistogramReservoir struct { + reservoir.ConcurrentSafe *storage + mu sync.Mutex // bounds are bucket bounds in ascending order. bounds []float64 @@ -57,14 +61,29 @@ type HistogramReservoir struct { // parameters are the value and dropped (filtered) attributes of the // measurement respectively. func (r *HistogramReservoir) Offer(ctx context.Context, t time.Time, v Value, a []attribute.KeyValue) { - var x float64 + var n float64 switch v.Type() { case Int64ValueType: - x = float64(v.Int64()) + n = float64(v.Int64()) case Float64ValueType: - x = v.Float64() + n = v.Float64() default: panic("unknown value type") } - r.store[sort.SearchFloat64s(r.bounds, x)] = newMeasurement(ctx, t, v, a) + + idx := sort.SearchFloat64s(r.bounds, n) + m := newMeasurement(ctx, t, v, a) + + r.mu.Lock() + defer r.mu.Unlock() + r.store(idx, m) +} + +// Collect returns all the held exemplars. +// +// The Reservoir state is preserved after this call. +func (r *HistogramReservoir) Collect(dest *[]Exemplar) { + r.mu.Lock() + defer r.mu.Unlock() + r.storage.Collect(dest) } diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/storage.go b/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/storage.go index 0e2e26dfb18..16b61c07dec 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/storage.go +++ b/vendor/go.opentelemetry.io/otel/sdk/metric/exemplar/storage.go @@ -13,24 +13,28 @@ import ( // storage is an exemplar storage for [Reservoir] implementations. type storage struct { - // store are the measurements sampled. + // measurements are the measurements sampled. // // This does not use []metricdata.Exemplar because it potentially would // require an allocation for trace and span IDs in the hot path of Offer. - store []measurement + measurements []measurement } func newStorage(n int) *storage { - return &storage{store: make([]measurement, n)} + return &storage{measurements: make([]measurement, n)} +} + +func (r *storage) store(idx int, m measurement) { + r.measurements[idx] = m } // Collect returns all the held exemplars. // // The Reservoir state is preserved after this call. func (r *storage) Collect(dest *[]Exemplar) { - *dest = reset(*dest, len(r.store), len(r.store)) + *dest = reset(*dest, len(r.measurements), len(r.measurements)) var n int - for _, m := range r.store { + for _, m := range r.measurements { if !m.valid { continue } diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/instrumentkind_string.go b/vendor/go.opentelemetry.io/otel/sdk/metric/instrumentkind_string.go index 25ea6244e57..e0558cb634d 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/metric/instrumentkind_string.go +++ b/vendor/go.opentelemetry.io/otel/sdk/metric/instrumentkind_string.go @@ -23,8 +23,9 @@ const _InstrumentKind_name = "instrumentKindUndefinedCounterUpDownCounterHistogr var _InstrumentKind_index = [...]uint8{0, 23, 30, 43, 52, 69, 92, 107, 112} func (i InstrumentKind) String() string { - if i >= InstrumentKind(len(_InstrumentKind_index)-1) { + idx := int(i) - 0 + if i < 0 || idx >= len(_InstrumentKind_index)-1 { return "InstrumentKind(" + strconv.FormatInt(int64(i), 10) + ")" } - return _InstrumentKind_name[_InstrumentKind_index[i]:_InstrumentKind_index[i+1]] + return _InstrumentKind_name[_InstrumentKind_index[idx]:_InstrumentKind_index[idx+1]] } diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/aggregate.go b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/aggregate.go index 0321da68150..2b60410801b 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/aggregate.go +++ b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/aggregate.go @@ -110,12 +110,13 @@ func (b Builder[N]) PrecomputedSum(monotonic bool) (Measure[N], ComputeAggregati // Sum returns a sum aggregate function input and output. func (b Builder[N]) Sum(monotonic bool) (Measure[N], ComputeAggregation) { - s := newSum[N](monotonic, b.AggregationLimit, b.resFunc()) switch b.Temporality { case metricdata.DeltaTemporality: - return b.filter(s.measure), s.delta + s := newDeltaSum[N](monotonic, b.AggregationLimit, b.resFunc()) + return b.filter(s.measure), s.collect default: - return b.filter(s.measure), s.cumulative + s := newCumulativeSum[N](monotonic, b.AggregationLimit, b.resFunc()) + return b.filter(s.measure), s.collect } } diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/atomic.go b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/atomic.go new file mode 100644 index 00000000000..0fa6d3c6fa8 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/atomic.go @@ -0,0 +1,184 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package aggregate // import "go.opentelemetry.io/otel/sdk/metric/internal/aggregate" + +import ( + "math" + "runtime" + "sync" + "sync/atomic" + + "go.opentelemetry.io/otel/attribute" +) + +// atomicCounter is an efficient way of adding to a number which is either an +// int64 or float64. It is designed to be efficient when adding whole +// numbers, regardless of whether N is an int64 or float64. +// +// Inspired by the Prometheus counter implementation: +// https://github.com/prometheus/client_golang/blob/14ccb93091c00f86b85af7753100aa372d63602b/prometheus/counter.go#L108 +type atomicCounter[N int64 | float64] struct { + // nFloatBits contains only the non-integer portion of the counter. + nFloatBits atomic.Uint64 + // nInt contains only the integer portion of the counter. + nInt atomic.Int64 +} + +// load returns the current value. The caller must ensure all calls to add have +// returned prior to calling load. +func (n *atomicCounter[N]) load() N { + fval := math.Float64frombits(n.nFloatBits.Load()) + ival := n.nInt.Load() + return N(fval + float64(ival)) +} + +func (n *atomicCounter[N]) add(value N) { + ival := int64(value) + // This case is where the value is an int, or if it is a whole-numbered float. + if float64(ival) == float64(value) { + n.nInt.Add(ival) + return + } + + // Value must be a float below. + for { + oldBits := n.nFloatBits.Load() + newBits := math.Float64bits(math.Float64frombits(oldBits) + float64(value)) + if n.nFloatBits.CompareAndSwap(oldBits, newBits) { + return + } + } +} + +// hotColdWaitGroup is a synchronization primitive which enables lockless +// writes for concurrent writers and enables a reader to acquire exclusive +// access to a snapshot of state including only completed operations. +// Conceptually, it can be thought of as a "hot" wait group, +// and a "cold" wait group, with the ability for the reader to atomically swap +// the hot and cold wait groups, and wait for the now-cold wait group to +// complete. +// +// Inspired by the prometheus/client_golang histogram implementation: +// https://github.com/prometheus/client_golang/blob/a974e0d45e0aa54c65492559114894314d8a2447/prometheus/histogram.go#L725 +// +// Usage: +// +// var hcwg hotColdWaitGroup +// var data [2]any +// +// func write() { +// hotIdx := hcwg.start() +// defer hcwg.done(hotIdx) +// // modify data without locking +// data[hotIdx].update() +// } +// +// func read() { +// coldIdx := hcwg.swapHotAndWait() +// // read data now that all writes to the cold data have completed. +// data[coldIdx].read() +// } +type hotColdWaitGroup struct { + // startedCountAndHotIdx contains a 63-bit counter in the lower bits, + // and a 1 bit hot index to denote which of the two data-points new + // measurements to write to. These are contained together so that read() + // can atomically swap the hot bit, reset the started writes to zero, and + // read the number writes that were started prior to the hot bit being + // swapped. + startedCountAndHotIdx atomic.Uint64 + // endedCounts is the number of writes that have completed to each + // dataPoint. + endedCounts [2]atomic.Uint64 +} + +// start returns the hot index that the writer should write to. The returned +// hot index is 0 or 1. The caller must call done(hot index) after it finishes +// its operation. start() is safe to call concurrently with other methods. +func (l *hotColdWaitGroup) start() uint64 { + // We increment h.startedCountAndHotIdx so that the counter in the lower + // 63 bits gets incremented. At the same time, we get the new value + // back, which we can use to return the currently-hot index. + return l.startedCountAndHotIdx.Add(1) >> 63 +} + +// done signals to the reader that an operation has fully completed. +// done is safe to call concurrently. +func (l *hotColdWaitGroup) done(hotIdx uint64) { + l.endedCounts[hotIdx].Add(1) +} + +// swapHotAndWait swaps the hot bit, waits for all start() calls to be done(), +// and then returns the now-cold index for the reader to read from. The +// returned index is 0 or 1. swapHotAndWait must not be called concurrently. +func (l *hotColdWaitGroup) swapHotAndWait() uint64 { + n := l.startedCountAndHotIdx.Load() + coldIdx := (^n) >> 63 + // Swap the hot and cold index while resetting the started measurements + // count to zero. + n = l.startedCountAndHotIdx.Swap((coldIdx << 63)) + hotIdx := n >> 63 + startedCount := n & ((1 << 63) - 1) + // Wait for all measurements to the previously-hot map to finish. + for startedCount != l.endedCounts[hotIdx].Load() { + runtime.Gosched() // Let measurements complete. + } + // reset the number of ended operations + l.endedCounts[hotIdx].Store(0) + return hotIdx +} + +// limitedSyncMap is a sync.Map which enforces the aggregation limit on +// attribute sets and provides a Len() function. +type limitedSyncMap struct { + sync.Map + aggLimit int + len int + lenMux sync.Mutex +} + +func (m *limitedSyncMap) LoadOrStoreAttr(fltrAttr attribute.Set, newValue func(attribute.Set) any) any { + actual, loaded := m.Load(fltrAttr.Equivalent()) + if loaded { + return actual + } + // If the overflow set exists, assume we have already overflowed and don't + // bother with the slow path below. + actual, loaded = m.Load(overflowSet.Equivalent()) + if loaded { + return actual + } + // Slow path: add a new attribute set. + m.lenMux.Lock() + defer m.lenMux.Unlock() + + // re-fetch now that we hold the lock to ensure we don't use the overflow + // set unless we are sure the attribute set isn't being written + // concurrently. + actual, loaded = m.Load(fltrAttr.Equivalent()) + if loaded { + return actual + } + + if m.aggLimit > 0 && m.len >= m.aggLimit-1 { + fltrAttr = overflowSet + } + actual, loaded = m.LoadOrStore(fltrAttr.Equivalent(), newValue(fltrAttr)) + if !loaded { + m.len++ + } + return actual +} + +func (m *limitedSyncMap) Clear() { + m.lenMux.Lock() + defer m.lenMux.Unlock() + m.len = 0 + m.Map.Clear() +} + +func (m *limitedSyncMap) Len() int { + m.lenMux.Lock() + defer m.lenMux.Unlock() + return m.len +} diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/exponential_histogram.go b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/exponential_histogram.go index 857eddf305f..5b3a19c067d 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/exponential_histogram.go +++ b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/exponential_histogram.go @@ -301,7 +301,7 @@ func newExponentialHistogram[N int64 | float64]( maxScale: maxScale, newRes: r, - limit: newLimiter[*expoHistogramDataPoint[N]](limit), + limit: newLimiter[expoHistogramDataPoint[N]](limit), values: make(map[attribute.Distinct]*expoHistogramDataPoint[N]), start: now(), @@ -317,7 +317,7 @@ type expoHistogram[N int64 | float64] struct { maxScale int32 newRes func(attribute.Set) FilteredExemplarReservoir[N] - limit limiter[*expoHistogramDataPoint[N]] + limit limiter[expoHistogramDataPoint[N]] values map[attribute.Distinct]*expoHistogramDataPoint[N] valuesMu sync.Mutex @@ -338,13 +338,18 @@ func (e *expoHistogram[N]) measure( e.valuesMu.Lock() defer e.valuesMu.Unlock() - attr := e.limit.Attributes(fltrAttr, e.values) - v, ok := e.values[attr.Equivalent()] + v, ok := e.values[fltrAttr.Equivalent()] if !ok { - v = newExpoHistogramDataPoint[N](attr, e.maxSize, e.maxScale, e.noMinMax, e.noSum) - v.res = e.newRes(attr) - - e.values[attr.Equivalent()] = v + fltrAttr = e.limit.Attributes(fltrAttr, e.values) + // If we overflowed, make sure we add to the existing overflow series + // if it already exists. + v, ok = e.values[fltrAttr.Equivalent()] + if !ok { + v = newExpoHistogramDataPoint[N](fltrAttr, e.maxSize, e.maxScale, e.noMinMax, e.noSum) + v.res = e.newRes(fltrAttr) + + e.values[fltrAttr.Equivalent()] = v + } } v.record(value) v.res.Offer(ctx, value, droppedAttr) diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/filtered_reservoir.go b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/filtered_reservoir.go index d4c41642d79..e4f9409bc80 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/filtered_reservoir.go +++ b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/filtered_reservoir.go @@ -5,10 +5,12 @@ package aggregate // import "go.opentelemetry.io/otel/sdk/metric/internal/aggreg import ( "context" + "sync" "time" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/sdk/metric/exemplar" + "go.opentelemetry.io/otel/sdk/metric/internal/reservoir" ) // FilteredExemplarReservoir wraps a [exemplar.Reservoir] with a filter. @@ -29,6 +31,11 @@ type FilteredExemplarReservoir[N int64 | float64] interface { type filteredExemplarReservoir[N int64 | float64] struct { filter exemplar.Filter reservoir exemplar.Reservoir + // The exemplar.Reservoir is not required to be concurrent safe, but + // implementations can indicate that they are concurrent-safe by embedding + // reservoir.ConcurrentSafe in order to improve performance. + reservoirMux sync.Mutex + concurrentSafe bool } // NewFilteredExemplarReservoir creates a [FilteredExemplarReservoir] which only offers values @@ -37,17 +44,30 @@ func NewFilteredExemplarReservoir[N int64 | float64]( f exemplar.Filter, r exemplar.Reservoir, ) FilteredExemplarReservoir[N] { + _, concurrentSafe := r.(reservoir.ConcurrentSafe) return &filteredExemplarReservoir[N]{ - filter: f, - reservoir: r, + filter: f, + reservoir: r, + concurrentSafe: concurrentSafe, } } func (f *filteredExemplarReservoir[N]) Offer(ctx context.Context, val N, attr []attribute.KeyValue) { if f.filter(ctx) { // only record the current time if we are sampling this measurement. - f.reservoir.Offer(ctx, time.Now(), exemplar.NewValue(val), attr) + ts := time.Now() + if !f.concurrentSafe { + f.reservoirMux.Lock() + defer f.reservoirMux.Unlock() + } + f.reservoir.Offer(ctx, ts, exemplar.NewValue(val), attr) } } -func (f *filteredExemplarReservoir[N]) Collect(dest *[]exemplar.Exemplar) { f.reservoir.Collect(dest) } +func (f *filteredExemplarReservoir[N]) Collect(dest *[]exemplar.Exemplar) { + if !f.concurrentSafe { + f.reservoirMux.Lock() + defer f.reservoirMux.Unlock() + } + f.reservoir.Collect(dest) +} diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/histogram.go b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/histogram.go index 736287e736f..a094519cf6d 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/histogram.go +++ b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/histogram.go @@ -31,9 +31,12 @@ func newBuckets[N int64 | float64](attrs attribute.Set, n int) *buckets[N] { func (b *buckets[N]) sum(value N) { b.total += value } -func (b *buckets[N]) bin(idx int, value N) { +func (b *buckets[N]) bin(idx int) { b.counts[idx]++ b.count++ +} + +func (b *buckets[N]) minMax(value N) { if value < b.min { b.min = value } else if value > b.max { @@ -44,18 +47,19 @@ func (b *buckets[N]) bin(idx int, value N) { // histValues summarizes a set of measurements as an histValues with // explicitly defined buckets. type histValues[N int64 | float64] struct { - noSum bool - bounds []float64 + noMinMax bool + noSum bool + bounds []float64 newRes func(attribute.Set) FilteredExemplarReservoir[N] - limit limiter[*buckets[N]] + limit limiter[buckets[N]] values map[attribute.Distinct]*buckets[N] valuesMu sync.Mutex } func newHistValues[N int64 | float64]( bounds []float64, - noSum bool, + noMinMax, noSum bool, limit int, r func(attribute.Set) FilteredExemplarReservoir[N], ) *histValues[N] { @@ -66,11 +70,12 @@ func newHistValues[N int64 | float64]( b := slices.Clone(bounds) slices.Sort(b) return &histValues[N]{ - noSum: noSum, - bounds: b, - newRes: r, - limit: newLimiter[*buckets[N]](limit), - values: make(map[attribute.Distinct]*buckets[N]), + noMinMax: noMinMax, + noSum: noSum, + bounds: b, + newRes: r, + limit: newLimiter[buckets[N]](limit), + values: make(map[attribute.Distinct]*buckets[N]), } } @@ -92,24 +97,32 @@ func (s *histValues[N]) measure( s.valuesMu.Lock() defer s.valuesMu.Unlock() - attr := s.limit.Attributes(fltrAttr, s.values) - b, ok := s.values[attr.Equivalent()] + b, ok := s.values[fltrAttr.Equivalent()] if !ok { - // N+1 buckets. For example: - // - // bounds = [0, 5, 10] - // - // Then, - // - // buckets = (-∞, 0], (0, 5.0], (5.0, 10.0], (10.0, +∞) - b = newBuckets[N](attr, len(s.bounds)+1) - b.res = s.newRes(attr) - - // Ensure min and max are recorded values (not zero), for new buckets. - b.min, b.max = value, value - s.values[attr.Equivalent()] = b + fltrAttr = s.limit.Attributes(fltrAttr, s.values) + // If we overflowed, make sure we add to the existing overflow series + // if it already exists. + b, ok = s.values[fltrAttr.Equivalent()] + if !ok { + // N+1 buckets. For example: + // + // bounds = [0, 5, 10] + // + // Then, + // + // buckets = (-∞, 0], (0, 5.0], (5.0, 10.0], (10.0, +∞) + b = newBuckets[N](fltrAttr, len(s.bounds)+1) + b.res = s.newRes(fltrAttr) + + // Ensure min and max are recorded values (not zero), for new buckets. + b.min, b.max = value, value + s.values[fltrAttr.Equivalent()] = b + } + } + b.bin(idx) + if !s.noMinMax { + b.minMax(value) } - b.bin(idx, value) if !s.noSum { b.sum(value) } @@ -125,8 +138,7 @@ func newHistogram[N int64 | float64]( r func(attribute.Set) FilteredExemplarReservoir[N], ) *histogram[N] { return &histogram[N]{ - histValues: newHistValues[N](boundaries, noSum, limit, r), - noMinMax: noMinMax, + histValues: newHistValues[N](boundaries, noMinMax, noSum, limit, r), start: now(), } } @@ -136,8 +148,7 @@ func newHistogram[N int64 | float64]( type histogram[N int64 | float64] struct { *histValues[N] - noMinMax bool - start time.Time + start time.Time } func (s *histogram[N]) delta( diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/lastvalue.go b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/lastvalue.go index 4bbe624c77c..3e2ed741505 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/lastvalue.go +++ b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/lastvalue.go @@ -23,7 +23,7 @@ func newLastValue[N int64 | float64](limit int, r func(attribute.Set) FilteredEx return &lastValue[N]{ newRes: r, limit: newLimiter[datapoint[N]](limit), - values: make(map[attribute.Distinct]datapoint[N]), + values: make(map[attribute.Distinct]*datapoint[N]), start: now(), } } @@ -34,7 +34,7 @@ type lastValue[N int64 | float64] struct { newRes func(attribute.Set) FilteredExemplarReservoir[N] limit limiter[datapoint[N]] - values map[attribute.Distinct]datapoint[N] + values map[attribute.Distinct]*datapoint[N] start time.Time } @@ -42,17 +42,19 @@ func (s *lastValue[N]) measure(ctx context.Context, value N, fltrAttr attribute. s.Lock() defer s.Unlock() - attr := s.limit.Attributes(fltrAttr, s.values) - d, ok := s.values[attr.Equivalent()] + d, ok := s.values[fltrAttr.Equivalent()] if !ok { - d.res = s.newRes(attr) + fltrAttr = s.limit.Attributes(fltrAttr, s.values) + d = &datapoint[N]{ + res: s.newRes(fltrAttr), + attrs: fltrAttr, + } } - d.attrs = attr d.value = value d.res.Offer(ctx, value, droppedAttr) - s.values[attr.Equivalent()] = d + s.values[fltrAttr.Equivalent()] = d } func (s *lastValue[N]) delta( diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/limit.go b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/limit.go index 9ea0251edd7..c19a1aff68f 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/limit.go +++ b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/limit.go @@ -30,7 +30,7 @@ func newLimiter[V any](aggregation int) limiter[V] { // aggregation cardinality limit for the existing measurements. If it will, // overflowSet is returned. Otherwise, if it will not exceed the limit, or the // limit is not set (limit <= 0), attr is returned. -func (l limiter[V]) Attributes(attrs attribute.Set, measurements map[attribute.Distinct]V) attribute.Set { +func (l limiter[V]) Attributes(attrs attribute.Set, measurements map[attribute.Distinct]*V) attribute.Set { if l.aggLimit > 0 { _, exists := measurements[attrs.Equivalent()] if !exists && len(measurements) >= l.aggLimit-1 { diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/sum.go b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/sum.go index 1b4b2304c0b..81690855114 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/sum.go +++ b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/aggregate/sum.go @@ -5,7 +5,6 @@ package aggregate // import "go.opentelemetry.io/otel/sdk/metric/internal/aggreg import ( "context" - "sync" "time" "go.opentelemetry.io/otel/attribute" @@ -13,64 +12,75 @@ import ( ) type sumValue[N int64 | float64] struct { - n N + n atomicCounter[N] res FilteredExemplarReservoir[N] attrs attribute.Set } -// valueMap is the storage for sums. type valueMap[N int64 | float64] struct { - sync.Mutex + values limitedSyncMap newRes func(attribute.Set) FilteredExemplarReservoir[N] - limit limiter[sumValue[N]] - values map[attribute.Distinct]sumValue[N] } -func newValueMap[N int64 | float64](limit int, r func(attribute.Set) FilteredExemplarReservoir[N]) *valueMap[N] { - return &valueMap[N]{ - newRes: r, - limit: newLimiter[sumValue[N]](limit), - values: make(map[attribute.Distinct]sumValue[N]), - } -} - -func (s *valueMap[N]) measure(ctx context.Context, value N, fltrAttr attribute.Set, droppedAttr []attribute.KeyValue) { - s.Lock() - defer s.Unlock() - - attr := s.limit.Attributes(fltrAttr, s.values) - v, ok := s.values[attr.Equivalent()] - if !ok { - v.res = s.newRes(attr) - } - - v.attrs = attr - v.n += value - v.res.Offer(ctx, value, droppedAttr) - - s.values[attr.Equivalent()] = v +func (s *valueMap[N]) measure( + ctx context.Context, + value N, + fltrAttr attribute.Set, + droppedAttr []attribute.KeyValue, +) { + sv := s.values.LoadOrStoreAttr(fltrAttr, func(attr attribute.Set) any { + return &sumValue[N]{ + res: s.newRes(attr), + attrs: attr, + } + }).(*sumValue[N]) + sv.n.add(value) + // It is possible for collection to race with measurement and observe the + // exemplar in the batch of metrics after the add() for cumulative sums. + // This is an accepted tradeoff to avoid locking during measurement. + sv.res.Offer(ctx, value, droppedAttr) } -// newSum returns an aggregator that summarizes a set of measurements as their -// arithmetic sum. Each sum is scoped by attributes and the aggregation cycle -// the measurements were made in. -func newSum[N int64 | float64](monotonic bool, limit int, r func(attribute.Set) FilteredExemplarReservoir[N]) *sum[N] { - return &sum[N]{ - valueMap: newValueMap[N](limit, r), +// newDeltaSum returns an aggregator that summarizes a set of measurements as +// their arithmetic sum. Each sum is scoped by attributes and the aggregation +// cycle the measurements were made in. +func newDeltaSum[N int64 | float64]( + monotonic bool, + limit int, + r func(attribute.Set) FilteredExemplarReservoir[N], +) *deltaSum[N] { + return &deltaSum[N]{ monotonic: monotonic, start: now(), + hotColdValMap: [2]valueMap[N]{ + { + values: limitedSyncMap{aggLimit: limit}, + newRes: r, + }, + { + values: limitedSyncMap{aggLimit: limit}, + newRes: r, + }, + }, } } -// sum summarizes a set of measurements made as their arithmetic sum. -type sum[N int64 | float64] struct { - *valueMap[N] - +// deltaSum is the storage for sums which resets every collection interval. +type deltaSum[N int64 | float64] struct { monotonic bool start time.Time + + hcwg hotColdWaitGroup + hotColdValMap [2]valueMap[N] +} + +func (s *deltaSum[N]) measure(ctx context.Context, value N, fltrAttr attribute.Set, droppedAttr []attribute.KeyValue) { + hotIdx := s.hcwg.start() + defer s.hcwg.done(hotIdx) + s.hotColdValMap[hotIdx].measure(ctx, value, fltrAttr, droppedAttr) } -func (s *sum[N]) delta( +func (s *deltaSum[N]) collect( dest *metricdata.Aggregation, //nolint:gocritic // The pointer is needed for the ComputeAggregation interface ) int { t := now() @@ -81,33 +91,61 @@ func (s *sum[N]) delta( sData.Temporality = metricdata.DeltaTemporality sData.IsMonotonic = s.monotonic - s.Lock() - defer s.Unlock() - - n := len(s.values) + // delta always clears values on collection + readIdx := s.hcwg.swapHotAndWait() + // The len will not change while we iterate over values, since we waited + // for all writes to finish to the cold values and len. + n := s.hotColdValMap[readIdx].values.Len() dPts := reset(sData.DataPoints, n, n) var i int - for _, val := range s.values { + s.hotColdValMap[readIdx].values.Range(func(_, value any) bool { + val := value.(*sumValue[N]) + collectExemplars(&dPts[i].Exemplars, val.res.Collect) dPts[i].Attributes = val.attrs dPts[i].StartTime = s.start dPts[i].Time = t - dPts[i].Value = val.n - collectExemplars(&dPts[i].Exemplars, val.res.Collect) + dPts[i].Value = val.n.load() i++ - } - // Do not report stale values. - clear(s.values) + return true + }) + s.hotColdValMap[readIdx].values.Clear() // The delta collection cycle resets. s.start = t sData.DataPoints = dPts *dest = sData - return n + return i +} + +// newCumulativeSum returns an aggregator that summarizes a set of measurements +// as their arithmetic sum. Each sum is scoped by attributes and the +// aggregation cycle the measurements were made in. +func newCumulativeSum[N int64 | float64]( + monotonic bool, + limit int, + r func(attribute.Set) FilteredExemplarReservoir[N], +) *cumulativeSum[N] { + return &cumulativeSum[N]{ + monotonic: monotonic, + start: now(), + valueMap: valueMap[N]{ + values: limitedSyncMap{aggLimit: limit}, + newRes: r, + }, + } } -func (s *sum[N]) cumulative( +// deltaSum is the storage for sums which never reset. +type cumulativeSum[N int64 | float64] struct { + monotonic bool + start time.Time + + valueMap[N] +} + +func (s *cumulativeSum[N]) collect( dest *metricdata.Aggregation, //nolint:gocritic // The pointer is needed for the ComputeAggregation interface ) int { t := now() @@ -118,30 +156,33 @@ func (s *sum[N]) cumulative( sData.Temporality = metricdata.CumulativeTemporality sData.IsMonotonic = s.monotonic - s.Lock() - defer s.Unlock() - - n := len(s.values) - dPts := reset(sData.DataPoints, n, n) + // Values are being concurrently written while we iterate, so only use the + // current length for capacity. + dPts := reset(sData.DataPoints, 0, s.values.Len()) var i int - for _, value := range s.values { - dPts[i].Attributes = value.attrs - dPts[i].StartTime = s.start - dPts[i].Time = t - dPts[i].Value = value.n - collectExemplars(&dPts[i].Exemplars, value.res.Collect) + s.values.Range(func(_, value any) bool { + val := value.(*sumValue[N]) + newPt := metricdata.DataPoint[N]{ + Attributes: val.attrs, + StartTime: s.start, + Time: t, + Value: val.n.load(), + } + collectExemplars(&newPt.Exemplars, val.res.Collect) + dPts = append(dPts, newPt) // TODO (#3006): This will use an unbounded amount of memory if there // are unbounded number of attribute sets being aggregated. Attribute // sets that become "stale" need to be forgotten so this will not // overload the system. i++ - } + return true + }) sData.DataPoints = dPts *dest = sData - return n + return i } // newPrecomputedSum returns an aggregator that summarizes a set of @@ -153,27 +194,22 @@ func newPrecomputedSum[N int64 | float64]( r func(attribute.Set) FilteredExemplarReservoir[N], ) *precomputedSum[N] { return &precomputedSum[N]{ - valueMap: newValueMap[N](limit, r), - monotonic: monotonic, - start: now(), + deltaSum: newDeltaSum(monotonic, limit, r), } } // precomputedSum summarizes a set of observations as their arithmetic sum. type precomputedSum[N int64 | float64] struct { - *valueMap[N] + *deltaSum[N] - monotonic bool - start time.Time - - reported map[attribute.Distinct]N + reported map[any]N } func (s *precomputedSum[N]) delta( dest *metricdata.Aggregation, //nolint:gocritic // The pointer is needed for the ComputeAggregation interface ) int { t := now() - newReported := make(map[attribute.Distinct]N) + newReported := make(map[any]N) // If *dest is not a metricdata.Sum, memory reuse is missed. In that case, // use the zero-value sData and hope for better alignment next cycle. @@ -181,27 +217,29 @@ func (s *precomputedSum[N]) delta( sData.Temporality = metricdata.DeltaTemporality sData.IsMonotonic = s.monotonic - s.Lock() - defer s.Unlock() - - n := len(s.values) + // delta always clears values on collection + readIdx := s.hcwg.swapHotAndWait() + // The len will not change while we iterate over values, since we waited + // for all writes to finish to the cold values and len. + n := s.hotColdValMap[readIdx].values.Len() dPts := reset(sData.DataPoints, n, n) var i int - for key, value := range s.values { - delta := value.n - s.reported[key] + s.hotColdValMap[readIdx].values.Range(func(key, value any) bool { + val := value.(*sumValue[N]) + n := val.n.load() - dPts[i].Attributes = value.attrs + delta := n - s.reported[key] + collectExemplars(&dPts[i].Exemplars, val.res.Collect) + dPts[i].Attributes = val.attrs dPts[i].StartTime = s.start dPts[i].Time = t dPts[i].Value = delta - collectExemplars(&dPts[i].Exemplars, value.res.Collect) - - newReported[key] = value.n + newReported[key] = n i++ - } - // Unused attribute sets do not report. - clear(s.values) + return true + }) + s.hotColdValMap[readIdx].values.Clear() s.reported = newReported // The delta collection cycle resets. s.start = t @@ -209,7 +247,7 @@ func (s *precomputedSum[N]) delta( sData.DataPoints = dPts *dest = sData - return n + return i } func (s *precomputedSum[N]) cumulative( @@ -223,27 +261,28 @@ func (s *precomputedSum[N]) cumulative( sData.Temporality = metricdata.CumulativeTemporality sData.IsMonotonic = s.monotonic - s.Lock() - defer s.Unlock() - - n := len(s.values) + // cumulative precomputed always clears values on collection + readIdx := s.hcwg.swapHotAndWait() + // The len will not change while we iterate over values, since we waited + // for all writes to finish to the cold values and len. + n := s.hotColdValMap[readIdx].values.Len() dPts := reset(sData.DataPoints, n, n) var i int - for _, val := range s.values { + s.hotColdValMap[readIdx].values.Range(func(_, value any) bool { + val := value.(*sumValue[N]) + collectExemplars(&dPts[i].Exemplars, val.res.Collect) dPts[i].Attributes = val.attrs dPts[i].StartTime = s.start dPts[i].Time = t - dPts[i].Value = val.n - collectExemplars(&dPts[i].Exemplars, val.res.Collect) - + dPts[i].Value = val.n.load() i++ - } - // Unused attribute sets do not report. - clear(s.values) + return true + }) + s.hotColdValMap[readIdx].values.Clear() sData.DataPoints = dPts *dest = sData - return n + return i } diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/observ/instrumentation.go b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/observ/instrumentation.go new file mode 100644 index 00000000000..41cfc6bcbef --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/observ/instrumentation.go @@ -0,0 +1,168 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package observ provides experimental observability instrumentation for the +// metric reader. +package observ // import "go.opentelemetry.io/otel/sdk/metric/internal/observ" + +import ( + "context" + "fmt" + "sync" + "time" + + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/sdk" + "go.opentelemetry.io/otel/sdk/internal/x" + semconv "go.opentelemetry.io/otel/semconv/v1.37.0" + "go.opentelemetry.io/otel/semconv/v1.37.0/otelconv" +) + +const ( + // ScopeName is the unique name of the meter used for instrumentation. + ScopeName = "go.opentelemetry.io/otel/sdk/metric/internal/observ" + + // SchemaURL is the schema URL of the metrics produced by this + // instrumentation. + SchemaURL = semconv.SchemaURL +) + +var ( + measureAttrsPool = &sync.Pool{ + New: func() any { + const n = 1 + // component.name + 1 + // component.type + 1 // error.type + s := make([]attribute.KeyValue, 0, n) + // Return a pointer to a slice instead of a slice itself + // to avoid allocations on every call. + return &s + }, + } + + recordOptPool = &sync.Pool{ + New: func() any { + const n = 1 // WithAttributeSet + o := make([]metric.RecordOption, 0, n) + return &o + }, + } +) + +func get[T any](p *sync.Pool) *[]T { return p.Get().(*[]T) } + +func put[T any](p *sync.Pool, s *[]T) { + *s = (*s)[:0] // Reset. + p.Put(s) +} + +// ComponentName returns the component name for the metric reader with the +// provided ComponentType and ID. +func ComponentName(componentType string, id int64) string { + return fmt.Sprintf("%s/%d", componentType, id) +} + +// Instrumentation is experimental instrumentation for the metric reader. +type Instrumentation struct { + colDuration metric.Float64Histogram + + attrs []attribute.KeyValue + recOpt metric.RecordOption +} + +// NewInstrumentation returns instrumentation for metric reader with the provided component +// type (such as periodic and manual metric reader) and ID. It uses the global +// MeterProvider to create the instrumentation. +// +// The id should be the unique metric reader instance ID. It is used +// to set the "component.name" attribute. +// +// If the experimental observability is disabled, nil is returned. +func NewInstrumentation(componentType string, id int64) (*Instrumentation, error) { + if !x.Observability.Enabled() { + return nil, nil + } + + i := &Instrumentation{ + attrs: []attribute.KeyValue{ + semconv.OTelComponentName(ComponentName(componentType, id)), + semconv.OTelComponentTypeKey.String(componentType), + }, + } + + r := attribute.NewSet(i.attrs...) + i.recOpt = metric.WithAttributeSet(r) + + meter := otel.GetMeterProvider().Meter( + ScopeName, + metric.WithInstrumentationVersion(sdk.Version()), + metric.WithSchemaURL(SchemaURL), + ) + + colDuration, err := otelconv.NewSDKMetricReaderCollectionDuration(meter) + if err != nil { + err = fmt.Errorf("failed to create collection duration metric: %w", err) + } + i.colDuration = colDuration.Inst() + + return i, err +} + +// CollectMetrics instruments the collect method of metric reader. It returns an +// [CollectOp] that must have its [CollectOp.End] method called when the +// collection end. +func (i *Instrumentation) CollectMetrics(ctx context.Context) CollectOp { + start := time.Now() + + return CollectOp{ + ctx: ctx, + start: start, + inst: i, + } +} + +// CollectOp tracks the collect operation being observed by +// [Instrumentation.CollectMetrics]. +type CollectOp struct { + ctx context.Context + start time.Time + + inst *Instrumentation +} + +// End completes the observation of the operation being observed by a call to +// [Instrumentation.CollectMetrics]. +// +// Any error that is encountered is provided as err. +func (e CollectOp) End(err error) { + recOpt := get[metric.RecordOption](recordOptPool) + defer put(recordOptPool, recOpt) + *recOpt = append(*recOpt, e.inst.recordOption(err)) + + d := time.Since(e.start).Seconds() + e.inst.colDuration.Record(e.ctx, d, *recOpt...) +} + +// recordOption returns a RecordOption with attributes representing the +// outcome of the collection being recorded. +// +// If err is nil, the default recOpt of the Instrumentation is returned. +// +// Otherwise, a new RecordOption is returned with the base attributes of the +// Instrumentation plus the error.type attribute set to the type of the error. +func (i *Instrumentation) recordOption(err error) metric.RecordOption { + if err == nil { + return i.recOpt + } + + attrs := get[attribute.KeyValue](measureAttrsPool) + defer put(measureAttrsPool, attrs) + *attrs = append(*attrs, i.attrs...) + *attrs = append(*attrs, semconv.ErrorType(err)) + + // Do not inefficiently make a copy of attrs by using WithAttributes + // instead of WithAttributeSet. + return metric.WithAttributeSet(attribute.NewSet(*attrs...)) +} diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/reservoir/concurrent_safe.go b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/reservoir/concurrent_safe.go new file mode 100644 index 00000000000..3be234a4108 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/reservoir/concurrent_safe.go @@ -0,0 +1,11 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package reservoir // import "go.opentelemetry.io/otel/sdk/metric/internal/reservoir" + +// ConcurrentSafe is an interface that can be embedded in an +// exemplar.Reservoir to indicate to the SDK that it is safe to invoke its +// methods concurrently. If this interface is not embedded, the SDK assumes it +// is not safe to call concurrently and locks around Reservoir methods. This +// is currently only used by the built-in reservoirs. +type ConcurrentSafe interface{ concurrentSafe() } diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/internal/reservoir/doc.go b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/reservoir/doc.go new file mode 100644 index 00000000000..6cd213b5f32 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/sdk/metric/internal/reservoir/doc.go @@ -0,0 +1,6 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package reservoir contains experimental features used by built-in exemplar +// reservoirs which require coordination with the metrics SDK. +package reservoir // import "go.opentelemetry.io/otel/sdk/metric/internal/reservoir" diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/manual_reader.go b/vendor/go.opentelemetry.io/otel/sdk/metric/manual_reader.go index 85d3dc20768..5b0630207b5 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/metric/manual_reader.go +++ b/vendor/go.opentelemetry.io/otel/sdk/metric/manual_reader.go @@ -10,10 +10,18 @@ import ( "sync" "sync/atomic" + "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/internal/global" + "go.opentelemetry.io/otel/sdk/metric/internal/observ" "go.opentelemetry.io/otel/sdk/metric/metricdata" ) +const ( + // ManualReaderType uniquely identifies the OpenTelemetry Metric Reader component + // being instrumented. + manualReaderType = "go.opentelemetry.io/otel/sdk/metric/metric.ManualReader" +) + // ManualReader is a simple Reader that allows an application to // read metrics on demand. type ManualReader struct { @@ -26,6 +34,8 @@ type ManualReader struct { temporalitySelector TemporalitySelector aggregationSelector AggregationSelector + + inst *observ.Instrumentation } // Compile time check the manualReader implements Reader and is comparable. @@ -39,9 +49,24 @@ func NewManualReader(opts ...ManualReaderOption) *ManualReader { aggregationSelector: cfg.aggregationSelector, } r.externalProducers.Store(cfg.producers) + + var err error + r.inst, err = observ.NewInstrumentation(manualReaderType, nextManualReaderID()) + if err != nil { + otel.Handle(err) + } + return r } +var manualReaderIDCounter atomic.Int64 + +// nextManualReaderID returns an identifier for this manual reader, +// starting with 0 and incrementing by 1 each time it is called. +func nextManualReaderID() int64 { + return manualReaderIDCounter.Add(1) - 1 +} + // register stores the sdkProducer which enables the caller // to read metrics from the SDK on demand. func (mr *ManualReader) register(p sdkProducer) { @@ -93,12 +118,20 @@ func (mr *ManualReader) Shutdown(context.Context) error { // // This method is safe to call concurrently. func (mr *ManualReader) Collect(ctx context.Context, rm *metricdata.ResourceMetrics) error { + var err error + if mr.inst != nil { + cp := mr.inst.CollectMetrics(ctx) + defer func() { cp.End(err) }() + } + if rm == nil { - return errors.New("manual reader: *metricdata.ResourceMetrics is nil") + err = errors.New("manual reader: *metricdata.ResourceMetrics is nil") + return err } p := mr.sdkProducer.Load() if p == nil { - return ErrReaderNotRegistered + err = ErrReaderNotRegistered + return err } ph, ok := p.(produceHolder) @@ -107,11 +140,11 @@ func (mr *ManualReader) Collect(ctx context.Context, rm *metricdata.ResourceMetr // this should never happen. In the unforeseen case that this does // happen, return an error instead of panicking so a users code does // not halt in the processes. - err := fmt.Errorf("manual reader: invalid producer: %T", p) + err = fmt.Errorf("manual reader: invalid producer: %T", p) return err } - err := ph.produce(ctx, rm) + err = ph.produce(ctx, rm) if err != nil { return err } diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/metricdata/temporality_string.go b/vendor/go.opentelemetry.io/otel/sdk/metric/metricdata/temporality_string.go index 4da833cdce2..129cc6430dc 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/metric/metricdata/temporality_string.go +++ b/vendor/go.opentelemetry.io/otel/sdk/metric/metricdata/temporality_string.go @@ -18,8 +18,9 @@ const _Temporality_name = "undefinedTemporalityCumulativeTemporalityDeltaTempora var _Temporality_index = [...]uint8{0, 20, 41, 57} func (i Temporality) String() string { - if i >= Temporality(len(_Temporality_index)-1) { + idx := int(i) - 0 + if i < 0 || idx >= len(_Temporality_index)-1 { return "Temporality(" + strconv.FormatInt(int64(i), 10) + ")" } - return _Temporality_name[_Temporality_index[i]:_Temporality_index[i+1]] + return _Temporality_name[_Temporality_index[idx]:_Temporality_index[idx+1]] } diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/periodic_reader.go b/vendor/go.opentelemetry.io/otel/sdk/metric/periodic_reader.go index f08c771a68f..e78402afc40 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/metric/periodic_reader.go +++ b/vendor/go.opentelemetry.io/otel/sdk/metric/periodic_reader.go @@ -13,7 +13,9 @@ import ( "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/internal/global" + "go.opentelemetry.io/otel/sdk/metric/internal/observ" "go.opentelemetry.io/otel/sdk/metric/metricdata" + semconv "go.opentelemetry.io/otel/semconv/v1.37.0" ) // Default periodic reader timing. @@ -126,9 +128,26 @@ func NewPeriodicReader(exporter Exporter, options ...PeriodicReaderOption) *Peri r.run(ctx, conf.interval) }() + var err error + r.inst, err = observ.NewInstrumentation( + semconv.OTelComponentTypePeriodicMetricReader.Value.AsString(), + nextPeriodicReaderID(), + ) + if err != nil { + otel.Handle(err) + } + return r } +var periodicReaderIDCounter atomic.Int64 + +// nextPeriodicReaderID returns an identifier for this periodic reader, +// starting with 0 and incrementing by 1 each time it is called. +func nextPeriodicReaderID() int64 { + return periodicReaderIDCounter.Add(1) - 1 +} + // PeriodicReader is a Reader that continuously collects and exports metric // data at a set interval. type PeriodicReader struct { @@ -148,6 +167,8 @@ type PeriodicReader struct { shutdownOnce sync.Once rmPool sync.Pool + + inst *observ.Instrumentation } // Compile time check the periodicReader implements Reader and is comparable. @@ -235,8 +256,15 @@ func (r *PeriodicReader) Collect(ctx context.Context, rm *metricdata.ResourceMet // collect unwraps p as a produceHolder and returns its produce results. func (r *PeriodicReader) collect(ctx context.Context, p any, rm *metricdata.ResourceMetrics) error { + var err error + if r.inst != nil { + cp := r.inst.CollectMetrics(ctx) + defer func() { cp.End(err) }() + } + if p == nil { - return ErrReaderNotRegistered + err = ErrReaderNotRegistered + return err } ph, ok := p.(produceHolder) @@ -245,11 +273,11 @@ func (r *PeriodicReader) collect(ctx context.Context, p any, rm *metricdata.Reso // this should never happen. In the unforeseen case that this does // happen, return an error instead of panicking so a users code does // not halt in the processes. - err := fmt.Errorf("periodic reader: invalid producer: %T", p) + err = fmt.Errorf("periodic reader: invalid producer: %T", p) return err } - err := ph.produce(ctx, rm) + err = ph.produce(ctx, rm) if err != nil { return err } diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/reader.go b/vendor/go.opentelemetry.io/otel/sdk/metric/reader.go index 5c1cea8254e..7b205c736c2 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/metric/reader.go +++ b/vendor/go.opentelemetry.io/otel/sdk/metric/reader.go @@ -127,10 +127,40 @@ type TemporalitySelector func(InstrumentKind) metricdata.Temporality // DefaultTemporalitySelector is the default TemporalitySelector used if // WithTemporalitySelector is not provided. CumulativeTemporality will be used // for all instrument kinds if this TemporalitySelector is used. -func DefaultTemporalitySelector(InstrumentKind) metricdata.Temporality { +func DefaultTemporalitySelector(k InstrumentKind) metricdata.Temporality { + return CumulativeTemporalitySelector(k) +} + +// CumulativeTemporalitySelector is the TemporalitySelector that uses +// a cumulative temporality for all instrument kinds. +func CumulativeTemporalitySelector(InstrumentKind) metricdata.Temporality { return metricdata.CumulativeTemporality } +// DeltaTemporalitySelector is the TemporalitySelector that uses +// a delta temporality for instrument kinds: counter, histogram, observable counter +// All other instruments use cumulative temporality. +func DeltaTemporalitySelector(k InstrumentKind) metricdata.Temporality { + switch k { + case InstrumentKindCounter, InstrumentKindHistogram, InstrumentKindObservableCounter: + return metricdata.DeltaTemporality + default: + return metricdata.CumulativeTemporality + } +} + +// LowMemoryTemporalitySelector is the TemporalitySelector that uses +// delta temporality for counters and histograms. All other instruments use +// cumulative temporality. +func LowMemoryTemporalitySelector(k InstrumentKind) metricdata.Temporality { + switch k { + case InstrumentKindCounter, InstrumentKindHistogram: + return metricdata.DeltaTemporality + default: + return metricdata.CumulativeTemporality + } +} + // AggregationSelector selects the aggregation and the parameters to use for // that aggregation based on the InstrumentKind. // diff --git a/vendor/go.opentelemetry.io/otel/sdk/metric/version.go b/vendor/go.opentelemetry.io/otel/sdk/metric/version.go index dd9051a76c5..ae5b57b191e 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/metric/version.go +++ b/vendor/go.opentelemetry.io/otel/sdk/metric/version.go @@ -5,5 +5,5 @@ package metric // import "go.opentelemetry.io/otel/sdk/metric" // version is the current release version of the metric SDK in use. func version() string { - return "1.38.0" + return "1.39.0" } diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_bsd.go b/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_bsd.go index cc8b8938ed5..4c1c30f2560 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_bsd.go +++ b/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_bsd.go @@ -2,7 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 //go:build dragonfly || freebsd || netbsd || openbsd || solaris -// +build dragonfly freebsd netbsd openbsd solaris package resource // import "go.opentelemetry.io/otel/sdk/resource" diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_linux.go b/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_linux.go index f84f173240f..4a26096c8d0 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_linux.go +++ b/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_linux.go @@ -2,7 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 //go:build linux -// +build linux package resource // import "go.opentelemetry.io/otel/sdk/resource" diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_unsupported.go b/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_unsupported.go index df12c44c564..63ad2fa4e05 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_unsupported.go +++ b/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_unsupported.go @@ -2,7 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 //go:build !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows -// +build !darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows package resource // import "go.opentelemetry.io/otel/sdk/resource" diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_windows.go b/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_windows.go index 3677c83d7da..2b8ca20b381 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_windows.go +++ b/vendor/go.opentelemetry.io/otel/sdk/resource/host_id_windows.go @@ -2,7 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 //go:build windows -// +build windows package resource // import "go.opentelemetry.io/otel/sdk/resource" diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/os_release_unix.go b/vendor/go.opentelemetry.io/otel/sdk/resource/os_release_unix.go index 7252af79fc9..a1763267c22 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/resource/os_release_unix.go +++ b/vendor/go.opentelemetry.io/otel/sdk/resource/os_release_unix.go @@ -2,7 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 //go:build aix || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos -// +build aix dragonfly freebsd linux netbsd openbsd solaris zos package resource // import "go.opentelemetry.io/otel/sdk/resource" diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/os_unix.go b/vendor/go.opentelemetry.io/otel/sdk/resource/os_unix.go index a6ff26a4d27..6c50ab68677 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/resource/os_unix.go +++ b/vendor/go.opentelemetry.io/otel/sdk/resource/os_unix.go @@ -2,7 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 //go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris || zos -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris zos package resource // import "go.opentelemetry.io/otel/sdk/resource" diff --git a/vendor/go.opentelemetry.io/otel/sdk/resource/os_unsupported.go b/vendor/go.opentelemetry.io/otel/sdk/resource/os_unsupported.go index a77742b0771..25f629532a3 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/resource/os_unsupported.go +++ b/vendor/go.opentelemetry.io/otel/sdk/resource/os_unsupported.go @@ -2,7 +2,6 @@ // SPDX-License-Identifier: Apache-2.0 //go:build !aix && !darwin && !dragonfly && !freebsd && !linux && !netbsd && !openbsd && !solaris && !windows && !zos -// +build !aix,!darwin,!dragonfly,!freebsd,!linux,!netbsd,!openbsd,!solaris,!windows,!zos package resource // import "go.opentelemetry.io/otel/sdk/resource" diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/batch_span_processor.go b/vendor/go.opentelemetry.io/otel/sdk/trace/batch_span_processor.go index 9bc3e525d19..7d15cbb9c0f 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/trace/batch_span_processor.go +++ b/vendor/go.opentelemetry.io/otel/sdk/trace/batch_span_processor.go @@ -6,20 +6,14 @@ package trace // import "go.opentelemetry.io/otel/sdk/trace" import ( "context" "errors" - "fmt" "sync" "sync/atomic" "time" "go.opentelemetry.io/otel" - "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/internal/global" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/sdk" - "go.opentelemetry.io/otel/sdk/internal/env" - "go.opentelemetry.io/otel/sdk/trace/internal/x" - semconv "go.opentelemetry.io/otel/semconv/v1.37.0" - "go.opentelemetry.io/otel/semconv/v1.37.0/otelconv" + "go.opentelemetry.io/otel/sdk/trace/internal/env" + "go.opentelemetry.io/otel/sdk/trace/internal/observ" "go.opentelemetry.io/otel/trace" ) @@ -33,8 +27,6 @@ const ( DefaultMaxExportBatchSize = 512 ) -var queueFull = otelconv.ErrorTypeAttr("queue_full") - // BatchSpanProcessorOption configures a BatchSpanProcessor. type BatchSpanProcessorOption func(o *BatchSpanProcessorOptions) @@ -78,10 +70,7 @@ type batchSpanProcessor struct { queue chan ReadOnlySpan dropped uint32 - selfObservabilityEnabled bool - callbackRegistration metric.Registration - spansProcessedCounter otelconv.SDKProcessorSpanProcessed - componentNameAttr attribute.KeyValue + inst *observ.BSP batch []ReadOnlySpan batchMutex sync.Mutex @@ -124,19 +113,14 @@ func NewBatchSpanProcessor(exporter SpanExporter, options ...BatchSpanProcessorO stopCh: make(chan struct{}), } - if x.SelfObservability.Enabled() { - bsp.selfObservabilityEnabled = true - bsp.componentNameAttr = componentName() - - var err error - bsp.spansProcessedCounter, bsp.callbackRegistration, err = newBSPObs( - bsp.componentNameAttr, - func() int64 { return int64(len(bsp.queue)) }, - int64(bsp.o.MaxQueueSize), - ) - if err != nil { - otel.Handle(err) - } + var err error + bsp.inst, err = observ.NewBSP( + nextProcessorID(), + func() int64 { return int64(len(bsp.queue)) }, + int64(bsp.o.MaxQueueSize), + ) + if err != nil { + otel.Handle(err) } bsp.stopWait.Add(1) @@ -157,51 +141,6 @@ func nextProcessorID() int64 { return processorIDCounter.Add(1) - 1 } -func componentName() attribute.KeyValue { - id := nextProcessorID() - name := fmt.Sprintf("%s/%d", otelconv.ComponentTypeBatchingSpanProcessor, id) - return semconv.OTelComponentName(name) -} - -// newBSPObs creates and returns a new set of metrics instruments and a -// registration for a BatchSpanProcessor. It is the caller's responsibility -// to unregister the registration when it is no longer needed. -func newBSPObs( - cmpnt attribute.KeyValue, - qLen func() int64, - qMax int64, -) (otelconv.SDKProcessorSpanProcessed, metric.Registration, error) { - meter := otel.GetMeterProvider().Meter( - selfObsScopeName, - metric.WithInstrumentationVersion(sdk.Version()), - metric.WithSchemaURL(semconv.SchemaURL), - ) - - qCap, err := otelconv.NewSDKProcessorSpanQueueCapacity(meter) - - qSize, e := otelconv.NewSDKProcessorSpanQueueSize(meter) - err = errors.Join(err, e) - - spansProcessed, e := otelconv.NewSDKProcessorSpanProcessed(meter) - err = errors.Join(err, e) - - cmpntT := semconv.OTelComponentTypeBatchingSpanProcessor - attrs := metric.WithAttributes(cmpnt, cmpntT) - - reg, e := meter.RegisterCallback( - func(_ context.Context, o metric.Observer) error { - o.ObserveInt64(qSize.Inst(), qLen(), attrs) - o.ObserveInt64(qCap.Inst(), qMax, attrs) - return nil - }, - qSize.Inst(), - qCap.Inst(), - ) - err = errors.Join(err, e) - - return spansProcessed, reg, err -} - // OnStart method does nothing. func (*batchSpanProcessor) OnStart(context.Context, ReadWriteSpan) {} @@ -242,8 +181,8 @@ func (bsp *batchSpanProcessor) Shutdown(ctx context.Context) error { case <-ctx.Done(): err = ctx.Err() } - if bsp.selfObservabilityEnabled { - err = errors.Join(err, bsp.callbackRegistration.Unregister()) + if bsp.inst != nil { + err = errors.Join(err, bsp.inst.Shutdown()) } }) return err @@ -357,10 +296,8 @@ func (bsp *batchSpanProcessor) exportSpans(ctx context.Context) error { if l := len(bsp.batch); l > 0 { global.Debug("exporting spans", "count", len(bsp.batch), "total_dropped", atomic.LoadUint32(&bsp.dropped)) - if bsp.selfObservabilityEnabled { - bsp.spansProcessedCounter.Add(ctx, int64(l), - bsp.componentNameAttr, - bsp.spansProcessedCounter.AttrComponentType(otelconv.ComponentTypeBatchingSpanProcessor)) + if bsp.inst != nil { + bsp.inst.Processed(ctx, int64(l)) } err := bsp.e.ExportSpans(ctx, bsp.batch) @@ -470,11 +407,8 @@ func (bsp *batchSpanProcessor) enqueueBlockOnQueueFull(ctx context.Context, sd R case bsp.queue <- sd: return true case <-ctx.Done(): - if bsp.selfObservabilityEnabled { - bsp.spansProcessedCounter.Add(ctx, 1, - bsp.componentNameAttr, - bsp.spansProcessedCounter.AttrComponentType(otelconv.ComponentTypeBatchingSpanProcessor), - bsp.spansProcessedCounter.AttrErrorType(queueFull)) + if bsp.inst != nil { + bsp.inst.ProcessedQueueFull(ctx, 1) } return false } @@ -490,11 +424,8 @@ func (bsp *batchSpanProcessor) enqueueDrop(ctx context.Context, sd ReadOnlySpan) return true default: atomic.AddUint32(&bsp.dropped, 1) - if bsp.selfObservabilityEnabled { - bsp.spansProcessedCounter.Add(ctx, 1, - bsp.componentNameAttr, - bsp.spansProcessedCounter.AttrComponentType(otelconv.ComponentTypeBatchingSpanProcessor), - bsp.spansProcessedCounter.AttrErrorType(queueFull)) + if bsp.inst != nil { + bsp.inst.ProcessedQueueFull(ctx, 1) } } return false diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/doc.go b/vendor/go.opentelemetry.io/otel/sdk/trace/doc.go index e58e7f6ed78..b502c7d4798 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/trace/doc.go +++ b/vendor/go.opentelemetry.io/otel/sdk/trace/doc.go @@ -7,7 +7,7 @@ Package trace contains support for OpenTelemetry distributed tracing. The following assumes a basic familiarity with OpenTelemetry concepts. See https://opentelemetry.io. -See [go.opentelemetry.io/otel/sdk/trace/internal/x] for information about +See [go.opentelemetry.io/otel/sdk/internal/x] for information about the experimental features. */ package trace // import "go.opentelemetry.io/otel/sdk/trace" diff --git a/vendor/go.opentelemetry.io/otel/sdk/internal/env/env.go b/vendor/go.opentelemetry.io/otel/sdk/trace/internal/env/env.go similarity index 98% rename from vendor/go.opentelemetry.io/otel/sdk/internal/env/env.go rename to vendor/go.opentelemetry.io/otel/sdk/trace/internal/env/env.go index e3309231d42..58f68df4417 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/internal/env/env.go +++ b/vendor/go.opentelemetry.io/otel/sdk/trace/internal/env/env.go @@ -3,7 +3,7 @@ // Package env provides types and functionality for environment variable support // in the OpenTelemetry SDK. -package env // import "go.opentelemetry.io/otel/sdk/internal/env" +package env // import "go.opentelemetry.io/otel/sdk/trace/internal/env" import ( "os" diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/internal/observ/batch_span_processor.go b/vendor/go.opentelemetry.io/otel/sdk/trace/internal/observ/batch_span_processor.go new file mode 100644 index 00000000000..bd7fe236296 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/sdk/trace/internal/observ/batch_span_processor.go @@ -0,0 +1,119 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package observ // import "go.opentelemetry.io/otel/sdk/trace/internal/observ" + +import ( + "context" + "errors" + "fmt" + + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/sdk" + "go.opentelemetry.io/otel/sdk/internal/x" + semconv "go.opentelemetry.io/otel/semconv/v1.37.0" + "go.opentelemetry.io/otel/semconv/v1.37.0/otelconv" +) + +const ( + // ScopeName is the name of the instrumentation scope. + ScopeName = "go.opentelemetry.io/otel/sdk/trace/internal/observ" + + // SchemaURL is the schema URL of the instrumentation. + SchemaURL = semconv.SchemaURL +) + +// ErrQueueFull is the attribute value for the "queue_full" error type. +var ErrQueueFull = otelconv.SDKProcessorSpanProcessed{}.AttrErrorType( + otelconv.ErrorTypeAttr("queue_full"), +) + +// BSPComponentName returns the component name attribute for a +// BatchSpanProcessor with the given ID. +func BSPComponentName(id int64) attribute.KeyValue { + t := otelconv.ComponentTypeBatchingSpanProcessor + name := fmt.Sprintf("%s/%d", t, id) + return semconv.OTelComponentName(name) +} + +// BSP is the instrumentation for an OTel SDK BatchSpanProcessor. +type BSP struct { + reg metric.Registration + + processed metric.Int64Counter + processedOpts []metric.AddOption + processedQueueFullOpts []metric.AddOption +} + +func NewBSP(id int64, qLen func() int64, qMax int64) (*BSP, error) { + if !x.Observability.Enabled() { + return nil, nil + } + + meter := otel.GetMeterProvider().Meter( + ScopeName, + metric.WithInstrumentationVersion(sdk.Version()), + metric.WithSchemaURL(SchemaURL), + ) + + qCap, err := otelconv.NewSDKProcessorSpanQueueCapacity(meter) + if err != nil { + err = fmt.Errorf("failed to create BSP queue capacity metric: %w", err) + } + qCapInst := qCap.Inst() + + qSize, e := otelconv.NewSDKProcessorSpanQueueSize(meter) + if e != nil { + e := fmt.Errorf("failed to create BSP queue size metric: %w", e) + err = errors.Join(err, e) + } + qSizeInst := qSize.Inst() + + cmpntT := semconv.OTelComponentTypeBatchingSpanProcessor + cmpnt := BSPComponentName(id) + set := attribute.NewSet(cmpnt, cmpntT) + + obsOpts := []metric.ObserveOption{metric.WithAttributeSet(set)} + reg, e := meter.RegisterCallback( + func(_ context.Context, o metric.Observer) error { + o.ObserveInt64(qSizeInst, qLen(), obsOpts...) + o.ObserveInt64(qCapInst, qMax, obsOpts...) + return nil + }, + qSizeInst, + qCapInst, + ) + if e != nil { + e := fmt.Errorf("failed to register BSP queue size/capacity callback: %w", e) + err = errors.Join(err, e) + } + + processed, e := otelconv.NewSDKProcessorSpanProcessed(meter) + if e != nil { + e := fmt.Errorf("failed to create BSP processed spans metric: %w", e) + err = errors.Join(err, e) + } + processedOpts := []metric.AddOption{metric.WithAttributeSet(set)} + + set = attribute.NewSet(cmpnt, cmpntT, ErrQueueFull) + processedQueueFullOpts := []metric.AddOption{metric.WithAttributeSet(set)} + + return &BSP{ + reg: reg, + processed: processed.Inst(), + processedOpts: processedOpts, + processedQueueFullOpts: processedQueueFullOpts, + }, err +} + +func (b *BSP) Shutdown() error { return b.reg.Unregister() } + +func (b *BSP) Processed(ctx context.Context, n int64) { + b.processed.Add(ctx, n, b.processedOpts...) +} + +func (b *BSP) ProcessedQueueFull(ctx context.Context, n int64) { + b.processed.Add(ctx, n, b.processedQueueFullOpts...) +} diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/internal/observ/doc.go b/vendor/go.opentelemetry.io/otel/sdk/trace/internal/observ/doc.go new file mode 100644 index 00000000000..b542121e6a2 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/sdk/trace/internal/observ/doc.go @@ -0,0 +1,6 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +// Package observ provides observability instrumentation for the OTel trace SDK +// package. +package observ // import "go.opentelemetry.io/otel/sdk/trace/internal/observ" diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/internal/observ/simple_span_processor.go b/vendor/go.opentelemetry.io/otel/sdk/trace/internal/observ/simple_span_processor.go new file mode 100644 index 00000000000..7d33870613a --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/sdk/trace/internal/observ/simple_span_processor.go @@ -0,0 +1,97 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package observ // import "go.opentelemetry.io/otel/sdk/trace/internal/observ" + +import ( + "context" + "fmt" + "sync" + + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/sdk" + "go.opentelemetry.io/otel/sdk/internal/x" + semconv "go.opentelemetry.io/otel/semconv/v1.37.0" + "go.opentelemetry.io/otel/semconv/v1.37.0/otelconv" +) + +var measureAttrsPool = sync.Pool{ + New: func() any { + // "component.name" + "component.type" + "error.type" + const n = 1 + 1 + 1 + s := make([]attribute.KeyValue, 0, n) + // Return a pointer to a slice instead of a slice itself + // to avoid allocations on every call. + return &s + }, +} + +// SSP is the instrumentation for an OTel SDK SimpleSpanProcessor. +type SSP struct { + spansProcessedCounter metric.Int64Counter + addOpts []metric.AddOption + attrs []attribute.KeyValue +} + +// SSPComponentName returns the component name attribute for a +// SimpleSpanProcessor with the given ID. +func SSPComponentName(id int64) attribute.KeyValue { + t := otelconv.ComponentTypeSimpleSpanProcessor + name := fmt.Sprintf("%s/%d", t, id) + return semconv.OTelComponentName(name) +} + +// NewSSP returns instrumentation for an OTel SDK SimpleSpanProcessor with the +// provided ID. +// +// If the experimental observability is disabled, nil is returned. +func NewSSP(id int64) (*SSP, error) { + if !x.Observability.Enabled() { + return nil, nil + } + + meter := otel.GetMeterProvider().Meter( + ScopeName, + metric.WithInstrumentationVersion(sdk.Version()), + metric.WithSchemaURL(SchemaURL), + ) + spansProcessedCounter, err := otelconv.NewSDKProcessorSpanProcessed(meter) + if err != nil { + err = fmt.Errorf("failed to create SSP processed spans metric: %w", err) + } + + componentName := SSPComponentName(id) + componentType := spansProcessedCounter.AttrComponentType(otelconv.ComponentTypeSimpleSpanProcessor) + attrs := []attribute.KeyValue{componentName, componentType} + addOpts := []metric.AddOption{metric.WithAttributeSet(attribute.NewSet(attrs...))} + + return &SSP{ + spansProcessedCounter: spansProcessedCounter.Inst(), + addOpts: addOpts, + attrs: attrs, + }, err +} + +// SpanProcessed records that a span has been processed by the SimpleSpanProcessor. +// If err is non-nil, it records the processing error as an attribute. +func (ssp *SSP) SpanProcessed(ctx context.Context, err error) { + ssp.spansProcessedCounter.Add(ctx, 1, ssp.addOption(err)...) +} + +func (ssp *SSP) addOption(err error) []metric.AddOption { + if err == nil { + return ssp.addOpts + } + attrs := measureAttrsPool.Get().(*[]attribute.KeyValue) + defer func() { + *attrs = (*attrs)[:0] // reset the slice for reuse + measureAttrsPool.Put(attrs) + }() + *attrs = append(*attrs, ssp.attrs...) + *attrs = append(*attrs, semconv.ErrorType(err)) + // Do not inefficiently make a copy of attrs by using + // WithAttributes instead of WithAttributeSet. + return []metric.AddOption{metric.WithAttributeSet(attribute.NewSet(*attrs...))} +} diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/internal/observ/tracer.go b/vendor/go.opentelemetry.io/otel/sdk/trace/internal/observ/tracer.go new file mode 100644 index 00000000000..a8a16458981 --- /dev/null +++ b/vendor/go.opentelemetry.io/otel/sdk/trace/internal/observ/tracer.go @@ -0,0 +1,223 @@ +// Copyright The OpenTelemetry Authors +// SPDX-License-Identifier: Apache-2.0 + +package observ // import "go.opentelemetry.io/otel/sdk/trace/internal/observ" + +import ( + "context" + "errors" + "fmt" + + "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" + "go.opentelemetry.io/otel/metric" + "go.opentelemetry.io/otel/sdk" + "go.opentelemetry.io/otel/sdk/internal/x" + "go.opentelemetry.io/otel/semconv/v1.37.0/otelconv" + "go.opentelemetry.io/otel/trace" +) + +var meterOpts = []metric.MeterOption{ + metric.WithInstrumentationVersion(sdk.Version()), + metric.WithSchemaURL(SchemaURL), +} + +// Tracer is instrumentation for an OTel SDK Tracer. +type Tracer struct { + enabled bool + + live metric.Int64UpDownCounter + started metric.Int64Counter +} + +func NewTracer() (Tracer, error) { + if !x.Observability.Enabled() { + return Tracer{}, nil + } + meter := otel.GetMeterProvider().Meter(ScopeName, meterOpts...) + + var err error + l, e := otelconv.NewSDKSpanLive(meter) + if e != nil { + e = fmt.Errorf("failed to create span live metric: %w", e) + err = errors.Join(err, e) + } + + s, e := otelconv.NewSDKSpanStarted(meter) + if e != nil { + e = fmt.Errorf("failed to create span started metric: %w", e) + err = errors.Join(err, e) + } + + return Tracer{enabled: true, live: l.Inst(), started: s.Inst()}, err +} + +func (t Tracer) Enabled() bool { return t.enabled } + +func (t Tracer) SpanStarted(ctx context.Context, psc trace.SpanContext, span trace.Span) { + key := spanStartedKey{ + parent: parentStateNoParent, + sampling: samplingStateDrop, + } + + if psc.IsValid() { + if psc.IsRemote() { + key.parent = parentStateRemoteParent + } else { + key.parent = parentStateLocalParent + } + } + + if span.IsRecording() { + if span.SpanContext().IsSampled() { + key.sampling = samplingStateRecordAndSample + } else { + key.sampling = samplingStateRecordOnly + } + } + + opts := spanStartedOpts[key] + t.started.Add(ctx, 1, opts...) +} + +func (t Tracer) SpanLive(ctx context.Context, span trace.Span) { + t.spanLive(ctx, 1, span) +} + +func (t Tracer) SpanEnded(ctx context.Context, span trace.Span) { + t.spanLive(ctx, -1, span) +} + +func (t Tracer) spanLive(ctx context.Context, value int64, span trace.Span) { + key := spanLiveKey{sampled: span.SpanContext().IsSampled()} + opts := spanLiveOpts[key] + t.live.Add(ctx, value, opts...) +} + +type parentState int + +const ( + parentStateNoParent parentState = iota + parentStateLocalParent + parentStateRemoteParent +) + +type samplingState int + +const ( + samplingStateDrop samplingState = iota + samplingStateRecordOnly + samplingStateRecordAndSample +) + +type spanStartedKey struct { + parent parentState + sampling samplingState +} + +var spanStartedOpts = map[spanStartedKey][]metric.AddOption{ + { + parentStateNoParent, + samplingStateDrop, + }: { + metric.WithAttributeSet(attribute.NewSet( + otelconv.SDKSpanStarted{}.AttrSpanParentOrigin(otelconv.SpanParentOriginNone), + otelconv.SDKSpanStarted{}.AttrSpanSamplingResult(otelconv.SpanSamplingResultDrop), + )), + }, + { + parentStateLocalParent, + samplingStateDrop, + }: { + metric.WithAttributeSet(attribute.NewSet( + otelconv.SDKSpanStarted{}.AttrSpanParentOrigin(otelconv.SpanParentOriginLocal), + otelconv.SDKSpanStarted{}.AttrSpanSamplingResult(otelconv.SpanSamplingResultDrop), + )), + }, + { + parentStateRemoteParent, + samplingStateDrop, + }: { + metric.WithAttributeSet(attribute.NewSet( + otelconv.SDKSpanStarted{}.AttrSpanParentOrigin(otelconv.SpanParentOriginRemote), + otelconv.SDKSpanStarted{}.AttrSpanSamplingResult(otelconv.SpanSamplingResultDrop), + )), + }, + + { + parentStateNoParent, + samplingStateRecordOnly, + }: { + metric.WithAttributeSet(attribute.NewSet( + otelconv.SDKSpanStarted{}.AttrSpanParentOrigin(otelconv.SpanParentOriginNone), + otelconv.SDKSpanStarted{}.AttrSpanSamplingResult(otelconv.SpanSamplingResultRecordOnly), + )), + }, + { + parentStateLocalParent, + samplingStateRecordOnly, + }: { + metric.WithAttributeSet(attribute.NewSet( + otelconv.SDKSpanStarted{}.AttrSpanParentOrigin(otelconv.SpanParentOriginLocal), + otelconv.SDKSpanStarted{}.AttrSpanSamplingResult(otelconv.SpanSamplingResultRecordOnly), + )), + }, + { + parentStateRemoteParent, + samplingStateRecordOnly, + }: { + metric.WithAttributeSet(attribute.NewSet( + otelconv.SDKSpanStarted{}.AttrSpanParentOrigin(otelconv.SpanParentOriginRemote), + otelconv.SDKSpanStarted{}.AttrSpanSamplingResult(otelconv.SpanSamplingResultRecordOnly), + )), + }, + + { + parentStateNoParent, + samplingStateRecordAndSample, + }: { + metric.WithAttributeSet(attribute.NewSet( + otelconv.SDKSpanStarted{}.AttrSpanParentOrigin(otelconv.SpanParentOriginNone), + otelconv.SDKSpanStarted{}.AttrSpanSamplingResult(otelconv.SpanSamplingResultRecordAndSample), + )), + }, + { + parentStateLocalParent, + samplingStateRecordAndSample, + }: { + metric.WithAttributeSet(attribute.NewSet( + otelconv.SDKSpanStarted{}.AttrSpanParentOrigin(otelconv.SpanParentOriginLocal), + otelconv.SDKSpanStarted{}.AttrSpanSamplingResult(otelconv.SpanSamplingResultRecordAndSample), + )), + }, + { + parentStateRemoteParent, + samplingStateRecordAndSample, + }: { + metric.WithAttributeSet(attribute.NewSet( + otelconv.SDKSpanStarted{}.AttrSpanParentOrigin(otelconv.SpanParentOriginRemote), + otelconv.SDKSpanStarted{}.AttrSpanSamplingResult(otelconv.SpanSamplingResultRecordAndSample), + )), + }, +} + +type spanLiveKey struct { + sampled bool +} + +var spanLiveOpts = map[spanLiveKey][]metric.AddOption{ + {true}: { + metric.WithAttributeSet(attribute.NewSet( + otelconv.SDKSpanLive{}.AttrSpanSamplingResult( + otelconv.SpanSamplingResultRecordAndSample, + ), + )), + }, + {false}: { + metric.WithAttributeSet(attribute.NewSet( + otelconv.SDKSpanLive{}.AttrSpanSamplingResult( + otelconv.SpanSamplingResultRecordOnly, + ), + )), + }, +} diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/provider.go b/vendor/go.opentelemetry.io/otel/sdk/trace/provider.go index 37ce2ac876a..d2cf4ebd3e7 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/trace/provider.go +++ b/vendor/go.opentelemetry.io/otel/sdk/trace/provider.go @@ -5,29 +5,21 @@ package trace // import "go.opentelemetry.io/otel/sdk/trace" import ( "context" - "errors" "fmt" "sync" "sync/atomic" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/internal/global" - "go.opentelemetry.io/otel/metric" - "go.opentelemetry.io/otel/sdk" "go.opentelemetry.io/otel/sdk/instrumentation" "go.opentelemetry.io/otel/sdk/resource" - "go.opentelemetry.io/otel/sdk/trace/internal/x" - semconv "go.opentelemetry.io/otel/semconv/v1.37.0" - "go.opentelemetry.io/otel/semconv/v1.37.0/otelconv" + "go.opentelemetry.io/otel/sdk/trace/internal/observ" "go.opentelemetry.io/otel/trace" "go.opentelemetry.io/otel/trace/embedded" "go.opentelemetry.io/otel/trace/noop" ) -const ( - defaultTracerName = "go.opentelemetry.io/otel/sdk/tracer" - selfObsScopeName = "go.opentelemetry.io/otel/sdk/trace" -) +const defaultTracerName = "go.opentelemetry.io/otel/sdk/tracer" // tracerProviderConfig. type tracerProviderConfig struct { @@ -163,19 +155,16 @@ func (p *TracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.T t, ok := p.namedTracer[is] if !ok { t = &tracer{ - provider: p, - instrumentationScope: is, - selfObservabilityEnabled: x.SelfObservability.Enabled(), + provider: p, + instrumentationScope: is, } - if t.selfObservabilityEnabled { - var err error - t.spanLiveMetric, t.spanStartedMetric, err = newInst() - if err != nil { - msg := "failed to create self-observability metrics for tracer: %w" - err := fmt.Errorf(msg, err) - otel.Handle(err) - } + + var err error + t.inst, err = observ.NewTracer() + if err != nil { + otel.Handle(err) } + p.namedTracer[is] = t } return t, ok @@ -201,23 +190,6 @@ func (p *TracerProvider) Tracer(name string, opts ...trace.TracerOption) trace.T return t } -func newInst() (otelconv.SDKSpanLive, otelconv.SDKSpanStarted, error) { - m := otel.GetMeterProvider().Meter( - selfObsScopeName, - metric.WithInstrumentationVersion(sdk.Version()), - metric.WithSchemaURL(semconv.SchemaURL), - ) - - var err error - spanLiveMetric, e := otelconv.NewSDKSpanLive(m) - err = errors.Join(err, e) - - spanStartedMetric, e := otelconv.NewSDKSpanStarted(m) - err = errors.Join(err, e) - - return spanLiveMetric, spanStartedMetric, err -} - // RegisterSpanProcessor adds the given SpanProcessor to the list of SpanProcessors. func (p *TracerProvider) RegisterSpanProcessor(sp SpanProcessor) { // This check prevents calls during a shutdown. diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/simple_span_processor.go b/vendor/go.opentelemetry.io/otel/sdk/trace/simple_span_processor.go index 411d9ccdd78..771e427a4c5 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/trace/simple_span_processor.go +++ b/vendor/go.opentelemetry.io/otel/sdk/trace/simple_span_processor.go @@ -6,9 +6,12 @@ package trace // import "go.opentelemetry.io/otel/sdk/trace" import ( "context" "sync" + "sync/atomic" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/internal/global" + "go.opentelemetry.io/otel/sdk/trace/internal/observ" + "go.opentelemetry.io/otel/trace" ) // simpleSpanProcessor is a SpanProcessor that synchronously sends all @@ -17,6 +20,8 @@ type simpleSpanProcessor struct { exporterMu sync.Mutex exporter SpanExporter stopOnce sync.Once + + inst *observ.SSP } var _ SpanProcessor = (*simpleSpanProcessor)(nil) @@ -33,11 +38,26 @@ func NewSimpleSpanProcessor(exporter SpanExporter) SpanProcessor { ssp := &simpleSpanProcessor{ exporter: exporter, } + + var err error + ssp.inst, err = observ.NewSSP(nextSimpleProcessorID()) + if err != nil { + otel.Handle(err) + } + global.Warn("SimpleSpanProcessor is not recommended for production use, consider using BatchSpanProcessor instead.") return ssp } +var simpleProcessorIDCounter atomic.Int64 + +// nextSimpleProcessorID returns an identifier for this simple span processor, +// starting with 0 and incrementing by 1 each time it is called. +func nextSimpleProcessorID() int64 { + return simpleProcessorIDCounter.Add(1) - 1 +} + // OnStart does nothing. func (*simpleSpanProcessor) OnStart(context.Context, ReadWriteSpan) {} @@ -46,11 +66,20 @@ func (ssp *simpleSpanProcessor) OnEnd(s ReadOnlySpan) { ssp.exporterMu.Lock() defer ssp.exporterMu.Unlock() + var err error if ssp.exporter != nil && s.SpanContext().TraceFlags().IsSampled() { - if err := ssp.exporter.ExportSpans(context.Background(), []ReadOnlySpan{s}); err != nil { + err = ssp.exporter.ExportSpans(context.Background(), []ReadOnlySpan{s}) + if err != nil { otel.Handle(err) } } + + if ssp.inst != nil { + // Add the span to the context to ensure the metric is recorded + // with the correct span context. + ctx := trace.ContextWithSpanContext(context.Background(), s.SpanContext()) + ssp.inst.SpanProcessed(ctx, err) + } } // Shutdown shuts down the exporter this SimpleSpanProcessor exports to. diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/span.go b/vendor/go.opentelemetry.io/otel/sdk/trace/span.go index b376051fbb8..8cfd9f62e3f 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/trace/span.go +++ b/vendor/go.opentelemetry.io/otel/sdk/trace/span.go @@ -151,6 +151,12 @@ type recordingSpan struct { // tracer is the SDK tracer that created this span. tracer *tracer + + // origCtx is the context used when starting this span that has the + // recordingSpan instance set as the active span. If not nil, it is used + // when ending the span to ensure any metrics are recorded with a context + // containing this span without requiring an additional allocation. + origCtx context.Context } var ( @@ -158,6 +164,10 @@ var ( _ runtimeTracer = (*recordingSpan)(nil) ) +func (s *recordingSpan) setOrigCtx(ctx context.Context) { + s.origCtx = ctx +} + // SpanContext returns the SpanContext of this span. func (s *recordingSpan) SpanContext() trace.SpanContext { if s == nil { @@ -496,14 +506,15 @@ func (s *recordingSpan) End(options ...trace.SpanEndOption) { } s.mu.Unlock() - if s.tracer.selfObservabilityEnabled { - defer func() { - // Add the span to the context to ensure the metric is recorded - // with the correct span context. - ctx := trace.ContextWithSpan(context.Background(), s) - set := spanLiveSet(s.spanContext.IsSampled()) - s.tracer.spanLiveMetric.AddSet(ctx, -1, set) - }() + if s.tracer.inst.Enabled() { + ctx := s.origCtx + if ctx == nil { + // This should not happen as the origCtx should be set, but + // ensure trace information is propagated in the case of an + // error. + ctx = trace.ContextWithSpan(context.Background(), s) + } + defer s.tracer.inst.SpanEnded(ctx, s) } sps := s.tracer.provider.getSpanProcessors() diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/span_limits.go b/vendor/go.opentelemetry.io/otel/sdk/trace/span_limits.go index bec5e209787..321d9743058 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/trace/span_limits.go +++ b/vendor/go.opentelemetry.io/otel/sdk/trace/span_limits.go @@ -3,7 +3,7 @@ package trace // import "go.opentelemetry.io/otel/sdk/trace" -import "go.opentelemetry.io/otel/sdk/internal/env" +import "go.opentelemetry.io/otel/sdk/trace/internal/env" const ( // DefaultAttributeValueLengthLimit is the default maximum allowed diff --git a/vendor/go.opentelemetry.io/otel/sdk/trace/tracer.go b/vendor/go.opentelemetry.io/otel/sdk/trace/tracer.go index e965c4cce86..e1d08fd4d8d 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/trace/tracer.go +++ b/vendor/go.opentelemetry.io/otel/sdk/trace/tracer.go @@ -7,9 +7,8 @@ import ( "context" "time" - "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/sdk/instrumentation" - "go.opentelemetry.io/otel/semconv/v1.37.0/otelconv" + "go.opentelemetry.io/otel/sdk/trace/internal/observ" "go.opentelemetry.io/otel/trace" "go.opentelemetry.io/otel/trace/embedded" ) @@ -20,9 +19,7 @@ type tracer struct { provider *TracerProvider instrumentationScope instrumentation.Scope - selfObservabilityEnabled bool - spanLiveMetric otelconv.SDKSpanLive - spanStartedMetric otelconv.SDKSpanStarted + inst observ.Tracer } var _ trace.Tracer = &tracer{} @@ -53,10 +50,17 @@ func (tr *tracer) Start( s := tr.newSpan(ctx, name, &config) newCtx := trace.ContextWithSpan(ctx, s) - if tr.selfObservabilityEnabled { + if tr.inst.Enabled() { + if o, ok := s.(interface{ setOrigCtx(context.Context) }); ok { + // If this is a recording span, store the original context. + // This allows later retrieval of baggage and other information + // that may have been stored in the context at span start time and + // to avoid the allocation of repeatedly calling + // trace.ContextWithSpan. + o.setOrigCtx(newCtx) + } psc := trace.SpanContextFromContext(ctx) - set := spanStartedSet(psc, s) - tr.spanStartedMetric.AddSet(newCtx, 1, set) + tr.inst.SpanStarted(newCtx, psc, s) } if rw, ok := s.(ReadWriteSpan); ok && s.IsRecording() { @@ -168,12 +172,11 @@ func (tr *tracer) newRecordingSpan( s.SetAttributes(sr.Attributes...) s.SetAttributes(config.Attributes()...) - if tr.selfObservabilityEnabled { + if tr.inst.Enabled() { // Propagate any existing values from the context with the new span to // the measurement context. ctx = trace.ContextWithSpan(ctx, s) - set := spanLiveSet(s.spanContext.IsSampled()) - tr.spanLiveMetric.AddSet(ctx, 1, set) + tr.inst.SpanLive(ctx, s) } return s @@ -183,112 +186,3 @@ func (tr *tracer) newRecordingSpan( func (tr *tracer) newNonRecordingSpan(sc trace.SpanContext) nonRecordingSpan { return nonRecordingSpan{tracer: tr, sc: sc} } - -type parentState int - -const ( - parentStateNoParent parentState = iota - parentStateLocalParent - parentStateRemoteParent -) - -type samplingState int - -const ( - samplingStateDrop samplingState = iota - samplingStateRecordOnly - samplingStateRecordAndSample -) - -type spanStartedSetKey struct { - parent parentState - sampling samplingState -} - -var spanStartedSetCache = map[spanStartedSetKey]attribute.Set{ - {parentStateNoParent, samplingStateDrop}: attribute.NewSet( - otelconv.SDKSpanStarted{}.AttrSpanParentOrigin(otelconv.SpanParentOriginNone), - otelconv.SDKSpanStarted{}.AttrSpanSamplingResult(otelconv.SpanSamplingResultDrop), - ), - {parentStateLocalParent, samplingStateDrop}: attribute.NewSet( - otelconv.SDKSpanStarted{}.AttrSpanParentOrigin(otelconv.SpanParentOriginLocal), - otelconv.SDKSpanStarted{}.AttrSpanSamplingResult(otelconv.SpanSamplingResultDrop), - ), - {parentStateRemoteParent, samplingStateDrop}: attribute.NewSet( - otelconv.SDKSpanStarted{}.AttrSpanParentOrigin(otelconv.SpanParentOriginRemote), - otelconv.SDKSpanStarted{}.AttrSpanSamplingResult(otelconv.SpanSamplingResultDrop), - ), - - {parentStateNoParent, samplingStateRecordOnly}: attribute.NewSet( - otelconv.SDKSpanStarted{}.AttrSpanParentOrigin(otelconv.SpanParentOriginNone), - otelconv.SDKSpanStarted{}.AttrSpanSamplingResult(otelconv.SpanSamplingResultRecordOnly), - ), - {parentStateLocalParent, samplingStateRecordOnly}: attribute.NewSet( - otelconv.SDKSpanStarted{}.AttrSpanParentOrigin(otelconv.SpanParentOriginLocal), - otelconv.SDKSpanStarted{}.AttrSpanSamplingResult(otelconv.SpanSamplingResultRecordOnly), - ), - {parentStateRemoteParent, samplingStateRecordOnly}: attribute.NewSet( - otelconv.SDKSpanStarted{}.AttrSpanParentOrigin(otelconv.SpanParentOriginRemote), - otelconv.SDKSpanStarted{}.AttrSpanSamplingResult(otelconv.SpanSamplingResultRecordOnly), - ), - - {parentStateNoParent, samplingStateRecordAndSample}: attribute.NewSet( - otelconv.SDKSpanStarted{}.AttrSpanParentOrigin(otelconv.SpanParentOriginNone), - otelconv.SDKSpanStarted{}.AttrSpanSamplingResult(otelconv.SpanSamplingResultRecordAndSample), - ), - {parentStateLocalParent, samplingStateRecordAndSample}: attribute.NewSet( - otelconv.SDKSpanStarted{}.AttrSpanParentOrigin(otelconv.SpanParentOriginLocal), - otelconv.SDKSpanStarted{}.AttrSpanSamplingResult(otelconv.SpanSamplingResultRecordAndSample), - ), - {parentStateRemoteParent, samplingStateRecordAndSample}: attribute.NewSet( - otelconv.SDKSpanStarted{}.AttrSpanParentOrigin(otelconv.SpanParentOriginRemote), - otelconv.SDKSpanStarted{}.AttrSpanSamplingResult(otelconv.SpanSamplingResultRecordAndSample), - ), -} - -func spanStartedSet(psc trace.SpanContext, span trace.Span) attribute.Set { - key := spanStartedSetKey{ - parent: parentStateNoParent, - sampling: samplingStateDrop, - } - - if psc.IsValid() { - if psc.IsRemote() { - key.parent = parentStateRemoteParent - } else { - key.parent = parentStateLocalParent - } - } - - if span.IsRecording() { - if span.SpanContext().IsSampled() { - key.sampling = samplingStateRecordAndSample - } else { - key.sampling = samplingStateRecordOnly - } - } - - return spanStartedSetCache[key] -} - -type spanLiveSetKey struct { - sampled bool -} - -var spanLiveSetCache = map[spanLiveSetKey]attribute.Set{ - {true}: attribute.NewSet( - otelconv.SDKSpanLive{}.AttrSpanSamplingResult( - otelconv.SpanSamplingResultRecordAndSample, - ), - ), - {false}: attribute.NewSet( - otelconv.SDKSpanLive{}.AttrSpanSamplingResult( - otelconv.SpanSamplingResultRecordOnly, - ), - ), -} - -func spanLiveSet(sampled bool) attribute.Set { - key := spanLiveSetKey{sampled: sampled} - return spanLiveSetCache[key] -} diff --git a/vendor/go.opentelemetry.io/otel/sdk/version.go b/vendor/go.opentelemetry.io/otel/sdk/version.go index 7f97cc31e51..0a3b3661910 100644 --- a/vendor/go.opentelemetry.io/otel/sdk/version.go +++ b/vendor/go.opentelemetry.io/otel/sdk/version.go @@ -6,5 +6,5 @@ package sdk // import "go.opentelemetry.io/otel/sdk" // Version is the current release version of the OpenTelemetry SDK in use. func Version() string { - return "1.38.0" + return "1.39.0" } diff --git a/vendor/go.opentelemetry.io/otel/semconv/v1.37.0/error_type.go b/vendor/go.opentelemetry.io/otel/semconv/v1.37.0/error_type.go index 666bded4baf..267979c051d 100644 --- a/vendor/go.opentelemetry.io/otel/semconv/v1.37.0/error_type.go +++ b/vendor/go.opentelemetry.io/otel/semconv/v1.37.0/error_type.go @@ -4,28 +4,53 @@ package semconv // import "go.opentelemetry.io/otel/semconv/v1.37.0" import ( - "fmt" "reflect" "go.opentelemetry.io/otel/attribute" ) // ErrorType returns an [attribute.KeyValue] identifying the error type of err. +// +// If err is nil, the returned attribute has the default value +// [ErrorTypeOther]. +// +// If err's type has the method +// +// ErrorType() string +// +// then the returned attribute has the value of err.ErrorType(). Otherwise, the +// returned attribute has a value derived from the concrete type of err. +// +// The key of the returned attribute is [ErrorTypeKey]. func ErrorType(err error) attribute.KeyValue { if err == nil { return ErrorTypeOther } - t := reflect.TypeOf(err) - var value string - if t.PkgPath() == "" && t.Name() == "" { - // Likely a builtin type. - value = t.String() - } else { - value = fmt.Sprintf("%s.%s", t.PkgPath(), t.Name()) + + return ErrorTypeKey.String(errorType(err)) +} + +func errorType(err error) string { + var s string + if et, ok := err.(interface{ ErrorType() string }); ok { + // Prioritize the ErrorType method if available. + s = et.ErrorType() } + if s == "" { + // Fallback to reflection if the ErrorType method is not supported or + // returns an empty value. - if value == "" { - return ErrorTypeOther + t := reflect.TypeOf(err) + pkg, name := t.PkgPath(), t.Name() + if pkg != "" && name != "" { + s = pkg + "." + name + } else { + // The type has no package path or name (predeclared, not-defined, + // or alias for a not-defined type). + // + // This is not guaranteed to be unique, but is a best effort. + s = t.String() + } } - return ErrorTypeKey.String(value) + return s } diff --git a/vendor/go.opentelemetry.io/otel/semconv/v1.37.0/httpconv/metric.go b/vendor/go.opentelemetry.io/otel/semconv/v1.37.0/httpconv/metric.go index 55bde895ddd..a0ddf652d34 100644 --- a/vendor/go.opentelemetry.io/otel/semconv/v1.37.0/httpconv/metric.go +++ b/vendor/go.opentelemetry.io/otel/semconv/v1.37.0/httpconv/metric.go @@ -91,6 +91,11 @@ type ClientActiveRequests struct { metric.Int64UpDownCounter } +var newClientActiveRequestsOpts = []metric.Int64UpDownCounterOption{ + metric.WithDescription("Number of active HTTP requests."), + metric.WithUnit("{request}"), +} + // NewClientActiveRequests returns a new ClientActiveRequests instrument. func NewClientActiveRequests( m metric.Meter, @@ -101,15 +106,18 @@ func NewClientActiveRequests( return ClientActiveRequests{noop.Int64UpDownCounter{}}, nil } + if len(opt) == 0 { + opt = newClientActiveRequestsOpts + } else { + opt = append(opt, newClientActiveRequestsOpts...) + } + i, err := m.Int64UpDownCounter( "http.client.active_requests", - append([]metric.Int64UpDownCounterOption{ - metric.WithDescription("Number of active HTTP requests."), - metric.WithUnit("{request}"), - }, opt...)..., + opt..., ) if err != nil { - return ClientActiveRequests{noop.Int64UpDownCounter{}}, err + return ClientActiveRequests{noop.Int64UpDownCounter{}}, err } return ClientActiveRequests{i}, nil } @@ -223,6 +231,11 @@ type ClientConnectionDuration struct { metric.Float64Histogram } +var newClientConnectionDurationOpts = []metric.Float64HistogramOption{ + metric.WithDescription("The duration of the successfully established outbound HTTP connections."), + metric.WithUnit("s"), +} + // NewClientConnectionDuration returns a new ClientConnectionDuration instrument. func NewClientConnectionDuration( m metric.Meter, @@ -233,15 +246,18 @@ func NewClientConnectionDuration( return ClientConnectionDuration{noop.Float64Histogram{}}, nil } + if len(opt) == 0 { + opt = newClientConnectionDurationOpts + } else { + opt = append(opt, newClientConnectionDurationOpts...) + } + i, err := m.Float64Histogram( "http.client.connection.duration", - append([]metric.Float64HistogramOption{ - metric.WithDescription("The duration of the successfully established outbound HTTP connections."), - metric.WithUnit("s"), - }, opt...)..., + opt..., ) if err != nil { - return ClientConnectionDuration{noop.Float64Histogram{}}, err + return ClientConnectionDuration{noop.Float64Histogram{}}, err } return ClientConnectionDuration{i}, nil } @@ -310,6 +326,7 @@ func (m ClientConnectionDuration) Record( func (m ClientConnectionDuration) RecordSet(ctx context.Context, val float64, set attribute.Set) { if set.Len() == 0 { m.Float64Histogram.Record(ctx, val) + return } o := recOptPool.Get().(*[]metric.RecordOption) @@ -353,6 +370,11 @@ type ClientOpenConnections struct { metric.Int64UpDownCounter } +var newClientOpenConnectionsOpts = []metric.Int64UpDownCounterOption{ + metric.WithDescription("Number of outbound HTTP connections that are currently active or idle on the client."), + metric.WithUnit("{connection}"), +} + // NewClientOpenConnections returns a new ClientOpenConnections instrument. func NewClientOpenConnections( m metric.Meter, @@ -363,15 +385,18 @@ func NewClientOpenConnections( return ClientOpenConnections{noop.Int64UpDownCounter{}}, nil } + if len(opt) == 0 { + opt = newClientOpenConnectionsOpts + } else { + opt = append(opt, newClientOpenConnectionsOpts...) + } + i, err := m.Int64UpDownCounter( "http.client.open_connections", - append([]metric.Int64UpDownCounterOption{ - metric.WithDescription("Number of outbound HTTP connections that are currently active or idle on the client."), - metric.WithUnit("{connection}"), - }, opt...)..., + opt..., ) if err != nil { - return ClientOpenConnections{noop.Int64UpDownCounter{}}, err + return ClientOpenConnections{noop.Int64UpDownCounter{}}, err } return ClientOpenConnections{i}, nil } @@ -488,6 +513,11 @@ type ClientRequestBodySize struct { metric.Int64Histogram } +var newClientRequestBodySizeOpts = []metric.Int64HistogramOption{ + metric.WithDescription("Size of HTTP client request bodies."), + metric.WithUnit("By"), +} + // NewClientRequestBodySize returns a new ClientRequestBodySize instrument. func NewClientRequestBodySize( m metric.Meter, @@ -498,15 +528,18 @@ func NewClientRequestBodySize( return ClientRequestBodySize{noop.Int64Histogram{}}, nil } + if len(opt) == 0 { + opt = newClientRequestBodySizeOpts + } else { + opt = append(opt, newClientRequestBodySizeOpts...) + } + i, err := m.Int64Histogram( "http.client.request.body.size", - append([]metric.Int64HistogramOption{ - metric.WithDescription("Size of HTTP client request bodies."), - metric.WithUnit("By"), - }, opt...)..., + opt..., ) if err != nil { - return ClientRequestBodySize{noop.Int64Histogram{}}, err + return ClientRequestBodySize{noop.Int64Histogram{}}, err } return ClientRequestBodySize{i}, nil } @@ -593,6 +626,7 @@ func (m ClientRequestBodySize) Record( func (m ClientRequestBodySize) RecordSet(ctx context.Context, val int64, set attribute.Set) { if set.Len() == 0 { m.Int64Histogram.Record(ctx, val) + return } o := recOptPool.Get().(*[]metric.RecordOption) @@ -662,6 +696,11 @@ type ClientRequestDuration struct { metric.Float64Histogram } +var newClientRequestDurationOpts = []metric.Float64HistogramOption{ + metric.WithDescription("Duration of HTTP client requests."), + metric.WithUnit("s"), +} + // NewClientRequestDuration returns a new ClientRequestDuration instrument. func NewClientRequestDuration( m metric.Meter, @@ -672,15 +711,18 @@ func NewClientRequestDuration( return ClientRequestDuration{noop.Float64Histogram{}}, nil } + if len(opt) == 0 { + opt = newClientRequestDurationOpts + } else { + opt = append(opt, newClientRequestDurationOpts...) + } + i, err := m.Float64Histogram( "http.client.request.duration", - append([]metric.Float64HistogramOption{ - metric.WithDescription("Duration of HTTP client requests."), - metric.WithUnit("s"), - }, opt...)..., + opt..., ) if err != nil { - return ClientRequestDuration{noop.Float64Histogram{}}, err + return ClientRequestDuration{noop.Float64Histogram{}}, err } return ClientRequestDuration{i}, nil } @@ -753,6 +795,7 @@ func (m ClientRequestDuration) Record( func (m ClientRequestDuration) RecordSet(ctx context.Context, val float64, set attribute.Set) { if set.Len() == 0 { m.Float64Histogram.Record(ctx, val) + return } o := recOptPool.Get().(*[]metric.RecordOption) @@ -822,6 +865,11 @@ type ClientResponseBodySize struct { metric.Int64Histogram } +var newClientResponseBodySizeOpts = []metric.Int64HistogramOption{ + metric.WithDescription("Size of HTTP client response bodies."), + metric.WithUnit("By"), +} + // NewClientResponseBodySize returns a new ClientResponseBodySize instrument. func NewClientResponseBodySize( m metric.Meter, @@ -832,15 +880,18 @@ func NewClientResponseBodySize( return ClientResponseBodySize{noop.Int64Histogram{}}, nil } + if len(opt) == 0 { + opt = newClientResponseBodySizeOpts + } else { + opt = append(opt, newClientResponseBodySizeOpts...) + } + i, err := m.Int64Histogram( "http.client.response.body.size", - append([]metric.Int64HistogramOption{ - metric.WithDescription("Size of HTTP client response bodies."), - metric.WithUnit("By"), - }, opt...)..., + opt..., ) if err != nil { - return ClientResponseBodySize{noop.Int64Histogram{}}, err + return ClientResponseBodySize{noop.Int64Histogram{}}, err } return ClientResponseBodySize{i}, nil } @@ -927,6 +978,7 @@ func (m ClientResponseBodySize) Record( func (m ClientResponseBodySize) RecordSet(ctx context.Context, val int64, set attribute.Set) { if set.Len() == 0 { m.Int64Histogram.Record(ctx, val) + return } o := recOptPool.Get().(*[]metric.RecordOption) @@ -996,6 +1048,11 @@ type ServerActiveRequests struct { metric.Int64UpDownCounter } +var newServerActiveRequestsOpts = []metric.Int64UpDownCounterOption{ + metric.WithDescription("Number of active HTTP server requests."), + metric.WithUnit("{request}"), +} + // NewServerActiveRequests returns a new ServerActiveRequests instrument. func NewServerActiveRequests( m metric.Meter, @@ -1006,15 +1063,18 @@ func NewServerActiveRequests( return ServerActiveRequests{noop.Int64UpDownCounter{}}, nil } + if len(opt) == 0 { + opt = newServerActiveRequestsOpts + } else { + opt = append(opt, newServerActiveRequestsOpts...) + } + i, err := m.Int64UpDownCounter( "http.server.active_requests", - append([]metric.Int64UpDownCounterOption{ - metric.WithDescription("Number of active HTTP server requests."), - metric.WithUnit("{request}"), - }, opt...)..., + opt..., ) if err != nil { - return ServerActiveRequests{noop.Int64UpDownCounter{}}, err + return ServerActiveRequests{noop.Int64UpDownCounter{}}, err } return ServerActiveRequests{i}, nil } @@ -1118,6 +1178,11 @@ type ServerRequestBodySize struct { metric.Int64Histogram } +var newServerRequestBodySizeOpts = []metric.Int64HistogramOption{ + metric.WithDescription("Size of HTTP server request bodies."), + metric.WithUnit("By"), +} + // NewServerRequestBodySize returns a new ServerRequestBodySize instrument. func NewServerRequestBodySize( m metric.Meter, @@ -1128,15 +1193,18 @@ func NewServerRequestBodySize( return ServerRequestBodySize{noop.Int64Histogram{}}, nil } + if len(opt) == 0 { + opt = newServerRequestBodySizeOpts + } else { + opt = append(opt, newServerRequestBodySizeOpts...) + } + i, err := m.Int64Histogram( "http.server.request.body.size", - append([]metric.Int64HistogramOption{ - metric.WithDescription("Size of HTTP server request bodies."), - metric.WithUnit("By"), - }, opt...)..., + opt..., ) if err != nil { - return ServerRequestBodySize{noop.Int64Histogram{}}, err + return ServerRequestBodySize{noop.Int64Histogram{}}, err } return ServerRequestBodySize{i}, nil } @@ -1220,6 +1288,7 @@ func (m ServerRequestBodySize) Record( func (m ServerRequestBodySize) RecordSet(ctx context.Context, val int64, set attribute.Set) { if set.Len() == 0 { m.Int64Histogram.Record(ctx, val) + return } o := recOptPool.Get().(*[]metric.RecordOption) @@ -1299,6 +1368,11 @@ type ServerRequestDuration struct { metric.Float64Histogram } +var newServerRequestDurationOpts = []metric.Float64HistogramOption{ + metric.WithDescription("Duration of HTTP server requests."), + metric.WithUnit("s"), +} + // NewServerRequestDuration returns a new ServerRequestDuration instrument. func NewServerRequestDuration( m metric.Meter, @@ -1309,15 +1383,18 @@ func NewServerRequestDuration( return ServerRequestDuration{noop.Float64Histogram{}}, nil } + if len(opt) == 0 { + opt = newServerRequestDurationOpts + } else { + opt = append(opt, newServerRequestDurationOpts...) + } + i, err := m.Float64Histogram( "http.server.request.duration", - append([]metric.Float64HistogramOption{ - metric.WithDescription("Duration of HTTP server requests."), - metric.WithUnit("s"), - }, opt...)..., + opt..., ) if err != nil { - return ServerRequestDuration{noop.Float64Histogram{}}, err + return ServerRequestDuration{noop.Float64Histogram{}}, err } return ServerRequestDuration{i}, nil } @@ -1387,6 +1464,7 @@ func (m ServerRequestDuration) Record( func (m ServerRequestDuration) RecordSet(ctx context.Context, val float64, set attribute.Set) { if set.Len() == 0 { m.Float64Histogram.Record(ctx, val) + return } o := recOptPool.Get().(*[]metric.RecordOption) @@ -1466,6 +1544,11 @@ type ServerResponseBodySize struct { metric.Int64Histogram } +var newServerResponseBodySizeOpts = []metric.Int64HistogramOption{ + metric.WithDescription("Size of HTTP server response bodies."), + metric.WithUnit("By"), +} + // NewServerResponseBodySize returns a new ServerResponseBodySize instrument. func NewServerResponseBodySize( m metric.Meter, @@ -1476,15 +1559,18 @@ func NewServerResponseBodySize( return ServerResponseBodySize{noop.Int64Histogram{}}, nil } + if len(opt) == 0 { + opt = newServerResponseBodySizeOpts + } else { + opt = append(opt, newServerResponseBodySizeOpts...) + } + i, err := m.Int64Histogram( "http.server.response.body.size", - append([]metric.Int64HistogramOption{ - metric.WithDescription("Size of HTTP server response bodies."), - metric.WithUnit("By"), - }, opt...)..., + opt..., ) if err != nil { - return ServerResponseBodySize{noop.Int64Histogram{}}, err + return ServerResponseBodySize{noop.Int64Histogram{}}, err } return ServerResponseBodySize{i}, nil } @@ -1568,6 +1654,7 @@ func (m ServerResponseBodySize) Record( func (m ServerResponseBodySize) RecordSet(ctx context.Context, val int64, set attribute.Set) { if set.Len() == 0 { m.Int64Histogram.Record(ctx, val) + return } o := recOptPool.Get().(*[]metric.RecordOption) @@ -1638,4 +1725,4 @@ func (ServerResponseBodySize) AttrServerPort(val int) attribute.KeyValue { // the category of synthetic traffic, such as tests or bots. func (ServerResponseBodySize) AttrUserAgentSyntheticType(val UserAgentSyntheticTypeAttr) attribute.KeyValue { return attribute.String("user_agent.synthetic.type", string(val)) -} \ No newline at end of file +} diff --git a/vendor/go.opentelemetry.io/otel/semconv/v1.37.0/otelconv/metric.go b/vendor/go.opentelemetry.io/otel/semconv/v1.37.0/otelconv/metric.go index a78eafd1fa3..fd064530c34 100644 --- a/vendor/go.opentelemetry.io/otel/semconv/v1.37.0/otelconv/metric.go +++ b/vendor/go.opentelemetry.io/otel/semconv/v1.37.0/otelconv/metric.go @@ -3,7 +3,7 @@ // Copyright The OpenTelemetry Authors // SPDX-License-Identifier: Apache-2.0 -// Package httpconv provides types and functionality for OpenTelemetry semantic +// Package otelconv provides types and functionality for OpenTelemetry semantic // conventions in the "otel" namespace. package otelconv @@ -172,6 +172,11 @@ type SDKExporterLogExported struct { metric.Int64Counter } +var newSDKExporterLogExportedOpts = []metric.Int64CounterOption{ + metric.WithDescription("The number of log records for which the export has finished, either successful or failed."), + metric.WithUnit("{log_record}"), +} + // NewSDKExporterLogExported returns a new SDKExporterLogExported instrument. func NewSDKExporterLogExported( m metric.Meter, @@ -182,15 +187,18 @@ func NewSDKExporterLogExported( return SDKExporterLogExported{noop.Int64Counter{}}, nil } + if len(opt) == 0 { + opt = newSDKExporterLogExportedOpts + } else { + opt = append(opt, newSDKExporterLogExportedOpts...) + } + i, err := m.Int64Counter( "otel.sdk.exporter.log.exported", - append([]metric.Int64CounterOption{ - metric.WithDescription("The number of log records for which the export has finished, either successful or failed."), - metric.WithUnit("{log_record}"), - }, opt...)..., + opt..., ) if err != nil { - return SDKExporterLogExported{noop.Int64Counter{}}, err + return SDKExporterLogExported{noop.Int64Counter{}}, err } return SDKExporterLogExported{i}, nil } @@ -319,6 +327,11 @@ type SDKExporterLogInflight struct { metric.Int64UpDownCounter } +var newSDKExporterLogInflightOpts = []metric.Int64UpDownCounterOption{ + metric.WithDescription("The number of log records which were passed to the exporter, but that have not been exported yet (neither successful, nor failed)."), + metric.WithUnit("{log_record}"), +} + // NewSDKExporterLogInflight returns a new SDKExporterLogInflight instrument. func NewSDKExporterLogInflight( m metric.Meter, @@ -329,15 +342,18 @@ func NewSDKExporterLogInflight( return SDKExporterLogInflight{noop.Int64UpDownCounter{}}, nil } + if len(opt) == 0 { + opt = newSDKExporterLogInflightOpts + } else { + opt = append(opt, newSDKExporterLogInflightOpts...) + } + i, err := m.Int64UpDownCounter( "otel.sdk.exporter.log.inflight", - append([]metric.Int64UpDownCounterOption{ - metric.WithDescription("The number of log records which were passed to the exporter, but that have not been exported yet (neither successful, nor failed)."), - metric.WithUnit("{log_record}"), - }, opt...)..., + opt..., ) if err != nil { - return SDKExporterLogInflight{noop.Int64UpDownCounter{}}, err + return SDKExporterLogInflight{noop.Int64UpDownCounter{}}, err } return SDKExporterLogInflight{i}, nil } @@ -449,6 +465,11 @@ type SDKExporterMetricDataPointExported struct { metric.Int64Counter } +var newSDKExporterMetricDataPointExportedOpts = []metric.Int64CounterOption{ + metric.WithDescription("The number of metric data points for which the export has finished, either successful or failed."), + metric.WithUnit("{data_point}"), +} + // NewSDKExporterMetricDataPointExported returns a new // SDKExporterMetricDataPointExported instrument. func NewSDKExporterMetricDataPointExported( @@ -460,15 +481,18 @@ func NewSDKExporterMetricDataPointExported( return SDKExporterMetricDataPointExported{noop.Int64Counter{}}, nil } + if len(opt) == 0 { + opt = newSDKExporterMetricDataPointExportedOpts + } else { + opt = append(opt, newSDKExporterMetricDataPointExportedOpts...) + } + i, err := m.Int64Counter( "otel.sdk.exporter.metric_data_point.exported", - append([]metric.Int64CounterOption{ - metric.WithDescription("The number of metric data points for which the export has finished, either successful or failed."), - metric.WithUnit("{data_point}"), - }, opt...)..., + opt..., ) if err != nil { - return SDKExporterMetricDataPointExported{noop.Int64Counter{}}, err + return SDKExporterMetricDataPointExported{noop.Int64Counter{}}, err } return SDKExporterMetricDataPointExported{i}, nil } @@ -598,6 +622,11 @@ type SDKExporterMetricDataPointInflight struct { metric.Int64UpDownCounter } +var newSDKExporterMetricDataPointInflightOpts = []metric.Int64UpDownCounterOption{ + metric.WithDescription("The number of metric data points which were passed to the exporter, but that have not been exported yet (neither successful, nor failed)."), + metric.WithUnit("{data_point}"), +} + // NewSDKExporterMetricDataPointInflight returns a new // SDKExporterMetricDataPointInflight instrument. func NewSDKExporterMetricDataPointInflight( @@ -609,15 +638,18 @@ func NewSDKExporterMetricDataPointInflight( return SDKExporterMetricDataPointInflight{noop.Int64UpDownCounter{}}, nil } + if len(opt) == 0 { + opt = newSDKExporterMetricDataPointInflightOpts + } else { + opt = append(opt, newSDKExporterMetricDataPointInflightOpts...) + } + i, err := m.Int64UpDownCounter( "otel.sdk.exporter.metric_data_point.inflight", - append([]metric.Int64UpDownCounterOption{ - metric.WithDescription("The number of metric data points which were passed to the exporter, but that have not been exported yet (neither successful, nor failed)."), - metric.WithUnit("{data_point}"), - }, opt...)..., + opt..., ) if err != nil { - return SDKExporterMetricDataPointInflight{noop.Int64UpDownCounter{}}, err + return SDKExporterMetricDataPointInflight{noop.Int64UpDownCounter{}}, err } return SDKExporterMetricDataPointInflight{i}, nil } @@ -728,6 +760,11 @@ type SDKExporterOperationDuration struct { metric.Float64Histogram } +var newSDKExporterOperationDurationOpts = []metric.Float64HistogramOption{ + metric.WithDescription("The duration of exporting a batch of telemetry records."), + metric.WithUnit("s"), +} + // NewSDKExporterOperationDuration returns a new SDKExporterOperationDuration // instrument. func NewSDKExporterOperationDuration( @@ -739,15 +776,18 @@ func NewSDKExporterOperationDuration( return SDKExporterOperationDuration{noop.Float64Histogram{}}, nil } + if len(opt) == 0 { + opt = newSDKExporterOperationDurationOpts + } else { + opt = append(opt, newSDKExporterOperationDurationOpts...) + } + i, err := m.Float64Histogram( "otel.sdk.exporter.operation.duration", - append([]metric.Float64HistogramOption{ - metric.WithDescription("The duration of exporting a batch of telemetry records."), - metric.WithUnit("s"), - }, opt...)..., + opt..., ) if err != nil { - return SDKExporterOperationDuration{noop.Float64Histogram{}}, err + return SDKExporterOperationDuration{noop.Float64Histogram{}}, err } return SDKExporterOperationDuration{i}, nil } @@ -825,6 +865,7 @@ func (m SDKExporterOperationDuration) Record( func (m SDKExporterOperationDuration) RecordSet(ctx context.Context, val float64, set attribute.Set) { if set.Len() == 0 { m.Float64Histogram.Record(ctx, val) + return } o := recOptPool.Get().(*[]metric.RecordOption) @@ -893,6 +934,11 @@ type SDKExporterSpanExported struct { metric.Int64Counter } +var newSDKExporterSpanExportedOpts = []metric.Int64CounterOption{ + metric.WithDescription("The number of spans for which the export has finished, either successful or failed."), + metric.WithUnit("{span}"), +} + // NewSDKExporterSpanExported returns a new SDKExporterSpanExported instrument. func NewSDKExporterSpanExported( m metric.Meter, @@ -903,15 +949,18 @@ func NewSDKExporterSpanExported( return SDKExporterSpanExported{noop.Int64Counter{}}, nil } + if len(opt) == 0 { + opt = newSDKExporterSpanExportedOpts + } else { + opt = append(opt, newSDKExporterSpanExportedOpts...) + } + i, err := m.Int64Counter( "otel.sdk.exporter.span.exported", - append([]metric.Int64CounterOption{ - metric.WithDescription("The number of spans for which the export has finished, either successful or failed."), - metric.WithUnit("{span}"), - }, opt...)..., + opt..., ) if err != nil { - return SDKExporterSpanExported{noop.Int64Counter{}}, err + return SDKExporterSpanExported{noop.Int64Counter{}}, err } return SDKExporterSpanExported{i}, nil } @@ -1040,6 +1089,11 @@ type SDKExporterSpanInflight struct { metric.Int64UpDownCounter } +var newSDKExporterSpanInflightOpts = []metric.Int64UpDownCounterOption{ + metric.WithDescription("The number of spans which were passed to the exporter, but that have not been exported yet (neither successful, nor failed)."), + metric.WithUnit("{span}"), +} + // NewSDKExporterSpanInflight returns a new SDKExporterSpanInflight instrument. func NewSDKExporterSpanInflight( m metric.Meter, @@ -1050,15 +1104,18 @@ func NewSDKExporterSpanInflight( return SDKExporterSpanInflight{noop.Int64UpDownCounter{}}, nil } + if len(opt) == 0 { + opt = newSDKExporterSpanInflightOpts + } else { + opt = append(opt, newSDKExporterSpanInflightOpts...) + } + i, err := m.Int64UpDownCounter( "otel.sdk.exporter.span.inflight", - append([]metric.Int64UpDownCounterOption{ - metric.WithDescription("The number of spans which were passed to the exporter, but that have not been exported yet (neither successful, nor failed)."), - metric.WithUnit("{span}"), - }, opt...)..., + opt..., ) if err != nil { - return SDKExporterSpanInflight{noop.Int64UpDownCounter{}}, err + return SDKExporterSpanInflight{noop.Int64UpDownCounter{}}, err } return SDKExporterSpanInflight{i}, nil } @@ -1169,6 +1226,11 @@ type SDKLogCreated struct { metric.Int64Counter } +var newSDKLogCreatedOpts = []metric.Int64CounterOption{ + metric.WithDescription("The number of logs submitted to enabled SDK Loggers."), + metric.WithUnit("{log_record}"), +} + // NewSDKLogCreated returns a new SDKLogCreated instrument. func NewSDKLogCreated( m metric.Meter, @@ -1179,15 +1241,18 @@ func NewSDKLogCreated( return SDKLogCreated{noop.Int64Counter{}}, nil } + if len(opt) == 0 { + opt = newSDKLogCreatedOpts + } else { + opt = append(opt, newSDKLogCreatedOpts...) + } + i, err := m.Int64Counter( "otel.sdk.log.created", - append([]metric.Int64CounterOption{ - metric.WithDescription("The number of logs submitted to enabled SDK Loggers."), - metric.WithUnit("{log_record}"), - }, opt...)..., + opt..., ) if err != nil { - return SDKLogCreated{noop.Int64Counter{}}, err + return SDKLogCreated{noop.Int64Counter{}}, err } return SDKLogCreated{i}, nil } @@ -1254,6 +1319,11 @@ type SDKMetricReaderCollectionDuration struct { metric.Float64Histogram } +var newSDKMetricReaderCollectionDurationOpts = []metric.Float64HistogramOption{ + metric.WithDescription("The duration of the collect operation of the metric reader."), + metric.WithUnit("s"), +} + // NewSDKMetricReaderCollectionDuration returns a new // SDKMetricReaderCollectionDuration instrument. func NewSDKMetricReaderCollectionDuration( @@ -1265,15 +1335,18 @@ func NewSDKMetricReaderCollectionDuration( return SDKMetricReaderCollectionDuration{noop.Float64Histogram{}}, nil } + if len(opt) == 0 { + opt = newSDKMetricReaderCollectionDurationOpts + } else { + opt = append(opt, newSDKMetricReaderCollectionDurationOpts...) + } + i, err := m.Float64Histogram( "otel.sdk.metric_reader.collection.duration", - append([]metric.Float64HistogramOption{ - metric.WithDescription("The duration of the collect operation of the metric reader."), - metric.WithUnit("s"), - }, opt...)..., + opt..., ) if err != nil { - return SDKMetricReaderCollectionDuration{noop.Float64Histogram{}}, err + return SDKMetricReaderCollectionDuration{noop.Float64Histogram{}}, err } return SDKMetricReaderCollectionDuration{i}, nil } @@ -1343,6 +1416,7 @@ func (m SDKMetricReaderCollectionDuration) Record( func (m SDKMetricReaderCollectionDuration) RecordSet(ctx context.Context, val float64, set attribute.Set) { if set.Len() == 0 { m.Float64Histogram.Record(ctx, val) + return } o := recOptPool.Get().(*[]metric.RecordOption) @@ -1384,6 +1458,11 @@ type SDKProcessorLogProcessed struct { metric.Int64Counter } +var newSDKProcessorLogProcessedOpts = []metric.Int64CounterOption{ + metric.WithDescription("The number of log records for which the processing has finished, either successful or failed."), + metric.WithUnit("{log_record}"), +} + // NewSDKProcessorLogProcessed returns a new SDKProcessorLogProcessed instrument. func NewSDKProcessorLogProcessed( m metric.Meter, @@ -1394,15 +1473,18 @@ func NewSDKProcessorLogProcessed( return SDKProcessorLogProcessed{noop.Int64Counter{}}, nil } + if len(opt) == 0 { + opt = newSDKProcessorLogProcessedOpts + } else { + opt = append(opt, newSDKProcessorLogProcessedOpts...) + } + i, err := m.Int64Counter( "otel.sdk.processor.log.processed", - append([]metric.Int64CounterOption{ - metric.WithDescription("The number of log records for which the processing has finished, either successful or failed."), - metric.WithUnit("{log_record}"), - }, opt...)..., + opt..., ) if err != nil { - return SDKProcessorLogProcessed{noop.Int64Counter{}}, err + return SDKProcessorLogProcessed{noop.Int64Counter{}}, err } return SDKProcessorLogProcessed{i}, nil } @@ -1515,6 +1597,11 @@ type SDKProcessorLogQueueCapacity struct { metric.Int64ObservableUpDownCounter } +var newSDKProcessorLogQueueCapacityOpts = []metric.Int64ObservableUpDownCounterOption{ + metric.WithDescription("The maximum number of log records the queue of a given instance of an SDK Log Record processor can hold."), + metric.WithUnit("{log_record}"), +} + // NewSDKProcessorLogQueueCapacity returns a new SDKProcessorLogQueueCapacity // instrument. func NewSDKProcessorLogQueueCapacity( @@ -1526,15 +1613,18 @@ func NewSDKProcessorLogQueueCapacity( return SDKProcessorLogQueueCapacity{noop.Int64ObservableUpDownCounter{}}, nil } + if len(opt) == 0 { + opt = newSDKProcessorLogQueueCapacityOpts + } else { + opt = append(opt, newSDKProcessorLogQueueCapacityOpts...) + } + i, err := m.Int64ObservableUpDownCounter( "otel.sdk.processor.log.queue.capacity", - append([]metric.Int64ObservableUpDownCounterOption{ - metric.WithDescription("The maximum number of log records the queue of a given instance of an SDK Log Record processor can hold."), - metric.WithUnit("{log_record}"), - }, opt...)..., + opt..., ) if err != nil { - return SDKProcessorLogQueueCapacity{noop.Int64ObservableUpDownCounter{}}, err + return SDKProcessorLogQueueCapacity{noop.Int64ObservableUpDownCounter{}}, err } return SDKProcessorLogQueueCapacity{i}, nil } @@ -1581,6 +1671,11 @@ type SDKProcessorLogQueueSize struct { metric.Int64ObservableUpDownCounter } +var newSDKProcessorLogQueueSizeOpts = []metric.Int64ObservableUpDownCounterOption{ + metric.WithDescription("The number of log records in the queue of a given instance of an SDK log processor."), + metric.WithUnit("{log_record}"), +} + // NewSDKProcessorLogQueueSize returns a new SDKProcessorLogQueueSize instrument. func NewSDKProcessorLogQueueSize( m metric.Meter, @@ -1591,15 +1686,18 @@ func NewSDKProcessorLogQueueSize( return SDKProcessorLogQueueSize{noop.Int64ObservableUpDownCounter{}}, nil } + if len(opt) == 0 { + opt = newSDKProcessorLogQueueSizeOpts + } else { + opt = append(opt, newSDKProcessorLogQueueSizeOpts...) + } + i, err := m.Int64ObservableUpDownCounter( "otel.sdk.processor.log.queue.size", - append([]metric.Int64ObservableUpDownCounterOption{ - metric.WithDescription("The number of log records in the queue of a given instance of an SDK log processor."), - metric.WithUnit("{log_record}"), - }, opt...)..., + opt..., ) if err != nil { - return SDKProcessorLogQueueSize{noop.Int64ObservableUpDownCounter{}}, err + return SDKProcessorLogQueueSize{noop.Int64ObservableUpDownCounter{}}, err } return SDKProcessorLogQueueSize{i}, nil } @@ -1646,6 +1744,11 @@ type SDKProcessorSpanProcessed struct { metric.Int64Counter } +var newSDKProcessorSpanProcessedOpts = []metric.Int64CounterOption{ + metric.WithDescription("The number of spans for which the processing has finished, either successful or failed."), + metric.WithUnit("{span}"), +} + // NewSDKProcessorSpanProcessed returns a new SDKProcessorSpanProcessed // instrument. func NewSDKProcessorSpanProcessed( @@ -1657,15 +1760,18 @@ func NewSDKProcessorSpanProcessed( return SDKProcessorSpanProcessed{noop.Int64Counter{}}, nil } + if len(opt) == 0 { + opt = newSDKProcessorSpanProcessedOpts + } else { + opt = append(opt, newSDKProcessorSpanProcessedOpts...) + } + i, err := m.Int64Counter( "otel.sdk.processor.span.processed", - append([]metric.Int64CounterOption{ - metric.WithDescription("The number of spans for which the processing has finished, either successful or failed."), - metric.WithUnit("{span}"), - }, opt...)..., + opt..., ) if err != nil { - return SDKProcessorSpanProcessed{noop.Int64Counter{}}, err + return SDKProcessorSpanProcessed{noop.Int64Counter{}}, err } return SDKProcessorSpanProcessed{i}, nil } @@ -1778,6 +1884,11 @@ type SDKProcessorSpanQueueCapacity struct { metric.Int64ObservableUpDownCounter } +var newSDKProcessorSpanQueueCapacityOpts = []metric.Int64ObservableUpDownCounterOption{ + metric.WithDescription("The maximum number of spans the queue of a given instance of an SDK span processor can hold."), + metric.WithUnit("{span}"), +} + // NewSDKProcessorSpanQueueCapacity returns a new SDKProcessorSpanQueueCapacity // instrument. func NewSDKProcessorSpanQueueCapacity( @@ -1789,15 +1900,18 @@ func NewSDKProcessorSpanQueueCapacity( return SDKProcessorSpanQueueCapacity{noop.Int64ObservableUpDownCounter{}}, nil } + if len(opt) == 0 { + opt = newSDKProcessorSpanQueueCapacityOpts + } else { + opt = append(opt, newSDKProcessorSpanQueueCapacityOpts...) + } + i, err := m.Int64ObservableUpDownCounter( "otel.sdk.processor.span.queue.capacity", - append([]metric.Int64ObservableUpDownCounterOption{ - metric.WithDescription("The maximum number of spans the queue of a given instance of an SDK span processor can hold."), - metric.WithUnit("{span}"), - }, opt...)..., + opt..., ) if err != nil { - return SDKProcessorSpanQueueCapacity{noop.Int64ObservableUpDownCounter{}}, err + return SDKProcessorSpanQueueCapacity{noop.Int64ObservableUpDownCounter{}}, err } return SDKProcessorSpanQueueCapacity{i}, nil } @@ -1844,6 +1958,11 @@ type SDKProcessorSpanQueueSize struct { metric.Int64ObservableUpDownCounter } +var newSDKProcessorSpanQueueSizeOpts = []metric.Int64ObservableUpDownCounterOption{ + metric.WithDescription("The number of spans in the queue of a given instance of an SDK span processor."), + metric.WithUnit("{span}"), +} + // NewSDKProcessorSpanQueueSize returns a new SDKProcessorSpanQueueSize // instrument. func NewSDKProcessorSpanQueueSize( @@ -1855,15 +1974,18 @@ func NewSDKProcessorSpanQueueSize( return SDKProcessorSpanQueueSize{noop.Int64ObservableUpDownCounter{}}, nil } + if len(opt) == 0 { + opt = newSDKProcessorSpanQueueSizeOpts + } else { + opt = append(opt, newSDKProcessorSpanQueueSizeOpts...) + } + i, err := m.Int64ObservableUpDownCounter( "otel.sdk.processor.span.queue.size", - append([]metric.Int64ObservableUpDownCounterOption{ - metric.WithDescription("The number of spans in the queue of a given instance of an SDK span processor."), - metric.WithUnit("{span}"), - }, opt...)..., + opt..., ) if err != nil { - return SDKProcessorSpanQueueSize{noop.Int64ObservableUpDownCounter{}}, err + return SDKProcessorSpanQueueSize{noop.Int64ObservableUpDownCounter{}}, err } return SDKProcessorSpanQueueSize{i}, nil } @@ -1910,6 +2032,11 @@ type SDKSpanLive struct { metric.Int64UpDownCounter } +var newSDKSpanLiveOpts = []metric.Int64UpDownCounterOption{ + metric.WithDescription("The number of created spans with `recording=true` for which the end operation has not been called yet."), + metric.WithUnit("{span}"), +} + // NewSDKSpanLive returns a new SDKSpanLive instrument. func NewSDKSpanLive( m metric.Meter, @@ -1920,15 +2047,18 @@ func NewSDKSpanLive( return SDKSpanLive{noop.Int64UpDownCounter{}}, nil } + if len(opt) == 0 { + opt = newSDKSpanLiveOpts + } else { + opt = append(opt, newSDKSpanLiveOpts...) + } + i, err := m.Int64UpDownCounter( "otel.sdk.span.live", - append([]metric.Int64UpDownCounterOption{ - metric.WithDescription("The number of created spans with `recording=true` for which the end operation has not been called yet."), - metric.WithUnit("{span}"), - }, opt...)..., + opt..., ) if err != nil { - return SDKSpanLive{noop.Int64UpDownCounter{}}, err + return SDKSpanLive{noop.Int64UpDownCounter{}}, err } return SDKSpanLive{i}, nil } @@ -2013,6 +2143,11 @@ type SDKSpanStarted struct { metric.Int64Counter } +var newSDKSpanStartedOpts = []metric.Int64CounterOption{ + metric.WithDescription("The number of created spans."), + metric.WithUnit("{span}"), +} + // NewSDKSpanStarted returns a new SDKSpanStarted instrument. func NewSDKSpanStarted( m metric.Meter, @@ -2023,15 +2158,18 @@ func NewSDKSpanStarted( return SDKSpanStarted{noop.Int64Counter{}}, nil } + if len(opt) == 0 { + opt = newSDKSpanStartedOpts + } else { + opt = append(opt, newSDKSpanStartedOpts...) + } + i, err := m.Int64Counter( "otel.sdk.span.started", - append([]metric.Int64CounterOption{ - metric.WithDescription("The number of created spans."), - metric.WithUnit("{span}"), - }, opt...)..., + opt..., ) if err != nil { - return SDKSpanStarted{noop.Int64Counter{}}, err + return SDKSpanStarted{noop.Int64Counter{}}, err } return SDKSpanStarted{i}, nil } @@ -2123,4 +2261,4 @@ func (SDKSpanStarted) AttrSpanParentOrigin(val SpanParentOriginAttr) attribute.K // value of the sampler for this span. func (SDKSpanStarted) AttrSpanSamplingResult(val SpanSamplingResultAttr) attribute.KeyValue { return attribute.String("otel.span.sampling_result", string(val)) -} \ No newline at end of file +} diff --git a/vendor/go.opentelemetry.io/otel/trace/config.go b/vendor/go.opentelemetry.io/otel/trace/config.go index aea11a2b52c..d9ecef1cad2 100644 --- a/vendor/go.opentelemetry.io/otel/trace/config.go +++ b/vendor/go.opentelemetry.io/otel/trace/config.go @@ -4,6 +4,7 @@ package trace // import "go.opentelemetry.io/otel/trace" import ( + "slices" "time" "go.opentelemetry.io/otel/attribute" @@ -304,12 +305,50 @@ func WithInstrumentationVersion(version string) TracerOption { }) } -// WithInstrumentationAttributes sets the instrumentation attributes. +// mergeSets returns the union of keys between a and b. Any duplicate keys will +// use the value associated with b. +func mergeSets(a, b attribute.Set) attribute.Set { + // NewMergeIterator uses the first value for any duplicates. + iter := attribute.NewMergeIterator(&b, &a) + merged := make([]attribute.KeyValue, 0, a.Len()+b.Len()) + for iter.Next() { + merged = append(merged, iter.Attribute()) + } + return attribute.NewSet(merged...) +} + +// WithInstrumentationAttributes adds the instrumentation attributes. // -// The passed attributes will be de-duplicated. +// This is equivalent to calling [WithInstrumentationAttributeSet] with an +// [attribute.Set] created from a clone of the passed attributes. +// [WithInstrumentationAttributeSet] is recommended for more control. +// +// If multiple [WithInstrumentationAttributes] or [WithInstrumentationAttributeSet] +// options are passed, the attributes will be merged together in the order +// they are passed. Attributes with duplicate keys will use the last value passed. func WithInstrumentationAttributes(attr ...attribute.KeyValue) TracerOption { + set := attribute.NewSet(slices.Clone(attr)...) + return WithInstrumentationAttributeSet(set) +} + +// WithInstrumentationAttributeSet adds the instrumentation attributes. +// +// If multiple [WithInstrumentationAttributes] or [WithInstrumentationAttributeSet] +// options are passed, the attributes will be merged together in the order +// they are passed. Attributes with duplicate keys will use the last value passed. +func WithInstrumentationAttributeSet(set attribute.Set) TracerOption { + if set.Len() == 0 { + return tracerOptionFunc(func(config TracerConfig) TracerConfig { + return config + }) + } + return tracerOptionFunc(func(config TracerConfig) TracerConfig { - config.attrs = attribute.NewSet(attr...) + if config.attrs.Len() == 0 { + config.attrs = set + } else { + config.attrs = mergeSets(config.attrs, set) + } return config }) } diff --git a/vendor/go.opentelemetry.io/otel/trace/span.go b/vendor/go.opentelemetry.io/otel/trace/span.go index d3aa476ee12..d01e7936649 100644 --- a/vendor/go.opentelemetry.io/otel/trace/span.go +++ b/vendor/go.opentelemetry.io/otel/trace/span.go @@ -66,6 +66,10 @@ type Span interface { // SetAttributes sets kv as attributes of the Span. If a key from kv // already exists for an attribute of the Span it will be overwritten with // the value contained in kv. + // + // Note that adding attributes at span creation using [WithAttributes] is preferred + // to calling SetAttribute later, as samplers can only consider information + // already present during span creation. SetAttributes(kv ...attribute.KeyValue) // TracerProvider returns a TracerProvider that can be used to generate diff --git a/vendor/go.opentelemetry.io/otel/version.go b/vendor/go.opentelemetry.io/otel/version.go index bcaa5aa5378..0d5b0291873 100644 --- a/vendor/go.opentelemetry.io/otel/version.go +++ b/vendor/go.opentelemetry.io/otel/version.go @@ -5,5 +5,5 @@ package otel // import "go.opentelemetry.io/otel" // Version is the current release version of OpenTelemetry in use. func Version() string { - return "1.38.0" + return "1.39.0" } diff --git a/vendor/go.opentelemetry.io/otel/versions.yaml b/vendor/go.opentelemetry.io/otel/versions.yaml index 07145e254b5..f4a3893eb5a 100644 --- a/vendor/go.opentelemetry.io/otel/versions.yaml +++ b/vendor/go.opentelemetry.io/otel/versions.yaml @@ -3,7 +3,7 @@ module-sets: stable-v1: - version: v1.38.0 + version: v1.39.0 modules: - go.opentelemetry.io/otel - go.opentelemetry.io/otel/bridge/opencensus @@ -22,11 +22,11 @@ module-sets: - go.opentelemetry.io/otel/sdk/metric - go.opentelemetry.io/otel/trace experimental-metrics: - version: v0.60.0 + version: v0.61.0 modules: - go.opentelemetry.io/otel/exporters/prometheus experimental-logs: - version: v0.14.0 + version: v0.15.0 modules: - go.opentelemetry.io/otel/log - go.opentelemetry.io/otel/log/logtest @@ -36,9 +36,28 @@ module-sets: - go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp - go.opentelemetry.io/otel/exporters/stdout/stdoutlog experimental-schema: - version: v0.0.13 + version: v0.0.14 modules: - go.opentelemetry.io/otel/schema excluded-modules: - go.opentelemetry.io/otel/internal/tools - go.opentelemetry.io/otel/trace/internal/telemetry/test +modules: + go.opentelemetry.io/otel/exporters/stdout/stdouttrace: + version-refs: + - ./internal/version.go + go.opentelemetry.io/otel/exporters/prometheus: + version-refs: + - ./internal/version.go + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc: + version-refs: + - ./internal/version.go + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc: + version-refs: + - ./internal/version.go + go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp: + version-refs: + - ./internal/version.go + go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploghttp: + version-refs: + - ./internal/version.go diff --git a/vendor/go.opentelemetry.io/proto/otlp/common/v1/common.pb.go b/vendor/go.opentelemetry.io/proto/otlp/common/v1/common.pb.go index a7c5d19bff3..1f8d49bc983 100644 --- a/vendor/go.opentelemetry.io/proto/otlp/common/v1/common.pb.go +++ b/vendor/go.opentelemetry.io/proto/otlp/common/v1/common.pb.go @@ -34,7 +34,7 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) -// AnyValue is used to represent any type of attribute value. AnyValue may contain a +// Represents any type of attribute value. AnyValue may contain a // primitive value such as a string or integer or it may contain an arbitrary nested // object containing arrays, key-value lists and primitives. type AnyValue struct { @@ -252,8 +252,10 @@ type KeyValueList struct { // A collection of key/value pairs of key-value pairs. The list may be empty (may // contain 0 elements). + // // The keys MUST be unique (it is not allowed to have more than one // value with the same key). + // The behavior of software that receives duplicated keys can be unpredictable. Values []*KeyValue `protobuf:"bytes,1,rep,name=values,proto3" json:"values,omitempty"` } @@ -296,14 +298,16 @@ func (x *KeyValueList) GetValues() []*KeyValue { return nil } -// KeyValue is a key-value pair that is used to store Span attributes, Link +// Represents a key-value pair that is used to store Span attributes, Link // attributes, etc. type KeyValue struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + // The key name of the pair. + Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"` + // The value of the pair. Value *AnyValue `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"` } @@ -360,14 +364,21 @@ type InstrumentationScope struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields + // A name denoting the Instrumentation scope. // An empty instrumentation scope name means the name is unknown. - Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // Defines the version of the instrumentation scope. + // An empty instrumentation scope version means the version is unknown. Version string `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"` // Additional attributes that describe the scope. [Optional]. // Attribute keys MUST be unique (it is not allowed to have more than one // attribute with the same key). - Attributes []*KeyValue `protobuf:"bytes,3,rep,name=attributes,proto3" json:"attributes,omitempty"` - DroppedAttributesCount uint32 `protobuf:"varint,4,opt,name=dropped_attributes_count,json=droppedAttributesCount,proto3" json:"dropped_attributes_count,omitempty"` + // The behavior of software that receives duplicated keys can be unpredictable. + Attributes []*KeyValue `protobuf:"bytes,3,rep,name=attributes,proto3" json:"attributes,omitempty"` + // The number of attributes that were discarded. Attributes + // can be discarded because their keys are too long or because there are too many + // attributes. If this value is 0, then no attributes were dropped. + DroppedAttributesCount uint32 `protobuf:"varint,4,opt,name=dropped_attributes_count,json=droppedAttributesCount,proto3" json:"dropped_attributes_count,omitempty"` } func (x *InstrumentationScope) Reset() { diff --git a/vendor/go.opentelemetry.io/proto/otlp/resource/v1/resource.pb.go b/vendor/go.opentelemetry.io/proto/otlp/resource/v1/resource.pb.go index eb7745d66e0..301247ddfee 100644 --- a/vendor/go.opentelemetry.io/proto/otlp/resource/v1/resource.pb.go +++ b/vendor/go.opentelemetry.io/proto/otlp/resource/v1/resource.pb.go @@ -44,8 +44,9 @@ type Resource struct { // Set of attributes that describe the resource. // Attribute keys MUST be unique (it is not allowed to have more than one // attribute with the same key). + // The behavior of software that receives duplicated keys can be unpredictable. Attributes []*v1.KeyValue `protobuf:"bytes,1,rep,name=attributes,proto3" json:"attributes,omitempty"` - // dropped_attributes_count is the number of dropped attributes. If the value is 0, then + // The number of dropped attributes. If the value is 0, then // no attributes were dropped. DroppedAttributesCount uint32 `protobuf:"varint,2,opt,name=dropped_attributes_count,json=droppedAttributesCount,proto3" json:"dropped_attributes_count,omitempty"` // Set of entities that participate in this Resource. diff --git a/vendor/go.opentelemetry.io/proto/otlp/trace/v1/trace.pb.go b/vendor/go.opentelemetry.io/proto/otlp/trace/v1/trace.pb.go index b342a0a9401..d7bfca90299 100644 --- a/vendor/go.opentelemetry.io/proto/otlp/trace/v1/trace.pb.go +++ b/vendor/go.opentelemetry.io/proto/otlp/trace/v1/trace.pb.go @@ -388,7 +388,8 @@ type ScopeSpans struct { // is recorded in. Notably, the last part of the URL path is the version number of the // schema: http[s]://server[:port]/path/. To learn more about Schema URL see // https://opentelemetry.io/docs/specs/otel/schemas/#schema-url - // This schema_url applies to all spans and span events in the "spans" field. + // This schema_url applies to the data in the "scope" field and all spans and span + // events in the "spans" field. SchemaUrl string `protobuf:"bytes,3,opt,name=schema_url,json=schemaUrl,proto3" json:"schema_url,omitempty"` } @@ -512,21 +513,21 @@ type Span struct { // two spans with the same name may be distinguished using `CLIENT` (caller) // and `SERVER` (callee) to identify queueing latency associated with the span. Kind Span_SpanKind `protobuf:"varint,6,opt,name=kind,proto3,enum=opentelemetry.proto.trace.v1.Span_SpanKind" json:"kind,omitempty"` - // start_time_unix_nano is the start time of the span. On the client side, this is the time + // The start time of the span. On the client side, this is the time // kept by the local machine where the span execution starts. On the server side, this // is the time when the server's application handler starts running. // Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January 1970. // // This field is semantically required and it is expected that end_time >= start_time. StartTimeUnixNano uint64 `protobuf:"fixed64,7,opt,name=start_time_unix_nano,json=startTimeUnixNano,proto3" json:"start_time_unix_nano,omitempty"` - // end_time_unix_nano is the end time of the span. On the client side, this is the time + // The end time of the span. On the client side, this is the time // kept by the local machine where the span execution ends. On the server side, this // is the time when the server application handler stops running. // Value is UNIX Epoch time in nanoseconds since 00:00:00 UTC on 1 January 1970. // // This field is semantically required and it is expected that end_time >= start_time. EndTimeUnixNano uint64 `protobuf:"fixed64,8,opt,name=end_time_unix_nano,json=endTimeUnixNano,proto3" json:"end_time_unix_nano,omitempty"` - // attributes is a collection of key/value pairs. Note, global attributes + // A collection of key/value pairs. Note, global attributes // like server name can be set using the resource API. Examples of attributes: // // "/http/user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36" @@ -534,24 +535,23 @@ type Span struct { // "example.com/myattribute": true // "example.com/score": 10.239 // - // The OpenTelemetry API specification further restricts the allowed value types: - // https://github.com/open-telemetry/opentelemetry-specification/blob/main/specification/common/README.md#attribute // Attribute keys MUST be unique (it is not allowed to have more than one // attribute with the same key). + // The behavior of software that receives duplicated keys can be unpredictable. Attributes []*v11.KeyValue `protobuf:"bytes,9,rep,name=attributes,proto3" json:"attributes,omitempty"` - // dropped_attributes_count is the number of attributes that were discarded. Attributes + // The number of attributes that were discarded. Attributes // can be discarded because their keys are too long or because there are too many // attributes. If this value is 0, then no attributes were dropped. DroppedAttributesCount uint32 `protobuf:"varint,10,opt,name=dropped_attributes_count,json=droppedAttributesCount,proto3" json:"dropped_attributes_count,omitempty"` - // events is a collection of Event items. + // A collection of Event items. Events []*Span_Event `protobuf:"bytes,11,rep,name=events,proto3" json:"events,omitempty"` - // dropped_events_count is the number of dropped events. If the value is 0, then no + // The number of dropped events. If the value is 0, then no // events were dropped. DroppedEventsCount uint32 `protobuf:"varint,12,opt,name=dropped_events_count,json=droppedEventsCount,proto3" json:"dropped_events_count,omitempty"` - // links is a collection of Links, which are references from this span to a span + // A collection of Links, which are references from this span to a span // in the same or different trace. Links []*Span_Link `protobuf:"bytes,13,rep,name=links,proto3" json:"links,omitempty"` - // dropped_links_count is the number of dropped links after the maximum size was + // The number of dropped links after the maximum size was // enforced. If this value is 0, then no links were dropped. DroppedLinksCount uint32 `protobuf:"varint,14,opt,name=dropped_links_count,json=droppedLinksCount,proto3" json:"dropped_links_count,omitempty"` // An optional final status for this span. Semantically when Status isn't set, it means @@ -769,16 +769,17 @@ type Span_Event struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // time_unix_nano is the time the event occurred. + // The time the event occurred. TimeUnixNano uint64 `protobuf:"fixed64,1,opt,name=time_unix_nano,json=timeUnixNano,proto3" json:"time_unix_nano,omitempty"` - // name of the event. + // The name of the event. // This field is semantically required to be set to non-empty string. Name string `protobuf:"bytes,2,opt,name=name,proto3" json:"name,omitempty"` - // attributes is a collection of attribute key/value pairs on the event. + // A collection of attribute key/value pairs on the event. // Attribute keys MUST be unique (it is not allowed to have more than one // attribute with the same key). + // The behavior of software that receives duplicated keys can be unpredictable. Attributes []*v11.KeyValue `protobuf:"bytes,3,rep,name=attributes,proto3" json:"attributes,omitempty"` - // dropped_attributes_count is the number of dropped attributes. If the value is 0, + // The number of dropped attributes. If the value is 0, // then no attributes were dropped. DroppedAttributesCount uint32 `protobuf:"varint,4,opt,name=dropped_attributes_count,json=droppedAttributesCount,proto3" json:"dropped_attributes_count,omitempty"` } @@ -859,11 +860,12 @@ type Span_Link struct { SpanId []byte `protobuf:"bytes,2,opt,name=span_id,json=spanId,proto3" json:"span_id,omitempty"` // The trace_state associated with the link. TraceState string `protobuf:"bytes,3,opt,name=trace_state,json=traceState,proto3" json:"trace_state,omitempty"` - // attributes is a collection of attribute key/value pairs on the link. + // A collection of attribute key/value pairs on the link. // Attribute keys MUST be unique (it is not allowed to have more than one // attribute with the same key). + // The behavior of software that receives duplicated keys can be unpredictable. Attributes []*v11.KeyValue `protobuf:"bytes,4,rep,name=attributes,proto3" json:"attributes,omitempty"` - // dropped_attributes_count is the number of dropped attributes. If the value is 0, + // The number of dropped attributes. If the value is 0, // then no attributes were dropped. DroppedAttributesCount uint32 `protobuf:"varint,5,opt,name=dropped_attributes_count,json=droppedAttributesCount,proto3" json:"dropped_attributes_count,omitempty"` // Flags, a bit field. diff --git a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305.go b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305.go index 8cf5d8112e4..956795524fa 100644 --- a/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305.go +++ b/vendor/golang.org/x/crypto/chacha20poly1305/chacha20poly1305.go @@ -38,6 +38,9 @@ type chacha20poly1305 struct { // New returns a ChaCha20-Poly1305 AEAD that uses the given 256-bit key. func New(key []byte) (cipher.AEAD, error) { + if fips140Enforced() { + return nil, errors.New("chacha20poly1305: use of ChaCha20Poly1305 is not allowed in FIPS 140-only mode") + } if len(key) != KeySize { return nil, errors.New("chacha20poly1305: bad key length") } diff --git a/vendor/golang.org/x/crypto/chacha20poly1305/fips140only_compat.go b/vendor/golang.org/x/crypto/chacha20poly1305/fips140only_compat.go new file mode 100644 index 00000000000..9b9d5643ec3 --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20poly1305/fips140only_compat.go @@ -0,0 +1,9 @@ +// 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 chacha20poly1305 + +func fips140Enforced() bool { return false } diff --git a/vendor/golang.org/x/crypto/chacha20poly1305/fips140only_go1.26.go b/vendor/golang.org/x/crypto/chacha20poly1305/fips140only_go1.26.go new file mode 100644 index 00000000000..f71089c486e --- /dev/null +++ b/vendor/golang.org/x/crypto/chacha20poly1305/fips140only_go1.26.go @@ -0,0 +1,11 @@ +// 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 chacha20poly1305 + +import "crypto/fips140" + +func fips140Enforced() bool { return fips140.Enforced() } diff --git a/vendor/golang.org/x/crypto/chacha20poly1305/xchacha20poly1305.go b/vendor/golang.org/x/crypto/chacha20poly1305/xchacha20poly1305.go index 1cebfe946f4..b4299b718c1 100644 --- a/vendor/golang.org/x/crypto/chacha20poly1305/xchacha20poly1305.go +++ b/vendor/golang.org/x/crypto/chacha20poly1305/xchacha20poly1305.go @@ -22,6 +22,9 @@ type xchacha20poly1305 struct { // preferred when nonce uniqueness cannot be trivially ensured, or whenever // nonces are randomly generated. func NewX(key []byte) (cipher.AEAD, error) { + if fips140Enforced() { + return nil, errors.New("chacha20poly1305: use of ChaCha20Poly1305 is not allowed in FIPS 140-only mode") + } if len(key) != KeySize { return nil, errors.New("chacha20poly1305: bad key length") } diff --git a/vendor/golang.org/x/net/http2/writesched_priority_rfc9218.go b/vendor/golang.org/x/net/http2/writesched_priority_rfc9218.go index cb4cadc32d7..dfbfc1eb341 100644 --- a/vendor/golang.org/x/net/http2/writesched_priority_rfc9218.go +++ b/vendor/golang.org/x/net/http2/writesched_priority_rfc9218.go @@ -37,6 +37,15 @@ type priorityWriteSchedulerRFC9218 struct { // incremental streams or not, when urgency is the same in a given Pop() // call. prioritizeIncremental bool + + // priorityUpdateBuf is used to buffer the most recent PRIORITY_UPDATE we + // receive per https://www.rfc-editor.org/rfc/rfc9218.html#name-the-priority_update-frame. + priorityUpdateBuf struct { + // streamID being 0 means that the buffer is empty. This is a safe + // assumption as PRIORITY_UPDATE for stream 0 is a PROTOCOL_ERROR. + streamID uint32 + priority PriorityParam + } } func newPriorityWriteSchedulerRFC9218() WriteScheduler { @@ -50,6 +59,10 @@ func (ws *priorityWriteSchedulerRFC9218) OpenStream(streamID uint32, opt OpenStr if ws.streams[streamID].location != nil { panic(fmt.Errorf("stream %d already opened", streamID)) } + if streamID == ws.priorityUpdateBuf.streamID { + ws.priorityUpdateBuf.streamID = 0 + opt.priority = ws.priorityUpdateBuf.priority + } q := ws.queuePool.get() ws.streams[streamID] = streamMetadata{ location: q, @@ -95,6 +108,8 @@ func (ws *priorityWriteSchedulerRFC9218) AdjustStream(streamID uint32, priority metadata := ws.streams[streamID] q, u, i := metadata.location, metadata.priority.urgency, metadata.priority.incremental if q == nil { + ws.priorityUpdateBuf.streamID = streamID + ws.priorityUpdateBuf.priority = priority return } diff --git a/vendor/golang.org/x/sys/cpu/cpu_x86.go b/vendor/golang.org/x/sys/cpu/cpu_x86.go index 1e642f3304f..f5723d4f7e5 100644 --- a/vendor/golang.org/x/sys/cpu/cpu_x86.go +++ b/vendor/golang.org/x/sys/cpu/cpu_x86.go @@ -64,6 +64,80 @@ func initOptions() { func archInit() { + // From internal/cpu + const ( + // eax bits + cpuid_AVXVNNI = 1 << 4 + + // ecx bits + cpuid_SSE3 = 1 << 0 + cpuid_PCLMULQDQ = 1 << 1 + cpuid_AVX512VBMI = 1 << 1 + cpuid_AVX512VBMI2 = 1 << 6 + cpuid_SSSE3 = 1 << 9 + cpuid_AVX512GFNI = 1 << 8 + cpuid_AVX512VAES = 1 << 9 + cpuid_AVX512VNNI = 1 << 11 + cpuid_AVX512BITALG = 1 << 12 + cpuid_FMA = 1 << 12 + cpuid_AVX512VPOPCNTDQ = 1 << 14 + cpuid_SSE41 = 1 << 19 + cpuid_SSE42 = 1 << 20 + cpuid_POPCNT = 1 << 23 + cpuid_AES = 1 << 25 + cpuid_OSXSAVE = 1 << 27 + cpuid_AVX = 1 << 28 + + // "Extended Feature Flag" bits returned in EBX for CPUID EAX=0x7 ECX=0x0 + cpuid_BMI1 = 1 << 3 + cpuid_AVX2 = 1 << 5 + cpuid_BMI2 = 1 << 8 + cpuid_ERMS = 1 << 9 + cpuid_AVX512F = 1 << 16 + cpuid_AVX512DQ = 1 << 17 + cpuid_ADX = 1 << 19 + cpuid_AVX512CD = 1 << 28 + cpuid_SHA = 1 << 29 + cpuid_AVX512BW = 1 << 30 + cpuid_AVX512VL = 1 << 31 + + // "Extended Feature Flag" bits returned in ECX for CPUID EAX=0x7 ECX=0x0 + cpuid_AVX512_VBMI = 1 << 1 + cpuid_AVX512_VBMI2 = 1 << 6 + cpuid_GFNI = 1 << 8 + cpuid_AVX512VPCLMULQDQ = 1 << 10 + cpuid_AVX512_BITALG = 1 << 12 + + // edx bits + cpuid_FSRM = 1 << 4 + // edx bits for CPUID 0x80000001 + cpuid_RDTSCP = 1 << 27 + ) + // Additional constants not in internal/cpu + const ( + // eax=1: edx + cpuid_SSE2 = 1 << 26 + // eax=1: ecx + cpuid_CX16 = 1 << 13 + cpuid_RDRAND = 1 << 30 + // eax=7,ecx=0: ebx + cpuid_RDSEED = 1 << 18 + cpuid_AVX512IFMA = 1 << 21 + cpuid_AVX512PF = 1 << 26 + cpuid_AVX512ER = 1 << 27 + // eax=7,ecx=0: edx + cpuid_AVX5124VNNIW = 1 << 2 + cpuid_AVX5124FMAPS = 1 << 3 + cpuid_AMXBF16 = 1 << 22 + cpuid_AMXTile = 1 << 24 + cpuid_AMXInt8 = 1 << 25 + // eax=7,ecx=1: eax + cpuid_AVX512BF16 = 1 << 5 + cpuid_AVXIFMA = 1 << 23 + // eax=7,ecx=1: edx + cpuid_AVXVNNIInt8 = 1 << 4 + ) + Initialized = true maxID, _, _, _ := cpuid(0, 0) @@ -73,90 +147,90 @@ func archInit() { } _, _, ecx1, edx1 := cpuid(1, 0) - X86.HasSSE2 = isSet(26, edx1) - - X86.HasSSE3 = isSet(0, ecx1) - X86.HasPCLMULQDQ = isSet(1, ecx1) - X86.HasSSSE3 = isSet(9, ecx1) - X86.HasFMA = isSet(12, ecx1) - X86.HasCX16 = isSet(13, ecx1) - X86.HasSSE41 = isSet(19, ecx1) - X86.HasSSE42 = isSet(20, ecx1) - X86.HasPOPCNT = isSet(23, ecx1) - X86.HasAES = isSet(25, ecx1) - X86.HasOSXSAVE = isSet(27, ecx1) - X86.HasRDRAND = isSet(30, ecx1) + X86.HasSSE2 = isSet(edx1, cpuid_SSE2) + + X86.HasSSE3 = isSet(ecx1, cpuid_SSE3) + X86.HasPCLMULQDQ = isSet(ecx1, cpuid_PCLMULQDQ) + X86.HasSSSE3 = isSet(ecx1, cpuid_SSSE3) + X86.HasFMA = isSet(ecx1, cpuid_FMA) + X86.HasCX16 = isSet(ecx1, cpuid_CX16) + X86.HasSSE41 = isSet(ecx1, cpuid_SSE41) + X86.HasSSE42 = isSet(ecx1, cpuid_SSE42) + X86.HasPOPCNT = isSet(ecx1, cpuid_POPCNT) + X86.HasAES = isSet(ecx1, cpuid_AES) + X86.HasOSXSAVE = isSet(ecx1, cpuid_OSXSAVE) + X86.HasRDRAND = isSet(ecx1, cpuid_RDRAND) var osSupportsAVX, osSupportsAVX512 bool // For XGETBV, OSXSAVE bit is required and sufficient. if X86.HasOSXSAVE { eax, _ := xgetbv() // Check if XMM and YMM registers have OS support. - osSupportsAVX = isSet(1, eax) && isSet(2, eax) + osSupportsAVX = isSet(eax, 1<<1) && isSet(eax, 1<<2) if runtime.GOOS == "darwin" { // Darwin requires special AVX512 checks, see cpu_darwin_x86.go osSupportsAVX512 = osSupportsAVX && darwinSupportsAVX512() } else { // Check if OPMASK and ZMM registers have OS support. - osSupportsAVX512 = osSupportsAVX && isSet(5, eax) && isSet(6, eax) && isSet(7, eax) + osSupportsAVX512 = osSupportsAVX && isSet(eax, 1<<5) && isSet(eax, 1<<6) && isSet(eax, 1<<7) } } - X86.HasAVX = isSet(28, ecx1) && osSupportsAVX + X86.HasAVX = isSet(ecx1, cpuid_AVX) && osSupportsAVX if maxID < 7 { return } eax7, ebx7, ecx7, edx7 := cpuid(7, 0) - X86.HasBMI1 = isSet(3, ebx7) - X86.HasAVX2 = isSet(5, ebx7) && osSupportsAVX - X86.HasBMI2 = isSet(8, ebx7) - X86.HasERMS = isSet(9, ebx7) - X86.HasRDSEED = isSet(18, ebx7) - X86.HasADX = isSet(19, ebx7) - - X86.HasAVX512 = isSet(16, ebx7) && osSupportsAVX512 // Because avx-512 foundation is the core required extension + X86.HasBMI1 = isSet(ebx7, cpuid_BMI1) + X86.HasAVX2 = isSet(ebx7, cpuid_AVX2) && osSupportsAVX + X86.HasBMI2 = isSet(ebx7, cpuid_BMI2) + X86.HasERMS = isSet(ebx7, cpuid_ERMS) + X86.HasRDSEED = isSet(ebx7, cpuid_RDSEED) + X86.HasADX = isSet(ebx7, cpuid_ADX) + + X86.HasAVX512 = isSet(ebx7, cpuid_AVX512F) && osSupportsAVX512 // Because avx-512 foundation is the core required extension if X86.HasAVX512 { X86.HasAVX512F = true - X86.HasAVX512CD = isSet(28, ebx7) - X86.HasAVX512ER = isSet(27, ebx7) - X86.HasAVX512PF = isSet(26, ebx7) - X86.HasAVX512VL = isSet(31, ebx7) - X86.HasAVX512BW = isSet(30, ebx7) - X86.HasAVX512DQ = isSet(17, ebx7) - X86.HasAVX512IFMA = isSet(21, ebx7) - X86.HasAVX512VBMI = isSet(1, ecx7) - X86.HasAVX5124VNNIW = isSet(2, edx7) - X86.HasAVX5124FMAPS = isSet(3, edx7) - X86.HasAVX512VPOPCNTDQ = isSet(14, ecx7) - X86.HasAVX512VPCLMULQDQ = isSet(10, ecx7) - X86.HasAVX512VNNI = isSet(11, ecx7) - X86.HasAVX512GFNI = isSet(8, ecx7) - X86.HasAVX512VAES = isSet(9, ecx7) - X86.HasAVX512VBMI2 = isSet(6, ecx7) - X86.HasAVX512BITALG = isSet(12, ecx7) + X86.HasAVX512CD = isSet(ebx7, cpuid_AVX512CD) + X86.HasAVX512ER = isSet(ebx7, cpuid_AVX512ER) + X86.HasAVX512PF = isSet(ebx7, cpuid_AVX512PF) + X86.HasAVX512VL = isSet(ebx7, cpuid_AVX512VL) + X86.HasAVX512BW = isSet(ebx7, cpuid_AVX512BW) + X86.HasAVX512DQ = isSet(ebx7, cpuid_AVX512DQ) + X86.HasAVX512IFMA = isSet(ebx7, cpuid_AVX512IFMA) + X86.HasAVX512VBMI = isSet(ecx7, cpuid_AVX512_VBMI) + X86.HasAVX5124VNNIW = isSet(edx7, cpuid_AVX5124VNNIW) + X86.HasAVX5124FMAPS = isSet(edx7, cpuid_AVX5124FMAPS) + X86.HasAVX512VPOPCNTDQ = isSet(ecx7, cpuid_AVX512VPOPCNTDQ) + X86.HasAVX512VPCLMULQDQ = isSet(ecx7, cpuid_AVX512VPCLMULQDQ) + X86.HasAVX512VNNI = isSet(ecx7, cpuid_AVX512VNNI) + X86.HasAVX512GFNI = isSet(ecx7, cpuid_AVX512GFNI) + X86.HasAVX512VAES = isSet(ecx7, cpuid_AVX512VAES) + X86.HasAVX512VBMI2 = isSet(ecx7, cpuid_AVX512VBMI2) + X86.HasAVX512BITALG = isSet(ecx7, cpuid_AVX512BITALG) } - X86.HasAMXTile = isSet(24, edx7) - X86.HasAMXInt8 = isSet(25, edx7) - X86.HasAMXBF16 = isSet(22, edx7) + X86.HasAMXTile = isSet(edx7, cpuid_AMXTile) + X86.HasAMXInt8 = isSet(edx7, cpuid_AMXInt8) + X86.HasAMXBF16 = isSet(edx7, cpuid_AMXBF16) // These features depend on the second level of extended features. if eax7 >= 1 { eax71, _, _, edx71 := cpuid(7, 1) if X86.HasAVX512 { - X86.HasAVX512BF16 = isSet(5, eax71) + X86.HasAVX512BF16 = isSet(eax71, cpuid_AVX512BF16) } if X86.HasAVX { - X86.HasAVXIFMA = isSet(23, eax71) - X86.HasAVXVNNI = isSet(4, eax71) - X86.HasAVXVNNIInt8 = isSet(4, edx71) + X86.HasAVXIFMA = isSet(eax71, cpuid_AVXIFMA) + X86.HasAVXVNNI = isSet(eax71, cpuid_AVXVNNI) + X86.HasAVXVNNIInt8 = isSet(edx71, cpuid_AVXVNNIInt8) } } } -func isSet(bitpos uint, value uint32) bool { - return value&(1<\x02\x03\x01\x0f\x02"}, - {"go/types", "\x03\x01\x06g\x03\x01\x03\b\x03\x024\x062\x04\x03\t \x06\a\b\x01\x01\x01\x02\x01\x0f\x02\x02"}, - {"go/version", "\xbe\x01{"}, - {"hash", "\xf5\x01"}, - {"hash/adler32", "q\x15\x16"}, - {"hash/crc32", "q\x15\x16\x15\x8a\x01\x01\x13"}, - {"hash/crc64", "q\x15\x16\x9f\x01"}, - {"hash/fnv", "q\x15\x16h"}, - {"hash/maphash", "\x86\x01\x11<|"}, - {"html", "\xb9\x02\x02\x12"}, - {"html/template", "\x03k\x06\x18-<\x01\n!\x05\x01\x02\x03\f\x01\x02\f\x01\x03\x02"}, - {"image", "\x02o\x1ef\x0f4\x03\x01"}, + {"encoding/ascii85", "\xfa\x01C"}, + {"encoding/asn1", "\x03q\x03g(\x01'\r\x02\x01\x11\x03\x01"}, + {"encoding/base32", "\xfa\x01A\x02"}, + {"encoding/base64", "\xa0\x01ZA\x02"}, + {"encoding/binary", "t\x86\x01\f(\r\x05"}, + {"encoding/csv", "\x02\x01q\x03\x83\x01D\x13\x02"}, + {"encoding/gob", "\x02f\x05\a\x03g\x1c\v\x01\x03\x1d\b\x12\x01\x10\x02"}, + {"encoding/hex", "t\x03\x83\x01A\x03"}, + {"encoding/json", "\x03\x01d\x04\b\x03\x83\x01\f(\r\x02\x01\x02\x11\x01\x01\x02"}, + {"encoding/pem", "\x03i\b\x86\x01A\x03"}, + {"encoding/xml", "\x02\x01e\f\x03\x83\x014\x05\n\x01\x02\x11\x02"}, + {"errors", "\xd0\x01\x85\x01"}, + {"expvar", "qLA\b\v\x15\r\b\x02\x03\x01\x12"}, + {"flag", "h\f\x03\x83\x01,\b\x05\b\x02\x01\x11"}, + {"fmt", "tF'\x19\f \b\r\x02\x03\x13"}, + {"go/ast", "\x03\x01s\x0f\x01s\x03)\b\r\x02\x01\x13\x02"}, + {"go/build", "\x02\x01q\x03\x01\x02\x02\b\x02\x01\x17\x1f\x04\x02\b\x1c\x13\x01+\x01\x04\x01\a\b\x02\x01\x13\x02\x02"}, + {"go/build/constraint", "t\xc9\x01\x01\x13\x02"}, + {"go/constant", "w\x10\x7f\x01\x024\x01\x02\x13"}, + {"go/doc", "\x04s\x01\x05\n=61\x10\x02\x01\x13\x02"}, + {"go/doc/comment", "\x03t\xc4\x01\x01\x01\x01\x13\x02"}, + {"go/format", "\x03t\x01\f\x01\x02sD"}, + {"go/importer", "y\a\x01\x02\x04\x01r9"}, + {"go/internal/gccgoimporter", "\x02\x01^\x13\x03\x04\f\x01p\x02,\x01\x05\x11\x01\r\b"}, + {"go/internal/gcimporter", "\x02u\x10\x010\x05\r0,\x15\x03\x02"}, + {"go/internal/scannerhooks", "\x87\x01"}, + {"go/internal/srcimporter", "w\x01\x01\v\x03\x01r,\x01\x05\x12\x02\x15"}, + {"go/parser", "\x03q\x03\x01\x02\b\x04\x01s\x01+\x06\x12"}, + {"go/printer", "w\x01\x02\x03\ns\f \x15\x02\x01\x02\f\x05\x02"}, + {"go/scanner", "\x03t\v\x05s2\x10\x01\x14\x02"}, + {"go/token", "\x04s\x86\x01>\x02\x03\x01\x10\x02"}, + {"go/types", "\x03\x01\x06j\x03\x01\x03\t\x03\x024\x063\x04\x03\t \x06\a\b\x01\x01\x01\x02\x01\x10\x02\x02"}, + {"go/version", "\xc2\x01|"}, + {"hash", "\xfa\x01"}, + {"hash/adler32", "t\x16\x16"}, + {"hash/crc32", "t\x16\x16\x15\x8b\x01\x01\x14"}, + {"hash/crc64", "t\x16\x16\xa0\x01"}, + {"hash/fnv", "t\x16\x16i"}, + {"hash/maphash", "\x8a\x01\x11<~"}, + {"html", "\xbe\x02\x02\x13"}, + {"html/template", "\x03n\x06\x19-=\x01\n!\x05\x01\x02\x03\f\x01\x02\r\x01\x03\x02"}, + {"image", "\x02r\x1fg\x0f4\x03\x01"}, {"image/color", ""}, - {"image/color/palette", "\x8f\x01"}, - {"image/draw", "\x8e\x01\x01\x04"}, - {"image/gif", "\x02\x01\x05i\x03\x1a\x01\x01\x01\vY"}, - {"image/internal/imageutil", "\x8e\x01"}, - {"image/jpeg", "\x02o\x1d\x01\x04b"}, - {"image/png", "\x02\aa\n\x12\x02\x06\x01fC"}, - {"index/suffixarray", "\x03g\a\x84\x01\f+\n\x01"}, - {"internal/abi", "\xb8\x01\x97\x01"}, - {"internal/asan", "\xcf\x02"}, - {"internal/bisect", "\xae\x02\r\x01"}, - {"internal/buildcfg", "tGf\x06\x02\x05\n\x01"}, - {"internal/bytealg", "\xb1\x01\x9e\x01"}, + {"image/color/palette", "\x93\x01"}, + {"image/draw", "\x92\x01\x01\x04"}, + {"image/gif", "\x02\x01\x05l\x03\x1b\x01\x01\x01\vZ\x0f"}, + {"image/internal/imageutil", "\x92\x01"}, + {"image/jpeg", "\x02r\x1e\x01\x04c"}, + {"image/png", "\x02\ad\n\x13\x02\x06\x01gC"}, + {"index/suffixarray", "\x03j\a\x86\x01\f+\n\x01"}, + {"internal/abi", "\xbc\x01\x99\x01"}, + {"internal/asan", "\xd5\x02"}, + {"internal/bisect", "\xb3\x02\r\x01"}, + {"internal/buildcfg", "wHg\x06\x02\x05\n\x01"}, + {"internal/bytealg", "\xb5\x01\xa0\x01"}, {"internal/byteorder", ""}, {"internal/cfg", ""}, - {"internal/cgrouptest", "tZS\x06\x0f\x02\x01\x04\x01"}, - {"internal/chacha8rand", "\x9c\x01\x15\a\x97\x01"}, + {"internal/cgrouptest", "w[T\x06\x0f\x02\x01\x04\x01"}, + {"internal/chacha8rand", "\xa0\x01\x15\a\x99\x01"}, {"internal/copyright", ""}, {"internal/coverage", ""}, {"internal/coverage/calloc", ""}, - {"internal/coverage/cfile", "n\x06\x16\x17\x01\x02\x01\x01\x01\x01\x01\x01\x01\"\x02&,\x06\a\n\x01\x03\r\x06"}, - {"internal/coverage/cformat", "\x04p-\x04P\v6\x01\x02\r"}, - {"internal/coverage/cmerge", "t-`"}, - {"internal/coverage/decodecounter", "j\n-\v\x02G,\x17\x17"}, - {"internal/coverage/decodemeta", "\x02h\n\x16\x17\v\x02G,"}, - {"internal/coverage/encodecounter", "\x02h\n-\f\x01\x02E\v!\x15"}, - {"internal/coverage/encodemeta", "\x02\x01g\n\x12\x04\x17\r\x02E,."}, - {"internal/coverage/pods", "\x04p-\x80\x01\x06\x05\n\x02\x01"}, - {"internal/coverage/rtcov", "\xcf\x02"}, - {"internal/coverage/slicereader", "j\n\x81\x01Z"}, - {"internal/coverage/slicewriter", "t\x81\x01"}, - {"internal/coverage/stringtab", "t8\x04E"}, + {"internal/coverage/cfile", "q\x06\x17\x17\x01\x02\x01\x01\x01\x01\x01\x01\x01\"\x02',\x06\a\n\x01\x03\x0e\x06"}, + {"internal/coverage/cformat", "\x04s.\x04Q\v6\x01\x02\x0e"}, + {"internal/coverage/cmerge", "w.a"}, + {"internal/coverage/decodecounter", "m\n.\v\x02H,\x17\x18"}, + {"internal/coverage/decodemeta", "\x02k\n\x17\x17\v\x02H,"}, + {"internal/coverage/encodecounter", "\x02k\n.\f\x01\x02F\v!\x15"}, + {"internal/coverage/encodemeta", "\x02\x01j\n\x13\x04\x17\r\x02F,/"}, + {"internal/coverage/pods", "\x04s.\x81\x01\x06\x05\n\x02\x01"}, + {"internal/coverage/rtcov", "\xd5\x02"}, + {"internal/coverage/slicereader", "m\n\x83\x01["}, + {"internal/coverage/slicewriter", "w\x83\x01"}, + {"internal/coverage/stringtab", "w9\x04F"}, {"internal/coverage/test", ""}, {"internal/coverage/uleb128", ""}, - {"internal/cpu", "\xcf\x02"}, - {"internal/dag", "\x04p\xc2\x01\x03"}, - {"internal/diff", "\x03q\xc3\x01\x02"}, - {"internal/exportdata", "\x02\x01n\x03\x02c\x1c,\x01\x05\x11\x01\x02"}, - {"internal/filepathlite", "q*A\x1a@"}, - {"internal/fmtsort", "\x04\xa5\x02\r"}, - {"internal/fuzz", "\x03\nE\x18\x04\x03\x03\x01\v\x036<\f\x03\x1d\x01\x05\x02\x05\n\x01\x02\x01\x01\f\x04\x02"}, + {"internal/cpu", "\xd5\x02"}, + {"internal/dag", "\x04s\xc4\x01\x03"}, + {"internal/diff", "\x03t\xc5\x01\x02"}, + {"internal/exportdata", "\x02\x01q\x03\x02e\x1c,\x01\x05\x11\x01\x02"}, + {"internal/filepathlite", "t+B\x1a@"}, + {"internal/fmtsort", "\x04\xaa\x02\r"}, + {"internal/fuzz", "\x03\nH\x18\x04\x03\x03\x01\f\x036=\f\x03\x1d\x01\x05\x02\x05\n\x01\x02\x01\x01\r\x04\x02"}, {"internal/goarch", ""}, - {"internal/godebug", "\x99\x01!\x81\x01\x01\x13"}, + {"internal/godebug", "\x9d\x01!\x82\x01\x01\x14"}, {"internal/godebugs", ""}, {"internal/goexperiment", ""}, {"internal/goos", ""}, - {"internal/goroot", "\xa1\x02\x01\x05\x12\x02"}, + {"internal/goroot", "\xa6\x02\x01\x05\x12\x02"}, {"internal/gover", "\x04"}, {"internal/goversion", ""}, - {"internal/lazyregexp", "\xa1\x02\v\r\x02"}, - {"internal/lazytemplate", "\xf5\x01,\x18\x02\f"}, - {"internal/msan", "\xcf\x02"}, + {"internal/lazyregexp", "\xa6\x02\v\r\x02"}, + {"internal/lazytemplate", "\xfa\x01,\x18\x02\r"}, + {"internal/msan", "\xd5\x02"}, {"internal/nettrace", ""}, - {"internal/obscuretestdata", "i\x8c\x01,"}, - {"internal/oserror", "q"}, - {"internal/pkgbits", "\x03O\x18\a\x03\x04\vr\r\x1f\r\n\x01"}, + {"internal/obscuretestdata", "l\x8e\x01,"}, + {"internal/oserror", "t"}, + {"internal/pkgbits", "\x03R\x18\a\x03\x04\fs\r\x1f\r\n\x01"}, {"internal/platform", ""}, - {"internal/poll", "qj\x05\x159\r\x01\x01\f\x06"}, - {"internal/profile", "\x03\x04j\x03\x81\x017\n\x01\x01\x01\x10"}, + {"internal/poll", "tl\x05\x159\r\x01\x01\r\x06"}, + {"internal/profile", "\x03\x04m\x03\x83\x017\n\x01\x01\x01\x11"}, {"internal/profilerecord", ""}, - {"internal/race", "\x97\x01\xb8\x01"}, - {"internal/reflectlite", "\x97\x01!:\x16"}, - {"vendor/golang.org/x/text/unicode/norm", "j\n\x81\x01F\x12\x11"}, - {"weak", "\x97\x01\x97\x01!"}, + {"vendor/golang.org/x/crypto/internal/alias", "\xd5\x02"}, + {"vendor/golang.org/x/crypto/internal/poly1305", "X\x15\x9c\x01"}, + {"vendor/golang.org/x/net/dns/dnsmessage", "t\xc7\x01"}, + {"vendor/golang.org/x/net/http/httpguts", "\x90\x02\x14\x1a\x15\r"}, + {"vendor/golang.org/x/net/http/httpproxy", "t\x03\x99\x01\x10\x05\x01\x18\x15\r"}, + {"vendor/golang.org/x/net/http2/hpack", "\x03q\x03\x83\x01F"}, + {"vendor/golang.org/x/net/idna", "w\x8f\x018\x15\x10\x02\x01"}, + {"vendor/golang.org/x/net/nettest", "\x03j\a\x03\x83\x01\x11\x05\x16\x01\f\n\x01\x02\x02\x01\f"}, + {"vendor/golang.org/x/sys/cpu", "\xa6\x02\r\n\x01\x17"}, + {"vendor/golang.org/x/text/secure/bidirule", "t\xdf\x01\x11\x01"}, + {"vendor/golang.org/x/text/transform", "\x03q\x86\x01Y"}, + {"vendor/golang.org/x/text/unicode/bidi", "\x03\bl\x87\x01>\x17"}, + {"vendor/golang.org/x/text/unicode/norm", "m\n\x83\x01F\x13\x11"}, + {"weak", "\x9b\x01\x98\x01\""}, } // bootstrap is the list of bootstrap packages extracted from cmd/dist. @@ -385,6 +391,7 @@ var bootstrap = map[string]bool{ "cmd/compile/internal/arm64": true, "cmd/compile/internal/base": true, "cmd/compile/internal/bitvec": true, + "cmd/compile/internal/bloop": true, "cmd/compile/internal/compare": true, "cmd/compile/internal/coverage": true, "cmd/compile/internal/deadlocals": true, @@ -413,6 +420,7 @@ var bootstrap = map[string]bool{ "cmd/compile/internal/riscv64": true, "cmd/compile/internal/rttype": true, "cmd/compile/internal/s390x": true, + "cmd/compile/internal/slice": true, "cmd/compile/internal/ssa": true, "cmd/compile/internal/ssagen": true, "cmd/compile/internal/staticdata": true, diff --git a/vendor/golang.org/x/tools/internal/stdlib/manifest.go b/vendor/golang.org/x/tools/internal/stdlib/manifest.go index 362f23c436c..33e4f505f3e 100644 --- a/vendor/golang.org/x/tools/internal/stdlib/manifest.go +++ b/vendor/golang.org/x/tools/internal/stdlib/manifest.go @@ -16,6 +16,14 @@ var PackageSymbols = map[string][]Symbol{ {"(*Writer).Flush", Method, 0, ""}, {"(*Writer).Write", Method, 0, ""}, {"(*Writer).WriteHeader", Method, 0, ""}, + {"(FileInfoNames).Gname", Method, 23, ""}, + {"(FileInfoNames).IsDir", Method, 23, ""}, + {"(FileInfoNames).ModTime", Method, 23, ""}, + {"(FileInfoNames).Mode", Method, 23, ""}, + {"(FileInfoNames).Name", Method, 23, ""}, + {"(FileInfoNames).Size", Method, 23, ""}, + {"(FileInfoNames).Sys", Method, 23, ""}, + {"(FileInfoNames).Uname", Method, 23, ""}, {"(Format).String", Method, 10, ""}, {"ErrFieldTooLong", Var, 0, ""}, {"ErrHeader", Var, 0, ""}, @@ -338,6 +346,9 @@ var PackageSymbols = map[string][]Symbol{ {"(*Writer).Write", Method, 0, ""}, {"(CorruptInputError).Error", Method, 0, ""}, {"(InternalError).Error", Method, 0, ""}, + {"(Reader).Read", Method, 0, ""}, + {"(Reader).ReadByte", Method, 0, ""}, + {"(Resetter).Reset", Method, 4, ""}, {"BestCompression", Const, 0, ""}, {"BestSpeed", Const, 0, ""}, {"CorruptInputError", Type, 0, ""}, @@ -409,6 +420,7 @@ var PackageSymbols = map[string][]Symbol{ {"(*Writer).Flush", Method, 0, ""}, {"(*Writer).Reset", Method, 2, ""}, {"(*Writer).Write", Method, 0, ""}, + {"(Resetter).Reset", Method, 4, ""}, {"BestCompression", Const, 0, ""}, {"BestSpeed", Const, 0, ""}, {"DefaultCompression", Const, 0, ""}, @@ -426,6 +438,11 @@ var PackageSymbols = map[string][]Symbol{ {"Writer", Type, 0, ""}, }, "container/heap": { + {"(Interface).Len", Method, 0, ""}, + {"(Interface).Less", Method, 0, ""}, + {"(Interface).Pop", Method, 0, ""}, + {"(Interface).Push", Method, 0, ""}, + {"(Interface).Swap", Method, 0, ""}, {"Fix", Func, 2, "func(h Interface, i int)"}, {"Init", Func, 0, "func(h Interface)"}, {"Interface", Type, 0, ""}, @@ -469,6 +486,10 @@ var PackageSymbols = map[string][]Symbol{ {"Ring.Value", Field, 0, ""}, }, "context": { + {"(Context).Deadline", Method, 7, ""}, + {"(Context).Done", Method, 7, ""}, + {"(Context).Err", Method, 7, ""}, + {"(Context).Value", Method, 7, ""}, {"AfterFunc", Func, 21, "func(ctx Context, f func()) (stop func() bool)"}, {"Background", Func, 7, "func() Context"}, {"CancelCauseFunc", Type, 20, ""}, @@ -488,17 +509,31 @@ var PackageSymbols = map[string][]Symbol{ {"WithoutCancel", Func, 21, "func(parent Context) Context"}, }, "crypto": { + {"(Decapsulator).Decapsulate", Method, 26, ""}, + {"(Decapsulator).Encapsulator", Method, 26, ""}, + {"(Decrypter).Decrypt", Method, 5, ""}, + {"(Decrypter).Public", Method, 5, ""}, + {"(Encapsulator).Bytes", Method, 26, ""}, + {"(Encapsulator).Encapsulate", Method, 26, ""}, {"(Hash).Available", Method, 0, ""}, {"(Hash).HashFunc", Method, 4, ""}, {"(Hash).New", Method, 0, ""}, {"(Hash).Size", Method, 0, ""}, {"(Hash).String", Method, 15, ""}, + {"(MessageSigner).Public", Method, 25, ""}, + {"(MessageSigner).Sign", Method, 25, ""}, + {"(MessageSigner).SignMessage", Method, 25, ""}, + {"(Signer).Public", Method, 4, ""}, + {"(Signer).Sign", Method, 4, ""}, + {"(SignerOpts).HashFunc", Method, 4, ""}, {"BLAKE2b_256", Const, 9, ""}, {"BLAKE2b_384", Const, 9, ""}, {"BLAKE2b_512", Const, 9, ""}, {"BLAKE2s_256", Const, 9, ""}, + {"Decapsulator", Type, 26, ""}, {"Decrypter", Type, 5, ""}, {"DecrypterOpts", Type, 5, ""}, + {"Encapsulator", Type, 26, ""}, {"Hash", Type, 0, ""}, {"MD4", Const, 0, ""}, {"MD5", Const, 0, ""}, @@ -530,6 +565,16 @@ var PackageSymbols = map[string][]Symbol{ {"NewCipher", Func, 0, "func(key []byte) (cipher.Block, error)"}, }, "crypto/cipher": { + {"(AEAD).NonceSize", Method, 2, ""}, + {"(AEAD).Open", Method, 2, ""}, + {"(AEAD).Overhead", Method, 2, ""}, + {"(AEAD).Seal", Method, 2, ""}, + {"(Block).BlockSize", Method, 0, ""}, + {"(Block).Decrypt", Method, 0, ""}, + {"(Block).Encrypt", Method, 0, ""}, + {"(BlockMode).BlockSize", Method, 0, ""}, + {"(BlockMode).CryptBlocks", Method, 0, ""}, + {"(Stream).XORKeyStream", Method, 0, ""}, {"(StreamReader).Read", Method, 0, ""}, {"(StreamWriter).Close", Method, 0, ""}, {"(StreamWriter).Write", Method, 0, ""}, @@ -581,7 +626,7 @@ var PackageSymbols = map[string][]Symbol{ {"PublicKey", Type, 0, ""}, {"PublicKey.Parameters", Field, 0, ""}, {"PublicKey.Y", Field, 0, ""}, - {"Sign", Func, 0, "func(rand io.Reader, priv *PrivateKey, hash []byte) (r *big.Int, s *big.Int, err error)"}, + {"Sign", Func, 0, "func(random io.Reader, priv *PrivateKey, hash []byte) (r *big.Int, s *big.Int, err error)"}, {"Verify", Func, 0, "func(pub *PublicKey, hash []byte, r *big.Int, s *big.Int) bool"}, }, "crypto/ecdh": { @@ -594,7 +639,13 @@ var PackageSymbols = map[string][]Symbol{ {"(*PublicKey).Bytes", Method, 20, ""}, {"(*PublicKey).Curve", Method, 20, ""}, {"(*PublicKey).Equal", Method, 20, ""}, - {"Curve", Type, 20, ""}, + {"(Curve).GenerateKey", Method, 20, ""}, + {"(Curve).NewPrivateKey", Method, 20, ""}, + {"(Curve).NewPublicKey", Method, 20, ""}, + {"(KeyExchanger).Curve", Method, 26, ""}, + {"(KeyExchanger).ECDH", Method, 26, ""}, + {"(KeyExchanger).PublicKey", Method, 26, ""}, + {"KeyExchanger", Type, 26, ""}, {"P256", Func, 20, "func() Curve"}, {"P384", Func, 20, "func() Curve"}, {"P521", Func, 20, "func() Curve"}, @@ -623,7 +674,7 @@ var PackageSymbols = map[string][]Symbol{ {"(PublicKey).Params", Method, 0, ""}, {"(PublicKey).ScalarBaseMult", Method, 0, ""}, {"(PublicKey).ScalarMult", Method, 0, ""}, - {"GenerateKey", Func, 0, "func(c elliptic.Curve, rand io.Reader) (*PrivateKey, error)"}, + {"GenerateKey", Func, 0, "func(c elliptic.Curve, r 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, ""}, @@ -634,7 +685,7 @@ var PackageSymbols = map[string][]Symbol{ {"PublicKey.X", Field, 0, ""}, {"PublicKey.Y", Field, 0, ""}, {"Sign", Func, 0, "func(rand io.Reader, priv *PrivateKey, hash []byte) (r *big.Int, s *big.Int, err error)"}, - {"SignASN1", Func, 15, "func(rand io.Reader, priv *PrivateKey, hash []byte) ([]byte, error)"}, + {"SignASN1", Func, 15, "func(r io.Reader, priv *PrivateKey, hash []byte) ([]byte, error)"}, {"Verify", Func, 0, "func(pub *PublicKey, hash []byte, r *big.Int, s *big.Int) bool"}, {"VerifyASN1", Func, 15, "func(pub *PublicKey, hash []byte, sig []byte) bool"}, }, @@ -645,7 +696,7 @@ var PackageSymbols = map[string][]Symbol{ {"(PrivateKey).Seed", Method, 13, ""}, {"(PrivateKey).Sign", Method, 13, ""}, {"(PublicKey).Equal", Method, 15, ""}, - {"GenerateKey", Func, 13, "func(rand io.Reader) (PublicKey, PrivateKey, error)"}, + {"GenerateKey", Func, 13, "func(random io.Reader) (PublicKey, PrivateKey, error)"}, {"NewKeyFromSeed", Func, 13, "func(seed []byte) PrivateKey"}, {"Options", Type, 20, ""}, {"Options.Context", Field, 20, ""}, @@ -667,6 +718,12 @@ var PackageSymbols = map[string][]Symbol{ {"(*CurveParams).Params", Method, 0, ""}, {"(*CurveParams).ScalarBaseMult", Method, 0, ""}, {"(*CurveParams).ScalarMult", Method, 0, ""}, + {"(Curve).Add", Method, 0, ""}, + {"(Curve).Double", Method, 0, ""}, + {"(Curve).IsOnCurve", Method, 0, ""}, + {"(Curve).Params", Method, 0, ""}, + {"(Curve).ScalarBaseMult", Method, 0, ""}, + {"(Curve).ScalarMult", Method, 0, ""}, {"Curve", Type, 0, ""}, {"CurveParams", Type, 0, ""}, {"CurveParams.B", Field, 0, ""}, @@ -688,6 +745,9 @@ var PackageSymbols = map[string][]Symbol{ }, "crypto/fips140": { {"Enabled", Func, 24, "func() bool"}, + {"Enforced", Func, 26, "func() bool"}, + {"Version", Func, 26, "func() string"}, + {"WithoutEnforcement", Func, 26, "func(f func())"}, }, "crypto/hkdf": { {"Expand", Func, 24, "func[H hash.Hash](h func() H, pseudorandomKey []byte, info string, keyLength int) ([]byte, error)"}, @@ -698,6 +758,54 @@ var PackageSymbols = map[string][]Symbol{ {"Equal", Func, 1, "func(mac1 []byte, mac2 []byte) bool"}, {"New", Func, 0, "func(h func() hash.Hash, key []byte) hash.Hash"}, }, + "crypto/hpke": { + {"(*Recipient).Export", Method, 26, ""}, + {"(*Recipient).Open", Method, 26, ""}, + {"(*Sender).Export", Method, 26, ""}, + {"(*Sender).Seal", Method, 26, ""}, + {"(AEAD).ID", Method, 26, ""}, + {"(KDF).ID", Method, 26, ""}, + {"(KEM).DeriveKeyPair", Method, 26, ""}, + {"(KEM).GenerateKey", Method, 26, ""}, + {"(KEM).ID", Method, 26, ""}, + {"(KEM).NewPrivateKey", Method, 26, ""}, + {"(KEM).NewPublicKey", Method, 26, ""}, + {"(PrivateKey).Bytes", Method, 26, ""}, + {"(PrivateKey).KEM", Method, 26, ""}, + {"(PrivateKey).PublicKey", Method, 26, ""}, + {"(PublicKey).Bytes", Method, 26, ""}, + {"(PublicKey).KEM", Method, 26, ""}, + {"AES128GCM", Func, 26, "func() AEAD"}, + {"AES256GCM", Func, 26, "func() AEAD"}, + {"ChaCha20Poly1305", Func, 26, "func() AEAD"}, + {"DHKEM", Func, 26, "func(curve ecdh.Curve) KEM"}, + {"ExportOnly", Func, 26, "func() AEAD"}, + {"HKDFSHA256", Func, 26, "func() KDF"}, + {"HKDFSHA384", Func, 26, "func() KDF"}, + {"HKDFSHA512", Func, 26, "func() KDF"}, + {"MLKEM1024", Func, 26, "func() KEM"}, + {"MLKEM1024P384", Func, 26, "func() KEM"}, + {"MLKEM768", Func, 26, "func() KEM"}, + {"MLKEM768P256", Func, 26, "func() KEM"}, + {"MLKEM768X25519", Func, 26, "func() KEM"}, + {"NewAEAD", Func, 26, "func(id uint16) (AEAD, error)"}, + {"NewDHKEMPrivateKey", Func, 26, "func(priv ecdh.KeyExchanger) (PrivateKey, error)"}, + {"NewDHKEMPublicKey", Func, 26, "func(pub *ecdh.PublicKey) (PublicKey, error)"}, + {"NewHybridPrivateKey", Func, 26, "func(pq crypto.Decapsulator, t ecdh.KeyExchanger) (PrivateKey, error)"}, + {"NewHybridPublicKey", Func, 26, "func(pq crypto.Encapsulator, t *ecdh.PublicKey) (PublicKey, error)"}, + {"NewKDF", Func, 26, "func(id uint16) (KDF, error)"}, + {"NewKEM", Func, 26, "func(id uint16) (KEM, error)"}, + {"NewMLKEMPrivateKey", Func, 26, "func(priv crypto.Decapsulator) (PrivateKey, error)"}, + {"NewMLKEMPublicKey", Func, 26, "func(pub crypto.Encapsulator) (PublicKey, error)"}, + {"NewRecipient", Func, 26, "func(enc []byte, k PrivateKey, kdf KDF, aead AEAD, info []byte) (*Recipient, error)"}, + {"NewSender", Func, 26, "func(pk PublicKey, kdf KDF, aead AEAD, info []byte) (enc []byte, s *Sender, err error)"}, + {"Open", Func, 26, "func(k PrivateKey, kdf KDF, aead AEAD, info []byte, ciphertext []byte) ([]byte, error)"}, + {"Recipient", Type, 26, ""}, + {"SHAKE128", Func, 26, "func() KDF"}, + {"SHAKE256", Func, 26, "func() KDF"}, + {"Seal", Func, 26, "func(pk PublicKey, kdf KDF, aead AEAD, info []byte, plaintext []byte) ([]byte, error)"}, + {"Sender", Type, 26, ""}, + }, "crypto/md5": { {"BlockSize", Const, 0, ""}, {"New", Func, 0, "func() hash.Hash"}, @@ -708,9 +816,11 @@ var PackageSymbols = map[string][]Symbol{ {"(*DecapsulationKey1024).Bytes", Method, 24, ""}, {"(*DecapsulationKey1024).Decapsulate", Method, 24, ""}, {"(*DecapsulationKey1024).EncapsulationKey", Method, 24, ""}, + {"(*DecapsulationKey1024).Encapsulator", Method, 26, ""}, {"(*DecapsulationKey768).Bytes", Method, 24, ""}, {"(*DecapsulationKey768).Decapsulate", Method, 24, ""}, {"(*DecapsulationKey768).EncapsulationKey", Method, 24, ""}, + {"(*DecapsulationKey768).Encapsulator", Method, 26, ""}, {"(*EncapsulationKey1024).Bytes", Method, 24, ""}, {"(*EncapsulationKey1024).Encapsulate", Method, 24, ""}, {"(*EncapsulationKey768).Bytes", Method, 24, ""}, @@ -732,12 +842,16 @@ var PackageSymbols = map[string][]Symbol{ {"SeedSize", Const, 24, ""}, {"SharedKeySize", Const, 24, ""}, }, + "crypto/mlkem/mlkemtest": { + {"Encapsulate1024", Func, 26, "func(ek *mlkem.EncapsulationKey1024, random []byte) (sharedKey []byte, ciphertext []byte, err error)"}, + {"Encapsulate768", Func, 26, "func(ek *mlkem.EncapsulationKey768, random []byte) (sharedKey []byte, ciphertext []byte, err error)"}, + }, "crypto/pbkdf2": { {"Key", Func, 24, "func[Hash hash.Hash](h func() Hash, password string, salt []byte, iter int, keyLength int) ([]byte, error)"}, }, "crypto/rand": { {"Int", Func, 0, "func(rand io.Reader, max *big.Int) (n *big.Int, err error)"}, - {"Prime", Func, 0, "func(rand io.Reader, bits int) (*big.Int, error)"}, + {"Prime", Func, 0, "func(r io.Reader, bits int) (*big.Int, error)"}, {"Read", Func, 0, "func(b []byte) (n int, err error)"}, {"Reader", Var, 0, ""}, {"Text", Func, 24, "func() string"}, @@ -769,6 +883,7 @@ var PackageSymbols = map[string][]Symbol{ {"DecryptPKCS1v15", Func, 0, "func(random io.Reader, priv *PrivateKey, ciphertext []byte) ([]byte, error)"}, {"DecryptPKCS1v15SessionKey", Func, 0, "func(random io.Reader, priv *PrivateKey, ciphertext []byte, key []byte) error"}, {"EncryptOAEP", Func, 0, "func(hash hash.Hash, random io.Reader, pub *PublicKey, msg []byte, label []byte) ([]byte, error)"}, + {"EncryptOAEPWithOptions", Func, 26, "func(random io.Reader, pub *PublicKey, msg []byte, opts *OAEPOptions) ([]byte, error)"}, {"EncryptPKCS1v15", Func, 0, "func(random io.Reader, pub *PublicKey, msg []byte) ([]byte, error)"}, {"ErrDecryption", Var, 0, ""}, {"ErrMessageTooLong", Var, 0, ""}, @@ -800,7 +915,7 @@ var PackageSymbols = map[string][]Symbol{ {"PublicKey.E", Field, 0, ""}, {"PublicKey.N", Field, 0, ""}, {"SignPKCS1v15", Func, 0, "func(random io.Reader, priv *PrivateKey, hash crypto.Hash, hashed []byte) ([]byte, error)"}, - {"SignPSS", Func, 2, "func(rand io.Reader, priv *PrivateKey, hash crypto.Hash, digest []byte, opts *PSSOptions) ([]byte, error)"}, + {"SignPSS", Func, 2, "func(random io.Reader, priv *PrivateKey, hash crypto.Hash, digest []byte, opts *PSSOptions) ([]byte, error)"}, {"VerifyPKCS1v15", Func, 0, "func(pub *PublicKey, hash crypto.Hash, hashed []byte, sig []byte) error"}, {"VerifyPSS", Func, 2, "func(pub *PublicKey, hash crypto.Hash, digest []byte, sig []byte, opts *PSSOptions) error"}, }, @@ -921,6 +1036,8 @@ var PackageSymbols = map[string][]Symbol{ {"(*SessionState).Bytes", Method, 21, ""}, {"(AlertError).Error", Method, 21, ""}, {"(ClientAuthType).String", Method, 15, ""}, + {"(ClientSessionCache).Get", Method, 3, ""}, + {"(ClientSessionCache).Put", Method, 3, ""}, {"(CurveID).String", Method, 15, ""}, {"(QUICEncryptionLevel).String", Method, 21, ""}, {"(RecordHeaderError).Error", Method, 6, ""}, @@ -953,6 +1070,7 @@ var PackageSymbols = map[string][]Symbol{ {"ClientHelloInfo.CipherSuites", Field, 4, ""}, {"ClientHelloInfo.Conn", Field, 8, ""}, {"ClientHelloInfo.Extensions", Field, 24, ""}, + {"ClientHelloInfo.HelloRetryRequest", Field, 26, ""}, {"ClientHelloInfo.ServerName", Field, 4, ""}, {"ClientHelloInfo.SignatureSchemes", Field, 8, ""}, {"ClientHelloInfo.SupportedCurves", Field, 4, ""}, @@ -1001,6 +1119,7 @@ var PackageSymbols = map[string][]Symbol{ {"ConnectionState.DidResume", Field, 1, ""}, {"ConnectionState.ECHAccepted", Field, 23, ""}, {"ConnectionState.HandshakeComplete", Field, 0, ""}, + {"ConnectionState.HelloRetryRequest", Field, 26, ""}, {"ConnectionState.NegotiatedProtocol", Field, 0, ""}, {"ConnectionState.NegotiatedProtocolIsMutual", Field, 0, ""}, {"ConnectionState.OCSPResponse", Field, 5, ""}, @@ -1055,8 +1174,10 @@ var PackageSymbols = map[string][]Symbol{ {"QUICEncryptionLevelEarly", Const, 21, ""}, {"QUICEncryptionLevelHandshake", Const, 21, ""}, {"QUICEncryptionLevelInitial", Const, 21, ""}, + {"QUICErrorEvent", Const, 26, ""}, {"QUICEvent", Type, 21, ""}, {"QUICEvent.Data", Field, 21, ""}, + {"QUICEvent.Err", Field, 26, ""}, {"QUICEvent.Kind", Field, 21, ""}, {"QUICEvent.Level", Field, 21, ""}, {"QUICEvent.SessionState", Field, 23, ""}, @@ -1087,6 +1208,8 @@ var PackageSymbols = map[string][]Symbol{ {"RequestClientCert", Const, 0, ""}, {"RequireAndVerifyClientCert", Const, 0, ""}, {"RequireAnyClientCert", Const, 0, ""}, + {"SecP256r1MLKEM768", Const, 26, ""}, + {"SecP384r1MLKEM1024", Const, 26, ""}, {"Server", Func, 0, "func(conn net.Conn, config *Config) *Conn"}, {"SessionState", Type, 21, ""}, {"SessionState.EarlyData", Field, 21, ""}, @@ -1151,8 +1274,11 @@ var PackageSymbols = map[string][]Symbol{ {"(*RevocationList).CheckSignatureFrom", Method, 19, ""}, {"(CertificateInvalidError).Error", Method, 0, ""}, {"(ConstraintViolationError).Error", Method, 0, ""}, + {"(ExtKeyUsage).OID", Method, 26, ""}, + {"(ExtKeyUsage).String", Method, 26, ""}, {"(HostnameError).Error", Method, 0, ""}, {"(InsecureAlgorithmError).Error", Method, 6, ""}, + {"(KeyUsage).String", Method, 26, ""}, {"(OID).AppendBinary", Method, 24, ""}, {"(OID).AppendText", Method, 24, ""}, {"(OID).Equal", Method, 22, ""}, @@ -1307,6 +1433,7 @@ var PackageSymbols = map[string][]Symbol{ {"NoValidChains", Const, 24, ""}, {"NotAuthorizedToSign", Const, 0, ""}, {"OID", Type, 22, ""}, + {"OIDFromASN1OID", Func, 26, "func(asn1OID asn1.ObjectIdentifier) (OID, error)"}, {"OIDFromInts", Func, 22, "func(oid []uint64) (OID, error)"}, {"PEMCipher", Type, 1, ""}, {"PEMCipher3DES", Const, 1, ""}, @@ -1516,6 +1643,9 @@ var PackageSymbols = map[string][]Symbol{ {"(NullInt64).Value", Method, 0, ""}, {"(NullString).Value", Method, 0, ""}, {"(NullTime).Value", Method, 13, ""}, + {"(Result).LastInsertId", Method, 0, ""}, + {"(Result).RowsAffected", Method, 0, ""}, + {"(Scanner).Scan", Method, 0, ""}, {"ColumnType", Type, 8, ""}, {"Conn", Type, 9, ""}, {"DB", Type, 0, ""}, @@ -1547,8 +1677,6 @@ var PackageSymbols = map[string][]Symbol{ {"NamedArg.Name", Field, 8, ""}, {"NamedArg.Value", Field, 8, ""}, {"Null", Type, 22, ""}, - {"Null.V", Field, 22, ""}, - {"Null.Valid", Field, 22, ""}, {"NullBool", Type, 0, ""}, {"NullBool.Bool", Field, 0, ""}, {"NullBool.Valid", Field, 0, ""}, @@ -1591,10 +1719,68 @@ var PackageSymbols = map[string][]Symbol{ {"TxOptions.ReadOnly", Field, 8, ""}, }, "database/sql/driver": { + {"(ColumnConverter).ColumnConverter", Method, 0, ""}, + {"(Conn).Begin", Method, 0, ""}, + {"(Conn).Close", Method, 0, ""}, + {"(Conn).Prepare", Method, 0, ""}, + {"(ConnBeginTx).BeginTx", Method, 8, ""}, + {"(ConnPrepareContext).PrepareContext", Method, 8, ""}, + {"(Connector).Connect", Method, 10, ""}, + {"(Connector).Driver", Method, 10, ""}, + {"(Driver).Open", Method, 0, ""}, + {"(DriverContext).OpenConnector", Method, 10, ""}, + {"(Execer).Exec", Method, 0, ""}, + {"(ExecerContext).ExecContext", Method, 8, ""}, + {"(NamedValueChecker).CheckNamedValue", Method, 9, ""}, {"(NotNull).ConvertValue", Method, 0, ""}, {"(Null).ConvertValue", Method, 0, ""}, + {"(Pinger).Ping", Method, 8, ""}, + {"(Queryer).Query", Method, 1, ""}, + {"(QueryerContext).QueryContext", Method, 8, ""}, + {"(Result).LastInsertId", Method, 0, ""}, + {"(Result).RowsAffected", Method, 0, ""}, + {"(Rows).Close", Method, 0, ""}, + {"(Rows).Columns", Method, 0, ""}, + {"(Rows).Next", Method, 0, ""}, {"(RowsAffected).LastInsertId", Method, 0, ""}, {"(RowsAffected).RowsAffected", Method, 0, ""}, + {"(RowsColumnTypeDatabaseTypeName).Close", Method, 8, ""}, + {"(RowsColumnTypeDatabaseTypeName).ColumnTypeDatabaseTypeName", Method, 8, ""}, + {"(RowsColumnTypeDatabaseTypeName).Columns", Method, 8, ""}, + {"(RowsColumnTypeDatabaseTypeName).Next", Method, 8, ""}, + {"(RowsColumnTypeLength).Close", Method, 8, ""}, + {"(RowsColumnTypeLength).ColumnTypeLength", Method, 8, ""}, + {"(RowsColumnTypeLength).Columns", Method, 8, ""}, + {"(RowsColumnTypeLength).Next", Method, 8, ""}, + {"(RowsColumnTypeNullable).Close", Method, 8, ""}, + {"(RowsColumnTypeNullable).ColumnTypeNullable", Method, 8, ""}, + {"(RowsColumnTypeNullable).Columns", Method, 8, ""}, + {"(RowsColumnTypeNullable).Next", Method, 8, ""}, + {"(RowsColumnTypePrecisionScale).Close", Method, 8, ""}, + {"(RowsColumnTypePrecisionScale).ColumnTypePrecisionScale", Method, 8, ""}, + {"(RowsColumnTypePrecisionScale).Columns", Method, 8, ""}, + {"(RowsColumnTypePrecisionScale).Next", Method, 8, ""}, + {"(RowsColumnTypeScanType).Close", Method, 8, ""}, + {"(RowsColumnTypeScanType).ColumnTypeScanType", Method, 8, ""}, + {"(RowsColumnTypeScanType).Columns", Method, 8, ""}, + {"(RowsColumnTypeScanType).Next", Method, 8, ""}, + {"(RowsNextResultSet).Close", Method, 8, ""}, + {"(RowsNextResultSet).Columns", Method, 8, ""}, + {"(RowsNextResultSet).HasNextResultSet", Method, 8, ""}, + {"(RowsNextResultSet).Next", Method, 8, ""}, + {"(RowsNextResultSet).NextResultSet", Method, 8, ""}, + {"(SessionResetter).ResetSession", Method, 10, ""}, + {"(Stmt).Close", Method, 0, ""}, + {"(Stmt).Exec", Method, 0, ""}, + {"(Stmt).NumInput", Method, 0, ""}, + {"(Stmt).Query", Method, 0, ""}, + {"(StmtExecContext).ExecContext", Method, 8, ""}, + {"(StmtQueryContext).QueryContext", Method, 8, ""}, + {"(Tx).Commit", Method, 0, ""}, + {"(Tx).Rollback", Method, 0, ""}, + {"(Validator).IsValid", Method, 15, ""}, + {"(ValueConverter).ConvertValue", Method, 0, ""}, + {"(Valuer).Value", Method, 0, ""}, {"Bool", Var, 0, ""}, {"ColumnConverter", Type, 0, ""}, {"Conn", Type, 0, ""}, @@ -1629,7 +1815,6 @@ var PackageSymbols = map[string][]Symbol{ {"ResultNoRows", Var, 0, ""}, {"Rows", Type, 0, ""}, {"RowsAffected", Type, 0, ""}, - {"RowsColumnScanner", Type, 26, ""}, {"RowsColumnTypeDatabaseTypeName", Type, 8, ""}, {"RowsColumnTypeLength", Type, 8, ""}, {"RowsColumnTypeNullable", Type, 8, ""}, @@ -1756,6 +1941,9 @@ var PackageSymbols = map[string][]Symbol{ {"(DecodeError).Error", Method, 0, ""}, {"(Tag).GoString", Method, 0, ""}, {"(Tag).String", Method, 0, ""}, + {"(Type).Common", Method, 0, ""}, + {"(Type).Size", Method, 0, ""}, + {"(Type).String", Method, 0, ""}, {"AddrType", Type, 0, ""}, {"AddrType.BasicType", Field, 0, ""}, {"ArrayType", Type, 0, ""}, @@ -3163,6 +3351,7 @@ var PackageSymbols = map[string][]Symbol{ {"R_LARCH_B16", Const, 20, ""}, {"R_LARCH_B21", Const, 20, ""}, {"R_LARCH_B26", Const, 20, ""}, + {"R_LARCH_CALL36", Const, 26, ""}, {"R_LARCH_CFA", Const, 22, ""}, {"R_LARCH_COPY", Const, 19, ""}, {"R_LARCH_DELETE", Const, 22, ""}, @@ -3220,11 +3409,25 @@ var PackageSymbols = map[string][]Symbol{ {"R_LARCH_SUB64", Const, 19, ""}, {"R_LARCH_SUB8", Const, 19, ""}, {"R_LARCH_SUB_ULEB128", Const, 22, ""}, + {"R_LARCH_TLS_DESC32", Const, 26, ""}, + {"R_LARCH_TLS_DESC64", Const, 26, ""}, + {"R_LARCH_TLS_DESC64_HI12", Const, 26, ""}, + {"R_LARCH_TLS_DESC64_LO20", Const, 26, ""}, + {"R_LARCH_TLS_DESC64_PC_HI12", Const, 26, ""}, + {"R_LARCH_TLS_DESC64_PC_LO20", Const, 26, ""}, + {"R_LARCH_TLS_DESC_CALL", Const, 26, ""}, + {"R_LARCH_TLS_DESC_HI20", Const, 26, ""}, + {"R_LARCH_TLS_DESC_LD", Const, 26, ""}, + {"R_LARCH_TLS_DESC_LO12", Const, 26, ""}, + {"R_LARCH_TLS_DESC_PCREL20_S2", Const, 26, ""}, + {"R_LARCH_TLS_DESC_PC_HI20", Const, 26, ""}, + {"R_LARCH_TLS_DESC_PC_LO12", Const, 26, ""}, {"R_LARCH_TLS_DTPMOD32", Const, 19, ""}, {"R_LARCH_TLS_DTPMOD64", Const, 19, ""}, {"R_LARCH_TLS_DTPREL32", Const, 19, ""}, {"R_LARCH_TLS_DTPREL64", Const, 19, ""}, {"R_LARCH_TLS_GD_HI20", Const, 20, ""}, + {"R_LARCH_TLS_GD_PCREL20_S2", Const, 26, ""}, {"R_LARCH_TLS_GD_PC_HI20", Const, 20, ""}, {"R_LARCH_TLS_IE64_HI12", Const, 20, ""}, {"R_LARCH_TLS_IE64_LO20", Const, 20, ""}, @@ -3235,11 +3438,15 @@ var PackageSymbols = map[string][]Symbol{ {"R_LARCH_TLS_IE_PC_HI20", Const, 20, ""}, {"R_LARCH_TLS_IE_PC_LO12", Const, 20, ""}, {"R_LARCH_TLS_LD_HI20", Const, 20, ""}, + {"R_LARCH_TLS_LD_PCREL20_S2", Const, 26, ""}, {"R_LARCH_TLS_LD_PC_HI20", Const, 20, ""}, {"R_LARCH_TLS_LE64_HI12", Const, 20, ""}, {"R_LARCH_TLS_LE64_LO20", Const, 20, ""}, + {"R_LARCH_TLS_LE_ADD_R", Const, 26, ""}, {"R_LARCH_TLS_LE_HI20", Const, 20, ""}, + {"R_LARCH_TLS_LE_HI20_R", Const, 26, ""}, {"R_LARCH_TLS_LE_LO12", Const, 20, ""}, + {"R_LARCH_TLS_LE_LO12_R", Const, 26, ""}, {"R_LARCH_TLS_TPREL32", Const, 19, ""}, {"R_LARCH_TLS_TPREL64", Const, 19, ""}, {"R_MIPS", Type, 6, ""}, @@ -3944,6 +4151,7 @@ var PackageSymbols = map[string][]Symbol{ {"(FatArch).ImportedSymbols", Method, 3, ""}, {"(FatArch).Section", Method, 3, ""}, {"(FatArch).Segment", Method, 3, ""}, + {"(Load).Raw", Method, 0, ""}, {"(LoadBytes).Raw", Method, 0, ""}, {"(LoadCmd).GoString", Method, 0, ""}, {"(LoadCmd).String", Method, 0, ""}, @@ -4590,6 +4798,12 @@ var PackageSymbols = map[string][]Symbol{ {"FS", Type, 16, ""}, }, "encoding": { + {"(BinaryAppender).AppendBinary", Method, 24, ""}, + {"(BinaryMarshaler).MarshalBinary", Method, 2, ""}, + {"(BinaryUnmarshaler).UnmarshalBinary", Method, 2, ""}, + {"(TextAppender).AppendText", Method, 24, ""}, + {"(TextMarshaler).MarshalText", Method, 2, ""}, + {"(TextUnmarshaler).UnmarshalText", Method, 2, ""}, {"BinaryAppender", Type, 24, ""}, {"BinaryMarshaler", Type, 2, ""}, {"BinaryUnmarshaler", Type, 2, ""}, @@ -4705,6 +4919,17 @@ var PackageSymbols = map[string][]Symbol{ {"URLEncoding", Var, 0, ""}, }, "encoding/binary": { + {"(AppendByteOrder).AppendUint16", Method, 19, ""}, + {"(AppendByteOrder).AppendUint32", Method, 19, ""}, + {"(AppendByteOrder).AppendUint64", Method, 19, ""}, + {"(AppendByteOrder).String", Method, 19, ""}, + {"(ByteOrder).PutUint16", Method, 0, ""}, + {"(ByteOrder).PutUint32", Method, 0, ""}, + {"(ByteOrder).PutUint64", Method, 0, ""}, + {"(ByteOrder).String", Method, 0, ""}, + {"(ByteOrder).Uint16", Method, 0, ""}, + {"(ByteOrder).Uint32", Method, 0, ""}, + {"(ByteOrder).Uint64", Method, 0, ""}, {"Append", Func, 23, "func(buf []byte, order ByteOrder, data any) ([]byte, error)"}, {"AppendByteOrder", Type, 19, ""}, {"AppendUvarint", Func, 19, "func(buf []byte, x uint64) []byte"}, @@ -4767,6 +4992,8 @@ var PackageSymbols = map[string][]Symbol{ {"(*Decoder).DecodeValue", Method, 0, ""}, {"(*Encoder).Encode", Method, 0, ""}, {"(*Encoder).EncodeValue", Method, 0, ""}, + {"(GobDecoder).GobDecode", Method, 0, ""}, + {"(GobEncoder).GobEncode", Method, 0, ""}, {"CommonType", Type, 0, ""}, {"CommonType.Id", Field, 0, ""}, {"CommonType.Name", Field, 0, ""}, @@ -4819,10 +5046,12 @@ var PackageSymbols = map[string][]Symbol{ {"(*UnsupportedTypeError).Error", Method, 0, ""}, {"(*UnsupportedValueError).Error", Method, 0, ""}, {"(Delim).String", Method, 5, ""}, + {"(Marshaler).MarshalJSON", Method, 0, ""}, {"(Number).Float64", Method, 1, ""}, {"(Number).Int64", Method, 1, ""}, {"(Number).String", Method, 1, ""}, {"(RawMessage).MarshalJSON", Method, 8, ""}, + {"(Unmarshaler).UnmarshalJSON", Method, 0, ""}, {"Compact", Func, 0, "func(dst *bytes.Buffer, src []byte) error"}, {"Decoder", Type, 0, ""}, {"Delim", Type, 5, ""}, @@ -4894,10 +5123,15 @@ var PackageSymbols = map[string][]Symbol{ {"(CharData).Copy", Method, 0, ""}, {"(Comment).Copy", Method, 0, ""}, {"(Directive).Copy", Method, 0, ""}, + {"(Marshaler).MarshalXML", Method, 2, ""}, + {"(MarshalerAttr).MarshalXMLAttr", Method, 2, ""}, {"(ProcInst).Copy", Method, 0, ""}, {"(StartElement).Copy", Method, 0, ""}, {"(StartElement).End", Method, 2, ""}, + {"(TokenReader).Token", Method, 10, ""}, {"(UnmarshalError).Error", Method, 0, ""}, + {"(Unmarshaler).UnmarshalXML", Method, 2, ""}, + {"(UnmarshalerAttr).UnmarshalXMLAttr", Method, 2, ""}, {"Attr", Type, 0, ""}, {"Attr.Name", Field, 0, ""}, {"Attr.Value", Field, 0, ""}, @@ -4984,6 +5218,7 @@ var PackageSymbols = map[string][]Symbol{ {"(*String).Value", Method, 8, ""}, {"(Func).String", Method, 0, ""}, {"(Func).Value", Method, 8, ""}, + {"(Var).String", Method, 0, ""}, {"Do", Func, 0, "func(f func(KeyValue))"}, {"Float", Type, 0, ""}, {"Func", Type, 0, ""}, @@ -5039,6 +5274,11 @@ var PackageSymbols = map[string][]Symbol{ {"(*FlagSet).Var", Method, 0, ""}, {"(*FlagSet).Visit", Method, 0, ""}, {"(*FlagSet).VisitAll", Method, 0, ""}, + {"(Getter).Get", Method, 2, ""}, + {"(Getter).Set", Method, 2, ""}, + {"(Getter).String", Method, 2, ""}, + {"(Value).Set", Method, 0, ""}, + {"(Value).String", Method, 0, ""}, {"Arg", Func, 0, "func(i int) string"}, {"Args", Func, 0, "func() []string"}, {"Bool", Func, 0, "func(name string, value bool, usage string) *bool"}, @@ -5090,6 +5330,20 @@ var PackageSymbols = map[string][]Symbol{ {"VisitAll", Func, 0, "func(fn func(*Flag))"}, }, "fmt": { + {"(Formatter).Format", Method, 0, ""}, + {"(GoStringer).GoString", Method, 0, ""}, + {"(ScanState).Read", Method, 0, ""}, + {"(ScanState).ReadRune", Method, 0, ""}, + {"(ScanState).SkipSpace", Method, 0, ""}, + {"(ScanState).Token", Method, 0, ""}, + {"(ScanState).UnreadRune", Method, 0, ""}, + {"(ScanState).Width", Method, 0, ""}, + {"(Scanner).Scan", Method, 0, ""}, + {"(State).Flag", Method, 0, ""}, + {"(State).Precision", Method, 0, ""}, + {"(State).Width", Method, 0, ""}, + {"(State).Write", Method, 0, ""}, + {"(Stringer).String", Method, 0, ""}, {"Append", Func, 19, "func(b []byte, a ...any) []byte"}, {"Appendf", Func, 19, "func(b []byte, format string, a ...any) []byte"}, {"Appendln", Func, 19, "func(b []byte, a ...any) []byte"}, @@ -5248,7 +5502,18 @@ var PackageSymbols = map[string][]Symbol{ {"(CommentMap).Filter", Method, 1, ""}, {"(CommentMap).String", Method, 1, ""}, {"(CommentMap).Update", Method, 1, ""}, + {"(Decl).End", Method, 0, ""}, + {"(Decl).Pos", Method, 0, ""}, + {"(Expr).End", Method, 0, ""}, + {"(Expr).Pos", Method, 0, ""}, + {"(Node).End", Method, 0, ""}, + {"(Node).Pos", Method, 0, ""}, {"(ObjKind).String", Method, 0, ""}, + {"(Spec).End", Method, 0, ""}, + {"(Spec).Pos", Method, 0, ""}, + {"(Stmt).End", Method, 0, ""}, + {"(Stmt).Pos", Method, 0, ""}, + {"(Visitor).Visit", Method, 0, ""}, {"ArrayType", Type, 0, ""}, {"ArrayType.Elt", Field, 0, ""}, {"ArrayType.Lbrack", Field, 0, ""}, @@ -5271,6 +5536,7 @@ var PackageSymbols = map[string][]Symbol{ {"BasicLit", Type, 0, ""}, {"BasicLit.Kind", Field, 0, ""}, {"BasicLit.Value", Field, 0, ""}, + {"BasicLit.ValueEnd", Field, 26, ""}, {"BasicLit.ValuePos", Field, 0, ""}, {"BinaryExpr", Type, 0, ""}, {"BinaryExpr.Op", Field, 0, ""}, @@ -5320,7 +5586,6 @@ var PackageSymbols = map[string][]Symbol{ {"CompositeLit.Rbrace", Field, 0, ""}, {"CompositeLit.Type", Field, 0, ""}, {"Con", Const, 0, ""}, - {"Decl", Type, 0, ""}, {"DeclStmt", Type, 0, ""}, {"DeclStmt.Decl", Field, 0, ""}, {"DeferStmt", Type, 0, ""}, @@ -5341,7 +5606,6 @@ var PackageSymbols = map[string][]Symbol{ {"EmptyStmt", Type, 0, ""}, {"EmptyStmt.Implicit", Field, 5, ""}, {"EmptyStmt.Semicolon", Field, 0, ""}, - {"Expr", Type, 0, ""}, {"ExprStmt", Type, 0, ""}, {"ExprStmt.X", Field, 0, ""}, {"Field", Type, 0, ""}, @@ -5525,11 +5789,9 @@ var PackageSymbols = map[string][]Symbol{ {"SliceExpr.Slice3", Field, 2, ""}, {"SliceExpr.X", Field, 0, ""}, {"SortImports", Func, 0, "func(fset *token.FileSet, f *File)"}, - {"Spec", Type, 0, ""}, {"StarExpr", Type, 0, ""}, {"StarExpr.Star", Field, 0, ""}, {"StarExpr.X", Field, 0, ""}, - {"Stmt", Type, 0, ""}, {"StructType", Type, 0, ""}, {"StructType.Fields", Field, 0, ""}, {"StructType.Incomplete", Field, 0, ""}, @@ -5684,10 +5946,11 @@ var PackageSymbols = map[string][]Symbol{ {"(*SyntaxError).Error", Method, 16, ""}, {"(*TagExpr).Eval", Method, 16, ""}, {"(*TagExpr).String", Method, 16, ""}, + {"(Expr).Eval", Method, 16, ""}, + {"(Expr).String", Method, 16, ""}, {"AndExpr", Type, 16, ""}, {"AndExpr.X", Field, 16, ""}, {"AndExpr.Y", Field, 16, ""}, - {"Expr", Type, 16, ""}, {"GoVersion", Func, 21, "func(x Expr) string"}, {"IsGoBuild", Func, 16, "func(line string) bool"}, {"IsPlusBuild", Func, 16, "func(line string) bool"}, @@ -5706,6 +5969,9 @@ var PackageSymbols = map[string][]Symbol{ }, "go/constant": { {"(Kind).String", Method, 18, ""}, + {"(Value).ExactString", Method, 6, ""}, + {"(Value).Kind", Method, 5, ""}, + {"(Value).String", Method, 5, ""}, {"BinaryOp", Func, 5, "func(x_ Value, op token.Token, y_ Value) Value"}, {"BitLen", Func, 5, "func(x Value) int"}, {"Bool", Const, 5, ""}, @@ -5744,7 +6010,6 @@ var PackageSymbols = map[string][]Symbol{ {"UnaryOp", Func, 5, "func(op token.Token, y Value, prec uint) Value"}, {"Unknown", Const, 5, ""}, {"Val", Func, 13, "func(x Value) any"}, - {"Value", Type, 5, ""}, }, "go/doc": { {"(*Package).Filter", Method, 0, ""}, @@ -5828,7 +6093,6 @@ var PackageSymbols = map[string][]Symbol{ {"(*Printer).HTML", Method, 19, ""}, {"(*Printer).Markdown", Method, 19, ""}, {"(*Printer).Text", Method, 19, ""}, - {"Block", Type, 19, ""}, {"Code", Type, 19, ""}, {"Code.Text", Field, 19, ""}, {"DefaultLookupPackage", Func, 19, "func(name string) (importPath string, ok bool)"}, @@ -5873,7 +6137,6 @@ var PackageSymbols = map[string][]Symbol{ {"Printer.TextCodePrefix", Field, 19, ""}, {"Printer.TextPrefix", Field, 19, ""}, {"Printer.TextWidth", Field, 19, ""}, - {"Text", Type, 19, ""}, }, "go/format": { {"Node", Func, 1, "func(dst io.Writer, fset *token.FileSet, node any) error"}, @@ -5945,6 +6208,7 @@ var PackageSymbols = map[string][]Symbol{ {"(*File).AddLineColumnInfo", Method, 11, ""}, {"(*File).AddLineInfo", Method, 0, ""}, {"(*File).Base", Method, 0, ""}, + {"(*File).End", Method, 26, ""}, {"(*File).Line", Method, 0, ""}, {"(*File).LineCount", Method, 0, ""}, {"(*File).LineStart", Method, 12, ""}, @@ -6307,6 +6571,22 @@ var PackageSymbols = map[string][]Symbol{ {"(Checker).PkgNameOf", Method, 22, ""}, {"(Checker).TypeOf", Method, 5, ""}, {"(Error).Error", Method, 5, ""}, + {"(Importer).Import", Method, 5, ""}, + {"(ImporterFrom).Import", Method, 6, ""}, + {"(ImporterFrom).ImportFrom", Method, 6, ""}, + {"(Object).Exported", Method, 5, ""}, + {"(Object).Id", Method, 5, ""}, + {"(Object).Name", Method, 5, ""}, + {"(Object).Parent", Method, 5, ""}, + {"(Object).Pkg", Method, 5, ""}, + {"(Object).Pos", Method, 5, ""}, + {"(Object).String", Method, 5, ""}, + {"(Object).Type", Method, 5, ""}, + {"(Sizes).Alignof", Method, 5, ""}, + {"(Sizes).Offsetsof", Method, 5, ""}, + {"(Sizes).Sizeof", Method, 5, ""}, + {"(Type).String", Method, 5, ""}, + {"(Type).Underlying", Method, 5, ""}, {"(TypeAndValue).Addressable", Method, 5, ""}, {"(TypeAndValue).Assignable", Method, 5, ""}, {"(TypeAndValue).HasOk", Method, 5, ""}, @@ -6445,7 +6725,6 @@ var PackageSymbols = map[string][]Symbol{ {"NewUnion", Func, 18, "func(terms []*Term) *Union"}, {"NewVar", Func, 5, "func(pos token.Pos, pkg *Package, name string, typ Type) *Var"}, {"Nil", Type, 5, ""}, - {"Object", Type, 5, ""}, {"ObjectString", Func, 5, "func(obj Object, qf Qualifier) string"}, {"Package", Type, 5, ""}, {"PackageVar", Const, 25, ""}, @@ -6516,6 +6795,33 @@ var PackageSymbols = map[string][]Symbol{ {"Lang", Func, 22, "func(x string) string"}, }, "hash": { + {"(Cloner).BlockSize", Method, 25, ""}, + {"(Cloner).Clone", Method, 25, ""}, + {"(Cloner).Reset", Method, 25, ""}, + {"(Cloner).Size", Method, 25, ""}, + {"(Cloner).Sum", Method, 25, ""}, + {"(Cloner).Write", Method, 25, ""}, + {"(Hash).BlockSize", Method, 0, ""}, + {"(Hash).Reset", Method, 0, ""}, + {"(Hash).Size", Method, 0, ""}, + {"(Hash).Sum", Method, 0, ""}, + {"(Hash).Write", Method, 0, ""}, + {"(Hash32).BlockSize", Method, 0, ""}, + {"(Hash32).Reset", Method, 0, ""}, + {"(Hash32).Size", Method, 0, ""}, + {"(Hash32).Sum", Method, 0, ""}, + {"(Hash32).Sum32", Method, 0, ""}, + {"(Hash32).Write", Method, 0, ""}, + {"(Hash64).BlockSize", Method, 0, ""}, + {"(Hash64).Reset", Method, 0, ""}, + {"(Hash64).Size", Method, 0, ""}, + {"(Hash64).Sum", Method, 0, ""}, + {"(Hash64).Sum64", Method, 0, ""}, + {"(Hash64).Write", Method, 0, ""}, + {"(XOF).BlockSize", Method, 25, ""}, + {"(XOF).Read", Method, 25, ""}, + {"(XOF).Reset", Method, 25, ""}, + {"(XOF).Write", Method, 25, ""}, {"Cloner", Type, 25, ""}, {"Hash", Type, 0, ""}, {"Hash32", Type, 0, ""}, @@ -6781,6 +7087,13 @@ var PackageSymbols = map[string][]Symbol{ {"(*YCbCr).SubImage", Method, 0, ""}, {"(*YCbCr).YCbCrAt", Method, 4, ""}, {"(*YCbCr).YOffset", Method, 0, ""}, + {"(Image).At", Method, 0, ""}, + {"(Image).Bounds", Method, 0, ""}, + {"(Image).ColorModel", Method, 0, ""}, + {"(PalettedImage).At", Method, 0, ""}, + {"(PalettedImage).Bounds", Method, 0, ""}, + {"(PalettedImage).ColorIndexAt", Method, 0, ""}, + {"(PalettedImage).ColorModel", Method, 0, ""}, {"(Point).Add", Method, 0, ""}, {"(Point).Div", Method, 0, ""}, {"(Point).Eq", Method, 0, ""}, @@ -6789,6 +7102,10 @@ var PackageSymbols = map[string][]Symbol{ {"(Point).Mul", Method, 0, ""}, {"(Point).String", Method, 0, ""}, {"(Point).Sub", Method, 0, ""}, + {"(RGBA64Image).At", Method, 17, ""}, + {"(RGBA64Image).Bounds", Method, 17, ""}, + {"(RGBA64Image).ColorModel", Method, 17, ""}, + {"(RGBA64Image).RGBA64At", Method, 17, ""}, {"(Rectangle).Add", Method, 0, ""}, {"(Rectangle).At", Method, 5, ""}, {"(Rectangle).Bounds", Method, 5, ""}, @@ -6913,8 +7230,10 @@ var PackageSymbols = map[string][]Symbol{ {"(Alpha).RGBA", Method, 0, ""}, {"(Alpha16).RGBA", Method, 0, ""}, {"(CMYK).RGBA", Method, 5, ""}, + {"(Color).RGBA", Method, 0, ""}, {"(Gray).RGBA", Method, 0, ""}, {"(Gray16).RGBA", Method, 0, ""}, + {"(Model).Convert", Method, 0, ""}, {"(NRGBA).RGBA", Method, 0, ""}, {"(NRGBA64).RGBA", Method, 0, ""}, {"(NYCbCrA).RGBA", Method, 6, ""}, @@ -6992,7 +7311,19 @@ var PackageSymbols = map[string][]Symbol{ {"WebSafe", Var, 2, ""}, }, "image/draw": { + {"(Drawer).Draw", Method, 2, ""}, + {"(Image).At", Method, 0, ""}, + {"(Image).Bounds", Method, 0, ""}, + {"(Image).ColorModel", Method, 0, ""}, + {"(Image).Set", Method, 0, ""}, {"(Op).Draw", Method, 2, ""}, + {"(Quantizer).Quantize", Method, 2, ""}, + {"(RGBA64Image).At", Method, 17, ""}, + {"(RGBA64Image).Bounds", Method, 17, ""}, + {"(RGBA64Image).ColorModel", Method, 17, ""}, + {"(RGBA64Image).RGBA64At", Method, 17, ""}, + {"(RGBA64Image).Set", Method, 17, ""}, + {"(RGBA64Image).SetRGBA64", Method, 17, ""}, {"Draw", Func, 0, "func(dst Image, r image.Rectangle, src image.Image, sp image.Point, op Op)"}, {"DrawMask", Func, 0, "func(dst Image, r image.Rectangle, src image.Image, sp image.Point, mask image.Image, mp image.Point, op Op)"}, {"Drawer", Type, 2, ""}, @@ -7027,6 +7358,8 @@ var PackageSymbols = map[string][]Symbol{ }, "image/jpeg": { {"(FormatError).Error", Method, 0, ""}, + {"(Reader).Read", Method, 0, ""}, + {"(Reader).ReadByte", Method, 0, ""}, {"(UnsupportedError).Error", Method, 0, ""}, {"Decode", Func, 0, "func(r io.Reader) (image.Image, error)"}, {"DecodeConfig", Func, 0, "func(r io.Reader) (image.Config, error)"}, @@ -7040,6 +7373,8 @@ var PackageSymbols = map[string][]Symbol{ }, "image/png": { {"(*Encoder).Encode", Method, 4, ""}, + {"(EncoderBufferPool).Get", Method, 9, ""}, + {"(EncoderBufferPool).Put", Method, 9, ""}, {"(FormatError).Error", Method, 0, ""}, {"(UnsupportedError).Error", Method, 0, ""}, {"BestCompression", Const, 4, ""}, @@ -7083,6 +7418,41 @@ var PackageSymbols = map[string][]Symbol{ {"(*SectionReader).ReadAt", Method, 0, ""}, {"(*SectionReader).Seek", Method, 0, ""}, {"(*SectionReader).Size", Method, 0, ""}, + {"(ByteReader).ReadByte", Method, 0, ""}, + {"(ByteScanner).ReadByte", Method, 0, ""}, + {"(ByteScanner).UnreadByte", Method, 0, ""}, + {"(ByteWriter).WriteByte", Method, 1, ""}, + {"(Closer).Close", Method, 0, ""}, + {"(ReadCloser).Close", Method, 0, ""}, + {"(ReadCloser).Read", Method, 0, ""}, + {"(ReadSeekCloser).Close", Method, 16, ""}, + {"(ReadSeekCloser).Read", Method, 16, ""}, + {"(ReadSeekCloser).Seek", Method, 16, ""}, + {"(ReadSeeker).Read", Method, 0, ""}, + {"(ReadSeeker).Seek", Method, 0, ""}, + {"(ReadWriteCloser).Close", Method, 0, ""}, + {"(ReadWriteCloser).Read", Method, 0, ""}, + {"(ReadWriteCloser).Write", Method, 0, ""}, + {"(ReadWriteSeeker).Read", Method, 0, ""}, + {"(ReadWriteSeeker).Seek", Method, 0, ""}, + {"(ReadWriteSeeker).Write", Method, 0, ""}, + {"(ReadWriter).Read", Method, 0, ""}, + {"(ReadWriter).Write", Method, 0, ""}, + {"(Reader).Read", Method, 0, ""}, + {"(ReaderAt).ReadAt", Method, 0, ""}, + {"(ReaderFrom).ReadFrom", Method, 0, ""}, + {"(RuneReader).ReadRune", Method, 0, ""}, + {"(RuneScanner).ReadRune", Method, 0, ""}, + {"(RuneScanner).UnreadRune", Method, 0, ""}, + {"(Seeker).Seek", Method, 0, ""}, + {"(StringWriter).WriteString", Method, 12, ""}, + {"(WriteCloser).Close", Method, 0, ""}, + {"(WriteCloser).Write", Method, 0, ""}, + {"(WriteSeeker).Seek", Method, 0, ""}, + {"(WriteSeeker).Write", Method, 0, ""}, + {"(Writer).Write", Method, 0, ""}, + {"(WriterAt).WriteAt", Method, 0, ""}, + {"(WriterTo).WriteTo", Method, 0, ""}, {"ByteReader", Type, 0, ""}, {"ByteScanner", Type, 0, ""}, {"ByteWriter", Type, 1, ""}, @@ -7142,11 +7512,42 @@ var PackageSymbols = map[string][]Symbol{ {"(*PathError).Error", Method, 16, ""}, {"(*PathError).Timeout", Method, 16, ""}, {"(*PathError).Unwrap", Method, 16, ""}, + {"(DirEntry).Info", Method, 16, ""}, + {"(DirEntry).IsDir", Method, 16, ""}, + {"(DirEntry).Name", Method, 16, ""}, + {"(DirEntry).Type", Method, 16, ""}, + {"(FS).Open", Method, 16, ""}, + {"(File).Close", Method, 16, ""}, + {"(File).Read", Method, 16, ""}, + {"(File).Stat", Method, 16, ""}, + {"(FileInfo).IsDir", Method, 16, ""}, + {"(FileInfo).ModTime", Method, 16, ""}, + {"(FileInfo).Mode", Method, 16, ""}, + {"(FileInfo).Name", Method, 16, ""}, + {"(FileInfo).Size", Method, 16, ""}, + {"(FileInfo).Sys", Method, 16, ""}, {"(FileMode).IsDir", Method, 16, ""}, {"(FileMode).IsRegular", Method, 16, ""}, {"(FileMode).Perm", Method, 16, ""}, {"(FileMode).String", Method, 16, ""}, {"(FileMode).Type", Method, 16, ""}, + {"(GlobFS).Glob", Method, 16, ""}, + {"(GlobFS).Open", Method, 16, ""}, + {"(ReadDirFS).Open", Method, 16, ""}, + {"(ReadDirFS).ReadDir", Method, 16, ""}, + {"(ReadDirFile).Close", Method, 16, ""}, + {"(ReadDirFile).Read", Method, 16, ""}, + {"(ReadDirFile).ReadDir", Method, 16, ""}, + {"(ReadDirFile).Stat", Method, 16, ""}, + {"(ReadFileFS).Open", Method, 16, ""}, + {"(ReadFileFS).ReadFile", Method, 16, ""}, + {"(ReadLinkFS).Lstat", Method, 25, ""}, + {"(ReadLinkFS).Open", Method, 25, ""}, + {"(ReadLinkFS).ReadLink", Method, 25, ""}, + {"(StatFS).Open", Method, 16, ""}, + {"(StatFS).Stat", Method, 16, ""}, + {"(SubFS).Open", Method, 16, ""}, + {"(SubFS).Sub", Method, 16, ""}, {"DirEntry", Type, 16, ""}, {"ErrClosed", Var, 16, ""}, {"ErrExist", Var, 16, ""}, @@ -7299,12 +7700,18 @@ var PackageSymbols = map[string][]Symbol{ {"(*TextHandler).WithGroup", Method, 21, ""}, {"(Attr).Equal", Method, 21, ""}, {"(Attr).String", Method, 21, ""}, + {"(Handler).Enabled", Method, 21, ""}, + {"(Handler).Handle", Method, 21, ""}, + {"(Handler).WithAttrs", Method, 21, ""}, + {"(Handler).WithGroup", Method, 21, ""}, {"(Kind).String", Method, 21, ""}, {"(Level).AppendText", Method, 24, ""}, {"(Level).Level", Method, 21, ""}, {"(Level).MarshalJSON", Method, 21, ""}, {"(Level).MarshalText", Method, 21, ""}, {"(Level).String", Method, 21, ""}, + {"(Leveler).Level", Method, 21, ""}, + {"(LogValuer).LogValue", Method, 21, ""}, {"(Record).Attrs", Method, 21, ""}, {"(Record).Clone", Method, 21, ""}, {"(Record).NumAttrs", Method, 21, ""}, @@ -7833,6 +8240,11 @@ var PackageSymbols = map[string][]Symbol{ {"(*Rand).Uint32", Method, 0, ""}, {"(*Rand).Uint64", Method, 8, ""}, {"(*Zipf).Uint64", Method, 0, ""}, + {"(Source).Int63", Method, 0, ""}, + {"(Source).Seed", Method, 0, ""}, + {"(Source64).Int63", Method, 8, ""}, + {"(Source64).Seed", Method, 8, ""}, + {"(Source64).Uint64", Method, 8, ""}, {"ExpFloat64", Func, 0, "func() float64"}, {"Float32", Func, 0, "func() float32"}, {"Float64", Func, 0, "func() float64"}, @@ -7888,6 +8300,7 @@ var PackageSymbols = map[string][]Symbol{ {"(*Rand).Uint64N", Method, 22, ""}, {"(*Rand).UintN", Method, 22, ""}, {"(*Zipf).Uint64", Method, 22, ""}, + {"(Source).Uint64", Method, 22, ""}, {"ChaCha8", Type, 22, ""}, {"ExpFloat64", Func, 22, "func() float64"}, {"Float32", Func, 22, "func() float32"}, @@ -7951,6 +8364,10 @@ var PackageSymbols = map[string][]Symbol{ {"(*Writer).FormDataContentType", Method, 0, ""}, {"(*Writer).SetBoundary", Method, 1, ""}, {"(*Writer).WriteField", Method, 0, ""}, + {"(File).Close", Method, 0, ""}, + {"(File).Read", Method, 0, ""}, + {"(File).ReadAt", Method, 0, ""}, + {"(File).Seek", Method, 0, ""}, {"ErrMessageTooLarge", Var, 9, ""}, {"File", Type, 0, ""}, {"FileContentDisposition", Func, 25, "func(fieldname string, filename string) string"}, @@ -8135,6 +8552,19 @@ var PackageSymbols = map[string][]Symbol{ {"(*UnixListener).SetDeadline", Method, 0, ""}, {"(*UnixListener).SetUnlinkOnClose", Method, 8, ""}, {"(*UnixListener).SyscallConn", Method, 10, ""}, + {"(Addr).Network", Method, 0, ""}, + {"(Addr).String", Method, 0, ""}, + {"(Conn).Close", Method, 0, ""}, + {"(Conn).LocalAddr", Method, 0, ""}, + {"(Conn).Read", Method, 0, ""}, + {"(Conn).RemoteAddr", Method, 0, ""}, + {"(Conn).SetDeadline", Method, 0, ""}, + {"(Conn).SetReadDeadline", Method, 0, ""}, + {"(Conn).SetWriteDeadline", Method, 0, ""}, + {"(Conn).Write", Method, 0, ""}, + {"(Error).Error", Method, 0, ""}, + {"(Error).Temporary", Method, 0, ""}, + {"(Error).Timeout", Method, 0, ""}, {"(Flags).String", Method, 0, ""}, {"(HardwareAddr).String", Method, 0, ""}, {"(IP).AppendText", Method, 24, ""}, @@ -8158,6 +8588,16 @@ var PackageSymbols = map[string][]Symbol{ {"(InvalidAddrError).Error", Method, 0, ""}, {"(InvalidAddrError).Temporary", Method, 0, ""}, {"(InvalidAddrError).Timeout", Method, 0, ""}, + {"(Listener).Accept", Method, 0, ""}, + {"(Listener).Addr", Method, 0, ""}, + {"(Listener).Close", Method, 0, ""}, + {"(PacketConn).Close", Method, 0, ""}, + {"(PacketConn).LocalAddr", Method, 0, ""}, + {"(PacketConn).ReadFrom", Method, 0, ""}, + {"(PacketConn).SetDeadline", Method, 0, ""}, + {"(PacketConn).SetReadDeadline", Method, 0, ""}, + {"(PacketConn).SetWriteDeadline", Method, 0, ""}, + {"(PacketConn).WriteTo", Method, 0, ""}, {"(UnknownNetworkError).Error", Method, 0, ""}, {"(UnknownNetworkError).Temporary", Method, 0, ""}, {"(UnknownNetworkError).Timeout", Method, 0, ""}, @@ -8333,6 +8773,14 @@ var PackageSymbols = map[string][]Symbol{ {"(*Client).Head", Method, 0, ""}, {"(*Client).Post", Method, 0, ""}, {"(*Client).PostForm", Method, 0, ""}, + {"(*ClientConn).Available", Method, 26, ""}, + {"(*ClientConn).Close", Method, 26, ""}, + {"(*ClientConn).Err", Method, 26, ""}, + {"(*ClientConn).InFlight", Method, 26, ""}, + {"(*ClientConn).Release", Method, 26, ""}, + {"(*ClientConn).Reserve", Method, 26, ""}, + {"(*ClientConn).RoundTrip", Method, 26, ""}, + {"(*ClientConn).SetStateHook", Method, 26, ""}, {"(*Cookie).String", Method, 0, ""}, {"(*Cookie).Valid", Method, 18, ""}, {"(*CrossOriginProtection).AddInsecureBypassPattern", Method, 25, ""}, @@ -8392,10 +8840,22 @@ var PackageSymbols = map[string][]Symbol{ {"(*Transport).CancelRequest", Method, 1, ""}, {"(*Transport).Clone", Method, 13, ""}, {"(*Transport).CloseIdleConnections", Method, 0, ""}, + {"(*Transport).NewClientConn", Method, 26, ""}, {"(*Transport).RegisterProtocol", Method, 0, ""}, {"(*Transport).RoundTrip", Method, 0, ""}, + {"(CloseNotifier).CloseNotify", Method, 1, ""}, {"(ConnState).String", Method, 3, ""}, + {"(CookieJar).Cookies", Method, 0, ""}, + {"(CookieJar).SetCookies", Method, 0, ""}, {"(Dir).Open", Method, 0, ""}, + {"(File).Close", Method, 0, ""}, + {"(File).Read", Method, 0, ""}, + {"(File).Readdir", Method, 0, ""}, + {"(File).Seek", Method, 0, ""}, + {"(File).Stat", Method, 0, ""}, + {"(FileSystem).Open", Method, 0, ""}, + {"(Flusher).Flush", Method, 0, ""}, + {"(Handler).ServeHTTP", Method, 0, ""}, {"(HandlerFunc).ServeHTTP", Method, 0, ""}, {"(Header).Add", Method, 0, ""}, {"(Header).Clone", Method, 13, ""}, @@ -8405,10 +8865,16 @@ var PackageSymbols = map[string][]Symbol{ {"(Header).Values", Method, 14, ""}, {"(Header).Write", Method, 0, ""}, {"(Header).WriteSubset", Method, 0, ""}, + {"(Hijacker).Hijack", Method, 0, ""}, {"(Protocols).HTTP1", Method, 24, ""}, {"(Protocols).HTTP2", Method, 24, ""}, {"(Protocols).String", Method, 24, ""}, {"(Protocols).UnencryptedHTTP2", Method, 24, ""}, + {"(Pusher).Push", Method, 8, ""}, + {"(ResponseWriter).Header", Method, 0, ""}, + {"(ResponseWriter).Write", Method, 0, ""}, + {"(ResponseWriter).WriteHeader", Method, 0, ""}, + {"(RoundTripper).RoundTrip", Method, 0, ""}, {"AllowQuerySemicolons", Func, 17, "func(h Handler) Handler"}, {"CanonicalHeaderKey", Func, 0, "func(s string) string"}, {"Client", Type, 0, ""}, @@ -8416,6 +8882,7 @@ var PackageSymbols = map[string][]Symbol{ {"Client.Jar", Field, 0, ""}, {"Client.Timeout", Field, 3, ""}, {"Client.Transport", Field, 0, ""}, + {"ClientConn", Type, 26, ""}, {"CloseNotifier", Type, 1, ""}, {"ConnState", Type, 3, ""}, {"Cookie", Type, 0, ""}, @@ -8726,6 +9193,8 @@ var PackageSymbols = map[string][]Symbol{ "net/http/cookiejar": { {"(*Jar).Cookies", Method, 1, ""}, {"(*Jar).SetCookies", Method, 1, ""}, + {"(PublicSuffixList).PublicSuffix", Method, 1, ""}, + {"(PublicSuffixList).String", Method, 1, ""}, {"Jar", Type, 1, ""}, {"New", Func, 1, "func(o *Options) (*Jar, error)"}, {"Options", Type, 1, ""}, @@ -8819,6 +9288,8 @@ var PackageSymbols = map[string][]Symbol{ {"(*ServerConn).Pending", Method, 0, ""}, {"(*ServerConn).Read", Method, 0, ""}, {"(*ServerConn).Write", Method, 0, ""}, + {"(BufferPool).Get", Method, 6, ""}, + {"(BufferPool).Put", Method, 6, ""}, {"BufferPool", Type, 6, ""}, {"ClientConn", Type, 0, ""}, {"DumpRequest", Func, 0, "func(req *http.Request, body bool) ([]byte, error)"}, @@ -8972,6 +9443,14 @@ var PackageSymbols = map[string][]Symbol{ {"(*Server).ServeConn", Method, 0, ""}, {"(*Server).ServeHTTP", Method, 0, ""}, {"(*Server).ServeRequest", Method, 0, ""}, + {"(ClientCodec).Close", Method, 0, ""}, + {"(ClientCodec).ReadResponseBody", Method, 0, ""}, + {"(ClientCodec).ReadResponseHeader", Method, 0, ""}, + {"(ClientCodec).WriteRequest", Method, 0, ""}, + {"(ServerCodec).Close", Method, 0, ""}, + {"(ServerCodec).ReadRequestBody", Method, 0, ""}, + {"(ServerCodec).ReadRequestHeader", Method, 0, ""}, + {"(ServerCodec).WriteResponse", Method, 0, ""}, {"(ServerError).Error", Method, 0, ""}, {"Accept", Func, 0, "func(lis net.Listener)"}, {"Call", Type, 0, ""}, @@ -9030,6 +9509,8 @@ var PackageSymbols = map[string][]Symbol{ {"(*Client).StartTLS", Method, 0, ""}, {"(*Client).TLSConnectionState", Method, 5, ""}, {"(*Client).Verify", Method, 0, ""}, + {"(Auth).Next", Method, 0, ""}, + {"(Auth).Start", Method, 0, ""}, {"Auth", Type, 0, ""}, {"CRAMMD5Auth", Func, 0, "func(username string, secret string) Auth"}, {"Client", Type, 0, ""}, @@ -9241,10 +9722,18 @@ var PackageSymbols = map[string][]Symbol{ {"(*SyscallError).Error", Method, 0, ""}, {"(*SyscallError).Timeout", Method, 10, ""}, {"(*SyscallError).Unwrap", Method, 13, ""}, + {"(FileInfo).IsDir", Method, 0, ""}, + {"(FileInfo).ModTime", Method, 0, ""}, + {"(FileInfo).Mode", Method, 0, ""}, + {"(FileInfo).Name", Method, 0, ""}, + {"(FileInfo).Size", Method, 0, ""}, + {"(FileInfo).Sys", Method, 0, ""}, {"(FileMode).IsDir", Method, 0, ""}, {"(FileMode).IsRegular", Method, 1, ""}, {"(FileMode).Perm", Method, 0, ""}, {"(FileMode).String", Method, 0, ""}, + {"(Signal).Signal", Method, 0, ""}, + {"(Signal).String", Method, 0, ""}, {"Args", Var, 0, ""}, {"Chdir", Func, 0, "func(dir string) error"}, {"Chmod", Func, 0, "func(name string, mode FileMode) error"}, @@ -9521,6 +10010,45 @@ var PackageSymbols = map[string][]Symbol{ {"(StructField).IsExported", Method, 17, ""}, {"(StructTag).Get", Method, 0, ""}, {"(StructTag).Lookup", Method, 7, ""}, + {"(Type).Align", Method, 0, ""}, + {"(Type).AssignableTo", Method, 0, ""}, + {"(Type).Bits", Method, 0, ""}, + {"(Type).CanSeq", Method, 23, ""}, + {"(Type).CanSeq2", Method, 23, ""}, + {"(Type).ChanDir", Method, 0, ""}, + {"(Type).Comparable", Method, 4, ""}, + {"(Type).ConvertibleTo", Method, 1, ""}, + {"(Type).Elem", Method, 0, ""}, + {"(Type).Field", Method, 0, ""}, + {"(Type).FieldAlign", Method, 0, ""}, + {"(Type).FieldByIndex", Method, 0, ""}, + {"(Type).FieldByName", Method, 0, ""}, + {"(Type).FieldByNameFunc", Method, 0, ""}, + {"(Type).Fields", Method, 26, ""}, + {"(Type).Implements", Method, 0, ""}, + {"(Type).In", Method, 0, ""}, + {"(Type).Ins", Method, 26, ""}, + {"(Type).IsVariadic", Method, 0, ""}, + {"(Type).Key", Method, 0, ""}, + {"(Type).Kind", Method, 0, ""}, + {"(Type).Len", Method, 0, ""}, + {"(Type).Method", Method, 0, ""}, + {"(Type).MethodByName", Method, 0, ""}, + {"(Type).Methods", Method, 26, ""}, + {"(Type).Name", Method, 0, ""}, + {"(Type).NumField", Method, 0, ""}, + {"(Type).NumIn", Method, 0, ""}, + {"(Type).NumMethod", Method, 0, ""}, + {"(Type).NumOut", Method, 0, ""}, + {"(Type).Out", Method, 0, ""}, + {"(Type).Outs", Method, 26, ""}, + {"(Type).OverflowComplex", Method, 23, ""}, + {"(Type).OverflowFloat", Method, 23, ""}, + {"(Type).OverflowInt", Method, 23, ""}, + {"(Type).OverflowUint", Method, 23, ""}, + {"(Type).PkgPath", Method, 0, ""}, + {"(Type).Size", Method, 0, ""}, + {"(Type).String", Method, 0, ""}, {"(Value).Addr", Method, 0, ""}, {"(Value).Bool", Method, 0, ""}, {"(Value).Bytes", Method, 0, ""}, @@ -9547,6 +10075,7 @@ var PackageSymbols = map[string][]Symbol{ {"(Value).FieldByIndexErr", Method, 18, ""}, {"(Value).FieldByName", Method, 0, ""}, {"(Value).FieldByNameFunc", Method, 0, ""}, + {"(Value).Fields", Method, 26, ""}, {"(Value).Float", Method, 0, ""}, {"(Value).Grow", Method, 20, ""}, {"(Value).Index", Method, 0, ""}, @@ -9563,6 +10092,7 @@ var PackageSymbols = map[string][]Symbol{ {"(Value).MapRange", Method, 12, ""}, {"(Value).Method", Method, 0, ""}, {"(Value).MethodByName", Method, 0, ""}, + {"(Value).Methods", Method, 26, ""}, {"(Value).NumField", Method, 0, ""}, {"(Value).NumMethod", Method, 0, ""}, {"(Value).OverflowComplex", Method, 0, ""}, @@ -9678,7 +10208,6 @@ var PackageSymbols = map[string][]Symbol{ {"StructOf", Func, 7, "func(fields []StructField) Type"}, {"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"}, @@ -9880,6 +10409,8 @@ var PackageSymbols = map[string][]Symbol{ {"(*TypeAssertionError).Error", Method, 0, ""}, {"(*TypeAssertionError).RuntimeError", Method, 0, ""}, {"(Cleanup).Stop", Method, 24, ""}, + {"(Error).Error", Method, 0, ""}, + {"(Error).RuntimeError", Method, 0, ""}, {"AddCleanup", Func, 24, "func[T, S any](ptr *T, cleanup func(S), arg S) Cleanup"}, {"BlockProfile", Func, 1, "func(p []BlockProfileRecord) (n int, ok bool)"}, {"BlockProfileRecord", Type, 1, ""}, @@ -10154,6 +10685,9 @@ var PackageSymbols = map[string][]Symbol{ {"(IntSlice).Search", Method, 0, ""}, {"(IntSlice).Sort", Method, 0, ""}, {"(IntSlice).Swap", Method, 0, ""}, + {"(Interface).Len", Method, 0, ""}, + {"(Interface).Less", Method, 0, ""}, + {"(Interface).Swap", Method, 0, ""}, {"(StringSlice).Len", Method, 0, ""}, {"(StringSlice).Less", Method, 0, ""}, {"(StringSlice).Search", Method, 0, ""}, @@ -10345,6 +10879,8 @@ var PackageSymbols = map[string][]Symbol{ {"(*WaitGroup).Done", Method, 0, ""}, {"(*WaitGroup).Go", Method, 25, ""}, {"(*WaitGroup).Wait", Method, 0, ""}, + {"(Locker).Lock", Method, 0, ""}, + {"(Locker).Unlock", Method, 0, ""}, {"Cond", Type, 0, ""}, {"Cond.L", Field, 0, ""}, {"Locker", Type, 0, ""}, @@ -10486,10 +11022,14 @@ var PackageSymbols = map[string][]Symbol{ {"(*Timeval).Nano", Method, 0, ""}, {"(*Timeval).Nanoseconds", Method, 0, ""}, {"(*Timeval).Unix", Method, 0, ""}, + {"(Conn).SyscallConn", Method, 9, ""}, {"(Errno).Error", Method, 0, ""}, {"(Errno).Is", Method, 13, ""}, {"(Errno).Temporary", Method, 0, ""}, {"(Errno).Timeout", Method, 0, ""}, + {"(RawConn).Control", Method, 9, ""}, + {"(RawConn).Read", Method, 9, ""}, + {"(RawConn).Write", Method, 9, ""}, {"(Signal).Signal", Method, 0, ""}, {"(Signal).String", Method, 0, ""}, {"(Token).Close", Method, 0, ""}, @@ -14409,7 +14949,7 @@ var PackageSymbols = map[string][]Symbol{ {"RouteMessage.Data", Field, 0, ""}, {"RouteMessage.Header", Field, 0, ""}, {"RouteRIB", Func, 0, ""}, - {"RoutingMessage", Type, 0, ""}, + {"RoutingMessage", Type, 14, ""}, {"RtAttr", Type, 0, ""}, {"RtAttr.Len", Field, 0, ""}, {"RtAttr.Type", Field, 0, ""}, @@ -15895,7 +16435,6 @@ var PackageSymbols = map[string][]Symbol{ {"SockFprog.Filter", Field, 0, ""}, {"SockFprog.Len", Field, 0, ""}, {"SockFprog.Pad_cgo_0", Field, 0, ""}, - {"Sockaddr", Type, 0, ""}, {"SockaddrDatalink", Type, 0, ""}, {"SockaddrDatalink.Alen", Field, 0, ""}, {"SockaddrDatalink.Data", Field, 0, ""}, @@ -16801,6 +17340,29 @@ var PackageSymbols = map[string][]Symbol{ {"(BenchmarkResult).MemString", Method, 1, ""}, {"(BenchmarkResult).NsPerOp", Method, 0, ""}, {"(BenchmarkResult).String", Method, 0, ""}, + {"(TB).ArtifactDir", Method, 26, ""}, + {"(TB).Attr", Method, 25, ""}, + {"(TB).Chdir", Method, 24, ""}, + {"(TB).Cleanup", Method, 14, ""}, + {"(TB).Context", Method, 24, ""}, + {"(TB).Error", Method, 2, ""}, + {"(TB).Errorf", Method, 2, ""}, + {"(TB).Fail", Method, 2, ""}, + {"(TB).FailNow", Method, 2, ""}, + {"(TB).Failed", Method, 2, ""}, + {"(TB).Fatal", Method, 2, ""}, + {"(TB).Fatalf", Method, 2, ""}, + {"(TB).Helper", Method, 9, ""}, + {"(TB).Log", Method, 2, ""}, + {"(TB).Logf", Method, 2, ""}, + {"(TB).Name", Method, 8, ""}, + {"(TB).Output", Method, 25, ""}, + {"(TB).Setenv", Method, 17, ""}, + {"(TB).Skip", Method, 2, ""}, + {"(TB).SkipNow", Method, 2, ""}, + {"(TB).Skipf", Method, 2, ""}, + {"(TB).Skipped", Method, 2, ""}, + {"(TB).TempDir", Method, 15, ""}, {"AllocsPerRun", Func, 1, "func(runs int, f func()) (avg float64)"}, {"B", Type, 0, ""}, {"B.N", Field, 0, ""}, @@ -16851,10 +17413,12 @@ var PackageSymbols = map[string][]Symbol{ {"RunTests", Func, 0, "func(matchString func(pat string, str string) (bool, error), tests []InternalTest) (ok bool)"}, {"Short", Func, 0, "func() bool"}, {"T", Type, 0, ""}, - {"TB", Type, 2, ""}, {"Testing", Func, 21, "func() bool"}, {"Verbose", Func, 1, "func() bool"}, }, + "testing/cryptotest": { + {"SetGlobalRandom", Func, 26, "func(t *testing.T, seed uint64)"}, + }, "testing/fstest": { {"(MapFS).Glob", Method, 16, ""}, {"(MapFS).Lstat", Method, 25, ""}, @@ -16887,6 +17451,7 @@ var PackageSymbols = map[string][]Symbol{ "testing/quick": { {"(*CheckEqualError).Error", Method, 0, ""}, {"(*CheckError).Error", Method, 0, ""}, + {"(Generator).Generate", Method, 0, ""}, {"(SetupError).Error", Method, 0, ""}, {"Check", Func, 0, "func(f any, config *Config) error"}, {"CheckEqual", Func, 0, "func(f any, g any, config *Config) error"}, @@ -17093,6 +17658,10 @@ var PackageSymbols = map[string][]Symbol{ {"(ListNode).Position", Method, 1, ""}, {"(ListNode).Type", Method, 0, ""}, {"(NilNode).Position", Method, 1, ""}, + {"(Node).Copy", Method, 0, ""}, + {"(Node).Position", Method, 1, ""}, + {"(Node).String", Method, 0, ""}, + {"(Node).Type", Method, 0, ""}, {"(NodeType).Type", Method, 0, ""}, {"(NumberNode).Position", Method, 1, ""}, {"(NumberNode).Type", Method, 0, ""}, diff --git a/vendor/golang.org/x/tools/internal/stdlib/stdlib.go b/vendor/golang.org/x/tools/internal/stdlib/stdlib.go index e223e0f3405..59a5de36a23 100644 --- a/vendor/golang.org/x/tools/internal/stdlib/stdlib.go +++ b/vendor/golang.org/x/tools/internal/stdlib/stdlib.go @@ -39,7 +39,7 @@ const ( Var // "EOF" Const // "Pi" Field // "Point.X" - Method // "(*Buffer).Grow" + Method // "(*Buffer).Grow" or "(Reader).Read" ) func (kind Kind) String() string { diff --git a/vendor/golang.org/x/tools/internal/typesinternal/classify_call.go b/vendor/golang.org/x/tools/internal/typesinternal/classify_call.go index 3db2a135b97..7ebe9768bc3 100644 --- a/vendor/golang.org/x/tools/internal/typesinternal/classify_call.go +++ b/vendor/golang.org/x/tools/internal/typesinternal/classify_call.go @@ -8,7 +8,7 @@ import ( "fmt" "go/ast" "go/types" - _ "unsafe" + _ "unsafe" // for go:linkname hack ) // CallKind describes the function position of an [*ast.CallExpr]. diff --git a/vendor/golang.org/x/tools/internal/typesinternal/types.go b/vendor/golang.org/x/tools/internal/typesinternal/types.go index fef74a78560..51001666ef1 100644 --- a/vendor/golang.org/x/tools/internal/typesinternal/types.go +++ b/vendor/golang.org/x/tools/internal/typesinternal/types.go @@ -23,7 +23,6 @@ import ( "go/token" "go/types" "reflect" - "unsafe" "golang.org/x/tools/go/ast/inspector" "golang.org/x/tools/internal/aliases" @@ -40,8 +39,7 @@ func SetUsesCgo(conf *types.Config) bool { } } - addr := unsafe.Pointer(f.UnsafeAddr()) - *(*bool)(addr) = true + *(*bool)(f.Addr().UnsafePointer()) = true return true } diff --git a/vendor/golang.org/x/tools/internal/versions/features.go b/vendor/golang.org/x/tools/internal/versions/features.go index a5f4e3252cc..cdd36c388ab 100644 --- a/vendor/golang.org/x/tools/internal/versions/features.go +++ b/vendor/golang.org/x/tools/internal/versions/features.go @@ -9,6 +9,7 @@ package versions // named constants, to avoid misspelling const ( + Go1_17 = "go1.17" Go1_18 = "go1.18" Go1_19 = "go1.19" Go1_20 = "go1.20" diff --git a/vendor/modules.txt b/vendor/modules.txt index e1e5405fdd6..6e94ed0a9a9 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -165,7 +165,7 @@ github.com/andybalholm/brotli/matchfinder # github.com/armon/go-metrics v0.4.1 ## explicit; go 1.12 github.com/armon/go-metrics -# github.com/aws/aws-sdk-go-v2 v1.40.1 +# github.com/aws/aws-sdk-go-v2 v1.41.1 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/aws github.com/aws/aws-sdk-go-v2/aws/defaults @@ -192,10 +192,10 @@ github.com/aws/aws-sdk-go-v2/internal/shareddefaults github.com/aws/aws-sdk-go-v2/internal/strings github.com/aws/aws-sdk-go-v2/internal/sync/singleflight github.com/aws/aws-sdk-go-v2/internal/timeconv -# github.com/aws/aws-sdk-go-v2/config v1.32.3 +# github.com/aws/aws-sdk-go-v2/config v1.32.7 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/config -# github.com/aws/aws-sdk-go-v2/credentials v1.19.3 +# github.com/aws/aws-sdk-go-v2/credentials v1.19.7 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/credentials github.com/aws/aws-sdk-go-v2/credentials/ec2rolecreds @@ -205,14 +205,14 @@ github.com/aws/aws-sdk-go-v2/credentials/logincreds github.com/aws/aws-sdk-go-v2/credentials/processcreds github.com/aws/aws-sdk-go-v2/credentials/ssocreds github.com/aws/aws-sdk-go-v2/credentials/stscreds -# github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.15 +# github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.17 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/feature/ec2/imds github.com/aws/aws-sdk-go-v2/feature/ec2/imds/internal/config -# github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.15 +# github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.17 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/internal/configsources -# github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.15 +# github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.17 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 # github.com/aws/aws-sdk-go-v2/internal/ini v1.8.4 @@ -230,30 +230,30 @@ github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding # github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery v1.11.6 ## explicit; go 1.22 github.com/aws/aws-sdk-go-v2/service/internal/endpoint-discovery -# github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.15 +# github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.17 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/service/internal/presigned-url -# github.com/aws/aws-sdk-go-v2/service/signin v1.0.3 +# github.com/aws/aws-sdk-go-v2/service/signin v1.0.5 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/service/signin github.com/aws/aws-sdk-go-v2/service/signin/internal/endpoints github.com/aws/aws-sdk-go-v2/service/signin/types -# github.com/aws/aws-sdk-go-v2/service/sns v1.39.8 +# github.com/aws/aws-sdk-go-v2/service/sns v1.39.11 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/service/sns github.com/aws/aws-sdk-go-v2/service/sns/internal/endpoints github.com/aws/aws-sdk-go-v2/service/sns/types -# github.com/aws/aws-sdk-go-v2/service/sso v1.30.6 +# github.com/aws/aws-sdk-go-v2/service/sso v1.30.9 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/service/sso github.com/aws/aws-sdk-go-v2/service/sso/internal/endpoints github.com/aws/aws-sdk-go-v2/service/sso/types -# github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.11 +# github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.13 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/service/ssooidc github.com/aws/aws-sdk-go-v2/service/ssooidc/internal/endpoints github.com/aws/aws-sdk-go-v2/service/ssooidc/types -# github.com/aws/aws-sdk-go-v2/service/sts v1.41.3 +# github.com/aws/aws-sdk-go-v2/service/sts v1.41.6 ## explicit; go 1.23 github.com/aws/aws-sdk-go-v2/service/sts github.com/aws/aws-sdk-go-v2/service/sts/internal/endpoints @@ -448,7 +448,7 @@ github.com/go-logr/logr/funcr # github.com/go-logr/stdr v1.2.2 ## explicit; go 1.16 github.com/go-logr/stdr -# github.com/go-openapi/analysis v0.24.1 +# github.com/go-openapi/analysis v0.24.2 ## explicit; go 1.24.0 github.com/go-openapi/analysis github.com/go-openapi/analysis/internal/debug @@ -457,13 +457,13 @@ github.com/go-openapi/analysis/internal/flatten/operations github.com/go-openapi/analysis/internal/flatten/replace github.com/go-openapi/analysis/internal/flatten/schutils github.com/go-openapi/analysis/internal/flatten/sortref -# github.com/go-openapi/errors v0.22.4 +# github.com/go-openapi/errors v0.22.6 ## explicit; go 1.24.0 github.com/go-openapi/errors -# github.com/go-openapi/jsonpointer v0.22.1 +# github.com/go-openapi/jsonpointer v0.22.4 ## explicit; go 1.24.0 github.com/go-openapi/jsonpointer -# github.com/go-openapi/jsonreference v0.21.3 +# github.com/go-openapi/jsonreference v0.21.4 ## explicit; go 1.24.0 github.com/go-openapi/jsonreference github.com/go-openapi/jsonreference/internal @@ -482,7 +482,7 @@ github.com/go-openapi/runtime/middleware/header github.com/go-openapi/runtime/middleware/untyped github.com/go-openapi/runtime/security github.com/go-openapi/runtime/yamlpc -# github.com/go-openapi/spec v0.22.1 => github.com/go-openapi/spec v0.20.6 +# github.com/go-openapi/spec v0.22.3 => github.com/go-openapi/spec v0.20.6 ## explicit; go 1.13 github.com/go-openapi/spec # github.com/go-openapi/strfmt v0.25.0 @@ -663,8 +663,8 @@ github.com/grpc-ecosystem/go-grpc-middleware github.com/grpc-ecosystem/go-grpc-middleware/v2 github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors github.com/grpc-ecosystem/go-grpc-middleware/v2/interceptors/logging -# github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 -## explicit; go 1.23.0 +# github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.3 +## explicit; go 1.24.0 github.com/grpc-ecosystem/grpc-gateway/v2/internal/httprule github.com/grpc-ecosystem/grpc-gateway/v2/runtime github.com/grpc-ecosystem/grpc-gateway/v2/utilities @@ -711,7 +711,7 @@ github.com/hashicorp/golang-lru/v2 github.com/hashicorp/golang-lru/v2/expirable github.com/hashicorp/golang-lru/v2/internal github.com/hashicorp/golang-lru/v2/simplelru -# github.com/hashicorp/memberlist v0.5.3 => github.com/grafana/memberlist v0.3.1-0.20220714140823-09ffed8adbbe +# github.com/hashicorp/memberlist v0.5.4 => github.com/grafana/memberlist v0.3.1-0.20220714140823-09ffed8adbbe ## explicit; go 1.12 github.com/hashicorp/memberlist # github.com/hashicorp/serf v0.10.1 @@ -970,7 +970,7 @@ github.com/prometheus-community/parquet-common/util # github.com/prometheus-community/prom-label-proxy v0.11.1 ## explicit; go 1.23.0 github.com/prometheus-community/prom-label-proxy/injectproxy -# github.com/prometheus/alertmanager v0.30.1 +# github.com/prometheus/alertmanager v0.31.1 ## explicit; go 1.24.0 github.com/prometheus/alertmanager/api github.com/prometheus/alertmanager/api/metrics @@ -996,6 +996,7 @@ github.com/prometheus/alertmanager/config github.com/prometheus/alertmanager/dispatch github.com/prometheus/alertmanager/featurecontrol github.com/prometheus/alertmanager/inhibit +github.com/prometheus/alertmanager/limit github.com/prometheus/alertmanager/matcher/compat github.com/prometheus/alertmanager/matcher/parse github.com/prometheus/alertmanager/nflog @@ -1063,7 +1064,7 @@ github.com/prometheus/common/model github.com/prometheus/common/promslog github.com/prometheus/common/route github.com/prometheus/common/version -# github.com/prometheus/exporter-toolkit v0.15.0 +# github.com/prometheus/exporter-toolkit v0.15.1 ## explicit; go 1.24.0 github.com/prometheus/exporter-toolkit/web # github.com/prometheus/otlptranslator v1.0.0 => github.com/prometheus/otlptranslator v1.0.0 @@ -1138,7 +1139,7 @@ github.com/prometheus/prometheus/util/teststorage github.com/prometheus/prometheus/util/testutil github.com/prometheus/prometheus/util/zeropool github.com/prometheus/prometheus/web/api/v1 -# github.com/prometheus/sigv4 v0.3.0 +# github.com/prometheus/sigv4 v0.4.0 ## explicit; go 1.24.0 github.com/prometheus/sigv4 # github.com/puzpuzpuz/xsync/v3 v3.5.1 @@ -1463,12 +1464,12 @@ go.opentelemetry.io/contrib/detectors/gcp ## explicit; go 1.23.0 go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc/internal -# go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.63.0 -## explicit; go 1.23.0 +# go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace v0.64.0 +## explicit; go 1.24.0 go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace go.opentelemetry.io/contrib/instrumentation/net/http/httptrace/otelhttptrace/internal/semconv -# go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.63.0 -## explicit; go 1.23.0 +# go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.64.0 +## explicit; go 1.24.0 go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/request go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp/internal/semconv @@ -1487,11 +1488,12 @@ go.opentelemetry.io/contrib/propagators/jaeger # go.opentelemetry.io/contrib/propagators/ot v1.36.0 ## explicit; go 1.23.0 go.opentelemetry.io/contrib/propagators/ot -# go.opentelemetry.io/otel v1.38.0 -## explicit; go 1.23.0 +# go.opentelemetry.io/otel v1.39.0 +## explicit; go 1.24.0 go.opentelemetry.io/otel go.opentelemetry.io/otel/attribute go.opentelemetry.io/otel/attribute/internal +go.opentelemetry.io/otel/attribute/internal/xxhash go.opentelemetry.io/otel/baggage go.opentelemetry.io/otel/codes go.opentelemetry.io/otel/internal/baggage @@ -1508,54 +1510,73 @@ go.opentelemetry.io/otel/semconv/v1.37.0/otelconv ## explicit; go 1.23.0 go.opentelemetry.io/otel/bridge/opentracing go.opentelemetry.io/otel/bridge/opentracing/migration -# go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 -## explicit; go 1.23.0 +# go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.39.0 +## explicit; go 1.24.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace go.opentelemetry.io/otel/exporters/otlp/otlptrace/internal/tracetransform -# go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.38.0 -## explicit; go 1.23.0 +# go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.39.0 +## explicit; go 1.24.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/counter go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/envconfig +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/observ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/otlpconfig go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/retry -# go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 -## explicit; go 1.23.0 +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc/internal/x +# go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.39.0 +## explicit; go 1.24.0 go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/counter go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/envconfig +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/observ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/otlpconfig go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/retry +<<<<<<< HEAD # go.opentelemetry.io/otel/metric v1.38.0 ## explicit; go 1.23.0 +======= +go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/x +# go.opentelemetry.io/otel/log v0.12.2 +## explicit; go 1.23.0 +go.opentelemetry.io/otel/log +go.opentelemetry.io/otel/log/embedded +go.opentelemetry.io/otel/log/global +go.opentelemetry.io/otel/log/internal/global +# go.opentelemetry.io/otel/metric v1.39.0 +## explicit; go 1.24.0 +>>>>>>> e97f2eedb4 (Upgrade to v0.31.1) go.opentelemetry.io/otel/metric go.opentelemetry.io/otel/metric/embedded go.opentelemetry.io/otel/metric/noop -# go.opentelemetry.io/otel/sdk v1.38.0 -## explicit; go 1.23.0 +# go.opentelemetry.io/otel/sdk v1.39.0 +## explicit; go 1.24.0 go.opentelemetry.io/otel/sdk go.opentelemetry.io/otel/sdk/instrumentation -go.opentelemetry.io/otel/sdk/internal/env go.opentelemetry.io/otel/sdk/internal/x go.opentelemetry.io/otel/sdk/resource go.opentelemetry.io/otel/sdk/trace -go.opentelemetry.io/otel/sdk/trace/internal/x +go.opentelemetry.io/otel/sdk/trace/internal/env +go.opentelemetry.io/otel/sdk/trace/internal/observ go.opentelemetry.io/otel/sdk/trace/tracetest -# go.opentelemetry.io/otel/sdk/metric v1.38.0 -## explicit; go 1.23.0 +# go.opentelemetry.io/otel/sdk/metric v1.39.0 +## explicit; go 1.24.0 go.opentelemetry.io/otel/sdk/metric go.opentelemetry.io/otel/sdk/metric/exemplar go.opentelemetry.io/otel/sdk/metric/internal go.opentelemetry.io/otel/sdk/metric/internal/aggregate +go.opentelemetry.io/otel/sdk/metric/internal/observ +go.opentelemetry.io/otel/sdk/metric/internal/reservoir go.opentelemetry.io/otel/sdk/metric/internal/x go.opentelemetry.io/otel/sdk/metric/metricdata -# go.opentelemetry.io/otel/trace v1.38.0 -## explicit; go 1.23.0 +# go.opentelemetry.io/otel/trace v1.39.0 +## explicit; go 1.24.0 go.opentelemetry.io/otel/trace go.opentelemetry.io/otel/trace/embedded go.opentelemetry.io/otel/trace/internal/telemetry go.opentelemetry.io/otel/trace/noop -# go.opentelemetry.io/proto/otlp v1.7.1 +# go.opentelemetry.io/proto/otlp v1.9.0 ## explicit; go 1.23.0 go.opentelemetry.io/proto/otlp/collector/trace/v1 go.opentelemetry.io/proto/otlp/common/v1 @@ -1601,7 +1622,7 @@ go4.org/intern # go4.org/unsafe/assume-no-moving-gc v0.0.0-20231121144256-b99613f794b6 ## explicit; go 1.11 go4.org/unsafe/assume-no-moving-gc -# golang.org/x/crypto v0.46.0 +# golang.org/x/crypto v0.47.0 ## explicit; go 1.24.0 golang.org/x/crypto/argon2 golang.org/x/crypto/bcrypt @@ -1620,10 +1641,10 @@ golang.org/x/crypto/pkcs12/internal/rc2 ## explicit; go 1.23.0 golang.org/x/exp/constraints golang.org/x/exp/slices -# golang.org/x/mod v0.30.0 +# golang.org/x/mod v0.32.0 ## explicit; go 1.24.0 golang.org/x/mod/semver -# golang.org/x/net v0.48.0 +# golang.org/x/net v0.49.0 ## explicit; go 1.24.0 golang.org/x/net/bpf golang.org/x/net/context @@ -1660,13 +1681,13 @@ golang.org/x/oauth2/jwt golang.org/x/sync/errgroup golang.org/x/sync/semaphore golang.org/x/sync/singleflight -# golang.org/x/sys v0.39.0 +# golang.org/x/sys v0.40.0 ## explicit; go 1.24.0 golang.org/x/sys/cpu golang.org/x/sys/unix golang.org/x/sys/windows golang.org/x/sys/windows/registry -# golang.org/x/text v0.32.0 +# golang.org/x/text v0.33.0 ## explicit; go 1.24.0 golang.org/x/text/cases golang.org/x/text/internal @@ -1679,10 +1700,10 @@ golang.org/x/text/secure/bidirule golang.org/x/text/transform golang.org/x/text/unicode/bidi golang.org/x/text/unicode/norm -# golang.org/x/time v0.13.0 +# golang.org/x/time v0.14.0 ## explicit; go 1.24.0 golang.org/x/time/rate -# golang.org/x/tools v0.39.0 +# golang.org/x/tools v0.41.0 ## explicit; go 1.24.0 golang.org/x/tools/go/ast/edge golang.org/x/tools/go/ast/inspector @@ -1731,7 +1752,7 @@ google.golang.org/genproto/googleapis/type/calendarperiod google.golang.org/genproto/googleapis/type/date google.golang.org/genproto/googleapis/type/expr google.golang.org/genproto/googleapis/type/timeofday -# google.golang.org/genproto/googleapis/api v0.0.0-20251029180050-ab9386a59fda +# google.golang.org/genproto/googleapis/api v0.0.0-20251202230838-ff82c1b0f217 ## explicit; go 1.24.0 google.golang.org/genproto/googleapis/api google.golang.org/genproto/googleapis/api/annotations @@ -1741,12 +1762,12 @@ google.golang.org/genproto/googleapis/api/httpbody google.golang.org/genproto/googleapis/api/label google.golang.org/genproto/googleapis/api/metric google.golang.org/genproto/googleapis/api/monitoredres -# google.golang.org/genproto/googleapis/rpc v0.0.0-20251029180050-ab9386a59fda +# google.golang.org/genproto/googleapis/rpc v0.0.0-20251202230838-ff82c1b0f217 ## explicit; go 1.24.0 google.golang.org/genproto/googleapis/rpc/code google.golang.org/genproto/googleapis/rpc/errdetails google.golang.org/genproto/googleapis/rpc/status -# google.golang.org/grpc v1.76.0 => google.golang.org/grpc v1.71.2 +# google.golang.org/grpc v1.78.0 => google.golang.org/grpc v1.71.2 ## explicit; go 1.22.0 google.golang.org/grpc google.golang.org/grpc/attributes From ded133b9069943b801d5cb9e926ea914de08ae3a Mon Sep 17 00:00:00 2001 From: Friedrich Gonzalez <1517449+friedrichg@users.noreply.github.com> Date: Sat, 14 Feb 2026 09:34:28 -0800 Subject: [PATCH 06/10] Fix building Signed-off-by: Friedrich Gonzalez <1517449+friedrichg@users.noreply.github.com> --- pkg/alertmanager/alertmanager.go | 2 +- pkg/alertmanager/multitenant.go | 5 ++--- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/pkg/alertmanager/alertmanager.go b/pkg/alertmanager/alertmanager.go index e9412cd49db..9e3360f063f 100644 --- a/pkg/alertmanager/alertmanager.go +++ b/pkg/alertmanager/alertmanager.go @@ -288,7 +288,7 @@ func New(cfg *Config, reg *prometheus.Registry) (*Alertmanager, error) { if am.cfg.Limits != nil { callback = newAlertsLimiter(am.cfg.UserID, am.cfg.Limits, reg) } - am.alerts, err = mem.NewAlerts(context.Background(), am.alertMarker, am.cfg.GCInterval, callback, util_log.GoKitLogToSlog(am.logger), am.registry) + am.alerts, err = mem.NewAlerts(context.Background(), am.alertMarker, am.cfg.GCInterval, 0, callback, util_log.GoKitLogToSlog(am.logger), am.registry, nil) if err != nil { return nil, fmt.Errorf("failed to create alerts: %v", err) } diff --git a/pkg/alertmanager/multitenant.go b/pkg/alertmanager/multitenant.go index 744a25d44be..b16a40671ad 100644 --- a/pkg/alertmanager/multitenant.go +++ b/pkg/alertmanager/multitenant.go @@ -968,13 +968,12 @@ func (am *MultitenantAlertmanager) setConfig(cfg alertspb.AlertConfigDesc) error if am.cfg.AutoWebhookRoot != "" { for i, r := range userAmConfig.Receivers { for j, w := range r.WebhookConfigs { - if w.URL.String() == autoWebhookURL { + if w.URL == autoWebhookURL { u, err := url.Parse(am.cfg.AutoWebhookRoot + "/" + cfg.User + "/monitor") if err != nil { return err } - - userAmConfig.Receivers[i].WebhookConfigs[j].URL = &amconfig.SecretURL{URL: u} + userAmConfig.Receivers[i].WebhookConfigs[j].URL = amconfig.SecretTemplateURL(u.String()) } } } From 4f4073a737575200a2b3d968de0f2a6a3158b557 Mon Sep 17 00:00:00 2001 From: Friedrich Gonzalez <1517449+friedrichg@users.noreply.github.com> Date: Sat, 14 Feb 2026 13:54:10 -0800 Subject: [PATCH 07/10] Update tests Signed-off-by: Friedrich Gonzalez <1517449+friedrichg@users.noreply.github.com> --- pkg/alertmanager/api.go | 77 +++++++++-- pkg/alertmanager/api_test.go | 251 ++++++++++++++++++++++++++++++++++- 2 files changed, 312 insertions(+), 16 deletions(-) diff --git a/pkg/alertmanager/api.go b/pkg/alertmanager/api.go index 5e9d765723e..cf27d6b53e7 100644 --- a/pkg/alertmanager/api.go +++ b/pkg/alertmanager/api.go @@ -40,27 +40,34 @@ const ( ) var ( - errPasswordFileNotAllowed = errors.New("setting password_file, bearer_token_file and credentials_file is not allowed") + errBearerTokenAndCredentialsFileNotAllowed = errors.New("setting bearer_token_file and credentials_file is not allowed") + errPasswordFileNotAllowed = errors.New("setting password_file is not allowed") + errUsernameFileNotAllowed = errors.New("setting username_file is not allowed") + errOAuth2CertificateKeyFileNotAllowed = errors.New("setting OAuth2 client_certificate_key_file is not allowed") errOAuth2SecretFileNotAllowed = errors.New("setting OAuth2 client_secret_file is not allowed") errTLSFileNotAllowed = errors.New("setting TLS ca_file, cert_file and key_file is not allowed") errSlackAPIURLFileNotAllowed = errors.New("setting Slack api_url_file and global slack_api_url_file is not allowed") - errVictorOpsAPIKeyFileNotAllowed = errors.New("setting VictorOps api_key_file is not allowed") - errOpsGenieAPIKeyFileNotAllowed = errors.New("setting OpsGenie api_key_file is not allowed") + errSlackAppTokenFileNotAllowed = errors.New("setting Slack slack_app_token_file and global slack_app_token_file is not allowed") + errVictorOpsAPIKeyFileNotAllowed = errors.New("setting VictorOps api_key_file and global victorops_api_key_file is not allowed") + errOpsGenieAPIKeyFileNotAllowed = errors.New("setting OpsGenie api_key_file and global opsgenie_api_key_file is not allowed") errPagerDutyRoutingKeyFileNotAllowed = errors.New("setting PagerDuty routing_key_file is not allowed") errPagerDutyServiceKeyFileNotAllowed = errors.New("setting PagerDuty service_key_file is not allowed") errWebhookURLFileNotAllowed = errors.New("setting Webhook url_file is not allowed") errPushOverUserKeyFileNotAllowed = errors.New("setting PushOver user_key_file is not allowed") errPushOverTokenFileNotAllowed = errors.New("setting PushOver token_file is not allowed") - errTelegramBotTokenFileNotAllowed = errors.New("setting Telegram bot_token_file is not allowed") + errTelegramBotTokenFileNotAllowed = errors.New("setting Telegram bot_token_file and global telegram_bot_token_file are not allowed") + errTelegramChatIdFileNotAllowed = errors.New("setting Telegram chat_id_file is not allowed") errMSTeamsWebhookUrlFileNotAllowed = errors.New("setting MSTeams webhook_url_file is not allowed") errMSTeamsV2WebhookUrlFileNotAllowed = errors.New("setting MSTeamsV2 webhook_url_file is not allowed") - errRocketChatTokenIdFileNotAllowed = errors.New("setting RocketChat token_id_file is not allowed") - errRocketChatTokenFileNotAllowed = errors.New("setting RocketChat token_file is not allowed") + errRocketChatTokenIdFileNotAllowed = errors.New("setting RocketChat token_id_file and global rocketchat_token_id_file is not allowed") + errRocketChatTokenFileNotAllowed = errors.New("setting RocketChat token_file and global rocketchat_token_file is not allowed") errDiscordWebhookUrlFileNotAllowed = errors.New("setting Discord webhook_url_file is not allowed") - errEmailAuthPasswordFileNotAllowed = errors.New("setting Email auth_password_file is not allowed") + errEmailAuthPasswordFileNotAllowed = errors.New("setting Email auth_password_file and global smtp_auth_password_file is not allowed") + errEmailAuthSecretFileNotAllowed = errors.New("setting Email auth_secret_file and global smtp_auth_secret_file is not allowed") errIncidentIOURLFileNotAllowed = errors.New("setting IncidentIO url_file is not allowed") errIncidentIOAlertSourceTokenFileNotAllowed = errors.New("setting IncidentIO alert_source_token_file is not allowed") errMatterMostWebhookUrlFileNotAllowed = errors.New("setting Mattermost webhook_url_file is not allowed") + errWeChatAPISecretFileNotAllowed = errors.New("setting Wechat api_secret_file and global wechat_api_secret_file is not allowed") ) // UserConfig is used to communicate a users alertmanager configs @@ -420,6 +427,10 @@ func validateAlertmanagerConfig(cfg any) error { if err := validateMattermostConfig(v.Interface().(config.MattermostConfig)); err != nil { return err } + case reflect.TypeFor[config.WechatConfig](): + if err := validateWeChatConfig(v.Interface().(config.WechatConfig)); err != nil { + return err + } } // If the input config is a struct, recursively iterate on all fields. @@ -472,11 +483,17 @@ func validateReceiverHTTPConfig(cfg commoncfg.HTTPClientConfig) error { if cfg.BasicAuth != nil && cfg.BasicAuth.PasswordFile != "" { return errPasswordFileNotAllowed } + if cfg.BasicAuth != nil && cfg.BasicAuth.UsernameFile != "" { + return errUsernameFileNotAllowed + } if cfg.Authorization != nil && cfg.Authorization.CredentialsFile != "" { - return errPasswordFileNotAllowed + return errBearerTokenAndCredentialsFileNotAllowed } if cfg.BearerTokenFile != "" { - return errPasswordFileNotAllowed + return errBearerTokenAndCredentialsFileNotAllowed + } + if cfg.OAuth2 != nil && cfg.OAuth2.ClientCertificateKeyFile != "" { + return errOAuth2CertificateKeyFileNotAllowed } if cfg.OAuth2 != nil && cfg.OAuth2.ClientSecretFile != "" { return errOAuth2SecretFileNotAllowed @@ -499,9 +516,33 @@ func validateGlobalConfig(cfg config.GlobalConfig) error { if cfg.OpsGenieAPIKeyFile != "" { return errOpsGenieAPIKeyFileNotAllowed } + if cfg.RocketchatTokenFile != "" { + return errRocketChatTokenFileNotAllowed + } + if cfg.RocketchatTokenIDFile != "" { + return errRocketChatTokenIdFileNotAllowed + } if cfg.SlackAPIURLFile != "" { return errSlackAPIURLFileNotAllowed } + if cfg.SlackAppTokenFile != "" { + return errSlackAppTokenFileNotAllowed + } + if cfg.SMTPAuthPasswordFile != "" { + return errEmailAuthPasswordFileNotAllowed + } + if cfg.SMTPAuthSecretFile != "" { + return errEmailAuthSecretFileNotAllowed + } + if cfg.TelegramBotTokenFile != "" { + return errTelegramBotTokenFileNotAllowed + } + if cfg.VictorOpsAPIKeyFile != "" { + return errVictorOpsAPIKeyFileNotAllowed + } + if cfg.WeChatAPISecretFile != "" { + return errWeChatAPISecretFileNotAllowed + } return nil } @@ -520,6 +561,9 @@ func validateSlackConfig(cfg config.SlackConfig) error { if cfg.APIURLFile != "" { return errSlackAPIURLFileNotAllowed } + if cfg.AppTokenFile != "" { + return errSlackAppTokenFileNotAllowed + } return nil } @@ -575,6 +619,9 @@ func validateTelegramConfig(cfg config.TelegramConfig) error { if cfg.BotTokenFile != "" { return errTelegramBotTokenFileNotAllowed } + if cfg.ChatIDFile != "" { + return errTelegramChatIdFileNotAllowed + } return nil } @@ -625,6 +672,9 @@ func validateEmailConfig(cfg config.EmailConfig) error { if cfg.AuthPasswordFile != "" { return errEmailAuthPasswordFileNotAllowed } + if cfg.AuthSecretFile != "" { + return errEmailAuthSecretFileNotAllowed + } return nil } @@ -650,3 +700,12 @@ func validateMattermostConfig(cfg config.MattermostConfig) error { } return nil } + +// validateWeChatConfig validates the WeChat Config and returns an error if it contains +// settings not allowed by Cortex. +func validateWeChatConfig(cfg config.WechatConfig) error { + if cfg.APISecretFile != "" { + return errWeChatAPISecretFileNotAllowed + } + return nil +} diff --git a/pkg/alertmanager/api_test.go b/pkg/alertmanager/api_test.go index 26a058faa4d..ed80a1a9890 100644 --- a/pkg/alertmanager/api_test.go +++ b/pkg/alertmanager/api_test.go @@ -239,6 +239,22 @@ alertmanager_config: | - "something.tmpl" `, }, + { + name: "Should return error if global HTTP username_file is set", + cfg: ` +alertmanager_config: | + global: + http_config: + basic_auth: + username_file: /secrets + + route: + receiver: 'default-receiver' + receivers: + - name: default-receiver +`, + err: errors.Wrap(errUsernameFileNotAllowed, "error validating Alertmanager config"), + }, { name: "Should return error if global HTTP password_file is set", cfg: ` @@ -268,7 +284,7 @@ alertmanager_config: | receivers: - name: default-receiver `, - err: errors.Wrap(errPasswordFileNotAllowed, "error validating Alertmanager config"), + err: errors.Wrap(errBearerTokenAndCredentialsFileNotAllowed, "error validating Alertmanager config"), }, { name: "Should return error if global HTTP credentials_file is set", @@ -284,7 +300,25 @@ alertmanager_config: | receivers: - name: default-receiver `, - err: errors.Wrap(errPasswordFileNotAllowed, "error validating Alertmanager config"), + err: errors.Wrap(errBearerTokenAndCredentialsFileNotAllowed, "error validating Alertmanager config"), + }, + { + name: "Should return error if global OAuth2 client_certificate_key_file is set", + cfg: ` +alertmanager_config: | + global: + http_config: + oauth2: + client_id: test + token_url: http://example.com + client_certificate_key_file: /secrets + + route: + receiver: 'default-receiver' + receivers: + - name: default-receiver +`, + err: errors.Wrap(errOAuth2CertificateKeyFileNotAllowed, "error validating Alertmanager config"), }, { name: "Should return error if global OAuth2 client_secret_file is set", @@ -335,7 +369,7 @@ alertmanager_config: | route: receiver: 'default-receiver' `, - err: errors.Wrap(errPasswordFileNotAllowed, "error validating Alertmanager config"), + err: errors.Wrap(errBearerTokenAndCredentialsFileNotAllowed, "error validating Alertmanager config"), }, { name: "Should return error if receiver's HTTP credentials_file is set", @@ -352,7 +386,26 @@ alertmanager_config: | route: receiver: 'default-receiver' `, - err: errors.Wrap(errPasswordFileNotAllowed, "error validating Alertmanager config"), + err: errors.Wrap(errBearerTokenAndCredentialsFileNotAllowed, "error validating Alertmanager config"), + }, + { + name: "Should return error if receiver's OAuth2 client_certificate_key_file is set", + cfg: ` +alertmanager_config: | + receivers: + - name: default-receiver + webhook_configs: + - url: http://localhost + http_config: + oauth2: + client_id: test + token_url: http://example.com + client_certificate_key_file: /secrets + + route: + receiver: 'default-receiver' +`, + err: errors.Wrap(errOAuth2CertificateKeyFileNotAllowed, "error validating Alertmanager config"), }, { name: "Should return error if receiver's OAuth2 client_secret_file is set", @@ -407,6 +460,57 @@ alertmanager_config: | `, err: errors.Wrap(errSlackAPIURLFileNotAllowed, "error validating Alertmanager config"), }, + { + name: "Should return error if global slack_app_token_file is set", + cfg: ` +alertmanager_config: | + global: + slack_app_token_file: /secrets + + receivers: + - name: default-receiver + webhook_configs: + - url: http://localhost + + route: + receiver: 'default-receiver' +`, + err: errors.Wrap(errSlackAppTokenFileNotAllowed, "error validating Alertmanager config"), + }, + { + name: "Should return error if global smtp_auth_password_file is set", + cfg: ` +alertmanager_config: | + global: + smtp_auth_password_file: /secrets + + receivers: + - name: default-receiver + webhook_configs: + - url: http://localhost + + route: + receiver: 'default-receiver' +`, + err: errors.Wrap(errEmailAuthPasswordFileNotAllowed, "error validating Alertmanager config"), + }, + { + name: "Should return error if global smtp_auth_secret_file is set", + cfg: ` +alertmanager_config: | + global: + smtp_auth_secret_file: /secrets + + receivers: + - name: default-receiver + webhook_configs: + - url: http://localhost + + route: + receiver: 'default-receiver' +`, + err: errors.Wrap(errEmailAuthSecretFileNotAllowed, "error validating Alertmanager config"), + }, { name: "Should return error if Slack api_url_file is set", cfg: ` @@ -421,6 +525,20 @@ alertmanager_config: | `, err: errors.Wrap(errSlackAPIURLFileNotAllowed, "error validating Alertmanager config"), }, + { + name: "Should return error if Slack app_token_file is set", + cfg: ` +alertmanager_config: | + receivers: + - name: default-receiver + slack_configs: + - app_token_file: /secrets + + route: + receiver: 'default-receiver' +`, + err: errors.Wrap(errSlackAppTokenFileNotAllowed, "error validating Alertmanager config"), + }, { name: "Should return error if OpsGenie api_key_file is set", cfg: ` @@ -435,6 +553,22 @@ alertmanager_config: | `, err: errors.Wrap(errOpsGenieAPIKeyFileNotAllowed, "error validating Alertmanager config"), }, + { + name: "Should return error if global victorops_api_key_file is set", + cfg: ` +alertmanager_config: | + global: + victorops_api_key_file: /secret + receivers: + - name: default-receiver + victorops_configs: + - routing_key: test + + route: + receiver: 'default-receiver' +`, + err: errors.Wrap(errVictorOpsAPIKeyFileNotAllowed, "error validating Alertmanager config"), + }, { name: "Should return error if VictorOps api_key_file is set", cfg: ` @@ -637,6 +771,21 @@ alertmanager_config: | `, err: errors.Wrap(errPushOverTokenFileNotAllowed, "error validating Alertmanager config"), }, + { + name: "Should return error if global telegram_bot_token_file is set", + cfg: ` +alertmanager_config: | + global: + telegram_bot_token_file: /secret + receivers: + - name: default-receiver + telegram_configs: + - chat_id: 5 + route: + receiver: 'default-receiver' +`, + err: errors.Wrap(errTelegramBotTokenFileNotAllowed, "error validating Alertmanager config"), + }, { name: "Should return error if Telegram bot_token_file is set", cfg: ` @@ -651,6 +800,20 @@ alertmanager_config: | `, err: errors.Wrap(errTelegramBotTokenFileNotAllowed, "error validating Alertmanager config"), }, + { + name: "Should return error if Telegram chat_id_file is set", + cfg: ` +alertmanager_config: | + receivers: + - name: default-receiver + telegram_configs: + - bot_token: token + chat_id_file: /secrets + route: + receiver: 'default-receiver' +`, + err: errors.Wrap(errTelegramChatIdFileNotAllowed, "error validating Alertmanager config"), + }, { name: "Should return error if MSTeams webhook_url_file is set", cfg: ` @@ -677,6 +840,21 @@ alertmanager_config: | `, err: errors.Wrap(errMSTeamsV2WebhookUrlFileNotAllowed, "error validating Alertmanager config"), }, + { + name: "Should return error if RocketChat rocketchat_token_id_file is set", + cfg: ` +alertmanager_config: | + global: + rocketchat_token_id_file: /secret + receivers: + - name: default-receiver + rocketchat_configs: + - token: 'token' + route: + receiver: 'default-receiver' +`, + err: errors.Wrap(errRocketChatTokenIdFileNotAllowed, "error validating Alertmanager config"), + }, { name: "Should return error if RocketChat token_id_file is set", cfg: ` @@ -691,6 +869,21 @@ alertmanager_config: | `, err: errors.Wrap(errRocketChatTokenIdFileNotAllowed, "error validating Alertmanager config"), }, + { + name: "Should return error if global rocketchat_token_file is set", + cfg: ` +alertmanager_config: | + global: + rocketchat_token_file: /secret + receivers: + - name: default-receiver + rocketchat_configs: + - token_id: 'tokenId' + route: + receiver: 'default-receiver' +`, + err: errors.Wrap(errRocketChatTokenFileNotAllowed, "error validating Alertmanager config"), + }, { name: "Should return error if RocketChat token_file is set", cfg: ` @@ -734,6 +927,22 @@ alertmanager_config: | `, err: errors.Wrap(errEmailAuthPasswordFileNotAllowed, "error validating Alertmanager config"), }, + { + name: "Should return error if Email auth_secret_file is set", + cfg: ` +alertmanager_config: | + receivers: + - name: default-receiver + email_configs: + - to: user@example.com + from: admin@example.com + smarthost: example.com:25 + auth_secret_file: /secretFile + route: + receiver: 'default-receiver' +`, + err: errors.Wrap(errEmailAuthSecretFileNotAllowed, "error validating Alertmanager config"), + }, { name: "Should return error if IncidentIO url_file is set", cfg: ` @@ -771,11 +980,39 @@ alertmanager_config: | receivers: - name: default-receiver mattermost_configs: - - webhook_url_file: /urlFile + - webhook_url_file: /secret route: receiver: 'default-receiver' `, err: errors.Wrap(errMatterMostWebhookUrlFileNotAllowed, "error validating Alertmanager config"), + }, { + name: "Should return error if global wechat_api_secret_file is set", + cfg: ` +alertmanager_config: | + global: + wechat_api_secret_file: /secret + receivers: + - name: default-receiver + wechat_configs: + - corp_id: id + route: + receiver: 'default-receiver' +`, + err: errors.Wrap(errWeChatAPISecretFileNotAllowed, "error validating Alertmanager config"), + }, + { + name: "Should return error if WeChat api_secret_file is set", + cfg: ` +alertmanager_config: | + receivers: + - name: default-receiver + wechat_configs: + - corp_id: id + api_secret_file: /secret + route: + receiver: 'default-receiver' +`, + err: errors.Wrap(errWeChatAPISecretFileNotAllowed, "error validating Alertmanager config"), }, } @@ -958,10 +1195,10 @@ func TestValidateAlertmanagerConfig(t *testing.T) { "*HTTPClientConfig": { input: &commoncfg.HTTPClientConfig{ BasicAuth: &commoncfg.BasicAuth{ - PasswordFile: "/secrets", + UsernameFile: "/secrets", }, }, - expected: errPasswordFileNotAllowed, + expected: errUsernameFileNotAllowed, }, "HTTPClientConfig": { input: commoncfg.HTTPClientConfig{ From 1fb9ddcfa8c710ac3ec162151afd4e0d3e0d1df7 Mon Sep 17 00:00:00 2001 From: Friedrich Gonzalez <1517449+friedrichg@users.noreply.github.com> Date: Sat, 14 Feb 2026 14:28:02 -0800 Subject: [PATCH 08/10] Include integrations in firewall test Signed-off-by: Friedrich Gonzalez <1517449+friedrichg@users.noreply.github.com> --- pkg/alertmanager/multitenant_test.go | 65 ++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) diff --git a/pkg/alertmanager/multitenant_test.go b/pkg/alertmanager/multitenant_test.go index de8591b498c..d32c509df35 100644 --- a/pkg/alertmanager/multitenant_test.go +++ b/pkg/alertmanager/multitenant_test.go @@ -541,6 +541,71 @@ receivers: - name: mattermost mattermost_configs: - webhook_url: %s +`, backendURL) + }, + }, + "discord": { + getAlertmanagerConfig: func(backendURL string) string { + return fmt.Sprintf(` +route: + receiver: discord + group_wait: 0s + group_interval: 1s + +receivers: + - name: discord + discord_configs: + - webhook_url: %s +`, backendURL) + }, + }, + "incidentio": { + getAlertmanagerConfig: func(backendURL string) string { + return fmt.Sprintf(` +route: + receiver: incidentio + group_wait: 0s + group_interval: 1s + +receivers: + - name: incidentio + incidentio_configs: + - url: %s + alert_source_token: secret +`, backendURL) + }, + }, + "victorops": { + getAlertmanagerConfig: func(backendURL string) string { + return fmt.Sprintf(` +route: + receiver: victorops + group_wait: 0s + group_interval: 1s + +receivers: + - name: victorops + victorops_configs: + - api_url: %s + api_key: secret + routing_key: test-route +`, backendURL) + }, + }, + "telegram": { + getAlertmanagerConfig: func(backendURL string) string { + return fmt.Sprintf(` +route: + receiver: telegram + group_wait: 0s + group_interval: 1s + +receivers: + - name: telegram + telegram_configs: + - api_url: %s + bot_token: secret + chat_id: 12345 `, backendURL) }, }, From d911ea3c74135b151ae4fe3ecc80790a16800330 Mon Sep 17 00:00:00 2001 From: Friedrich Gonzalez <1517449+friedrichg@users.noreply.github.com> Date: Sat, 14 Feb 2026 14:59:16 -0800 Subject: [PATCH 09/10] Include more tests Signed-off-by: Friedrich Gonzalez <1517449+friedrichg@users.noreply.github.com> --- AGENTS.md | 12 +++ pkg/alertmanager/api.go | 130 +++++++++++---------------- pkg/alertmanager/api_test.go | 80 +++++++++++++++++ pkg/alertmanager/multitenant_test.go | 42 +++++++++ 4 files changed, 184 insertions(+), 80 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 37a92c17d72..139da527444 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -18,6 +18,18 @@ make doc # Generate config documentation (run after changi make ./cmd/cortex/.uptodate # Build Cortex Docker image for integration tests ``` +## Vendored Dependencies + +Go modules are vendored in the `vendor/` folder. When upgrading a dependency or component: + +```bash +go get github.com/some/dependency@version # Update go.mod +go mod vendor # Sync vendor folder +go mod tidy # Clean up go.mod/go.sum +``` + +**Important**: Always check the `vendor/` folder for upstream library code (e.g., `vendor/github.com/prometheus/alertmanager/` for Alertmanager internals). Do not modify vendored code directly. + ## Testing ### Unit Tests diff --git a/pkg/alertmanager/api.go b/pkg/alertmanager/api.go index cf27d6b53e7..af006d9387b 100644 --- a/pkg/alertmanager/api.go +++ b/pkg/alertmanager/api.go @@ -8,6 +8,7 @@ import ( "os" "path/filepath" "reflect" + "strings" "github.com/go-kit/log" "github.com/go-kit/log/level" @@ -40,6 +41,9 @@ const ( ) var ( + // errBearerTokenAndCredentialsFileNotAllowed covers both bearer_token_file and credentials_file + // because prometheus/common normalizes bearer_token_file to authorization.credentials_file + // during YAML unmarshaling (see HTTPClientConfig.Validate in prometheus/common/config). errBearerTokenAndCredentialsFileNotAllowed = errors.New("setting bearer_token_file and credentials_file is not allowed") errPasswordFileNotAllowed = errors.New("setting password_file is not allowed") errUsernameFileNotAllowed = errors.New("setting username_file is not allowed") @@ -330,6 +334,43 @@ func (am *MultitenantAlertmanager) ListAllConfigs(w http.ResponseWriter, r *http <-done } +// noopValidator is a sentinel to mark known non-receiver config types that should be ignored. +var noopValidator = func(any) error { return nil } + +// configValidators maps config types to their validation functions. +// - Actual validator: receiver config with file-based fields to validate +// - nil: receiver config with no file-based fields to validate +// - noopValidator: non-receiver config type to ignore +var configValidators = map[reflect.Type]func(any) error{ + reflect.TypeFor[config.GlobalConfig](): func(v any) error { return validateGlobalConfig(v.(config.GlobalConfig)) }, + reflect.TypeFor[commoncfg.HTTPClientConfig](): func(v any) error { return validateReceiverHTTPConfig(v.(commoncfg.HTTPClientConfig)) }, + reflect.TypeFor[commoncfg.TLSConfig](): func(v any) error { return validateReceiverTLSConfig(v.(commoncfg.TLSConfig)) }, + reflect.TypeFor[config.OpsGenieConfig](): func(v any) error { return validateOpsGenieConfig(v.(config.OpsGenieConfig)) }, + reflect.TypeFor[config.SlackConfig](): func(v any) error { return validateSlackConfig(v.(config.SlackConfig)) }, + reflect.TypeFor[config.VictorOpsConfig](): func(v any) error { return validateVictorOpsConfig(v.(config.VictorOpsConfig)) }, + reflect.TypeFor[config.PagerdutyConfig](): func(v any) error { return validatePagerdutyConfig(v.(config.PagerdutyConfig)) }, + reflect.TypeFor[config.WebhookConfig](): func(v any) error { return validateWebhookConfig(v.(config.WebhookConfig)) }, + reflect.TypeFor[config.PushoverConfig](): func(v any) error { return validatePushOverConfig(v.(config.PushoverConfig)) }, + reflect.TypeFor[config.TelegramConfig](): func(v any) error { return validateTelegramConfig(v.(config.TelegramConfig)) }, + reflect.TypeFor[config.MSTeamsConfig](): func(v any) error { return validateMSTeamsConfig(v.(config.MSTeamsConfig)) }, + reflect.TypeFor[config.MSTeamsV2Config](): func(v any) error { return validateMSTeamsV2Config(v.(config.MSTeamsV2Config)) }, + reflect.TypeFor[config.RocketchatConfig](): func(v any) error { return validateRocketChatConfig(v.(config.RocketchatConfig)) }, + reflect.TypeFor[config.DiscordConfig](): func(v any) error { return validateDiscordConfig(v.(config.DiscordConfig)) }, + reflect.TypeFor[config.EmailConfig](): func(v any) error { return validateEmailConfig(v.(config.EmailConfig)) }, + reflect.TypeFor[config.IncidentioConfig](): func(v any) error { return validateIncidentIOConfig(v.(config.IncidentioConfig)) }, + reflect.TypeFor[config.MattermostConfig](): func(v any) error { return validateMattermostConfig(v.(config.MattermostConfig)) }, + reflect.TypeFor[config.WechatConfig](): func(v any) error { return validateWeChatConfig(v.(config.WechatConfig)) }, + reflect.TypeFor[config.WebexConfig](): nil, // No file-based fields to validate + reflect.TypeFor[config.SNSConfig](): nil, // No file-based fields to validate + reflect.TypeFor[config.JiraConfig](): nil, // No file-based fields to validate + // Non-receiver config types (ignored during validation) + reflect.TypeFor[config.Config](): noopValidator, + reflect.TypeFor[config.NotifierConfig](): noopValidator, + reflect.TypeFor[config.TracingConfig](): noopValidator, + reflect.TypeFor[config.ThreadingConfig](): noopValidator, + reflect.TypeFor[config.JiraFieldConfig](): noopValidator, +} + // validateAlertmanagerConfig recursively scans the input config looking for data types for which // we have a specific validation and, whenever encountered, it runs their validation. Returns the // first error or nil if validation succeeds. @@ -350,87 +391,16 @@ func validateAlertmanagerConfig(cfg any) error { } // Check if the input config is a data type for which we have a specific validation. - // At this point the value can't be a pointer anymore. - switch t { - case reflect.TypeFor[config.GlobalConfig](): - if err := validateGlobalConfig(v.Interface().(config.GlobalConfig)); err != nil { - return err - } - - case reflect.TypeFor[commoncfg.HTTPClientConfig](): - if err := validateReceiverHTTPConfig(v.Interface().(commoncfg.HTTPClientConfig)); err != nil { - return err - } - - case reflect.TypeFor[config.OpsGenieConfig](): - if err := validateOpsGenieConfig(v.Interface().(config.OpsGenieConfig)); err != nil { - return err - } - - case reflect.TypeFor[commoncfg.TLSConfig](): - if err := validateReceiverTLSConfig(v.Interface().(commoncfg.TLSConfig)); err != nil { - return err - } - - case reflect.TypeFor[config.SlackConfig](): - if err := validateSlackConfig(v.Interface().(config.SlackConfig)); err != nil { - return err - } - - case reflect.TypeFor[config.VictorOpsConfig](): - if err := validateVictorOpsConfig(v.Interface().(config.VictorOpsConfig)); err != nil { - return err - } - - case reflect.TypeFor[config.PagerdutyConfig](): - if err := validatePagerdutyConfig(v.Interface().(config.PagerdutyConfig)); err != nil { - return err - } - - case reflect.TypeFor[config.WebhookConfig](): - if err := validateWebhookConfig(v.Interface().(config.WebhookConfig)); err != nil { - return err - } - case reflect.TypeFor[config.PushoverConfig](): - if err := validatePushOverConfig(v.Interface().(config.PushoverConfig)); err != nil { - return err - } - case reflect.TypeFor[config.TelegramConfig](): - if err := validateTelegramConfig(v.Interface().(config.TelegramConfig)); err != nil { - return err - } - case reflect.TypeFor[config.MSTeamsConfig](): - if err := validateMSTeamsConfig(v.Interface().(config.MSTeamsConfig)); err != nil { - return err - } - case reflect.TypeFor[config.MSTeamsV2Config](): - if err := validateMSTeamsV2Config(v.Interface().(config.MSTeamsV2Config)); err != nil { - return err - } - case reflect.TypeFor[config.RocketchatConfig](): - if err := validateRocketChatConfig(v.Interface().(config.RocketchatConfig)); err != nil { - return err - } - case reflect.TypeFor[config.DiscordConfig](): - if err := validateDiscordConfig(v.Interface().(config.DiscordConfig)); err != nil { - return err - } - case reflect.TypeFor[config.EmailConfig](): - if err := validateEmailConfig(v.Interface().(config.EmailConfig)); err != nil { - return err - } - case reflect.TypeFor[config.IncidentioConfig](): - if err := validateIncidentIOConfig(v.Interface().(config.IncidentioConfig)); err != nil { - return err - } - case reflect.TypeFor[config.MattermostConfig](): - if err := validateMattermostConfig(v.Interface().(config.MattermostConfig)); err != nil { - return err - } - case reflect.TypeFor[config.WechatConfig](): - if err := validateWeChatConfig(v.Interface().(config.WechatConfig)); err != nil { - return err + if validator, ok := configValidators[t]; ok { + if validator != nil { + if err := validator(v.Interface()); err != nil { + return err + } } + } else if strings.Contains(t.PkgPath(), "alertmanager/config") && + strings.HasSuffix(t.Name(), "Config") { + // Unhandled config type - fail to ensure we don't miss new types. + return fmt.Errorf("unsupported receiver config type: %s", t.Name()) } // If the input config is a struct, recursively iterate on all fields. diff --git a/pkg/alertmanager/api_test.go b/pkg/alertmanager/api_test.go index ed80a1a9890..f3bbb5d1dee 100644 --- a/pkg/alertmanager/api_test.go +++ b/pkg/alertmanager/api_test.go @@ -426,6 +426,41 @@ alertmanager_config: | `, err: errors.Wrap(errOAuth2SecretFileNotAllowed, "error validating Alertmanager config"), }, + { + name: "Should return error if receiver's TLS ca_file is set", + cfg: ` +alertmanager_config: | + receivers: + - name: default-receiver + webhook_configs: + - url: http://localhost + http_config: + tls_config: + ca_file: /ca.crt + + route: + receiver: 'default-receiver' +`, + err: errors.Wrap(errTLSFileNotAllowed, "error validating Alertmanager config"), + }, + { + name: "Should return error if receiver's TLS cert_file and key_file are set", + cfg: ` +alertmanager_config: | + receivers: + - name: default-receiver + webhook_configs: + - url: http://localhost + http_config: + tls_config: + cert_file: /cert.crt + key_file: /key.key + + route: + receiver: 'default-receiver' +`, + err: errors.Wrap(errTLSFileNotAllowed, "error validating Alertmanager config"), + }, { name: "Should return error if global opsgenie_api_key_file is set", cfg: ` @@ -1014,6 +1049,51 @@ alertmanager_config: | `, err: errors.Wrap(errWeChatAPISecretFileNotAllowed, "error validating Alertmanager config"), }, + { + name: "Should pass with valid Jira config", + cfg: ` +alertmanager_config: | + receivers: + - name: default-receiver + jira_configs: + - api_url: http://jira.example.com + project: TEST + issue_type: Bug + route: + receiver: 'default-receiver' +`, + }, + { + name: "Should pass with valid SNS config", + cfg: ` +alertmanager_config: | + receivers: + - name: default-receiver + sns_configs: + - api_url: http://sns.example.com + topic_arn: arn:aws:sns:us-east-1:123456789012:test + sigv4: + region: us-east-1 + route: + receiver: 'default-receiver' +`, + }, + { + name: "Should pass with valid Webex config", + cfg: ` +alertmanager_config: | + receivers: + - name: default-receiver + webex_configs: + - api_url: http://webex.example.com + room_id: test-room + http_config: + authorization: + credentials: secret + route: + receiver: 'default-receiver' +`, + }, } limits := &mockAlertManagerLimits{} diff --git a/pkg/alertmanager/multitenant_test.go b/pkg/alertmanager/multitenant_test.go index d32c509df35..c1e6a483af2 100644 --- a/pkg/alertmanager/multitenant_test.go +++ b/pkg/alertmanager/multitenant_test.go @@ -382,6 +382,9 @@ templates: } func TestMultitenantAlertmanager_FirewallShouldBlockHTTPBasedReceiversWhenEnabled(t *testing.T) { + // TODO: Pushover is probably blocked by the firewall already (it uses httpOpts with the firewall dialer), + // but we can't test it here because it has a hardcoded API URL (https://api.pushover.net/1/messages.json) + // with no configuration option to redirect requests to our test server. tests := map[string]struct { getAlertmanagerConfig func(backendURL string) string }{ @@ -606,6 +609,45 @@ receivers: - api_url: %s bot_token: secret chat_id: 12345 +`, backendURL) + }, + }, + "sns": { + getAlertmanagerConfig: func(backendURL string) string { + return fmt.Sprintf(` +route: + receiver: sns + group_wait: 0s + group_interval: 1s + +receivers: + - name: sns + sns_configs: + - api_url: %s + topic_arn: arn:aws:sns:us-east-1:123456789012:test + sigv4: + region: us-east-1 + access_key: test-access-key + secret_key: test-secret-key +`, backendURL) + }, + }, + "webex": { + getAlertmanagerConfig: func(backendURL string) string { + return fmt.Sprintf(` +route: + receiver: webex + group_wait: 0s + group_interval: 1s + +receivers: + - name: webex + webex_configs: + - api_url: %s + room_id: test-room + http_config: + authorization: + credentials: secret `, backendURL) }, }, From bc464c137bd0d4b61c61f101e33bebc97f6b5d3a Mon Sep 17 00:00:00 2001 From: Friedrich Gonzalez <1517449+friedrichg@users.noreply.github.com> Date: Tue, 17 Feb 2026 09:24:56 -0800 Subject: [PATCH 10/10] Fix vendor/modules.txt Signed-off-by: Friedrich Gonzalez <1517449+friedrichg@users.noreply.github.com> --- vendor/modules.txt | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/vendor/modules.txt b/vendor/modules.txt index 6e94ed0a9a9..a2c1af78a5e 100644 --- a/vendor/modules.txt +++ b/vendor/modules.txt @@ -1533,20 +1533,9 @@ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/envconf go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/observ go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/otlpconfig go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/retry -<<<<<<< HEAD -# go.opentelemetry.io/otel/metric v1.38.0 -## explicit; go 1.23.0 -======= go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp/internal/x -# go.opentelemetry.io/otel/log v0.12.2 -## explicit; go 1.23.0 -go.opentelemetry.io/otel/log -go.opentelemetry.io/otel/log/embedded -go.opentelemetry.io/otel/log/global -go.opentelemetry.io/otel/log/internal/global # go.opentelemetry.io/otel/metric v1.39.0 ## explicit; go 1.24.0 ->>>>>>> e97f2eedb4 (Upgrade to v0.31.1) go.opentelemetry.io/otel/metric go.opentelemetry.io/otel/metric/embedded go.opentelemetry.io/otel/metric/noop